Subversion Repositories spacemission

Rev

Rev 71 | Rev 74 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 71 Rev 72
Line 50... Line 50...
50
    procedure DoMove(MoveCount: Integer); override;
50
    procedure DoMove(MoveCount: Integer); override;
51
  public
51
  public
52
    constructor Create(AParent: TSprite); override;
52
    constructor Create(AParent: TSprite); override;
53
  end;
53
  end;
54
 
54
 
55
  TPlayerOrEnemyState = (
55
  TPlayerOrEnemyOrItemState = (
56
    pesUnknown,
56
    pesUnknown,
57
    pesNormal,
57
    pesNormal,
58
    pesExploding, // only boss, as preparation of pesDead
58
    pesExploding, // only boss, as preparation of pesDead
59
    pesDead,
59
    pesDead,
60
    pesDeadVanished,
60
    pesDeadVanished,
61
    pesFlyaway, // only player at mission end
61
    pesFlyaway, // only player at mission end
62
    pesEntering,
62
    pesEntering,
63
    pesHovering // only some kind of enemies
63
    pesHovering // only some kind of enemies
64
  );
64
  );
65
 
65
 
66
  TPlayerOrEnemy = class abstract (TImageSprite)
66
  TPlayerOrEnemyOrItem = class abstract (TImageSprite)
67
  strict protected
67
  strict protected
68
    State: TPlayerOrEnemyState;
68
    State: TPlayerOrEnemyOrItemState;
69
  end;
69
  end;
70
 
70
 
71
  TPlayerSprite = class(TPlayerOrEnemy)
71
  TPlayerSprite = class(TPlayerOrEnemyOrItem)
72
  private
72
  private
73
    FTamaCount: Integer; // accessed by TPlayerTamaSprite.Destroy
73
    FTamaCount: Integer; // accessed by TPlayerTamaSprite.Destroy
74
  strict private
74
  strict private
75
    FCounter: Integer;
75
    FCounter: Integer;
76
    FOldTamaTime: Integer;
76
    FOldTamaTime: Integer;
Line 93... Line 93...
93
    constructor Create(AParent: TSprite; APlayerSprite: TPlayerSprite); reintroduce;
93
    constructor Create(AParent: TSprite; APlayerSprite: TPlayerSprite); reintroduce;
94
    destructor Destroy; override;
94
    destructor Destroy; override;
95
  end;
95
  end;
96
 
96
 
97
  TEnemyClass = class of TEnemy;
97
  TEnemyClass = class of TEnemy;
98
  TEnemy = class abstract (TPlayerOrEnemy)
98
  TEnemy = class abstract (TPlayerOrEnemyOrItem)
99
  strict protected
99
  strict protected
100
    FCounter: Integer;
100
    FCounter: Integer;
101
    FLife: integer;
101
    FLife: integer;
102
    procedure HitEnemy(ADead: Boolean); virtual;
102
    procedure HitEnemy(ADead: Boolean); virtual;
103
  public
103
  public
Line 190... Line 190...
190
    procedure HitEnemy(ADead: Boolean); override;
190
    procedure HitEnemy(ADead: Boolean); override;
191
  public
191
  public
192
    constructor Create(AParent: TSprite; ALifes: integer); override;
192
    constructor Create(AParent: TSprite; ALifes: integer); override;
193
  end;
193
  end;
194
 
194
 
-
 
195
  TItemClass = class of TItem;
-
 
196
  TItem = class abstract (TPlayerOrEnemyOrItem)
-
 
197
  strict protected
-
 
198
    procedure DoMove(MoveCount: Integer); override;
-
 
199
  public
-
 
200
    procedure Collected; virtual;
-
 
201
  end;
-
 
202
 
-
 
203
  TItemMedikit = class(TItem)
-
 
204
  public
-
 
205
    procedure Collected; override;
-
 
206
    constructor Create(AParent: TSprite); override;
-
 
207
  end;
-
 
208
 
195
  TMainForm = class(TDXForm)
209
  TMainForm = class(TDXForm)
196
    MainMenu: TMainMenu;
210
    MainMenu: TMainMenu;
