Subversion Repositories spacemission

Rev

Rev 14 | Rev 17 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  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
  48.   sl: TStringList;
  49.   curline: integer;
  50.   ergebniss: string;
  51.   e: TEnemyAdvent;
  52. begin
  53.   sl := TStringList.Create;
  54.   try
  55.     sl.LoadFromFile(filename);
  56.     curline := 0;
  57.  
  58.     ergebniss := sl.Strings[curline]; Inc(curline);
  59.     if ergebniss = '; SpaceMission 1.0' then
  60.     begin
  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;
  66.  
  67.       ergebniss := sl.Strings[curline]; Inc(curline);
  68.       LevelEditorLength := StrToInt(ergebniss);
  69.  
  70.       while curline < sl.Count do
  71.       begin
  72.         ergebniss := sl.Strings[curline]; Inc(curline);
  73.         e.enemyType := TEnemyType(strtoint(ergebniss));
  74.         ergebniss := sl.Strings[curline]; Inc(curline);
  75.         e.x := strtoint(ergebniss);
  76.         ergebniss := sl.Strings[curline]; Inc(curline);
  77.         e.y := strtoint(ergebniss);
  78.         ergebniss := sl.Strings[curline]; Inc(curline);
  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
  91.     FreeAndNil(sl);
  92.   end;
  93. end;
  94.  
  95. procedure TLevelData.Save(filename: string);
  96. var
  97.   sl: TStringList;
  98.   i: integer;
  99. begin
  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;
  116. end;
  117.  
  118. end.
  119.