Skip to content

Commit f8db73d

Browse files
authored
Merge pull request #2 from phomm/dev
recent dev - web, android fixes, new credits/about scene
2 parents bd88fd6 + dab8d9a commit f8db73d

17 files changed

Lines changed: 882 additions & 178 deletions

CastleEngineManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,6 @@ See https://castle-engine.io/project_manifest for documentation of this file.
5757
<service name="keyboard" />
5858
</services>
5959
</android>
60+
<!--Exclusion for WEB until music is supported-->
61+
<!--<package><exclude path="data/music/*" /></package>-->
6062
</project>

code/gameviewcredits.pas

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
unit GameViewCredits;
22

3+
{$mode delphi}
4+
35
interface
46

57
uses
@@ -11,15 +13,21 @@ interface
1113
type
1214
TViewCredits = class(TCastleView)
1315
published
14-
ButtonMenu, ButtonCastle, ButtonAuthor: TCastleButton;
16+
ButtonMenu, ButtonCredits, ButtonRules, ButtonKeys, ButtonWeapon,
17+
ButtonCastle, ButtonAuthor, ButtonItch, ButtonDiscord, ButtonWeb: TCastleButton;
18+
GroupCredits, GroupRules, GroupKeys, GroupWeapon: TCastleUserInterface;
1519
public
1620
constructor Create(AOwner: TComponent); override;
1721
procedure Start; override;
1822
function Press(const Event: TInputPressRelease): Boolean; override;
1923
private
2024
procedure ButtonMenuClick(Sender: TObject);
25+
procedure ButtonPanelClick(Sender: TObject);
2126
procedure ButtonCastleClick(Sender: TObject);
2227
procedure ButtonAuthorClick(Sender: TObject);
28+
procedure ButtonItchClick(Sender: TObject);
29+
procedure ButtonDiscordClick(Sender: TObject);
30+
procedure ButtonWebClick(Sender: TObject);
2331
end;
2432

2533
var
@@ -31,7 +39,7 @@ implementation
3139
// System
3240
SysUtils,
3341
// Castle
34-
castlewindow, CastleOpenDocument,
42+
castlewindow, CastleOpenDocument, CastleApplicationProperties,
3543
// Own
3644
gameviewmain;
3745

@@ -44,9 +52,18 @@ constructor TViewCredits.Create(AOwner: TComponent);
4452
procedure TViewCredits.Start;
4553
begin
4654
inherited;
47-
ButtonMenu.OnClick := @ButtonMenuClick;
48-
ButtonCastle.OnClick := @ButtonCastleClick;
49-
ButtonAuthor.OnClick := @ButtonAuthorClick;
55+
ButtonMenu.OnClick := ButtonMenuClick;
56+
ButtonCredits.OnClick := ButtonPanelClick;
57+
ButtonRules.OnClick := ButtonPanelClick;
58+
ButtonKeys.OnClick := ButtonPanelClick;
59+
ButtonWeapon.OnClick := ButtonPanelClick;
60+
ButtonCastle.OnClick := ButtonCastleClick;
61+
ButtonAuthor.OnClick := ButtonAuthorClick;
62+
ButtonItch.OnClick := ButtonItchClick;
63+
ButtonDiscord.OnClick := ButtonDiscordClick;
64+
ButtonWeb.OnClick := ButtonWebClick;
65+
66+
ButtonKeys.Exists := ApplicationProperties.ShowUserInterfaceToQuit {$IFDEF WASI} or True {$ENDIF};
5067
end;
5168

