Subversion Repositories spacemission

Rev

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

Rev 24 Rev 25
Line 9... Line 9...
9
// [OK SVN 19]  Wenn man pause gemacht hat und fenster wechselt und wieder zurückwechselt, ist pause aufgehoben.
9
// [OK SVN 19]  Wenn man pause gemacht hat und fenster wechselt und wieder zurückwechselt, ist pause aufgehoben.
10
// [OK SVN 21]  DPlayX.dll auskommentieren wegen Windows Meldung
10
// [OK SVN 21]  DPlayX.dll auskommentieren wegen Windows Meldung
11
// [OK SVN 22]  Vollbild entf.
11
// [OK SVN 22]  Vollbild entf.
12
// [OK SVN 22]  Credits: unDelphiX (micrel.cz/Dx)
12
// [OK SVN 22]  Credits: unDelphiX (micrel.cz/Dx)
13
// [OK SVN 24]  Quellcode optimieren
13
// [OK SVN 24]  Quellcode optimieren
-
 
14
// [OK SVN 25]  Bug: Zwei Fenster in Taskleiste
14
//              EV CodeSign
15
//              EV CodeSign
15
//              Spielstände usw. "Spiele" Ordner speichern, Config in Registry sichern, etc.
16
//              Spielstände usw. "Spiele" Ordner speichern, Config in Registry sichern, etc.
16
//              Neue Einheiten => Medikit, Ufo das im Kreis fliegt und nicht weggeht
17
//              Neue Einheiten => Medikit, Ufo das im Kreis fliegt und nicht weggeht
17
//              Bei Pause => Entweder alles grau werden lassen
18
//              Bei Pause => Entweder alles grau werden lassen
18
//              Alle Notizen durchschauen
19
//              Alle Notizen durchschauen
19
//              Boss schwieriger machen: Er soll auch nach links und rechts gehen?
20
//              Boss schwieriger machen: Er soll auch nach links und rechts gehen?
20
//              Cooldown für Laser?
21
//              Cooldown für Laser?
21
//              Improve Sound effects
22
//              Improve Sound effects
22
//              Bug: Zwei Fenster in Taskleiste
-
 
23
//              Level-Editor in die SpaceMission.exe rein und über Hauptmenü aufrufen?
23
//              Level-Editor in die SpaceMission.exe rein und über Hauptmenü aufrufen?
24
//              "Doku" in Hilfemenü einbinden, ggf. auch den Leveleditor ins Menü machen
24
//              "Doku" in Hilfemenü einbinden, ggf. auch den Leveleditor ins Menü machen
25
//              Highscore Liste
25
//              Highscore Liste
26
//              Multilingual (all strings in resourcestrings)
26
//              Multilingual (all strings in resourcestrings)
27
//              ESC soll Pause machen und das MainMenu (wie Alt Taste) aufmachen
27
//              ESC soll Pause machen und das MainMenu (wie Alt Taste) aufmachen
Line 98... Line 98...
98
    procedure DoMove(MoveCount: Integer); override;
98
    procedure DoMove(MoveCount: Integer); override;
99
  public
99
  public
100
    constructor Create(AParent: TSprite); override;
100
    constructor Create(AParent: TSprite); override;
101
  end;
101
  end;
102
 
102
 
-
 
103
  TPlayerOrEnemyState = (
-
 
104
    pesUnknown,
-
 
105
    pesNormal,
-
 
106
    pesExploding, // only boss, as preparation of pesDead
-
 
107
    pesDead,
-
 
108
    pesDeadVanished,
-
 
109
    pesFlyaway, // only player at mission end
-
 
110
    pesEntering,
-
 
111
    pesHovering // only some kind of enemies
-
 
112
  );
-
 
113
 
103
  TPlayerState = (pmNormal, pmDead, pmDeadVanished, pmFlyaway, pmEntering);
114
  TPlayerOrEnemy = class abstract (TImageSprite)
-
 
115
  strict protected
-
 
116
    State: TPlayerOrEnemyState;
-
 
117
  end;
-
 
118
 
104
  TPlayerSprite = class(TImageSprite)
119
  TPlayerSprite = class(TPlayerOrEnemy)
105
  private
120
  private
106
    FTamaCount: Integer; // accessed by TPlayerTamaSprite.Destroy
121
    FTamaCount: Integer; // accessed by TPlayerTamaSprite.Destroy
107
  strict private
122
  strict private
108
    FCounter: Integer;
123
    FCounter: Integer;
109
    FState: TPlayerState;
-
 
110
    FOldTamaTime: Integer;
124
    FOldTamaTime: Integer;
111
  strict protected
125
  strict protected
112
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
126
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
113
    procedure DoMove(MoveCount: Integer); override;
