Rev 15 | Rev 20 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | daniel-mar | 1 | unit ComLevelReader; |
2 | |||
3 | interface |
||
4 | |||
5 | type |
||
6 | TEnemyType = ( |
||
7 | etUnknown, |
||
8 | etEnemyAttacker, |
||
9 | etEnemyAttacker2, |
||
10 | etEnemyAttacker3, |
||
11 | etEnemyMeteor, |
||
12 | etEnemyUFO, |
||
13 | etEnemyUFO2, |
||
14 | etEnemyBoss |
||
15 | ); |
||
16 | |||
17 | TEnemyAdvent = record |
||
18 | enemyType: TEnemyType; |
||
19 | x: integer; |
||
20 | y: integer; |
||
21 | lifes: integer; |
||
22 | end; |
||
23 | |||
24 | TLevelData = class(TObject) |
||
25 | public |
||
26 | LevelEditorLength: integer; |
||
27 | EnemyAdventTable: array of TEnemyAdvent; |
||
28 | procedure Clear; |
||
29 | procedure Load(filename: string); |
||
30 | procedure Save(filename: string); |
||
31 | end; |
||
32 | |||
17 | daniel-mar | 33 | function GetLevelFileName(lev: integer): string; |
34 | |||
14 | daniel-mar | 35 | implementation |
36 | |||
37 | uses |
||
17 | daniel-mar | 38 | SysUtils, StrUtils, Classes, Global; |
14 | daniel-mar | 39 | |
17 | daniel-mar | 40 | function GetLevelFileName(lev: integer): string; |
41 | begin |
||
42 | result := FDirectory+'Levels\Lev'+inttostr(lev)+'A1.lev'; // Version 0.2 Level Files |
||
43 | if not FileExists(Result) then |
||
44 | result := FDirectory+'Levels\Level '+inttostr(lev)+'.lev'; // Version 0.3+ Level Files |
||
45 | end; |
||
46 | |||
14 | daniel-mar | 47 | { TLevelData } |
48 | |||
49 | procedure TLevelData.Clear; |
||
50 | begin |
||
51 | SetLength(EnemyAdventTable, 0); |
||
52 | LevelEditorLength := 0; |
||
53 | end; |
||
54 | |||
55 | procedure TLevelData.Load(filename: string); |
||
56 | var |
||
17 | daniel-mar | 57 | sl, sl2: TStringList; |
14 | daniel-mar | 58 | curline: integer; |
17 | daniel-mar | 59 | ergebnis: string; |
14 | daniel-mar | 60 | e: TEnemyAdvent; |
17 | daniel-mar | 61 | z, act: integer; |
62 | i, j: integer; |
||
63 | temp: string; |
||
64 | m: array[1..6] of tstrings; |
||
14 | daniel-mar | 65 | begin |
15 | daniel-mar | 66 | sl := TStringList.Create; |
14 | daniel-mar | 67 | try |
17 | daniel-mar | 68 | if EndsText('A1.lev', filename) then |
69 | begin |
||
70 | {$REGION 'Backwards compatibility level format 0.2 (split into 5-6 files)'} |
||
71 | m[1] := TStringList.create; |
||
72 | m[2] := TStringList.create; |
||
73 | m[3] := TStringList.create; |
||
74 | m[4] := TStringList.create; |
||
75 | m[5] := TStringList.create; |
||
76 | m[6] := TStringList.create; |
||
77 | try |
||
78 | for i := 1 to 6 do |
||
79 | begin |
||
80 | filename[Length(filename)-4] := IntToStr(i)[1]; // ...A2.sav, ...A3.sav, etc. |
||
81 | if FileExists(filename) then |
||
82 | m[i].loadfromfile(filename); |
||
83 | end; |
||
84 | m[1].strings[0] := '-624'; |
||
85 | if m[6].Text = '' then m[6].Text := '30000'; |
||
14 | daniel-mar | 86 | |
17 | daniel-mar | 87 | sl.Add('; SpaceMission 0.3'); |
88 | sl.Add(temp); |
||
89 | for j := 0 to m[1].count-2 do |
||
90 | begin |
||
91 | for i := 0 to m[1].count-2 do |
||
92 | begin |
||
93 | if strtoint(m[1].strings[i]) > strtoint(m[1].strings[i+1]) then |
||
94 | begin |
||
95 | m[1].exchange(i, i+1); |
||
96 | m[2].exchange(i, i+1); |
||
97 | m[3].exchange(i, i+1); |
||
98 | m[4].exchange(i, i+1); |
||
99 | m[5].exchange(i, i+1); |
||
100 | end; |
||
101 | end; |
||
102 | end; |
||
103 | for i := 0 to m[3].count-1 do |
||
104 | begin |
||
105 | for j := 1 to 4 do |
||
106 | begin |
||
107 | if j = 1 then sl.Add(m[3].strings[i]); |
||
108 | if j = 2 then sl.Add(m[1].strings[i]); |
||
109 | if j = 3 then sl.Add(m[2].strings[i]); |
||
110 | if j = 4 then sl.Add(m[4].strings[i]); |
||
111 | end; |
||
112 | end; |
||
113 | finally |
||
114 | FreeAndNil(m[1]); |
||
115 | FreeAndNil(m[2]); |
||
116 | FreeAndNil(m[3]); |
||
117 | FreeAndNil(m[4]); |
||
118 | FreeAndNil(m[5]); |
||
119 | FreeAndNil(m[6]); |
||
120 | end; |
||
121 | {$ENDREGION} |
||
122 | end |
||
123 | else |
||
14 | daniel-mar | 124 | begin |
17 | daniel-mar | 125 | sl.LoadFromFile(filename); |
126 | end; |
||
127 | |||
128 | if sl.Strings[0] = '; SpaceMission 0.3' then |
||
129 | begin |
||
130 | {$REGION 'Backwards compatibility level format 0.3'} |
||
131 | sl.Strings[0] := '; SpaceMission 0.4'; |
||
132 | sl.Insert(1, '; SAV-File'); |
||
133 | {$ENDREGION} |
||
134 | end; |
||
135 | |||
136 | if sl.Strings[0] = '; SpaceMission 0.4' then |
||
137 | begin |
||
138 | {$REGION 'Backwards compatibility level format 0.4'} |
||
139 | sl2 := TStringList.Create; |
||
140 | try |
||
141 | z := 0; |
||
142 | act := 0; |
||
143 | while z < sl.Count do |
||
144 | begin |
||
145 | inc(z); |
||
146 | if z > 2 then inc(act); |
||
147 | if act = 5 then act := 1; |
||
148 | ergebnis := sl.Strings[z-1]; |
||
149 | if ergebnis = '; SpaceMission 0.4' then |
||
150 | sl2.Add('; SpaceMission 1.0') |
||
151 | else |
||
152 | begin |
||
153 | if (ergebnis = '30000') and (z = 3) then |
||
154 | sl2.Add('1200') |
||
155 | else |
||
156 | begin |
||
157 | //if not (((ergebnis = '0') and (z = 4)) or ((ergebnis = '-624') and (z = 5)) or ((ergebnis = '222') and (z = 6)) or ((ergebnis = '3') and (z = 7))) then |
||
158 | if (z < 4) or (z > 7) then |
||
159 | begin |
||
160 | if act = 4 then |
||
161 | sl2.Add(inttostr(strtoint(ergebnis) + 32 - (5 * (strtoint(ergebnis) div 37)))) |
||
162 | else |
||
163 | sl2.Add(Ergebnis); |
||
164 | end; |
||
165 | end; |
||
166 | end; |
||
167 | end; |
||
168 | sl.Text := sl2.Text; |
||
169 | finally |
||
170 | FreeAndNil(sl2); |
||
171 | end; |
||
172 | {$ENDREGION} |
||
173 | end; |
||
174 | |||
175 | if sl.Strings[0] = '; SpaceMission 1.0' then |
||
176 | begin |
||
177 | {$REGION 'Level format 1.0'} |
||
178 | if sl.Strings[1] <> '; LEV-File' then |
||
15 | daniel-mar | 179 | begin |
180 | raise Exception.Create('Dies ist keine SpaceMission Level-Datei'); |
||
181 | end; |
||
14 | daniel-mar | 182 | |
17 | daniel-mar | 183 | LevelEditorLength := StrToInt(sl.Strings[2]); |
14 | daniel-mar | 184 | |
17 | daniel-mar | 185 | curline := 3; |
15 | daniel-mar | 186 | while curline < sl.Count do |
14 | daniel-mar | 187 | begin |
17 | daniel-mar | 188 | ergebnis := sl.Strings[curline]; Inc(curline); |
189 | e.enemyType := TEnemyType(strtoint(ergebnis)); |
||
190 | ergebnis := sl.Strings[curline]; Inc(curline); |
||
191 | e.x := strtoint(ergebnis); |
||
192 | ergebnis := sl.Strings[curline]; Inc(curline); |
||
193 | e.y := strtoint(ergebnis); |
||
194 | ergebnis := sl.Strings[curline]; Inc(curline); |
||
195 | e.lifes := strtoint(ergebnis); |
||
14 | daniel-mar | 196 | |
197 | SetLength(EnemyAdventTable, Length(EnemyAdventTable)+1); |
||
198 | EnemyAdventTable[Length(EnemyAdventTable)-1] := e; |
||
199 | end; |
||
17 | daniel-mar | 200 | {$ENDREGION} |
14 | daniel-mar | 201 | end |
202 | else |
||
203 | begin |
||
17 | daniel-mar | 204 | raise Exception.CreateFmt('Level-Format "%s" nicht unterstützt', [Copy(ergebnis, 3, Length(ergebnis)-2)]); |
14 | daniel-mar | 205 | end; |
206 | finally |
||
15 | daniel-mar | 207 | FreeAndNil(sl); |
14 | daniel-mar | 208 | end; |
209 | end; |
||
210 | |||
211 | procedure TLevelData.Save(filename: string); |
||
15 | daniel-mar | 212 | var |
213 | sl: TStringList; |
||
214 | i: integer; |
||
14 | daniel-mar | 215 | begin |
15 | daniel-mar | 216 | sl := TStringList.Create; |
217 | try |
||
218 | sl.Add('; SpaceMission 1.0'); |
||
219 | sl.Add('; LEV-File'); |
||
220 | sl.Add(IntToStr(LevelEditorLength)); |
||
221 | for i := 0 to Length(EnemyAdventTable)-1 do |
||
222 | begin |
||
223 | sl.Add(IntToStr(Ord(EnemyAdventTable[i].enemyType))); |
||
224 | sl.Add(IntToStr(EnemyAdventTable[i].x)); |
||
225 | sl.Add(IntToStr(EnemyAdventTable[i].y)); |
||
226 | sl.Add(IntToStr(EnemyAdventTable[i].lifes)); |
||
227 | end; |
||
228 | sl.SaveToFile(filename); |
||
229 | finally |
||
230 | FreeAndNil(sl); |
||
231 | end; |
||
14 | daniel-mar | 232 | end; |
233 | |||
234 | end. |