Subversion Repositories spacemission

Rev

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.