127
    procedure DoMove(MoveCount: Integer); override;
114
  public
128
  public
Line 127... Line 141...
127
    constructor Create(AParent: TSprite; APlayerSprite: TPlayerSprite); reintroduce;
141
    constructor Create(AParent: TSprite; APlayerSprite: TPlayerSprite); reintroduce;
128
    destructor Destroy; override;
142
    destructor Destroy; override;
129
  end;
143
  end;
130
 
144
 
131
  TEnemyClass = class of TEnemy;
145
  TEnemyClass = class of TEnemy;
132
  TEnemy = class(TImageSprite)
146
  TEnemy = class abstract (TPlayerOrEnemy)
133
  strict protected
147
  strict protected
134
    FCounter: Integer;
148
    FCounter: Integer;
135
    FLife: integer;
149
    FLife: integer;
136
    FMode: Integer; // TODO: Find out what this does and replace with an Enum (maybe the same as TPlayerState?)
-
 
137
    procedure HitEnemy(ADead: Boolean); virtual;
150
    procedure HitEnemy(ADead: Boolean); virtual;
138
  public
151
  public
139
    property Life: integer read FLife;
152
    property Life: integer read FLife;
140
    procedure Hit(AHitStrength: integer = 1);
153
    procedure Hit(AHitStrength: integer = 1);
141
    constructor Create(AParent: TSprite; ALifes: integer); reintroduce; virtual;
154
    constructor Create(AParent: TSprite; ALifes: integer); reintroduce; virtual;
Line 573... Line 586...
573
{ TPlayerSprite }
586
{ TPlayerSprite }
574
 
587
 
575
constructor TPlayerSprite.Create(AParent: TSprite);
588
constructor TPlayerSprite.Create(AParent: TSprite);
576
begin
589
begin
577
  inherited Create(AParent);
590
  inherited Create(AParent);
-
 
591
  State := pesEntering;
578
  Image := MainForm.ImageList.Items.Find('Machine');
592
  Image := MainForm.ImageList.Items.Find('Machine');
579
  Width := Image.Width;
593
  Width := Image.Width;
580
  Height := Image.Height;
594
  Height := Image.Height;
581
  X := -70{20};
595
  X := -70{20};
582
  Y := mainform.dxdraw.surfaceHeight / 2 - (height / 2);
596
  Y := mainform.dxdraw.surfaceHeight / 2 - (height / 2);
583
  Z := 2;
597
  Z := 2;
584
  AnimCount := Image.PatternCount;
598
  AnimCount := Image.PatternCount;
585
  AnimLooped := True;
599
  AnimLooped := True;
586
  AnimSpeed := DEFAULT_ANIMSPEED;
600
  AnimSpeed := DEFAULT_ANIMSPEED;
587
  FState := pmEntering;
-
 
588
end;
601
end;
589
 
602
 
590
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
603
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
591
begin
604
begin
592
  if mainform.FCheat then exit;
605
  if mainform.FCheat then exit;
Line 599... Line 612...
599
      if MainForm.Flife=0 then
612
      if MainForm.Flife=0 then
600
      begin
613
      begin
601
        MainForm.PlaySound('Explosion', false);
614
        MainForm.PlaySound('Explosion', false);
602
        Collisioned := false;
615
        Collisioned := false;
603
        FCounter := 0;
616
        FCounter := 0;
604
        FState := pmDead;
617
        State := pesDead;
605
        Done := false;
618
        Done := false;
606
        Image := MainForm.ImageList.Items.Find('Explosion');
619
        Image := MainForm.ImageList.Items.Find('Explosion');
607
        Width := Image.Width;
620
        Width := Image.Width;
608
        Height := Image.Height;
621
        Height := Image.Height;
609
        AnimCount := Image.PatternCount;
622
        AnimCount := Image.PatternCount;
Line 626... Line 639...
626
procedure TPlayerSprite.DoMove(MoveCount: Integer);
639
procedure TPlayerSprite.DoMove(MoveCount: Integer);
627
const
640
const
628
  WegduesKonstante = 1.75;
641
  WegduesKonstante = 1.75;
629
begin
642
begin
630
  inherited DoMove(MoveCount);
643
  inherited DoMove(MoveCount);
631
  if FState = pmNormal then
644
  if State = pesNormal then
632
  begin
645
  begin
633
    if isUp in MainForm.DXInput.States then Y := Y - (250/1000)*MoveCount;
646
    if isUp in MainForm.DXInput.States then Y := Y - (250/1000)*MoveCount;
634
    if isDown in MainForm.DXInput.States then Y := Y + (250/1000)*MoveCount;
647
    if isDown in MainForm.DXInput.States then Y := Y + (250/1000)*MoveCount;