5269
function TViewCredits.Press(const Event: TInputPressRelease): Boolean;
@@ -74,6 +91,33 @@ procedure TViewCredits.ButtonCastleClick(Sender: TObject);
7491
procedure TViewCredits.ButtonAuthorClick(Sender: TObject);
7592
begin
7693
OpenURL('https://github.com/phomm/Towerfight');
77-
end;
94+
end;
95+
96+
procedure TViewCredits.ButtonItchClick(Sender: TObject);
97+
begin
98+
OpenURL('https://phomm.itch.io/tower-fight');
99+
end;
100+
101+
procedure TViewCredits.ButtonDiscordClick(Sender: TObject);
102+
begin
103+
OpenURL('https://discord.gg/fz7bbM3dr3');
104+
end;
105+
106+
procedure TViewCredits.ButtonWebClick(Sender: TObject);
107+
begin
108+
OpenURL('https://ephyre.ru');
109+
end;
110+
111+
procedure TViewCredits.ButtonPanelClick(Sender: TObject);
112+
begin
113+
GroupCredits.Exists := Sender = ButtonCredits;
114+
GroupRules.Exists := Sender = ButtonRules;
115+
GroupKeys.Exists := Sender = ButtonKeys;
116+
GroupWeapon.Exists := Sender = ButtonWeapon;
117+
ButtonCredits.Pressed := Sender = ButtonCredits;
118+
ButtonRules.Pressed := Sender = ButtonRules;
119+
ButtonKeys.Pressed := Sender = ButtonKeys;
120+
ButtonWeapon.Pressed := Sender = ButtonWeapon;
121+
end;
78122

79123
end.

code/gameviewformula.pas

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ TViewFormula = class(TCastleView)
2121
These fields will be automatically initialized at Start. }
2222
ButtonGo: TCastleButton;
2323
GroupElements: TCastleHorizontalGroup;
24+
ImageEnemy: TCastleImageControl;
25+
LabelHeroLevel: TCastleLabel;
2426
public
2527
RoomComponent: TRoomComponent;
2628
constructor Create(AOwner: TComponent); override;
@@ -83,7 +85,7 @@ procedure TViewFormula.Resume;
8385
if AMarked then
8486
begin
8587
LButton.ImageScale := 0.2;
86-
LButton.Image.Url := 'castle-data:/resources/' + WeaponFileNames[Weapon];
88+
LButton.Image.Url := 'castle-data:/resources/' + WeaponFileNames[Weapon];
8789
end
8890
else
8991
begin
@@ -102,6 +104,8 @@ procedure TViewFormula.Resume;
102104
inherited;
103105
Weapon := TMap.Map.Hero.Weapon;
104106
LActor := TMap.Map.GetRoomByIndex(RoomComponent.Tag).Actors[0];
107+
ImageEnemy.Url := LActor.AssetId;
108+
LabelHeroLevel.Caption := TMap.Map.Hero.Visual;
105109
Formula := LActor.Visual;
106110
GroupElements.ClearControls();
107111
SetLength(FPositions, Length(Formula) + 1);

code/gameviewgame.pas

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ TViewGame = class(TCastleView)
2424
BloodSplash0, BloodSplash1, BloodSplash2: TCastleScene;
2525
Viewport1: TCastleViewport;
2626
ImageWeapon: TCastleImageControl;
27-
TimerGame, TimerHint: TCastleTimer;
27+
TimerBlood, TimerGame, TimerHint: TCastleTimer;
2828
function GetMap(): TMap;
2929
property Map: TMap read GetMap;
3030
protected
@@ -46,15 +46,14 @@ TViewGame = class(TCastleView)
4646
FPosFrom, FPosTo: TVector2;
4747
FAnimateWeaponTicks, FGameTicks: Integer;
4848
FRoomFight: TRoomComponent;
49-
FBloodTime: Single;
5049
procedure ButtonDefeatClick(Sender: TObject);
5150
procedure ButtonRoomClick(Sender: TObject);
5251
procedure ButtonWeaponClick(Sender: TObject);
5352
procedure RunAnimation(AScene: TCastleScene; ARoom: TCastleUserInterface);
5453
procedure AnimationStopped(const AScene: TCastleSceneCore; const ATimeSensorNode: TTimeSensorNode);
5554
function RandomBloodSplash(): TCastleScene;
5655
procedure DefeatQuestionYes(Sender: TObject);
57-
procedure TimerBloodTrigger();
56+
procedure TimerBloodTick(ASender: TObject);
5857
procedure TimerGameTick(ASender: TObject);
5958
procedure TimerHintTick(ASender: TObject);
6059
procedure WeaponHint(ADoShow: Boolean; AWeapon: NHeroWeapon = hwNo);
@@ -148,7 +147,9 @@ procedure TViewGame.Start();
148147
FWeapons[1] := WeaponPlus;
149148
FWeapons[2] := WeaponMinus;
150149
FWeapons[3] := WeaponMultiply;
151-
WeaponNo.DoClick();
150+
WeaponNo.DoClick();
151+
TimerBlood.Exists := False;
152+
TimerBlood.OnTimer := TimerBloodTick;
152153
TimerHint.OnTimer := TimerHintTick;
153154
TimerGame.OnTimer := TimerGameTick;
154155
TimerGame.IntervalSeconds := 1;
@@ -208,7 +209,7 @@ procedure TViewGame.ButtonWeaponClick(Sender: TObject);
208209
LWeaponButton := Sender as TCastleButton;
209210
for i := 0 to High(FWeapons) do
210211
begin
211-
LIsWeapon := FWeapons[i] = LWeaponButton;
212+
LIsWeapon := FWeapons[i] = LWeaponButton;
212213
if LIsWeapon then
213214
begin
214215
if not FInternalWeaponSwitch then
@@ -237,7 +238,8 @@ procedure TViewGame.Stop();
237238
begin
238239
inherited;
239240
TMap.Die();
240-
FPreviousRoom := nil;
241+
FPreviousRoom := nil;
242+
FPause := True;
241243
end;
242244

