Subversion Repositories spacemission

Rev

Rev 14 | Rev 17 | 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
 
33
implementation
34
 
35
uses
36
  SysUtils, Classes;
37
 
38
{ TLevelData }
39
 
40
procedure TLevelData.Clear;
41
begin
42
  SetLength(EnemyAdventTable, 0);
43
  LevelEditorLength := 0;
44
end;
45
 
46
procedure TLevelData.Load(filename: string);
47
var
15 daniel-mar 48
  sl: TStringList;
14 daniel-mar 49
  curline: integer;
50
  ergebniss: string;
51
  e: TEnemyAdvent;
52
begin
15 daniel-mar 53
  sl := TStringList.Create;
14 daniel-mar 54
  try
15 daniel-mar 55
    sl.LoadFromFile(filename);
14 daniel-mar 56
    curline := 0;
57
 
15 daniel-mar 58
    ergebniss := sl.Strings[curline]; Inc(curline);
14 daniel-mar 59
    if ergebniss = '; SpaceMission 1.0' then
60
    begin
15 daniel-mar 61
      ergebniss := sl.Strings[curline]; Inc(curline);
62
      if ergebniss <> '; LEV-File' then
63
      begin
64
        raise Exception.Create('Dies ist keine SpaceMission Level-Datei');
65
      end;
14 daniel-mar 66
 
15 daniel-mar 67
      ergebniss := sl.Strings[curline]; Inc(curline);
14 daniel-mar 68
      LevelEditorLength := StrToInt(ergebniss);
69
 
15 daniel-mar 70
      while curline < sl.Count do
14 daniel-mar 71
      begin
15 daniel-mar 72
        ergebniss := sl.Strings[curline]; Inc(curline);
14 daniel-mar 73
        e.enemyType := TEnemyType(strtoint(ergebniss));
15 daniel-mar 74
        ergebniss := sl.Strings[curline]; Inc(curline);
14 daniel-mar 75
        e.x := strtoint(ergebniss);
15 daniel-mar 76
        ergebniss := sl.Strings[curline]; Inc(curline);
14 daniel-mar 77
        e.y := strtoint(ergebniss);
15 daniel-mar 78
        ergebniss := sl.Strings[curline]; Inc(curline);
14 daniel-mar 79
        e.lifes := strtoint(ergebniss);
80
 
81
        SetLength(EnemyAdventTable, Length(EnemyAdventTable)+1);
82
        EnemyAdventTable[Length(EnemyAdventTable)-1] := e;
83
      end;
84
    end
85
    else
86
    begin
87
      // TODO: Support 0.2, 0.3, 0.4
88
      raise Exception.CreateFmt('Level-Format "%s" nicht unterstützt', [Copy(ergebniss, 3, Length(ergebniss)-2)]);
89
    end;
90
  finally
15 daniel-mar 91
    FreeAndNil(sl);
14 daniel-mar 92
  end;
93
end;
94
 
95
procedure TLevelData.Save(filename: string);
15 daniel-mar 96
var
97
  sl: TStringList;
98
  i: integer;
14 daniel-mar 99
begin
15 daniel-mar 100
  sl := TStringList.Create;
101
  try
102
    sl.Add('; SpaceMission 1.0');
103
    sl.Add('; LEV-File');
104
    sl.Add(IntToStr(LevelEditorLength));
105
    for i := 0 to Length(EnemyAdventTable)-1 do
106
    begin
107
      sl.Add(IntToStr(Ord(EnemyAdventTable[i].enemyType)));
108
      sl.Add(IntToStr(EnemyAdventTable[i].x));
109
      sl.Add(IntToStr(EnemyAdventTable[i].y));
110
      sl.Add(IntToStr(EnemyAdventTable[i].lifes));
111
    end;
112
    sl.SaveToFile(filename);
113
  finally
114
    FreeAndNil(sl);
115
  end;
14 daniel-mar 116
end;
117
 
118
end.