635
    if isLeft in MainForm.DXInput.States then X := X - (250/1000)*MoveCount;
648
    if isLeft in MainForm.DXInput.States then X := X - (250/1000)*MoveCount;
636
    if isRight in MainForm.DXInput.States then X := X + (250/1000)*MoveCount;
649
    if isRight in MainForm.DXInput.States then X := X + (250/1000)*MoveCount;
Line 652... Line 665...
652
        FOldTamaTime := FCounter;
665
        FOldTamaTime := FCounter;
653
      end;
666
      end;
654
    end;
667
    end;
655
    Collision;
668
    Collision;
656
  end
669
  end
657
  else if FState = pmDead then
670
  else if State = pesDead then
658
  begin
671
  begin
659
    if FCounter>200 then
672
    if FCounter>200 then
660
    begin
673
    begin
661
      FCounter := 0;
674
      FCounter := 0;
662
      FState := pmDeadVanished;
675
      State := pesDeadVanished;
663
      Visible := false;
676
      Visible := false;
664
    end;
677
    end;
665
  end
678
  end
666
  else if FState = pmDeadVanished then
679
  else if State = pesDeadVanished then
667
  begin
680
  begin
668
    if FCounter>1500 then
681
    if FCounter>1500 then
669
    begin
682
    begin
670
      MainForm.FNextScene := gsGameOver;
683
      MainForm.FNextScene := gsGameOver;
671
      MainForm.PlaySound('SceneMov', false);
684
      MainForm.PlaySound('SceneMov', false);
672
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
685
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
673
      Sleep(200);
686
      Sleep(200);
674
    end;
687
    end;
675
  end
688
  end
676
  else if FState = pmFlyaway then
689
  else if State = pesFlyaway then
677
  begin
690
  begin
678
    // TODO: "Wusch" sound?
691
    // TODO: "Wusch" sound?
679
    X := X + MoveCount*(300/1000) * (X/MainForm.DXDraw.Width + WegduesKonstante);
692
    X := X + MoveCount*(300/1000) * (X/MainForm.DXDraw.Width + WegduesKonstante);
680
    if X > MainForm.DXDraw.Width+Width then
693
    if X > MainForm.DXDraw.Width+Width then
681
    begin
694
    begin
Line 684... Line 697...
684
      MainForm.FNextScene := gsNewLevel;
697
      MainForm.FNextScene := gsNewLevel;
685
      MainForm.PlaySound('SceneMov', false);
698
      MainForm.PlaySound('SceneMov', false);
686
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
699
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
687
    end;
700
    end;
688
  end
701
  end
689
  else if FState = pmEntering then
702
  else if State = pesEntering then
690
  begin
703
  begin
691
    X := X + MoveCount*(300/1000);
704
    X := X + MoveCount*(300/1000);
692
    if X > 19 then FState := pmNormal;
705
    if X > 19 then State := pesNormal;
693
  end;
706
  end;
694
  inc(FCounter, MoveCount);
707
  inc(FCounter, MoveCount);
695
end;
708
end;
696
 
709
 
697
procedure TPlayerSprite.FlyAway;
710
procedure TPlayerSprite.FlyAway;
698
begin
711
begin
699
  FState := pmFlyaway;
712
  State := pesFlyaway;
700
end;
713
end;
701
 
714
 
702
{ TPlayerTamaSprite }
715
{ TPlayerTamaSprite }
703
 
716
 
704
constructor TPlayerTamaSprite.Create(AParent: TSprite; APlayerSprite: TPlayerSprite);
717
constructor TPlayerTamaSprite.Create(AParent: TSprite; APlayerSprite: TPlayerSprite);
Line 799... Line 812...
799
{ TEnemyMeteor }
812
{ TEnemyMeteor }
800
 
813
 
801
constructor TEnemyMeteor.Create(AParent: TSprite; ALifes: integer);
814
constructor TEnemyMeteor.Create(AParent: TSprite; ALifes: integer);
802
begin
815
begin
803
  inherited Create(AParent, ALifes);
816
  inherited Create(AParent, ALifes);
-
 
817
  State := pesNormal;
804
  Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
818
  Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
805
  Width := Image.Width;
819
  Width := Image.Width;
806
  Height := Image.Height;
820
  Height := Image.Height;
807
  AnimCount := Image.PatternCount;
821
  AnimCount := Image.PatternCount;
808
  AnimLooped := True;
822
  AnimLooped := True;
Line 826... Line 840...
826
{ TEnemyUFO }
840
{ TEnemyUFO }
827
 
841
 
828
constructor TEnemyUFO.Create(AParent: TSprite; ALifes: integer);
842
constructor TEnemyUFO.Create(AParent: TSprite; ALifes: integer);
829
begin
843
begin
830
  inherited Create(AParent, ALifes);
