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); |