243245
procedure TViewGame.ButtonDefeatClick(Sender: TObject);
@@ -268,20 +270,11 @@ procedure TViewGame.Update(const SecondsPassed: Single; var HandleInput: boolean
268270
begin
269271
ImageWeapon.Url := '';
270272
WeaponClick(hwNo);
271-
end;
273+
end;
272274
end;
273275
if not FPause and (Map.Hero.Weapon <> hwNo) then
274276
with FPreviousRoom.ImageHeroWeapon do
275277
Rotation := Rotation + 4 * SecondsPassed;
276-
if not FPause and (FBloodTime > 0) then
277-
begin
278-
FBloodTime := FBloodTime - SecondsPassed;
279-
if FBloodTime <= 0 then
280-
begin
281-
TimerBloodTrigger();
282-
FBloodTime := 0;
283-
end;
284-
end;
285278
end;
286279

287280
function TViewGame.Press(const Event: TInputPressRelease): Boolean;
@@ -306,7 +299,7 @@ function TViewGame.Press(const Event: TInputPressRelease): Boolean;
306299
if Result then Exit; // allow the ancestor to handle keys
307300
if FPause then Exit;
308301

309-
if Event.IsKey(keyEscape) or Event.IsKey(keyBackSpace) then
302+
if Event.IsKey(keyEscape) or Event.IsKey(keyBackSpace) or Event.IsKey(keyEnter) then
310303
begin
311304
ButtonDefeat.DoClick();
312305
Exit(True); // key was handled
@@ -317,20 +310,20 @@ function TViewGame.Press(const Event: TInputPressRelease): Boolean;
317310
W := Ord(Map.Hero.Weapon);
318311
repeat
319312
W := (W + 1) mod Length(FWeapons);
320-
until FWeapons[W].Enabled;
321-
WeaponClick(NHeroWeapon(W), True);
313+
until FWeapons[W].Enabled;
314+
WeaponClick(NHeroWeapon(W), True);
322315
Exit(True); // key was handled
323316
end;
324317

325318
if Event.Key in [key1, key2, key3, key4] then
326319
begin
327-
WeaponClick(NHeroWeapon(Ord(Event.Key) - Ord(key1)), True);
320+
WeaponClick(NHeroWeapon(Ord(Event.Key) - Ord(key1)), True);
328321
Exit(True); // key was handled
329322
end;
330323

331324
if Event.Key in [keyNumpad1, keyNumpad2, keyNumpad3, keyNumpad4] then
332325
begin
333-
WeaponClick(NHeroWeapon(Ord(Event.Key) - Ord(keyNumpad1)), True);
326+
WeaponClick(NHeroWeapon(Ord(Event.Key) - Ord(keyNumpad1)), True);
334327
Exit(True); // key was handled
335328
end;
336329

@@ -366,11 +359,11 @@ procedure TViewGame.ButtonRoomClick(Sender: TObject);
366359
begin
367360
FPreviousRoom.LabelLeft.Caption := '';
368361
FPreviousRoom.ImageLeft.Url := '';
369-
FPreviousRoom.ImageHeroWeapon.Url := '';
362+
FPreviousRoom.ImageHeroWeapon.Url := '';
370363
end;
371364

372365
// Show image on currently clicked button
373-
FPreviousRoom := LRoom;
366+
FPreviousRoom := LRoom;
374367
LRoom.ImageLeft.Url := Map.Hero.AssetId;
375368
LRoom.LabelLeft.Caption := Map.Hero.Visual;
376369
SwitchHeroWeaponImage();
@@ -411,7 +404,7 @@ procedure TViewGame.RoomFight(ARoom: TRoomComponent);
411404

412405
SwitchHeroWeaponImage(True);
413406
FSkip := True;
414-
FBloodTime := 1;
407+
TimerBlood.Exists := True;
415408
FRoomFight := ARoom;
416409
end;
417410

@@ -422,7 +415,7 @@ function TViewGame.RandomBloodSplash(): TCastleScene;
422415
1: Result := BloodSplash1;
423416
2: Result := BloodSplash2;
424417
end;
425-
end;
418+
end;
426419

427420
procedure TViewGame.RunAnimation(AScene: TCastleScene; ARoom: TCastleUserInterface);
428421
var
@@ -446,10 +439,12 @@ procedure TViewGame.AnimationStopped(const AScene: TCastleSceneCore; const ATime
446439
AScene.Exists := False;
447440
end;
448441

449-
procedure TViewGame.TimerBloodTrigger();
442+
procedure TViewGame.TimerBloodTick(ASender: TObject);
450443
var
451444
LWeapon: NHeroWeapon;
452445
begin
446+
TimerBlood.Exists := False;
447+
453448
if Map.Hero.Dead then
454449
Container.View := ViewDefeat
455450
else
@@ -479,7 +474,7 @@ procedure TViewGame.TimerBloodTrigger();
479474
Container.View := ViewWin;
480475
end;
481476
end;
482-
FSkip := False;
477+
FSkip := False;
483478
end;
484479

485480
procedure TViewGame.TimerHintTick(ASender: TObject);

code/gameviewmain.pas

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ TViewMain = class(TCastleView)
2323
GroupOptions: TCastleUserInterface;
2424
SliderMusic, SliderFullscreen, SliderUseTimer: TCastleIntegerSlider;
2525
FactoryButton: TCastleComponentFactory;
26-
ImageRoomRoof3: TCastleImageControl;
26+
ImageRoomRoof2, ImageRoomRoof3: TCastleImageControl;
2727
public
2828
constructor Create(AOwner: TComponent); override;
2929
procedure Start(); override;
@@ -92,6 +92,7 @@ procedure TViewMain.Start();
9292
ButtonExit.Exists := ApplicationProperties.ShowUserInterfaceToQuit;
9393
ImageRoomRoof3.Exists := ApplicationProperties.ShowUserInterfaceToQuit;
9494
SliderFullScreen.Exists := ApplicationProperties.ShowUserInterfaceToQuit;
95+
9596
for LButton in Buttons do
9697
LButton.OnMotion := ButtonMotion;
9798

code/gameviewwin.pas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ TViewWin = class(TCastleView)
1717
LabelScore: TCastleLabel;
1818
EditName: TCastleEdit;
1919
PanelNotifications: TCastleNotifications;
20+
ImageControl1: TCastleImageControl;
2021
public
2122
Score: Integer;
2223
constructor Create(AOwner: TComponent); override;

code/models.pas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ procedure TSubmitLeader.CalcHash();
9292
begin
9393
FHash := Format(HashTemplate, [Difficulty, IIF(Guid = '', '', ':Guid='+ Guid), Name, Salt, Score]);
9494
//WriteLnLog('ForHash ' + FHash);
95+
// TODO : remove this when WEB platform supports http requests
9596
FHash := TSHA2_256.Create().ComputeString(FHash, TEncoding.UTF8).ToString();
9697
end;
9798

0 commit comments

Comments
 (0)