844
  inherited Create(AParent, ALifes);
-
 
845
  State := pesNormal;
831
  Image := MainForm.ImageList.Items.Find('Enemy-disk');
846
  Image := MainForm.ImageList.Items.Find('Enemy-disk');
832
  Width := Image.Width;
847
  Width := Image.Width;
833
  Height := Image.Height;
848
  Height := Image.Height;
834
  AnimCount := Image.PatternCount;
849
  AnimCount := Image.PatternCount;
835
  AnimLooped := True;
850
  AnimLooped := True;
Line 840... Line 855...
840
begin
855
begin
841
  inherited HitEnemy(ADead);
856
  inherited HitEnemy(ADead);
842
 
857
 
843
  if ADead then
858
  if ADead then
844
  begin
859
  begin
845
    FMode := 2;
860
    State := pesDead;
846
    FCounter := 0;
861
    FCounter := 0;
847
    Inc(MainForm.FScore, 1000);
862
    Inc(MainForm.FScore, 1000);
848
    Image := MainForm.ImageList.Items.Find('Explosion');
863
    Image := MainForm.ImageList.Items.Find('Explosion');
849
    Width := Image.Width;
864
    Width := Image.Width;
850
    Height := Image.Height;
865
    Height := Image.Height;
Line 860... Line 875...
860
end;
875
end;
861
 
876
 
862
procedure TEnemyUFO.DoMove(MoveCount: Integer);
877
procedure TEnemyUFO.DoMove(MoveCount: Integer);
863
begin
878
begin
864
  inherited DoMove(MoveCount);
879
  inherited DoMove(MoveCount);
865
  if FMode=0 then
880
  if State = pesNormal then
866
  begin
881
  begin
867
    X := X - MoveCount*(300/1000);
882
    X := X - MoveCount*(300/1000);
868
    Y := Y + Cos256(FCounter div 15)*2;
883
    Y := Y + Cos256(FCounter div 15)*2;
869
    if X<-Width then Dead;
884
    if X < -Width then Dead;
870
  end
885
  end
871
  else if FMode=2 then
886
  else if State = pesDead then
872
  begin
887
  begin
873
    X := X - MoveCount*(300/1000);
888
    X := X - MoveCount*(300/1000);
874
    if FCounter>200 then Dead;
889
    if FCounter>200 then
-
 
890
    begin
-
 
891
      State := pesDeadVanished;
-
 
892
      Dead;
-
 
893
    end;
875
  end;
894
  end;
876
  inc(FCounter, MoveCount);
895
  inc(FCounter, MoveCount);
877
end;
896
end;
878
 
897
 
879
{ TEnemyUFO2 }
898
{ TEnemyUFO2 }
880
 
899
 
881
constructor TEnemyUFO2.Create(AParent: TSprite; ALifes: integer);
900
constructor TEnemyUFO2.Create(AParent: TSprite; ALifes: integer);
882
begin
901
begin
883
  inherited Create(AParent, ALifes);
902
  inherited Create(AParent, ALifes);
-
 
903
  State := pesNormal;
884
  Image := MainForm.ImageList.Items.Find('Enemy-disk2');
904
  Image := MainForm.ImageList.Items.Find('Enemy-disk2');
885
  Width := Image.Width;
905
  Width := Image.Width;
886
  Height := Image.Height;
906
  Height := Image.Height;
887
  AnimCount := Image.PatternCount;
907
  AnimCount := Image.PatternCount;
888
  AnimLooped := True;
908
  AnimLooped := True;
Line 893... Line 913...
893
begin
913
begin
894
  inherited HitEnemy(ADead);
914
  inherited HitEnemy(ADead);
895
 
915
 
896
  if ADead then
916
  if ADead then
897
  begin
917
  begin
898
    FMode := 2;
918
    State := pesDead;
899
    FCounter := 0;
919
    FCounter := 0;
900
    Inc(MainForm.FScore, 1000);
920
    Inc(MainForm.FScore, 1000);
901
    Image := MainForm.ImageList.Items.Find('Explosion');
921
    Image := MainForm.ImageList.Items.Find('Explosion');
902
    Width := Image.Width;
922
    Width := Image.Width;
903
    Height := Image.Height;
923
    Height := Image.Height;
Line 913... Line 933...
913
end;
933
end;
914
 
934
 
915
procedure TEnemyUFO2.DoMove(MoveCount: Integer);
935
procedure TEnemyUFO2.DoMove(MoveCount: Integer);
916
begin
936
begin
917
  inherited DoMove(MoveCount);
937
  inherited DoMove(MoveCount);
918
  if FMode=0 then
938
  if State = pesNormal then
919
  begin
939
  begin
920
    X := X - MoveCount*(300/1000);
