Rev 20 | Rev 27 | 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 |
||
24 | daniel-mar | 42 | result := FDirectory+'Levels\Level '+inttostr(lev)+'.lev'; // Version 0.3+ Level Files |
17 | daniel-mar | 43 | if not FileExists(Result) then |
24 | daniel-mar | 44 | result := FDirectory+'Levels\Lev'+inttostr(lev)+'A1.lev'; // Version 0.2 Level Files |
17 | daniel-mar | 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; |
60 | z, act: integer; |
||
61 | i, j: integer; |
||
62 | temp: string; |
||
63 | m: array[1..6] of tstrings; |
||
14 | daniel-mar | 64 | begin |
15 | daniel-mar | 65 | sl := TStringList.Create; |
14 | daniel-mar | 66 | try |
17 | daniel-mar | 67 | if EndsText('A1.lev', filename) then |
68 | begin |
||
69 | {$REGION 'Backwards compatibility level format 0.2 (split into 5-6 files)'} |
||
70 | m[1] := TStringList.create; |
||
71 | m[2] := TStringList.create; |
||
72 | m[3] := TStringList.create; |
||
73 | m[4] := TStringList.create; |
||
74 | m[5] := TStringList.create; |
||
75 | m[6] := TStringList.create; |
||
76 | try |
||
77 | for i := 1 to 6 do |
||
78 | begin |
||
79 | filename[Length(filename)-4] := IntToStr(i)[1]; // ...A2.sav, ...A3.sav, etc. |
||
80 | if FileExists(filename) then |
||
81 | m[i].loadfromfile(filename); |
||
82 | end; |
||
83 | m[1].strings[0] := '-624'; |
||
84 | if m[6].Text = '' then m[6].Text := '30000'; |
||
14 | daniel-mar | 85 | |
17 | daniel-mar | 86 | sl.Add('; SpaceMission 0.3'); |
87 | sl.Add(temp); |
||
88 | for j := 0 to m[1].count-2 do |
||
89 | begin |
||
90 | for i := 0 to m[1].count-2 do |
||
91 | begin |
||
92 | if strtoint(m[1].strings[i]) > strtoint(m[1].strings[i+1]) then |
||
93 | begin |
||
94 | m[1].exchange(i, i+1); |
||
95 | m[2].exchange(i, i+1); |
||
96 | m[3].exchange(i, i+1); |
||
97 | m[4].exchange(i, i+1); |
||
98 | m[5].exchange(i, i+1); |
||
99 | end; |
||
100 | end; |
||
101 | end; |
||
102 | for i := 0 to m[3].count-1 do |
||
103 | begin |
||
104 | for j := 1 to 4 do |
||
105 | begin |
||
106 | if j = 1 then sl.Add(m[3].strings[i]); |
||
107 | if j = 2 then sl.Add(m[1].strings[i]); |
||
108 | if j = 3 then sl.Add(m[2].strings[i]); |
||
109 | if j = 4 then sl.Add(m[4].strings[i]); |
||
110 | end; |
||
111 | end; |
||
112 | finally |
||
113 | FreeAndNil(m[1]); |
||
114 | FreeAndNil(m[2]); |
||
115 | FreeAndNil(m[3]); |
||
116 | FreeAndNil(m[4]); |
||
117 | FreeAndNil(m[5]); |
||
118 | FreeAndNil(m[6]); |
||
119 | end; |
||
120 | {$ENDREGION} |
||
121 | end |
||
122 | else |
||
14 | daniel-mar | 123 | begin |
17 | daniel-mar | 124 | sl.LoadFromFile(filename); |
125 | end; |
||
126 | |||
127 | if sl.Strings[0] = '; SpaceMission 0.3' then |
||
128 | begin |
||
129 | {$REGION 'Backwards compatibility level format 0.3'} |
||
130 | sl.Strings[0] := '; SpaceMission 0.4'; |
||
131 | sl.Insert(1, '; SAV-File'); |
||
132 | {$ENDREGION} |
||
133 | end; |
||
134 | |||
135 | if sl.Strings[0] = '; SpaceMission 0.4' then |
||
136 | begin |
||
137 | {$REGION 'Backwards compatibility level format 0.4'} |
||
138 | sl2 := TStringList.Create; |
||
139 | try |
||
140 | z := 0; |
||
141 | act := 0; |
||
142 | while z < sl.Count do |
||
143 | begin |
||
144 | inc(z); |
||
145 | if z > 2 then inc(act); |
||
146 | if act = 5 then act := 1; |
||
147 | ergebnis := sl.Strings[z-1]; |
||
148 | if ergebnis = '; SpaceMission 0.4' then |
||
149 | sl2.Add('; SpaceMission 1.0') |
||
150 | else |
||
151 | begin |
||
152 | if (ergebnis = '30000') and (z = 3) then |
||
153 | sl2.Add('1200') |
||
154 | else |
||
155 | begin |
||
156 | //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 |
||
157 | if (z < 4) or (z > 7) then |
||
158 | begin |
||
159 | if act = 4 then |
||
160 | sl2.Add(inttostr(strtoint(ergebnis) + 32 - (5 * (strtoint(ergebnis) div 37)))) |
||
161 | else |
||
162 | sl2.Add(Ergebnis); |
||
163 | end; |
||
164 | end; |
||
165 | end; |
||
166 | end; |
||
167 | sl.Text := sl2.Text; |
||
168 | finally |
||
169 | FreeAndNil(sl2); |
||
170 | end; |
||
171 | {$ENDREGION} |
||
172 | end; |
||
173 | |||
174 | if sl.Strings[0] = '; SpaceMission 1.0' then |
||
175 | begin |
||
176 | {$REGION 'Level format 1.0'} |
||
177 | if sl.Strings[1] <> '; LEV-File' then |
||
15 | daniel-mar | 178 | begin |
179 | raise Exception.Create('Dies ist keine SpaceMission Level-Datei'); |
||
180 | end; |
||
14 | daniel-mar | 181 | |
17 | daniel-mar | 182 | LevelEditorLength := StrToInt(sl.Strings[2]); |
14 | daniel-mar | 183 | |
17 | daniel-mar | 184 | curline := 3; |
15 | daniel-mar | 185 | while curline < sl.Count do |
14 | daniel-mar | 186 | begin |
187 | SetLength(EnemyAdventTable, Length(EnemyAdventTable)+1); |
||
20 | daniel-mar | 188 | EnemyAdventTable[Length(EnemyAdventTable)-1].enemyType := TEnemyType(strtoint(sl.Strings[curline])); |
189 | Inc(curline); |
||
190 | EnemyAdventTable[Length(EnemyAdventTable)-1].x := strtoint(sl.Strings[curline]); |
||
191 | Inc(curline); |
||
192 | EnemyAdventTable[Length(EnemyAdventTable)-1].y := strtoint(sl.Strings[curline]); |
||
193 | Inc(curline); |
||
194 | EnemyAdventTable[Length(EnemyAdventTable)-1].lifes := strtoint(sl.Strings[curline]); |
||
195 | Inc(curline); |
||
14 | daniel-mar | 196 | end; |
17 | daniel-mar | 197 | {$ENDREGION} |
14 | daniel-mar | 198 | end |
199 | else |
||
200 | begin |
||
17 | daniel-mar | 201 | raise Exception.CreateFmt('Level-Format "%s" nicht unterstützt', [Copy(ergebnis, 3, Length(ergebnis)-2)]); |
14 | daniel-mar | 202 | end; |
203 | finally |
||
15 | daniel-mar | 204 | FreeAndNil(sl); |
14 | daniel-mar | 205 | end; |
206 | end; |
||
207 | |||
208 | procedure TLevelData.Save(filename: string); |
||
15 | daniel-mar | 209 | var |
210 | sl: TStringList; |
||
211 | i: integer; |
||
14 | daniel-mar | 212 | begin |
15 | daniel-mar | 213 | sl := TStringList.Create; |
214 | try |
||
215 | sl.Add('; SpaceMission 1.0'); |
||
216 | sl.Add('; LEV-File'); |
||
217 | sl.Add(IntToStr(LevelEditorLength)); |
||
218 | for i := 0 to Length(EnemyAdventTable)-1 do |
||
219 | begin |
||
220 | sl.Add(IntToStr(Ord(EnemyAdventTable[i].enemyType))); |
||
221 | sl.Add(IntToStr(EnemyAdventTable[i].x)); |
||
222 | sl.Add(IntToStr(EnemyAdventTable[i].y)); |
||
223 | sl.Add(IntToStr(EnemyAdventTable[i].lifes)); |
||
224 | end; |
||
225 | sl.SaveToFile(filename); |
||
226 | finally |
||
227 | FreeAndNil(sl); |
||
228 | end; |
||
14 | daniel-mar | 229 | end; |
230 | |||
231 | end. |