Subversion Repositories spacemission

Rev

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.