940
    X := X - MoveCount*(300/1000);
921
    Y := Y + Cos256(FCounter div 15)*2;
941
    Y := Y + Cos256(FCounter div 15)*2;
922
    if X<-Width then Dead;
942
    if X < -Width then Dead;
923
    if FCounter-FOldTamaTime>=100 then
943
    if FCounter-FOldTamaTime>=100 then
Line 930... Line 950...
930
        Z := 10;
950
        Z := 10;
931
      end;
951
      end;
932
      FOldTamaTime := FCounter;
952
      FOldTamaTime := FCounter;
933
    end;
953
    end;
934
  end
954
  end
935
  else if FMode=2 then
955
  else if State = pesDead then
936
  begin
956
  begin
937
    X := X - MoveCount*(300/1000);
957
    X := X - MoveCount*(300/1000);
938
    if FCounter>200 then Dead;
958
    if FCounter>200 then
-
 
959
    begin
-
 
960
      State := pesDeadVanished;
-
 
961
      Dead;
-
 
962
    end;
939
  end;
963
  end;
940
  inc(FCounter, MoveCount);
964
  inc(FCounter, MoveCount);
941
end;
965
end;
942
 
966
 
943
{ TEnemyAttacker }
967
{ TEnemyAttacker }
944
 
968
 
945
constructor TEnemyAttacker.Create(AParent: TSprite; ALifes: integer);
969
constructor TEnemyAttacker.Create(AParent: TSprite; ALifes: integer);
946
begin
970
begin
947
  inherited Create(AParent, ALifes);
971
  inherited Create(AParent, ALifes);
-
 
972
  State := pesNormal;
948
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
973
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
949
  Width := Image.Width;
974
  Width := Image.Width;
950
  Height := Image.Height;
975
  Height := Image.Height;
951
  AnimCount := Image.PatternCount;
976
  AnimCount := Image.PatternCount;
952
  AnimLooped := True;
977
  AnimLooped := True;
Line 958... Line 983...
958
begin
983
begin
959
  inherited HitEnemy(ADead);
984
  inherited HitEnemy(ADead);
960
 
985
 
961
  if ADead then
986
  if ADead then
962
  begin
987
  begin
963
    FMode := 2;
988
    State := pesDead;
964
    FCounter := 0;
989
    FCounter := 0;
965
    Inc(MainForm.FScore, 1000);
990
    Inc(MainForm.FScore, 1000);
966
    Image := MainForm.ImageList.Items.Find('Explosion');
991
    Image := MainForm.ImageList.Items.Find('Explosion');
967
    Width := Image.Width;
992
    Width := Image.Width;
968
    Height := Image.Height;
993
    Height := Image.Height;
Line 978... Line 1003...
978
end;
1003
end;
979
 
1004
 
980
procedure TEnemyAttacker.DoMove(MoveCount: Integer);
1005
procedure TEnemyAttacker.DoMove(MoveCount: Integer);
981
begin
1006
begin
982
  inherited DoMove(MoveCount);
1007
  inherited DoMove(MoveCount);
983
  if FMode=0 then
1008
  if State = pesNormal then
984
  begin
1009
  begin
985
    X := X - MoveCount*(300/1000)-FCounter div 128;
1010
    X := X - MoveCount*(300/1000)-FCounter div 128;
986
    if X < -Width then Dead;
1011
    if X < -Width then Dead;
987
  end
1012
  end
988
  else if FMode=2 then
1013
  else if State = pesDead then
989
  begin
1014
  begin
990
    X := X - MoveCount*(300/1000);
1015
    X := X - MoveCount*(300/1000);
991
    if FCounter>200 then Dead;
1016
    if FCounter>200 then
-
 
1017
    begin
-
 
1018
      State := pesDeadVanished;
-
 
1019
      Dead;
-
 
1020
    end;
992
  end;
1021
  end;
993
  inc(FCounter, MoveCount);
1022
  inc(FCounter, MoveCount);
994
end;
1023
end;
995
 
1024
 
996
{ TEnemyAttacker2 }
1025
{ TEnemyAttacker2 }
997
 
1026
 
998
constructor TEnemyAttacker2.Create(AParent: TSprite; ALifes: integer);
1027
constructor TEnemyAttacker2.Create(AParent: TSprite; ALifes: integer);
999
begin
1028
begin
1000
  inherited Create(AParent, ALifes);
1029
  inherited Create(AParent, ALifes);
-
 
1030
  State := pesEntering;
1001
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
1031
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
1002
  Width := Image.Width;
1032
  Width := Image.Width;
1003
  Height := Image.Height;
1033
  Height := Image.Height;
1004
  AnimCount := Image.PatternCount;
1034
  AnimCount := Image.PatternCount;