197
    Spiel: TMenuItem;
211
    Spiel: TMenuItem;
198
    GameStart: TMenuItem;
212
    GameStart: TMenuItem;
199
    GamePause: TMenuItem;
213
    GamePause: TMenuItem;
Line 471... Line 485...
471
end;
485
end;
472
 
486
 
473
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
487
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
474
begin
488
begin
475
  if mainform.FCheat then exit;
489
  if mainform.FCheat then exit;
-
 
490
  if (Sprite is TItem) then
-
 
491
  begin
-
 
492
    TItem(Sprite).Collected;
-
 
493
  end
476
  if (Sprite is TEnemy) or (Sprite is TEnemyTama) then
494
  else if (Sprite is TEnemy) or (Sprite is TEnemyTama) then
477
  begin
495
  begin
478
    if not mainform.crash then
496
    if not mainform.crash then
479
    begin
497
    begin
480
      dec(MainForm.FLife);
498
      dec(MainForm.FLife);
481
      mainform.Crash := true;
499
      mainform.Crash := true;
Line 1172... Line 1190...
1172
    end;
1190
    end;
1173
  end;
1191
  end;
1174
  inc(FCounter, MoveCount);
1192
  inc(FCounter, MoveCount);
1175
end;
1193
end;
1176
 
1194
 
-
 
1195
{ TItem }
-
 
1196
 
-
 
1197
procedure TItem.Collected;
-
 
1198
begin
-
 
1199
  MainForm.PlaySound(smsItemCollected, false);
-
 
1200
  Dead;
-
 
1201
end;
-
 
1202
 
-
 
1203
procedure TItem.DoMove(MoveCount: Integer);
-
 
1204
begin
-
 
1205
  X := X - MoveCount*(250/1000);
-
 
1206
  if X < -Width then Dead;
-
 
1207
end;
-
 
1208
 
-
 
1209
{ TItemMedikit }
-
 
1210
 
-
 
1211
procedure TItemMedikit.Collected;
-
 
1212
begin
-
 
1213
  Inc(MainForm.FLife);
-
 
1214
  inherited;
-
 
1215
end;
-
 
1216
 
-
 
1217
constructor TItemMedikit.Create(AParent: TSprite);
-
 
1218
begin
-
 
1219
  inherited Create(AParent);
-
 
1220
  State := pesNormal;
-
 
1221
  Image := MainForm.GetSpriteGraphic(smgItemMedikit);
-
 
1222
  Width := Image.Width;
-
 
1223
  Height := Image.Height;
-
 
1224
  AnimCount := Image.PatternCount;
-
 
1225
  AnimLooped := True;
-
 
1226
  AnimSpeed := DEFAULT_ANIMSPEED;
-
 
1227
  PixelCheck := True;
-
 
1228
end;
-
 
1229
 
1177
{ TMainForm }
1230
{ TMainForm }
1178
 
1231
 
1179
procedure TMainForm.FormCreate(Sender: TObject);
1232
procedure TMainForm.FormCreate(Sender: TObject);
1180
begin
1233
begin
1181
  Randomize;
1234
  Randomize;
Line 1799... Line 1852...
1799
var
1852
var
1800
  act: integer;
1853
  act: integer;
1801
  Enemies: array[1..27] of TEnemyType;
1854
  Enemies: array[1..27] of TEnemyType;
1802
  numEnemies: integer;
1855
  numEnemies: integer;
1803
  e: TEnemyAdvent;
1856
  e: TEnemyAdvent;
1804
  bossPosition: integer;
1857
  bossPosition, medikitPosition: integer;
1805
  levFile: TLevelFile;
1858
  levFile: TLevelFile;
1806
begin
1859
begin
1807
  ResetLevelData;
1860
  ResetLevelData;
1808
  if FGameMode = gmRandom then
1861
  if FGameMode = gmRandom then
1809
  begin
1862
  begin
Line 1891... Line 1944...
1891
      e.x := LevelData.EnemyAdventTable[bossPosition-1].x;
1944
      e.x := LevelData.EnemyAdventTable[bossPosition-1].x;