1005
  AnimLooped := True;
1035
  AnimLooped := True;
Line 1011... Line 1041...
1011
begin
1041
begin
1012
  inherited HitEnemy(ADead);
1042
  inherited HitEnemy(ADead);
1013
 
1043
 
1014
  if ADead then
1044
  if ADead then
1015
  begin
1045
  begin
1016
    FMode := 2;
1046
    State := pesDead;
1017
    FCounter := 0;
1047
    FCounter := 0;
1018
    Inc(MainForm.FScore, 5000);
1048
    Inc(MainForm.FScore, 5000);
1019
    Image := MainForm.ImageList.Items.Find('Explosion');
1049
    Image := MainForm.ImageList.Items.Find('Explosion');
1020
    Width := Image.Width;
1050
    Width := Image.Width;
1021
    Height := Image.Height;
1051
    Height := Image.Height;
Line 1031... Line 1061...
1031
end;
1061
end;
1032
 
1062
 
1033
procedure TEnemyAttacker2.DoMove(MoveCount: Integer);
1063
procedure TEnemyAttacker2.DoMove(MoveCount: Integer);
1034
begin
1064
begin
1035
  inherited DoMove(MoveCount);
1065
  inherited DoMove(MoveCount);
1036
  if FMode=0 then
1066
  if State = pesEntering then
1037
  begin
1067
  begin
1038
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/2)){450} then
1068
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/2)){450} then
1039
      X := X - MoveCount*(300/1000)
1069
      X := X - MoveCount*(300/1000)
1040
    else
1070
    else
1041
    begin
1071
    begin
1042
      Collisioned := True;
1072
      Collisioned := True;
1043
      FMode := 1;
1073
      State := pesHovering;
1044
      FPutTama := True;
1074
      FPutTama := True;
1045
    end;
1075
    end;
1046
    Y := Y + Cos256(FCounter div 15)*5;
1076
    Y := Y + Cos256(FCounter div 15)*5;
1047
  end
1077
  end
1048
  else if FMode=1 then
1078
  else if State = pesHovering then
1049
  begin
1079
  begin
1050
    Y := Y + Cos256(FCounter div 15)*5;
1080
    Y := Y + Cos256(FCounter div 15)*5;
1051
    if FPutTama then
1081
    if FPutTama then
1052
    begin
1082
    begin
1053
      if FTamaT>100 then
1083
      if FTamaT>100 then
Line 1073... Line 1103...
1073
        FTamaF := 0;
1103
        FTamaF := 0;
1074
        FTamaT := 0;
1104
        FTamaT := 0;
1075
      end;
1105
      end;
1076
    end;
1106
    end;
1077
  end
1107
  end
1078
  else if FMode=2 then
1108
  else if State = pesDead then
1079
  begin
1109
  begin
1080
    if FCounter>200 then Dead;
1110
    if FCounter>200 then
-
 
1111
    begin
-
 
1112
      State := pesDeadVanished;
-
 
1113
      Dead;
-
 
1114
    end;
1081
  end;
1115
  end;
1082
  inc(FCounter, MoveCount);
1116
  inc(FCounter, MoveCount);
1083
end;
1117
end;
1084
 
1118
 
1085
{ TEnemyAttacker3 }
1119
{ TEnemyAttacker3 }
1086
 
1120
 
1087
constructor TEnemyAttacker3.Create(AParent: TSprite; ALifes: integer);
1121
constructor TEnemyAttacker3.Create(AParent: TSprite; ALifes: integer);
1088
begin
1122
begin
1089
  inherited Create(AParent, ALifes);
1123
  inherited Create(AParent, ALifes);
-
 
1124
  State := pesNormal;
1090
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
1125
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
1091
  Width := Image.Width;
1126
  Width := Image.Width;
1092
  Height := Image.Height;
1127
  Height := Image.Height;
1093
  AnimCount := Image.PatternCount;
1128
  AnimCount := Image.PatternCount;
1094
  AnimLooped := True;
1129
  AnimLooped := True;
Line 1100... Line 1135...
1100
begin
1135
begin
1101
  inherited HitEnemy(ADead);
1136
  inherited HitEnemy(ADead);
1102
 
1137
 
1103
  if ADead then
1138
  if ADead then
1104
  begin
1139
  begin
1105
    FMode := 1;
1140
    State := pesDead;
1106
    FCounter := 0;
1141
    FCounter := 0;
1107
    Inc(MainForm.FScore, 5000);
1142
    Inc(MainForm.FScore, 5000);
1108
    Image := MainForm.ImageList.Items.Find('Explosion');
1143
    Image := MainForm.ImageList.Items.Find('Explosion');
1109
    Width := Image.Width;
1144
    Width := Image.Width;
1110
    Height := Image.Height;
1145
    Height := Image.Height;
Line 1120... Line 1155...
1120
end;
1155
end;
1121
 
1156
 
1122
procedure TEnemyAttacker3.DoMove(MoveCount: Integer);
1157
procedure TEnemyAttacker3.DoMove(MoveCount: Integer);
1123
begin
1158
begin
1124
  inherited DoMove(MoveCount);
1159
  inherited DoMove(MoveCount);
1125
  if FMode=0 then
1160
  if State = pesNormal then
1126
  begin
1161
  begin
1127
    X := X - (250/1000)*MoveCount;
1162
    X := X - (250/1000)*MoveCount;
1128
    if X<-Width then Dead;
1163
    if X < -Width then Dead;
1129
    if FCounter-FOldTamaTime>=100 then
1164
    if FCounter-FOldTamaTime>=100 then
1130
    begin
1165
    begin
Line 1136... Line 1171...
1136
        Z := 10;
1171
        Z := 10;
1137
      end;
1172
      end;
1138
      FOldTamaTime := FCounter;
1173
      FOldTamaTime := FCounter;
1139
     end;
1174
     end;
1140
  end
1175
  end
1141
  else if FMode=1 then
1176
  else if State = pesDead then
1142
  begin
1177
  begin
1143
    if FCounter>200 then Dead;
1178
    if FCounter>200 then
-
 
1179
    begin
-
 
1180
      State := pesDeadVanished;
-
 
1181
      Dead;
-
 
1182
    end;
1144
  end;
1183
  end;
1145
  inc(FCounter, MoveCount);
1184
  inc(FCounter, MoveCount);
1146
end;
1185
end;
1147
 
1186
 
1148
{ TEnemyBoss }
1187
{ TEnemyBoss }
1149
 
1188
 
1150
constructor TEnemyBoss.Create(AParent: TSprite; ALifes: integer);
1189
constructor TEnemyBoss.Create(AParent: TSprite; ALifes: integer);
1151
begin
1190
begin
1152
  inherited Create(AParent, ALifes);
1191
  inherited Create(AParent, ALifes);
-
 
1192
  State := pesEntering;
1153
  Image := MainForm.ImageList.Items.Find('Enemy-boss');
1193
  Image := MainForm.ImageList.Items.Find('Enemy-boss');
1154
  Width := Image.Width;
1194
  Width := Image.Width;
1155
  Height := Image.Height;
1195
  Height := Image.Height;
1156
  BossExists := true;
1196
  BossExists := true;
1157
  MainForm.MusicSwitchTrack(mtBoss);
1197
  MainForm.MusicSwitchTrack(mtBoss);
Line 1169... Line 1209...
1169
begin
1209
begin
1170
  inherited HitEnemy(ADead);
1210
  inherited HitEnemy(ADead);
1171
 
1211
 
1172
  if ADead then
1212
  if ADead then
1173
  begin
1213
  begin
1174
    FMode := 2;
1214
    State := pesExploding; // not pesDead for the boss!
1175
    FCounter := 0;
1215
    FCounter := 0;
1176
    Inc(MainForm.FScore, 100000);
1216
    Inc(MainForm.FScore, 100000);
1177
    BossExists := false;
1217
    BossExists := false;
1178
    dec(MainForm.FBossLife);
1218
    dec(MainForm.FBossLife);
1179
  end
1219
  end
Line 1185... Line 1225...
1185
end;
1225
end;
1186
 
1226
 
1187
procedure TEnemyBoss.DoMove(MoveCount: Integer);
1227
procedure TEnemyBoss.DoMove(MoveCount: Integer);
1188
begin
1228
begin
1189
  inherited DoMove(MoveCount);
1229
  inherited DoMove(MoveCount);
1190
  if FMode=0 then
1230
  if State = pesEntering then
1191
  begin
1231
  begin
1192
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/4)){450} then
1232
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/4)){450} then
1193
      X := X - MoveCount*(300/1000)
1233
      X := X - MoveCount*(300/1000)
1194
    else
1234
    else
1195
    begin
1235
    begin
1196
      Collisioned := True;
1236
      Collisioned := True;
1197
      FMode := 1;
1237
      State := pesHovering;
1198
      FPutTama := True;
1238
      FPutTama := True;
1199
    end;
1239
    end;
1200
    Y := Y + Cos256(FCounter div 15)*5;
1240
    Y := Y + Cos256(FCounter div 15)*5;
1201
  end
1241
  end
1202
  else if FMode=1 then
1242
  else if State = pesHovering then
1203
  begin
1243
  begin
1204
    Y := Y + Cos256(FCounter div 15)*5;
1244
    Y := Y + Cos256(FCounter div 15)*5;