1892
      e.y := (dxdraw.surfaceheight div 2) - (MainForm.GetSpriteGraphic(smgEnemyBoss).height div 2);
1945
      e.y := (dxdraw.surfaceheight div 2) - (MainForm.GetSpriteGraphic(smgEnemyBoss).height div 2);
1893
      e.lifes := lev*5;
1946
      e.lifes := lev*5;
1894
      LevelData.EnemyAdventTable[bossPosition] := e;
1947
      LevelData.EnemyAdventTable[bossPosition] := e;
1895
    end;
1948
    end;
-
 
1949
 
-
 
1950
    medikitPosition := 0;
-
 
1951
    LevelData.EnemyAdventTable[medikitPosition].enemyType := etItemMedikit;
-
 
1952
    LevelData.EnemyAdventTable[medikitPosition].lifes := 0;
-
 
1953
 
1896
    {$ENDREGION}
1954
    {$ENDREGION}
1897
  end
1955
  end
1898
  else
1956
  else
1899
  begin
1957
  begin
1900
    {$REGION 'Normal game'}
1958
    {$REGION 'Normal game'}
Line 2048... Line 2106...
2048
end;
2106
end;
2049
 
2107
 
2050
procedure TMainForm.SceneMain;
2108
procedure TMainForm.SceneMain;
2051
var
2109
var
2052
  Enemy: TSprite;
2110
  Enemy: TSprite;
2053
  spriteClass: TEnemyClass;
2111
  spriteClass: TClass;
2054
  tmpEnemyAnzeige: integer;
2112
  tmpEnemyAnzeige: integer;
2055
begin
2113
begin
2056
  case FInterval of
2114
  case FInterval of
2057
    giLeicht: SpriteEngine.Move(conleicht);
2115
    giLeicht: SpriteEngine.Move(conleicht);
2058
    giMittel: SpriteEngine.Move(conmittel);
2116
    giMittel: SpriteEngine.Move(conmittel);
Line 2076... Line 2134...
2076
        etEnemyAttacker3: spriteClass := TEnemyAttacker3;
2134
        etEnemyAttacker3: spriteClass := TEnemyAttacker3;
2077
        etEnemyMeteor:    spriteClass := TEnemyMeteor;
2135
        etEnemyMeteor:    spriteClass := TEnemyMeteor;
2078
        etEnemyUFO:       spriteClass := TEnemyUFO;
2136
        etEnemyUFO:       spriteClass := TEnemyUFO;
2079
        etEnemyUFO2:      spriteClass := TEnemyUFO2;
2137
        etEnemyUFO2:      spriteClass := TEnemyUFO2;
2080
        etEnemyBoss:      spriteClass := TEnemyBoss;
2138
        etEnemyBoss:      spriteClass := TEnemyBoss;
-
 
2139
        etItemMedikit:    spriteClass := TItemMedikit;
2081
      end;
2140
      end;
2082
      if spriteClass <> nil then
2141
      if spriteClass <> nil then
2083
      begin
2142
      begin
-
 
2143
        Enemy := nil;
-
 
2144
        if spriteClass.InheritsFrom(TEnemy) then
2084
        Enemy := spriteClass.Create(SpriteEngine.Engine, lifes);
2145
          Enemy := TEnemyClass(spriteClass).Create(SpriteEngine.Engine, lifes)
-
 
2146
        else if spriteClass.InheritsFrom(TItem) then
-
 
2147
          Enemy := TItemClass(spriteClass).Create(SpriteEngine.Engine)
-
 
2148
        else
-
 
2149
          Assert(False);
2085
        Enemy.x := dxdraw.surfacewidth;
2150
        Enemy.x := dxdraw.surfacewidth;
2086
        //Enemy.y := y;
2151
        //Enemy.y := y;
2087
        if y <> 0 then
2152
        if y <> 0 then
2088
          Enemy.y := dxdraw.surfaceheight / (480{maximale Bandbreite im alten Format} / y)
2153
          Enemy.y := dxdraw.surfaceheight / (480{maximale Bandbreite im alten Format} / y)
2089
        else
2154
        else