1205
    if FPutTama then
1245
    if FPutTama then
1206
    begin
1246
    begin
1207
      if FTamaT>100 then
1247
      if FTamaT>100 then
Line 1227... Line 1267...
1227
        FTamaF := 0;
1267
        FTamaF := 0;
1228
        FTamaT := 0;
1268
        FTamaT := 0;
1229
      end;
1269
      end;
1230
    end;
1270
    end;
1231
  end
1271
  end
1232
  else if FMode=2 then
1272
  else if State = pesExploding then
1233
  begin
1273
  begin
1234
    inc(waiter1);
1274
    inc(waiter1);
1235
    if waiter1 = 3 then
1275
    if waiter1 = 3 then
1236
    begin
1276
    begin
1237
      waiter1 := 0;
1277
      waiter1 := 0;
Line 1245... Line 1285...
1245
          Y := Self.Y+Random(Self.Height)-16;
1285
          Y := Self.Y+Random(Self.Height)-16;
1246
        end;
1286
        end;
1247
      end
1287
      end
1248
      else
1288
      else
1249
      begin
1289
      begin
1250
        Inc(MainForm.FScore, 1000);
1290
        Inc(MainForm.FScore, 10000);
1251
        FMode := 3;
1291
        State := pesDead;
1252
      end;
1292
      end;
1253
    end;
1293
    end;
1254
  end
1294
  end
1255
  else if FMode=3 then
1295
  else if State = pesDead then
-
 
1296
  begin
-
 
1297
    if FCounter>4000 then
1256
  begin
1298
    begin
1257
    if FCounter>4000 then Dead;
1299
      State := pesDeadVanished;
-
 
1300
      Dead;
-
 
1301
    end;
1258
  end;
1302
  end;
1259
  inc(FCounter, MoveCount);
1303
  inc(FCounter, MoveCount);
1260
end;
1304
end;
1261
 
1305
 
1262
{ TMainForm }
1306
{ TMainForm }
Line 2171... Line 2215...
2171
        DXDraw.Surface.Canvas.Font.Color := clGreen;
2215
        DXDraw.Surface.Canvas.Font.Color := clGreen;
2172
        DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission erfolgreich!');
2216
        DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission erfolgreich!');
2173
        DXDraw.Surface.Canvas.Font.Color := clLime;
2217
        DXDraw.Surface.Canvas.Font.Color := clLime;
2174
        DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission erfolgreich!');
2218
        DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission erfolgreich!');
2175
        DXDraw.Surface.Canvas.Release;
2219
        DXDraw.Surface.Canvas.Release;
2176
        Sleep(1);
2220
        Sleep(1); // TODO: man merkt hier einen lag!
2177
        inc(FCounter);
2221
        inc(FCounter);
2178
        if FCounter>150{200} then PlayerSprite.FlyAway;
2222
        if FCounter>150{200} then PlayerSprite.FlyAway;
2179
      end;
2223
      end;
2180
    end
2224
    end
2181
    else
2225
    else
Line 2248... Line 2292...
2248
    DXDraw.Surface.Canvas.Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2292
    DXDraw.Surface.Canvas.Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2249
  end;
2293
  end;
2250
  BlinkUpdate;
2294
  BlinkUpdate;
2251
  DXDraw.Surface.Canvas.Release;
2295
  DXDraw.Surface.Canvas.Release;
2252
 
2296
 
-
 
2297
  // Weiter mit Leertaste oder Enter
2253
  if isButton1 in DXInput.States then
2298
  if (isButton1 in DXInput.States) or (isButton2 in DXInput.States) then
2254
  begin
2299
  begin
2255
    PlaySound('SceneMov', False);
2300
    PlaySound('SceneMov', False);
2256
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2301
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2257
    Sleep(200);
2302
    Sleep(200);
2258
    StartScene(gsTitle);
2303
    StartScene(gsTitle);
Line 2305... Line 2350...
2305
    DXDraw.Surface.Canvas.Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2350
    DXDraw.Surface.Canvas.Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2306
  end;
2351
  end;
2307
  BlinkUpdate;
2352
  BlinkUpdate;
2308
  DXDraw.Surface.Canvas.Release;
2353
  DXDraw.Surface.Canvas.Release;
2309
 
2354
 
-
 
2355
  // Weiter mit Leertaste oder Enter
2310
  if isButton1 in DXInput.States then
2356
  if (isButton1 in DXInput.States) or (isButton2 in DXInput.States) then
2311
  begin
2357
  begin
2312
    PlaySound('SceneMov', False);
2358
    PlaySound('SceneMov', False);
2313
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2359
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2314
    Sleep(200);
2360
    Sleep(200);
2315
    StartScene(gsMain);
2361
    StartScene(gsMain);