From 48880f0a10eb5cb93eb1131d2b4e0a50719c9447 Mon Sep 17 00:00:00 2001 From: Nathan Date: Fri, 20 Oct 2017 20:37:38 +0200 Subject: [PATCH] Add attack mechanic demo - tutorial with Heartbeast --- ....png-ca4dd02b5a08671d1e8200d74b5e8347.stex | Bin 0 -> 9728 bytes ....png-2eb85c58aef2a5294e97d930fe09f0e5.stex | Bin 0 -> 2330 bytes ....png-e53b2a7e2ae7e41f1caa814d90a4f307.stex | Bin 0 -> 1473 bytes ....png-487276ed1e3a0c39cad0279d744ee560.stex | Bin 0 -> 5132 bytes ....png-7ac08bc6ed7dcf19791e52a1c588d64c.stex | Bin 0 -> 673 bytes ....png-9b88bc6b24165e21f04edb7eaa0e0cce.stex | Bin 0 -> 673 bytes ....png-b325bd4ecef242c2d8570488a23b715b.stex | Bin 0 -> 2809 bytes ....png-41731279fc65f79e376db0eb84917f2f.stex | Bin 0 -> 2210 bytes ....png-fa08b35650d3d8263f7b1e08cb6ba3c8.stex | Bin 0 -> 2550 bytes .../end/Game.tscn | 36 ++++ .../end/art/bg.png | Bin 0 -> 6037 bytes .../end/art/bg.png.import | 24 +++ .../end/characters/Character.gd | 105 +++++++++++ .../end/characters/Character.tscn | 123 ++++++++++++ .../end/characters/DebugCharacter.gd | 9 + .../end/characters/enemy/Enemy.gd | 67 +++++++ .../end/characters/enemy/Enemy.tscn | 45 +++++ .../end/characters/enemy/foe_pink.png | Bin 0 -> 807 bytes .../end/characters/enemy/foe_pink.png.import | 24 +++ .../end/characters/player/Player.gd | 21 +++ .../end/characters/player/Player.tscn | 15 ++ .../end/characters/player/buddy_green.png | Bin 0 -> 1650 bytes .../characters/player/buddy_green.png.import | 24 +++ .../end/characters/shared/health.gd | 22 +++ .../end/characters/shared/shadow.png | Bin 0 -> 525 bytes .../end/characters/shared/shadow.png.import | 24 +++ .../end/characters/weapons/Weapon.gd | 55 ++++++ .../end/characters/weapons/Weapon.tscn | 177 ++++++++++++++++++ .../end/characters/weapons/spear/Spear.tscn | 149 +++++++++++++++ .../characters/weapons/spear/spear_enemy.png | Bin 0 -> 2514 bytes .../weapons/spear/spear_enemy.png.import | 24 +++ .../end/characters/weapons/sword/Sword.tscn | 18 ++ .../characters/weapons/sword/sword_enemy.png | Bin 0 -> 2156 bytes .../weapons/sword/sword_enemy.png.import | 24 +++ .../characters/weapons/sword/sword_player.png | Bin 0 -> 2387 bytes .../weapons/sword/sword_player.png.import | 24 +++ .../end/icon.png | Bin 0 -> 4910 bytes .../end/icon.png.flags | 1 + .../end/icon.png.import | 24 +++ .../end/logs/log-2017-10-19-14-31-39.txt | 8 + .../end/logs/log-2017-10-19-14-32-12.txt | 6 + .../end/logs/log-2017-10-19-14-32-28.txt | 6 + .../end/logs/log-2017-10-19-14-32-59.txt | 6 + .../end/logs/log-2017-10-19-14-33-50.txt | 10 + .../end/logs/log-2017-10-19-14-33-58.txt | 6 + .../end/logs/log-2017-10-19-14-34-14.txt | 10 + .../end/logs/log-2017-10-19-14-34-49.txt | 10 + .../end/logs/log-2017-10-19-14-35-31.txt | 10 + .../end/logs/log-2017-10-19-14-35-38.txt | 6 + .../end/logs/log-2017-10-19-14-36-10.txt | 10 + .../end/logs/log-2017-10-19-14-37-45.txt | 10 + .../end/logs/log-2017-10-19-14-37-58.txt | 10 + .../end/logs/log-2017-10-20-11-04-53.txt | 10 + .../end/logs/log-2017-10-20-11-24-04.txt | 6 + .../end/logs/log-2017-10-20-11-24-42.txt | 10 + .../end/logs/log-2017-10-20-11-25-15.txt | 10 + .../end/logs/log-2017-10-20-11-25-34.txt | 10 + .../end/logs/log-2017-10-20-11-26-13.txt | 10 + .../end/logs/log-2017-10-20-11-29-22.txt | 10 + .../end/logs/log-2017-10-20-11-35-01.txt | 8 + .../end/logs/log.txt | 6 + .../end/project.godot | 42 +++++ ....png-ca4dd02b5a08671d1e8200d74b5e8347.stex | Bin 0 -> 9728 bytes ....png-2eb85c58aef2a5294e97d930fe09f0e5.stex | Bin 0 -> 2330 bytes ....png-e53b2a7e2ae7e41f1caa814d90a4f307.stex | Bin 0 -> 1473 bytes ....png-487276ed1e3a0c39cad0279d744ee560.stex | Bin 0 -> 5132 bytes ....png-7ac08bc6ed7dcf19791e52a1c588d64c.stex | Bin 0 -> 673 bytes ....png-9b88bc6b24165e21f04edb7eaa0e0cce.stex | Bin 0 -> 673 bytes ....png-b325bd4ecef242c2d8570488a23b715b.stex | Bin 0 -> 2809 bytes ....png-41731279fc65f79e376db0eb84917f2f.stex | Bin 0 -> 2210 bytes ....png-fa08b35650d3d8263f7b1e08cb6ba3c8.stex | Bin 0 -> 2550 bytes .../start/Game.tscn | 36 ++++ .../start/art/bg.png | Bin 0 -> 6037 bytes .../start/art/bg.png.import | 24 +++ .../start/characters/Character.gd | 105 +++++++++++ .../start/characters/Character.tscn | 123 ++++++++++++ .../start/characters/DebugCharacter.gd | 9 + .../start/characters/enemy/Enemy.gd | 67 +++++++ .../start/characters/enemy/Enemy.tscn | 45 +++++ .../start/characters/enemy/foe_pink.png | Bin 0 -> 807 bytes .../characters/enemy/foe_pink.png.import | 24 +++ .../start/characters/player/Player.gd | 21 +++ .../start/characters/player/Player.tscn | 15 ++ .../start/characters/player/buddy_green.png | Bin 0 -> 1650 bytes .../characters/player/buddy_green.png.import | 24 +++ .../start/characters/shared/health.gd | 22 +++ .../start/characters/shared/shadow.png | Bin 0 -> 525 bytes .../start/characters/shared/shadow.png.import | 24 +++ .../start/characters/weapons/Weapon.gd | 41 ++++ .../start/characters/weapons/Weapon.tscn | 177 ++++++++++++++++++ .../start/characters/weapons/spear/Spear.tscn | 149 +++++++++++++++ .../characters/weapons/spear/spear_enemy.png | Bin 0 -> 2514 bytes .../weapons/spear/spear_enemy.png.import | 24 +++ .../start/characters/weapons/sword/Sword.tscn | 18 ++ .../characters/weapons/sword/sword_enemy.png | Bin 0 -> 2156 bytes .../weapons/sword/sword_enemy.png.import | 24 +++ .../characters/weapons/sword/sword_player.png | Bin 0 -> 2387 bytes .../weapons/sword/sword_player.png.import | 24 +++ .../start/icon.png | Bin 0 -> 4910 bytes .../start/icon.png.flags | 1 + .../start/icon.png.import | 24 +++ .../start/logs/log-2017-10-19-14-31-39.txt | 8 + .../start/logs/log-2017-10-19-14-32-12.txt | 6 + .../start/logs/log-2017-10-19-14-32-28.txt | 6 + .../start/logs/log-2017-10-19-14-32-59.txt | 6 + .../start/logs/log-2017-10-19-14-33-50.txt | 10 + .../start/logs/log-2017-10-19-14-33-58.txt | 6 + .../start/logs/log-2017-10-19-14-34-14.txt | 10 + .../start/logs/log-2017-10-19-14-34-49.txt | 10 + .../start/logs/log-2017-10-19-14-35-31.txt | 10 + .../start/logs/log-2017-10-19-14-35-38.txt | 6 + .../start/logs/log-2017-10-19-14-36-10.txt | 10 + .../start/logs/log-2017-10-19-14-37-45.txt | 10 + .../start/logs/log-2017-10-19-14-37-58.txt | 10 + .../start/logs/log-2017-10-20-11-04-53.txt | 10 + .../start/logs/log-2017-10-20-11-19-15.txt | 6 + .../start/logs/log-2017-10-20-11-29-41.txt | 8 + .../start/logs/log-2017-10-20-12-46-56.txt | 8 + .../start/logs/log.txt | 8 + .../start/project.godot | 42 +++++ 120 files changed, 2476 insertions(+) create mode 100644 final/17-Attack demo with Heartbeast/end/.import/bg.png-ca4dd02b5a08671d1e8200d74b5e8347.stex create mode 100644 final/17-Attack demo with Heartbeast/end/.import/buddy_green.png-2eb85c58aef2a5294e97d930fe09f0e5.stex create mode 100644 final/17-Attack demo with Heartbeast/end/.import/foe_pink.png-e53b2a7e2ae7e41f1caa814d90a4f307.stex create mode 100644 final/17-Attack demo with Heartbeast/end/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex create mode 100644 final/17-Attack demo with Heartbeast/end/.import/shadow.png-7ac08bc6ed7dcf19791e52a1c588d64c.stex create mode 100644 final/17-Attack demo with Heartbeast/end/.import/shadow.png-9b88bc6b24165e21f04edb7eaa0e0cce.stex create mode 100644 final/17-Attack demo with Heartbeast/end/.import/spear_enemy.png-b325bd4ecef242c2d8570488a23b715b.stex create mode 100644 final/17-Attack demo with Heartbeast/end/.import/sword_enemy.png-41731279fc65f79e376db0eb84917f2f.stex create mode 100644 final/17-Attack demo with Heartbeast/end/.import/sword_player.png-fa08b35650d3d8263f7b1e08cb6ba3c8.stex create mode 100644 final/17-Attack demo with Heartbeast/end/Game.tscn create mode 100644 final/17-Attack demo with Heartbeast/end/art/bg.png create mode 100644 final/17-Attack demo with Heartbeast/end/art/bg.png.import create mode 100644 final/17-Attack demo with Heartbeast/end/characters/Character.gd create mode 100644 final/17-Attack demo with Heartbeast/end/characters/Character.tscn create mode 100644 final/17-Attack demo with Heartbeast/end/characters/DebugCharacter.gd create mode 100644 final/17-Attack demo with Heartbeast/end/characters/enemy/Enemy.gd create mode 100644 final/17-Attack demo with Heartbeast/end/characters/enemy/Enemy.tscn create mode 100644 final/17-Attack demo with Heartbeast/end/characters/enemy/foe_pink.png create mode 100644 final/17-Attack demo with Heartbeast/end/characters/enemy/foe_pink.png.import create mode 100644 final/17-Attack demo with Heartbeast/end/characters/player/Player.gd create mode 100644 final/17-Attack demo with Heartbeast/end/characters/player/Player.tscn create mode 100644 final/17-Attack demo with Heartbeast/end/characters/player/buddy_green.png create mode 100644 final/17-Attack demo with Heartbeast/end/characters/player/buddy_green.png.import create mode 100644 final/17-Attack demo with Heartbeast/end/characters/shared/health.gd create mode 100644 final/17-Attack demo with Heartbeast/end/characters/shared/shadow.png create mode 100644 final/17-Attack demo with Heartbeast/end/characters/shared/shadow.png.import create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/Weapon.gd create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/Weapon.tscn create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/spear/Spear.tscn create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/spear/spear_enemy.png create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/spear/spear_enemy.png.import create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/sword/Sword.tscn create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/sword/sword_enemy.png create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/sword/sword_enemy.png.import create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/sword/sword_player.png create mode 100644 final/17-Attack demo with Heartbeast/end/characters/weapons/sword/sword_player.png.import create mode 100644 final/17-Attack demo with Heartbeast/end/icon.png create mode 100644 final/17-Attack demo with Heartbeast/end/icon.png.flags create mode 100644 final/17-Attack demo with Heartbeast/end/icon.png.import create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-31-39.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-32-12.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-32-28.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-32-59.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-33-50.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-33-58.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-34-14.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-34-49.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-35-31.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-35-38.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-36-10.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-37-45.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-19-14-37-58.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-20-11-04-53.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-20-11-24-04.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-20-11-24-42.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-20-11-25-15.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-20-11-25-34.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-20-11-26-13.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-20-11-29-22.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log-2017-10-20-11-35-01.txt create mode 100644 final/17-Attack demo with Heartbeast/end/logs/log.txt create mode 100644 final/17-Attack demo with Heartbeast/end/project.godot create mode 100644 final/17-Attack demo with Heartbeast/start/.import/bg.png-ca4dd02b5a08671d1e8200d74b5e8347.stex create mode 100644 final/17-Attack demo with Heartbeast/start/.import/buddy_green.png-2eb85c58aef2a5294e97d930fe09f0e5.stex create mode 100644 final/17-Attack demo with Heartbeast/start/.import/foe_pink.png-e53b2a7e2ae7e41f1caa814d90a4f307.stex create mode 100644 final/17-Attack demo with Heartbeast/start/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex create mode 100644 final/17-Attack demo with Heartbeast/start/.import/shadow.png-7ac08bc6ed7dcf19791e52a1c588d64c.stex create mode 100644 final/17-Attack demo with Heartbeast/start/.import/shadow.png-9b88bc6b24165e21f04edb7eaa0e0cce.stex create mode 100644 final/17-Attack demo with Heartbeast/start/.import/spear_enemy.png-b325bd4ecef242c2d8570488a23b715b.stex create mode 100644 final/17-Attack demo with Heartbeast/start/.import/sword_enemy.png-41731279fc65f79e376db0eb84917f2f.stex create mode 100644 final/17-Attack demo with Heartbeast/start/.import/sword_player.png-fa08b35650d3d8263f7b1e08cb6ba3c8.stex create mode 100644 final/17-Attack demo with Heartbeast/start/Game.tscn create mode 100644 final/17-Attack demo with Heartbeast/start/art/bg.png create mode 100644 final/17-Attack demo with Heartbeast/start/art/bg.png.import create mode 100644 final/17-Attack demo with Heartbeast/start/characters/Character.gd create mode 100644 final/17-Attack demo with Heartbeast/start/characters/Character.tscn create mode 100644 final/17-Attack demo with Heartbeast/start/characters/DebugCharacter.gd create mode 100644 final/17-Attack demo with Heartbeast/start/characters/enemy/Enemy.gd create mode 100644 final/17-Attack demo with Heartbeast/start/characters/enemy/Enemy.tscn create mode 100644 final/17-Attack demo with Heartbeast/start/characters/enemy/foe_pink.png create mode 100644 final/17-Attack demo with Heartbeast/start/characters/enemy/foe_pink.png.import create mode 100644 final/17-Attack demo with Heartbeast/start/characters/player/Player.gd create mode 100644 final/17-Attack demo with Heartbeast/start/characters/player/Player.tscn create mode 100644 final/17-Attack demo with Heartbeast/start/characters/player/buddy_green.png create mode 100644 final/17-Attack demo with Heartbeast/start/characters/player/buddy_green.png.import create mode 100644 final/17-Attack demo with Heartbeast/start/characters/shared/health.gd create mode 100644 final/17-Attack demo with Heartbeast/start/characters/shared/shadow.png create mode 100644 final/17-Attack demo with Heartbeast/start/characters/shared/shadow.png.import create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/Weapon.gd create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/Weapon.tscn create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/spear/Spear.tscn create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/spear/spear_enemy.png create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/spear/spear_enemy.png.import create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/sword/Sword.tscn create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/sword/sword_enemy.png create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/sword/sword_enemy.png.import create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/sword/sword_player.png create mode 100644 final/17-Attack demo with Heartbeast/start/characters/weapons/sword/sword_player.png.import create mode 100644 final/17-Attack demo with Heartbeast/start/icon.png create mode 100644 final/17-Attack demo with Heartbeast/start/icon.png.flags create mode 100644 final/17-Attack demo with Heartbeast/start/icon.png.import create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-31-39.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-32-12.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-32-28.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-32-59.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-33-50.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-33-58.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-34-14.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-34-49.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-35-31.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-35-38.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-36-10.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-37-45.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-19-14-37-58.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-20-11-04-53.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-20-11-19-15.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-20-11-29-41.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log-2017-10-20-12-46-56.txt create mode 100644 final/17-Attack demo with Heartbeast/start/logs/log.txt create mode 100644 final/17-Attack demo with Heartbeast/start/project.godot diff --git a/final/17-Attack demo with Heartbeast/end/.import/bg.png-ca4dd02b5a08671d1e8200d74b5e8347.stex b/final/17-Attack demo with Heartbeast/end/.import/bg.png-ca4dd02b5a08671d1e8200d74b5e8347.stex new file mode 100644 index 0000000000000000000000000000000000000000..693738dc7076c6ea321a1c0948df0d554c9546f1 GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/end/.import/buddy_green.png-2eb85c58aef2a5294e97d930fe09f0e5.stex b/final/17-Attack demo with Heartbeast/end/.import/buddy_green.png-2eb85c58aef2a5294e97d930fe09f0e5.stex new file mode 100644 index 0000000000000000000000000000000000000000..e74206232d1b383560b176eb1a3dcdb622a562cb GIT binary patch literal 2330 zcmds3`8yPj6W+DX4J-G$wn$p!$k8scxx&)A!Xj*ha+IUoVMRpv`0N_6`p8x>hVFRA<5jy~2 zjxjv*^n|#;BH)t{m$8w)<%#{DoSpT=vw(UY0|4yp#`-!pf^&aOP2K0GiO2o+aECY* zB>CuqfldG5iZ9<)^qe>1Fs9(zBR})j$Dp~AE|iO?Sr}PaSK7x)D4;D8>|<4}$C?-= zXh@XqSx>%b^DvSkBA z#IbAZ_P0cAaaU@f!GJp;`zZI9K%)V-IHs$D!c2eh5>$CQjEeB}YtUTPqTCaqkzBIf z&S}$?=*)D)Eir$OZGd6aB%bdoZsxPV_1p4w?28Ii(KZY&@1fLQYZJ2=Qv}N&JN0;Q zx8ioRa=Jj1s(FUK=MeE-(Iogup+i(8pVM6Le0{dB z#CroSSx6`iwgL`XeNlFMaOrRmR(B6bpTC(*M4tX^li}vL$X}6a zr7F!N+pJ~%_TXlqOxtd{;rWe`g6$P@=W=%Zh+6(jl*49d*P>y}mV>{ghFLw|<+VF7 z`kMDFNnL`Db9{1r8@i6c47yt>6B8E8B+c}+sI&cI5K7$fF@kR)Z|KnfqzNu1^mYhQhIW&AG`lGM_ z*`{OoUDm32IQ3N0-3ImIGP-~d9RZ1cd&#VYboeFHgt;z66p_5@T)fr|%xh@7-C zX}6qG_l}K>dn7+wc|tWPrI8WrY@K|?tA|Lj9(-*sO0M(xB`jKD+U|Y6SuZlJ11rLz zSSVRv;;&WjZc39$G>t9rn9NbO_mLaW2Dg~VK3hb-gnL4^e@B(BL#2w%1&fPL1Xo;D zJM+vG-V{*@eFNAW{EUUeep^~a^=hHV^NOd7A^zLjqbXw3bXAohM~~$1EH?~%_LdXg zVcaw0xiXLvUZzb?C`@4`$63i;pccV;>qlBRhq?e-ZM?S^+Ce)xaI+Ot;u^wyC+VAu ziK{&gZgSFAX% zaE02+lXXM;k;8@BN<3<>QH5hUi?}niTv~-TJz_jQMdfXX<{7v%j6~auhU7jK8A-E| zC$|@K(6m}?&WTXq9y)^%68#tcBpuwF<vIEcgEP^W_r8o15-KgB*p91B0Fl9g)1ub|w!M^Rg` zE=<(-FdLPhM-n>yU%sUGyqf*#ONwV)QbHUW&WZft^}Xo1I+r`#4)K)#Zi$BGaB6W! zn7bm&K7tQ!FQLHig_#+RjM22@tyMWSjXB5L=RqltZ9SJUFEG;iZr$ZfT?Og;T)qSK zr2z|m4CgAhaYtf0egvL!nCbO~mfI6G2|l*-F4=0cg%iuOOjd;VLp_ldX|uI~wQgWeY(~bJ+ z4VjWK)L8QvP4ml4y`(1_iZ%azD{Q>wffv{v$-`FWn})0FBX<(eF& z(~BC2Lsq}A+MNt0J8IZOkoe%9n7EPOgEIzJk~mju!ghw$8#HEw2V%4rV)?c?BJL6! zaBi!X58rcjqEwNuP*Z$iI=EvqO9zhXRBHY2jsmJEEY!O=)XO*rLNZ`ikWMD*DT1ch?@#p32W8O1$N9nhH@TqENKP$4GqUtkn!lgeuGm~SK~;tSg8zy) z`;s0tF=of*uX{jDEwzeCGpZ*_&H{8w56`<}$Jzb^{~hQPV{0Nc^eH`7Rd@H}_iG&{ z3%wO9F0Zb3LKe8%0h~ZZz{R#8jsi;h<_M^n{T=V@k+8pyxh#K{pW2OtIoXwxLm&h+ z#epiH7F2@Z*3U|?WoWME(c(hLj&>_8^NQdS0r06%wyP9VX{CB+34;`Q`!2?EkU<&4Z6 zY(Uo5IN?qP2G$Hu7srr_Id5-l%nuD^IR5edUYm@U+E*tDF!?N*Yobt?Sg5GOb~mOZ z>0v&DyIbi+dxvzHg5XC^5hi&pQx-7i&d^a*3E^J9WlQb(hfSAmmA_|xrT^*I-=6Ky z_spv)zF+zL-lI=HBH2v%Y8d7)`7yXRnm0^zw0~f_o#_wf9mYI{>kaY^?#(`WY#g?{ zF${K$xAga(d3c3Uk8wWp=2GU4~3LAk(S!-~Yx39BBqS^xfd zp}O((fyM`m+O9G_uwJ$7z_APBjpc{9rP7YCoW=BC=KZpU`we$}H{aH^FbUgKza*hV ze9F=Kt>^wv&*PtV{oz5c{@vcOR@uzH(X98F(xUzKYrLGFY-)JfImtPh)q2TWwp7Ms zU5RW_nauY|`z|NHOPrp!zU)@ss%_7`66CKQ_IPV=X%<;j(e8F{4MX1+?mpjX%{7bd z*}hFZASos1w(Q$fpS~Ftn@>(`TG_cP-EKiv^)eQ}>wQ_GGI`QF=O0dHeH)fM|FY`U z^~v$prT%guj#pP4{5a{=k&D;sw)eO(o6OQ`?A#@|c=xtkTj%TsH(^y?{ob-umOn#z zE@b#W_FuNGeW5dtY|;w>=XMFJBNr6g_zX)rMukRvNO(Q)yxWkczh%<(8&$=N)m1k{ zm?u@%?w)46XWDFU{b>hc?sl+i-@D{17ADnxX6gZ-yB)i|ZGG;>_pb_Uo+-2=%6!r0 zYsve5HkYmWxm0fM)?;?z-VeAgtdut0ek1ju?vr@2u&Oh*$v{y`lZ+(~p}OE+1Hb;N7yww_-9<+BfZkHf(1-s;&2{ zbmP6%e&XEP1?4Nf({mSOu0C-4z}st=xi=q}e&FY_nR88N(bZ zi^PqbuZrA|_+|J(u)u!Lg2a;ftDauk%su;l=^3W?%-@^3rOdvskUD2qU$}a@*Y(El z1=5w0#vyOl<^OZuzrB3(0nZ2AtK$8xMla1Oo#b2o$+&dA=k!MIkmHlrSLW@%cwdhB zet_vNhpRc>=g(bimSDGI@nckPSbShMPr)}iq16ZE56C`XE8zVhS7CDE$$o}g=MEb% T-Am~J7QGCfu6{1-oD!M&dm1mTYve{1b^&pl_qzTf@Zd;fm>x8bkySNVS} zqVUh7{?AO!AoEk+eJsB9o$JxNEc#qB=P&{IZSa!-To-@nFW;kgS>{B5BT}=7c%)+E z*t=^Z5C3I)^e)S61UOSfIio*WvUv%>L$+3Y@?F-7wOc0_9^eC zBS6^cP2h*XHXsh*LRWdFRxXtS;Niga0BjujO)34Kmz;O+72|)hIRKPvUdlX?03}SY zfJ^&ZTq%7Es6zyO5cfs54V9SFWXnAl0 zDYrq&ZA_alYK^5RNYiI7kO>;_AIU#CkHY@8f3yGEc2gPWtf|omr~3beqPs&3$7;3oqZJ9>rZ{*;o}Lbm7rQcN_! z3shDJ&%(R?*S)x^N;4|m6SLV7O5B^bI^aoXB(OYUcs`myTb~nhRnSHCIf0CLE$T*3r5_g$y>TNjjHR6> zz_IO9`!Li7t-*}(=&p!D*Y_FzYqCPF(KYH<1hU%uD@Hjdm?4yv zycsvh_m8}Me0y)6Ng7^ErX#>~2mq1~W%h6W3hS;;=fSN_&Fs?!E{V3xTyQ?HJ^RsJ zCZHVfrahu>{HT`I|JGl$!7I16qLihQlSmMTfdtkKo5pvuQoO&}pZ8o`nP6pEh9+;0 zfNs_QTu*>xT7_i$P@7$?D%w~H1UMvQfaJ58uI|qn?>pEt;yq_s`BYK`mNo=6vjP?o(Y@18B}h!b~cnfIN@_k_Ymqx1JiEzAnE3mtNoXt$%ob;K0Tf z|EBrVtw|OhH`2$364^2=oEoX^#ODBKQ_c!RaSf@2iOyFlS-N4+|kfJtf@P;_{}7<*^j1O zQRfZ+Ml3I(ihz8RHM2wi|eAkc&`KX{nnrh32Ga^o!E9rf2nlKV&YoIZjzbtmjb z^CiI94N}1950fu!`#TjGUXxpVMLFK)YUy3E`jhQ0b>YAmcmO@3z*M>JNZz#D$O7sk z`k2Q!K`YEu9_i5>5;PPaJWTMv>H=z3@BoKKT=b-L=o@}HbT}Td37A#=OCi7^Ap;}; zV{7WoSGV$J8{ql;Wxiz_TB>e~E|+8AjedpeFx>fi&AxBl`^E_@nZV8uF4(=K9T!;n$dh`eS#l6at)IXI;nv z`S#vy^a~gJ&#w%N1?fcsqhDbhhDX~L^USHL#S7{eEoy9Re6p#jDgWZ7|0%(=tT(Ak z5Srb-CX~{f%67U`PJN)$UA}2ykd_-8;;b$K`~#-~Y#;Pt9tqvsd*}Wqff$y?PCd#h zBBlC}&XzcW#qKCDn$D8G;hS$t&-ArnnZ7aR zFa_r7P&@gZ^8z1GZl@sDXd26wHl4GivH4p~0b`7Wj_NfWy5R4@;{zcqpI({NxDFuo zZ7dFUmkj={o*+*Q_>f)0zt8{S(3YM*4;}_WHuxkZE`U(l8ZezWjpP}(7qWmE3P(aC zE3aB3Gb4+=XqT6Kp5-9%9;Bmfrqz80Cqzr;|pV!@;aCJ>}{J|@O&i?M;gQxd}j{y-TE_@|}hqq6FW3~e*{1rmnwB?V& z@V!^mE+pj+5_eajM^28BAcuSK8l8+R?6ASdN&O7OtQ}wNx;kH{K5y#q<(pV!uXYgYn<}Bj`NI;i2-ERP2LigPw z7Bzw!O?Hu$cUq+;ii8_9v@I%MAVi4QQo z=;auxnPZkwetJq*M5IoRMq$imRT#jnYTztj=*S)D%SzrRWDOp8!ZXE zso=J*a<&h8Np`I!6GC@} zUBD)!w7`S4%}EV31KeJ!J%`c!`#GaBT9VplmEh;c%lOlfhs3cpq~a^VSB~&kg4>5s z8p;#+DX>FCdUPg&pA!kQ9vKx8NA)G3nLoI~0M}BZ|G|7sgK)vk6l<0%#fPL>3IG%vWLtBe;z9^%Js@cs($m0RF-x20J^Kp+U( z;xC$;TDN2SCd^|Un6Cy1KvTcI$tCLFdn5h;V@EU&c)cCXc$_+acS+z!a)R5t%Gfn* z5I@?&XmsU7@U8;zfba)E$@2jh)^_d$YUZQ~b0wfK@?!Y}LSHL<_UKOl{|D;)-TYGt z;A1(-9Vg0pdDzW@r^D2|+=cL!+28{fcrgwh0Iv^nIls8*`dV?(^@Rk?NlGH1@AkT4 zp)x|vLf5`;cBuI~j4r~rc?b>vMH1a{HI*}AV%k1U#$}?C}KC^S#lhpZDPms2V zm+0{|MB^(F!E*2ftpzQYMWhl$q&DV2O-lkmE(dMTbudpq0A_KA|7AnKc@%)2Q+%UB z*KSNNk)F&#f$09O;K`ZbVBK`N0{5C8kESRP@962oDIGNT5_{Fqh=EQ6y_xP>Pl0A-iV z`vl2l;60LO!CN5)S5}d(@=U1b*r?9kJwe(-e&Q$A5E(hwHgd|q?FW|uNRaxtp#u|K z>B*YV-h2%zmp)(vc0d=Vl4M2=SiVf7Gn}O}oYgwRS$AhRn`ti7FZ8EGWj+AP4woyJ zr3v1MiP4vypb1A37Wl)V0MYKXL<_-t0v33ofs___A;+F)(gdRY48>wU=fKW(tkWPz z0~DZITU+Vs>Y6_RSG8Wk&wkg*wmoUFZBJU;wkK_D+mjw`YSf}lUj6J~N|et=Lc8hZ z?w&F_h66;q*APvdW2?Pw;Y~JjgeaYakpU|E52Si}dUjx)2{^~$CO}hD6V1)dvyxDh zfU7UJf|i|K-Oek=^mRS8H$7ZgU$damudS#`=e6lb&`+m%Bw4`=ks4w>Yl)4Xg9ubw z;NAY2ExegX2>0Ms771C+wY<7+;ll3j?kBNNhFV)&RZ~+F!mf8V5~dLFq1KC$LLdaZ zr>TLnni}Zr>K?QIFKk)adMdqeW61Q?F88IVNaZL-f-h>aIvQu+&}!a_UpPMUZa?To zaquOO5KBw+cyHc|DHnMp8L6+ZBT(C#o16215|iqkiG(Qxyr-!F1!E)toYmAInitp0 zGaD9PX#^|29dH{f+&MQ1<)+?9Qa%j{!MI6_Im~w6N7PeqFL-VX*lc(FijfeFkV@s! zxqVM;)_lIDZcXzo@<`G`Tbat6OMq=ch@v5}=}0I_08mJR05na?4W{A!p3kMPUg8x5 zbwMOy(3>`>HBwZir;?z>p<*<}!{&PW-3^v=Q_Q3-g@jlP6$_i@OAmZM-tk(y%IA)X zK>68jP4h4ENK(kvHVIEK%`Q-kglP$|Nf1&9O$at*b@wK(uC+Me0Y>wRw}xCC8xbQb z{P9FZ8m~iw`=r7cP~4Nej7QaavPN)hpP#F!!2uYFX3Tw$-OMYGya6Pmu~@%^P7x?u zWoTMpkw=nJvL%%>8|Fg7Oaur(Drn8=o*xwhe=@0vrZeHa?F08k(nI^tt#CD#XJk-I zfH9!BxA$Cr9Ns|4-vEXWG`;lE2N+GD`c6SM6*3?B&ga?t*deT=@C1+wMpJD?L-A@G!) za)22MhlgF7Jc>WKb|w;B1+f!{fa&znxhw1ks;^vk*Pm$YewP{rz{m zaiHywjEANK5WotV`<(G)JYpm9SGvWu-@i)KG^|4R)}Xn{5kkkz#mJ^ZB%|Hx*<8UWu7YRhR0+m| ztj-0^>?8ux1u4t8$t$q}GXbm+{S*>9M)IUHnQsEOQV=|yjR5S*ol6i^K;_cLhO>o` z>S$NjTLs{qTO$;Jbb!i9@0|C}^%$r9$x-H<4L-}br{@57%w0#bber%gBviTex=2>B zd-v{oyT8umDH4eUQ2HGq1?0ogXn!~oIcWorVa-V=I9Uk7xhs$>^6QLj;i#qx(qwfn zbafr@g&v>tJmv-uhr%J3COdSm?~Gl4-hE9nnM`D}*>pCW&1bV&mCZWiHTx-wbNcJX z(gvOJTVsv~R_K2hp2^9A@>;>OUhvJyTQ~*s1;2%9CU@7FW^Sx?s~k%sB-S7~+L~rk z6uFd(l1_tJyTZbeo_zRF_*|$JxdPCW&+iJ$7W($Z{QSvn6qd~uJS!Wl#`s_ry*yE> zRU#(+mKumGEH@c+v9>3JH79*5rJowsT4UJ%of~dr^S@XJ-)WiL&P?r2r%`iht5DON udrU=7iry^(rjyB2;GL-Vov8o+j{Gn8ixW83gI?_b0000Ky=6@dF!Vb3jpHsOSB9kUwq22$!iw=(ZpQkcyxJ~S0TlUPC z(8621!7;w$`l%mH6K)&(Qy!bhzg2SKg)$EjY;*hRLJ++x@r`n zC@a-ZuMpLCseWz>QAU~S=c*9(v8jG83sLx->gS>m744~h&I++qVd^UOR0&<252pM& zFWHh*x(@&5bC2ZvZe8?5o_FDP#Tt}UeaHH@+2I1YsTLQdg?24+#Qkuuaro@bNo6`T z)Imp!(g$lmQ}rAhc`zQgoa7KE&(fS!mJ_k0^PX|x_V5*_^KMZp#i_{a!Q0Mb>vM1M zSze+S-I2)Y!SYQeFCXcNuKvf!8kF?n1`odz2cM=1tb^ZjPmD#-Q}Uh|`X@TT53y9? zwJfZAPFMJ8PP^F*bn&hKH@Xj1OWeb=XV0!D?w?&H>_hbz+Wcmw&{U<>00000NkvXX Hu0mjfMms}o literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/end/.import/shadow.png-9b88bc6b24165e21f04edb7eaa0e0cce.stex b/final/17-Attack demo with Heartbeast/end/.import/shadow.png-9b88bc6b24165e21f04edb7eaa0e0cce.stex new file mode 100644 index 0000000000000000000000000000000000000000..01415d30d086e888d8826e850b9a94fd31be09b7 GIT binary patch literal 673 zcmV;S0$%+`L{n6E0000f000040000001yWO0001m0ssI|PDdb#P)Ky=6@dF!Vb3jpHsOSB9kUwq22$!iw=(ZpQkcyxJ~S0TlUPC z(8621!7;w$`l%mH6K)&(Qy!bhzg2SKg)$EjY;*hRLJ++x@r`n zC@a-ZuMpLCseWz>QAU~S=c*9(v8jG83sLx->gS>m744~h&I++qVd^UOR0&<252pM& zFWHh*x(@&5bC2ZvZe8?5o_FDP#Tt}UeaHH@+2I1YsTLQdg?24+#Qkuuaro@bNo6`T z)Imp!(g$lmQ}rAhc`zQgoa7KE&(fS!mJ_k0^PX|x_V5*_^KMZp#i_{a!Q0Mb>vM1M zSze+S-I2)Y!SYQeFCXcNuKvf!8kF?n1`odz2cM=1tb^ZjPmD#-Q}Uh|`X@TT53y9? zwJfZAPFMJ8PP^F*bn&hKH@Xj1OWeb=XV0!D?w?&H>_hbz+Wcmw&{U<>00000NkvXX Hu0mjfMms}o literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/end/.import/spear_enemy.png-b325bd4ecef242c2d8570488a23b715b.stex b/final/17-Attack demo with Heartbeast/end/.import/spear_enemy.png-b325bd4ecef242c2d8570488a23b715b.stex new file mode 100644 index 0000000000000000000000000000000000000000..772786ab01488735cfb7732324da033d6f21cc8d GIT binary patch literal 2809 zcmVdyHIF9mhZCzGi1;XJ^~(gR+of z2o|VGAt*v2`bQfighc#@KtyR`6g1IDY*GPZsv#ku7$pK?VzP)rLR#fzgBbC_BGo`? zh-qy>2r2FEb|0O6&AoSK?mhl-=kDCO^Vr$h>9&mLlT12u?!9O3G<&}HcYeR$`5l2m zp=gVLuHRAhSw`L$Jn&@DVrc?PuN*7+)%{$3a_F?&-*OOV`UVt=k0P(F-GQN1w=Go| z^w{+PSB?&K^gi1~34=nhL|z%VorD$)okrr&NEo8lLR1+1sHy;0jSY3~hTA|1gQDx1 zdiK1I^z-f=+p9ho%Y!^B4iYrrmV(D^o|GGalBJ1ZOXpGGolqD`5)u(BA{2%?Mg&)$ z0g+I`py*1bo;$y`QOer3RuGk8^6uBRExeyA$++ckL#`m7oGr4trVAiz@j==U4*`#q zBz`CiQEMS83^7;4idqr%1WKV$v_P*RaLc2*;EYi&^@ZWmE0EFW3sYzG9GGC%MesRAgSe+0QeaVC?u}jUrEM;J4OtCkiu@e{z zg(2#!j0!_3HY>WO!y!*442rHJ_jJYC7!imy`n-HupJj_yY;6kdn|NM^x4pEu4wwM= z_gA)s1N1v%wtTQ8tNYRfT-2wrAtFo?$hndedC7z$Y3AwB1u|=KC}oJW?4~Mluyv=}TJWvr*K399 z&!q%~zwO*6Tn{sT?gbf*jlH66^V{)YB=0klmlPUACPFeMr+Q5>1bn~f%ehb(ycVs9 zR@1MQFeti~$FE-y2N@l-vzKd&Mkn+j zQ;S#;riP!j*q_wJE@0SOup%HCNt_DX^(9&nDvv?YwcPR2r3h*rX|04TYtD&{(~K#& zVvXK0QGnn+*Y*gutk$@4tfcKpi{WAkTTr5*=n{T;{h_C#pL5r=_NU$dTD4uj@4JD;upuS5s82&%0oT1R zVZ3ZbOc$D45tfFRwZvbOIy-@bQ7fXSo)yt#5tk8Z+b~;_2j@N3wf!p;iY}&JC~_sf zbA3{-l zh`9;kOTGb&NO+{mabap;inHTCLZML9Cu0gWWd#>zV9b`B$otIKNxv>H;<_MLkdGvF z9_q8i^T1BvSa^;Xaj6(JJ(Stfr#CvJP$Y>h2o48F2)+kOC}dt(hZO?nd&vfljDxu4deh;B}7g2C?i?%GR)fk zqQxr|ivL?YS%1yJnZWj7H19KNOWZ}C;Xy_uul4BS-dsTrLy&r1h!wBhx;o3W7~p?X*oT zNqFhThYl?-`XS0EI5GFNUGd@(+Za`(n9EGCW zc<%FuPfNciZOLrWV{?DwH4E*Ki-Z~LB_~Bm8_Z=)vDebMd$u4)AgCl2btD?1{n z!;B-gzi2gSL*QpE4yFw8!zouj7q(|CvGDY7RKp=$S=mZ0NR`K+=t_Qf>*46$40C$E zQsO=Nz9jkn(jJI@lG(wOxMjkTdu^{$CeD}e&a_X?4W<_Hy(}9cfk{U)VoRo43o}mi zn&OFZTkZztfO2{I$~n4Lz1|@t^p!59?xXR{zCX2mvO@7uAot99#3Fbv=y`5kPM=;c zF9Q33!PN;~opQM}dVJgorWTj3(&%e4wXjPtV*8A?P~XwgC}k}%+@o`Mt|0dVtW63E zUgI$1!u^&{X|={U|K9VCOsL{a%?rsn6)^TGQ=Yjj(jLzPv`R+P?q1)V~xeOo|SwJZ8{RERgJ>0 z+`jNWUmm%MvNORDTxNUnXSo8`7X9j}N;%Bw-g?;J`>;z5zH;8)l5>M})K! zX6zKoVo)fS$X^C-2WmtC0Naxb>BoL~HD+i9n3 literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/end/.import/sword_enemy.png-41731279fc65f79e376db0eb84917f2f.stex b/final/17-Attack demo with Heartbeast/end/.import/sword_enemy.png-41731279fc65f79e376db0eb84917f2f.stex new file mode 100644 index 0000000000000000000000000000000000000000..5149fe6eb803238938e60ed5334dfd0b4939c648 GIT binary patch literal 2210 zcmV;T2wnF_L{n6@0000l000040000001yWO0001n2mk<3PDdb#P)eTW=q9mhY<%kot!&gf{9Q{v{$RY6~`2K~S(QG=Er9XbY*f zv`H+bMTnx_rO92=OYX9Fx4ZN5^N*R?o!y<;m)o7qZSMKNu+Ka%zjTu zQe^2bJ5jEm7OS>Q*IbKeL&1l#~*TQn~N$AO;%$F!(5?a&utLyfq9l|9RS%0+e1{6;aE zEl=?q-~laaO)F9#ibN5UuVfdvze7<2pj=dTf&0be-Zc8AxwPn5V4bk?yPfq}i`E6E zyRqqvvIxvX^NxReZ#O1e((3nZw-!3G-=cE&eciZSQ-Prrrh-h2%lzo+gT3xnBB=_y z@aqO)yM|M}O1OC_Z*Sg(?1EsfR@XfX52y@Aj_yxa)S!jkuH7VI$9=;eNm=Bn3VZDr z4Z^NDKId;STK7O;{AI5`R{^|sAbn8>T}ai!RuXo-owU4oU&q)Dv~yY|)ajR~HQiBi zv<1Alt#{1ZJ+Pq}LQY`xfi4Ga14HA zdX^*8vmI~KDtf|@kzR1*o``gK0s17Q3WVeHjb!|7PZeRD!{}2J& z6G|?u*uq-Oy+NM9yCpunRFc1sXE~A2sBZy>!tyu|o(lrIukDzv!a&h*q1(zz&oqL{HjN};qQnl zd5h)uWYtfBABo@rc))Osu%#w5J=SA}DFuhIf+GipO};yxRZjp91I4hs(@We%C@UM*@(S{Mp0A5rX{Ho1Pn zU^Ejyx?gu0I<+njES2N}@F!p@TAmat^u!MphT%e^=nBEIzsLKc(KMid=^@2UQwATJ zG?>W63%ulEEv(C3^Q*G3>hL`9-e`G}2N(QMp>?5pS-2)zDQ_tz6V57)rWZ`)6cahc z1zVUa2#du=xrU)aLvdmv%h7F?dJuReERPEn0$52uSl^d7(!E1UqX`(zDBeGzxXOXK zRgcr_(jeGQLxqW92`y?(zZtgR+A)JY+f8=m6;_N01vppcnz>bZcBL$*fUnorvAv6Z zcb`TRL)L(+M-BGOm|Q(-kWEnOvdxZ@Yx3A~SQTR_mDA>t=Uyf&)&u7#_C6}keJS}X^rlb==7i@VN z{J-DB2OAQF?TH^$*J%35Mg*OYgr!4qTV^#+T&V^_jxD=PB?QkknqJebprhnWutuvl znH)Xua8tMbBdmAF;Mn z7i~B1{X8WX7K_5^HDR^Mb75%+I>ds(5;gc{WeQLt!Dn!l59+GGe=70oglQsmDvv*Hc1A4LMl8v3LE(T#qPi+!NPxsk9B2UWj)B?-|d+dArq9DKvw)RGsw#TnczguP%X=d?O^fuMI9a{MYH{Fk=LS~ z#1w={L-~`x*G#b%saG%TGz1-zs>gPR8?sIsWp;%t%7fhL&PI&xFek(G2YzyxHy_rX zdr$~3&T%t0^_o;Y_R>=g9{ZEIQ@o(Ojcr#9q;xr-240HhPu{Wh-pm`Fq%mYudhCGR zeSEPJ^nZ-~QhA2^tR;SFmdLcOUd7E}JCl5qI#F*`(tbJ7pwm}j2V>>Ofj<_n;4bCx zDJ2XwYa@!HSiG2dmp=mq<@sZCjiwoW6L$0mpnVwy;E7;q3;VKaP*;mv(~7>xBPwd? kVpJb(tJ(>SYPKx@2RZq6nzv`x%K!iX07*qoM6N<$f=E3+3IG5A literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/end/.import/sword_player.png-fa08b35650d3d8263f7b1e08cb6ba3c8.stex b/final/17-Attack demo with Heartbeast/end/.import/sword_player.png-fa08b35650d3d8263f7b1e08cb6ba3c8.stex new file mode 100644 index 0000000000000000000000000000000000000000..aaf641d108ef055af4d0900b044fc63c3e9db765 GIT binary patch literal 2550 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 end_position.x \ + or input_direction.x == -1 and position.x < start_position.x: + last_move_direction = input_direction + _change_mind_state(WAIT) + + +func _change_mind_state(new_state): + previous_mind_state = current_mind_state + current_mind_state = new_state + + match current_mind_state: + WAIT: + input_direction = Vector2() + wait_timer.wait_time = 1.0 + wait_timer.start() + MOVE: + input_direction.x = -last_move_direction.x + if last_move_direction.x == 0: + input_direction.x = 1 + wait_timer.stop() + + +func _on_WaitTimer_timeout(): + wait_timer.stop() + if first_ai_cycle: + first_ai_cycle = false + _change_mind_state(MOVE) + return + + _change_state(ATTACK) + _change_mind_state(ACT) + + +func _on_Weapon_attack_finished(): + _change_mind_state(MOVE) + _change_state(IDLE) diff --git a/final/17-Attack demo with Heartbeast/end/characters/enemy/Enemy.tscn b/final/17-Attack demo with Heartbeast/end/characters/enemy/Enemy.tscn new file mode 100644 index 0000000..2db536c --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/enemy/Enemy.tscn @@ -0,0 +1,45 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://characters/Character.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/enemy/Enemy.gd" type="Script" id=2] +[ext_resource path="res://characters/enemy/foe_pink.png" type="Texture" id=3] + +[sub_resource type="RectangleShape2D" id=1] + +custom_solver_bias = 0.0 +extents = Vector2( 20.2295, 16 ) + +[node name="Enemy" instance=ExtResource( 1 )] + +script = ExtResource( 2 ) +max_health = 2 +patrol_distance = 200 + +[node name="Body" parent="."] + +texture = ExtResource( 3 ) +offset = Vector2( 0, -129 ) + +[node name="CollisionShape2D" parent="."] + +shape = SubResource( 1 ) + +[node name="WeaponSpawnPoint" parent="."] + +position = Vector2( 0, -42 ) + +[node name="DisplayDebugInfo" parent="."] + +margin_top = -134.0 +margin_bottom = -120.0 + +[node name="WaitTimer" type="Timer" parent="."] + +process_mode = 1 +wait_time = 1.0 +one_shot = false +autostart = false + +[connection signal="timeout" from="WaitTimer" to="." method="_on_WaitTimer_timeout"] + + diff --git a/final/17-Attack demo with Heartbeast/end/characters/enemy/foe_pink.png b/final/17-Attack demo with Heartbeast/end/characters/enemy/foe_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..b91a0a0b2d4951e4d2d92173ae472568216f49ca GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^Q49=>%pA->R#U^{-9U;Z-O<;Pfnj4m_n$;oAYUQb zBgmJ5p-PQ`p`nF=;TKS-;RORjsR0ASs{{rHs~HRo;stYd1=;{5<^=eJxV}+MYG`O! z!xK**v|S+nf>h!o#iUm%NkFUD@y1`0PJFGJbWtktwp`*x>BQ{<2`^QW9x5gR9jHB} zWIvEnDGBlmW?l50%+pI68iIDxWuc@rv`p#b0xHXTAQa+Qs!PV&=)H!pTfP z^^8g0?k>jWS8L*c9L@rd$YKTtZXpn6ymYtj4^WW3#M9T6{UH|<7pt+I>mm)Ho~52H zjv*Dd-rhM`)Z`%H`mju4o0NNxg<4>=z~evv_{BNzt~lveC$`e6oOL$;D(+ahrJJT| zhrVB$HZSh&(bZw6mgY#VdENW`>TRjgzukHJwy8WwSzGpb-n){e4^m=l7gyJM-kec) z{^G6aQ+q#_dhy>|lA7GsEWb-vU;47&3%?0>*B{Ohw%_Y3vd&oRLinzC@3zJ7etx%P z_up%oizi9#jz9Hng1BEmv?qf5t9L@4qK}9mwf>KlkzwTdpqL2Pt&$PewzJX*3KQP%j%ii W1$bVpHEaS!EQ6=3pUXO@geCwV$1_L( literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/end/characters/enemy/foe_pink.png.import b/final/17-Attack demo with Heartbeast/end/characters/enemy/foe_pink.png.import new file mode 100644 index 0000000..fc2e410 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/enemy/foe_pink.png.import @@ -0,0 +1,24 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/foe_pink.png-e53b2a7e2ae7e41f1caa814d90a4f307.stex" + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/final/17-Attack demo with Heartbeast/end/characters/player/Player.gd b/final/17-Attack demo with Heartbeast/end/characters/player/Player.gd new file mode 100644 index 0000000..9963756 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/player/Player.gd @@ -0,0 +1,21 @@ +extends "res://characters/Character.gd" + + +func _input(event): + if event.is_action_pressed("attack"): + if current_state in [ATTACK, STAGGER, DIE, DEAD]: + return + _change_state(ATTACK) + + +func _physics_process(delta): + input_direction = Vector2() + + if Input.is_action_pressed("move_left"): + input_direction.x = -1 + elif Input.is_action_pressed("move_right"): + input_direction.x = 1 + elif Input.is_action_pressed("move_up"): + input_direction.y = -1 + elif Input.is_action_pressed("move_down"): + input_direction.y = 1 diff --git a/final/17-Attack demo with Heartbeast/end/characters/player/Player.tscn b/final/17-Attack demo with Heartbeast/end/characters/player/Player.tscn new file mode 100644 index 0000000..6bd74bc --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/player/Player.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://characters/Character.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/player/Player.gd" type="Script" id=2] + +[node name="Player" instance=ExtResource( 1 )] + +script = ExtResource( 2 ) +weapon_scene_path = "res://characters/weapons/sword/Sword.tscn" + +[node name="WeaponAnchorPoint" parent="WeaponSpawnPoint"] + +position = Vector2( 46, 8.1054 ) + + diff --git a/final/17-Attack demo with Heartbeast/end/characters/player/buddy_green.png b/final/17-Attack demo with Heartbeast/end/characters/player/buddy_green.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f7f41c7429baa5370704bfd40a380a7900f902 GIT binary patch literal 1650 zcmeHGdpOez82%BDlcgf$h;rmIs&jg%*v+nH+aYqxrIy?iQB1jRtq>~Ou?b7%xOED- zw=uUck8LR{W{jiLD9NpHDpP0uef~QCpXd3$@BQBQukZQZ@5}Z$>Y}4D$s~PyP*M~J`bckt*PQ>Ap}o107$k10NPam_@a_%ZvlXE5CGg_C=fY4|(NHgjG`1c0fxP*jWEJK8PAV#!HU{A-Os&(-s zu-`-|Jcp3Z$25^YDFAX!jU2r5}^Z$J`X4@`Whs0H)~`+?7kX(2Gsz!`>32s)rH1QfT`q ztnn2*xgUF+=h7vCRShEwM5u>iMB6A#FahC?!Wcr7%4G?SsPYydCwLz90s!;V`K=>! zUv8-*Oa4R|Qm1vVuiem73wj^Cs|!zx*`Qy|&W*oBRDLDwUg(UNzox&sk~(#J((Ghb zZT<6?i|g-(GG$I_%i$fS#x56gE=T>yBcIxyky2D#BYvxJrW&iR2~Z3E)dg2Lb8c6i zifoP}_{RePNbh^94a?G%Dp4ze=;o|7t*x%DY47A*1_pplIYb=V`;zp-#Ah!tN?&U! zL%RkXJ+PGLgUjKp4i1pRzUMMcq0MXBXXQoQT@cC zCO?v?ztghWam`Va&~#yeV%Y?)@I~v@46fNMACMcUTL$R*H+eI(t_-p9U0UryK68NSpM?nTY;n~P zgJ0M>E;HU=?2Uv32%foS_MBlwuG%V!DR5tY;LW>1)|Hv60g6k55rRQV?gfTvX^{c0 z`%+>irN-m7Tp#9W9ZZePn0nk{70 ziD#wLak7?VH+RP5tjV|iIxkzy*z{%d81f_k0z4NR9LtK#c=t0?V$Mpn4P>CYKOtgH z8P&6`-!CU1KZ*7knQef~Syl~OiT8t)mldrM_rsHKIFTBzA447CqI?Amu#tGm-tdjp zLxVFccg6XvfPuNjLjtgFQ(10kv#rR^O`~x8hV^+|aoE*#WSJn;a)nQ?AGy|*U7OE5 zq}{K;-tc}*)7&4V2J-7tH~den(t+ig?9QybXE(iZ^7GQD3|3Cu@!(`m7v7rVFV zqW48v?@RhjLz`C*-J8HYD7E%4#7(bQRA1R2CXZH@Q}-4kSHe(V2e5Uw*e6CbV(R1# z`o@`zlH-lzTOb`en^~GtWq@nPF=b<+d>71gIR37p-$!O~WiBX5Qgrx!!Q;{_%5(M- zC7Ez%N7A>7Zc}GGZPoe=Rg%715;#+f0f9_pslZKqpIc1JxFSjgIA73 z@s+&MsAu0=)*oHU=LPtr77cyOx1TMyn^YFAZ`1I4Jw(lhE4br0azPfUCkc(ngK83? zG6ZoJyb3=zk@S0cSZrK$NTpY372F+~IC%hl7_ka2KW>-nE0Qfl@X|JH@QS}zTb{I) daGcuZzkqjG=8X)57^of max_life: + life = max_life + +func get_health_ratio(): + return life / max_life \ No newline at end of file diff --git a/final/17-Attack demo with Heartbeast/end/characters/shared/shadow.png b/final/17-Attack demo with Heartbeast/end/characters/shared/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..77e64665231b9e0746716db0ef9685f4bd4e2817 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^$3WswtPWKvNUlGighbeKUAsDd%c+ucR1=Hd!TAcwQS zBeIx*fm;ZK886+f`vVkYFY)wsWq-)U#KmfC=ekG(DD=V8#W5t}@X;C3V$BLXtjhe# zU7;)A)vp$PyK&1E`xA3{&v3T1w7lqc%S?{e^Um%KnWOimj2me>1N{AYVr&-&XxNZ=dWnLQs`&bzOu6fpaL?1|9K z@64$U-=vS*rLWD1&HrY3{a=>$zWuj8{k_VqxukAg_Ak*$px+rhUHx3vIVCg!0OO&? AH~;_u literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/end/characters/shared/shadow.png.import b/final/17-Attack demo with Heartbeast/end/characters/shared/shadow.png.import new file mode 100644 index 0000000..c343588 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/shared/shadow.png.import @@ -0,0 +1,24 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/shadow.png-7ac08bc6ed7dcf19791e52a1c588d64c.stex" + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/final/17-Attack demo with Heartbeast/end/characters/weapons/Weapon.gd b/final/17-Attack demo with Heartbeast/end/characters/weapons/Weapon.gd new file mode 100644 index 0000000..f45e78f --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/weapons/Weapon.gd @@ -0,0 +1,55 @@ +extends Area2D + +signal attack_finished + +onready var animation_player = $AnimationPlayer + +enum STATES {IDLE, ATTACK} +var current_state = IDLE + +export(int) var damage = 1 + + +func _ready(): + set_physics_process(false) + + +func _physics_process(delta): + var overlapping_bodies = get_overlapping_bodies() + if not overlapping_bodies: + return + + for body in overlapping_bodies: + if not body.is_in_group("character"): + return + if is_owner(body): + return + + body.take_damage(damage) + set_physics_process(false) + + +func is_owner(node): + return node.weapon_path == get_path() + + +func _change_state(new_state): + current_state = new_state + + # Initialize the new state + match new_state: + ATTACK: + set_physics_process(true) + IDLE: + set_physics_process(false) + + +func attack(): + animation_player.play("attack") + _change_state(ATTACK) + + +func _on_AnimationPlayer_animation_finished( name ): + if name == "attack": + _change_state(IDLE) + emit_signal("attack_finished") diff --git a/final/17-Attack demo with Heartbeast/end/characters/weapons/Weapon.tscn b/final/17-Attack demo with Heartbeast/end/characters/weapons/Weapon.tscn new file mode 100644 index 0000000..d753c76 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/weapons/Weapon.tscn @@ -0,0 +1,177 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://characters/weapons/Weapon.gd" type="Script" id=1] +[ext_resource path="res://characters/weapons/sword/sword_enemy.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] + +resource_name = "_setup" +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:rotation_deg") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath(".:modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath(".:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("CollisionPolygon2D:disabled") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} + +[sub_resource type="Animation" id=2] + +resource_name = "attack" +length = 0.4 +loop = false +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath(".:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/keys = { +"times": PoolRealArray( 0, 0.35, 0.4 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ true, true, false ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("CollisionPolygon2D:disabled") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/keys = { +"times": PoolRealArray( 0, 0.35, 0.4 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ false, false, true ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/keys = { +"times": PoolRealArray( 0, 0.05, 0.2 ), +"transitions": PoolRealArray( 1, 0.473309, 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ), Vector2( 1.3, 1.3 ), Vector2( 1, 1 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath(".:rotation_deg") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/keys = { +"times": PoolRealArray( 0, 0.15, 0.3 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -100.102, 98.7122, 90.0 ] +} + +[node name="Weapon" type="Area2D" groups=[ +"weapon", +]] + +rotation = 1.72285 +input_pickable = false +gravity_vec = Vector2( 0, 1 ) +gravity = 98.0 +linear_damp = 0.1 +angular_damp = 1.0 +monitorable = false +audio_bus_override = false +audio_bus_name = "Master" +script = ExtResource( 1 ) +_sections_unfolded = [ "Collision", "Transform", "Visibility" ] +damage = 1 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." groups=[ +"weapon", +]] + +playback_process_mode = 1 +playback_default_blend_time = 0.0 +root_node = NodePath("..") +anims/_setup = SubResource( 1 ) +anims/attack = SubResource( 2 ) +playback/active = true +playback/speed = 1.0 +blend_times = [ ] +autoplay = "" + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] + +position = Vector2( 1.90735e-06, 0 ) +build_mode = 0 +polygon = PoolVector2Array( 26, -13, 26, 13, 129, 13, 160, 0, 130, -13 ) +one_way_collision = true + +[node name="Sprite" type="Sprite" parent="."] + +scale = Vector2( 1.02945, 1.02945 ) +texture = ExtResource( 2 ) +offset = Vector2( 72, 0 ) +_sections_unfolded = [ "Offset", "Transform" ] + +[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_AnimationPlayer_animation_finished"] + + diff --git a/final/17-Attack demo with Heartbeast/end/characters/weapons/spear/Spear.tscn b/final/17-Attack demo with Heartbeast/end/characters/weapons/spear/Spear.tscn new file mode 100644 index 0000000..7e1e542 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/weapons/spear/Spear.tscn @@ -0,0 +1,149 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://characters/weapons/Weapon.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/weapons/spear/spear_enemy.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] + +resource_name = "_setup" +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:rotation_deg") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath(".:modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath(".:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("CollisionPolygon2D:disabled") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} + +[sub_resource type="Animation" id=2] + +resource_name = "attack" +length = 1.2 +loop = false +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.35, 0.4, 0.45, 0.55, 0.55, 0.6, 0.75, 1.1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 5.29456, 1, 1, 1, 1, 2.46314, 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ), Vector2( -11.0626, 7.31512 ), Vector2( -13.7383, 5.24251 ), Vector2( -14.6302, 2.92606 ), Vector2( -14.6302, 0 ), Vector2( -13.8042, -3.9014 ), Vector2( 103.387, -2.38419e-06 ), Vector2( 98.998, 0 ), Vector2( 91.6829, 0 ), Vector2( 91.6829, 0 ), Vector2( 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("CollisionPolygon2D:disabled") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:rotation_deg") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/keys = { +"times": PoolRealArray( 0, 0.05, 0.3, 0.35, 0.4, 0.45, 0.55, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ 0.0, -2.88659, 1.92508, 0.962542, 0.0, -0.896525, 0.0, 0.0 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Sprite:scale") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/keys = { +"times": PoolRealArray( 0.3, 0.45, 0.55, 0.65 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1, 1.4 ), Vector2( 1, 1 ) ] +} + +[node name="Spear" instance=ExtResource( 1 )] + +rotation = 0.0 + +[node name="AnimationPlayer" parent="."] + +anims/_setup = SubResource( 1 ) +anims/attack = SubResource( 2 ) + +[node name="CollisionPolygon2D" parent="."] + +polygon = PoolVector2Array( 33, 0, 54, 17, 98, 0, 55, -17 ) + +[node name="Sprite" parent="."] + +scale = Vector2( 1, 1 ) +texture = ExtResource( 2 ) +offset = Vector2( -30, 0 ) + + diff --git a/final/17-Attack demo with Heartbeast/end/characters/weapons/spear/spear_enemy.png b/final/17-Attack demo with Heartbeast/end/characters/weapons/spear/spear_enemy.png new file mode 100644 index 0000000000000000000000000000000000000000..9ede6cc0dfabf365d44671bbcbdcca3d41f38538 GIT binary patch literal 2514 zcmV;@2`%=CP)am5g3D z0GVt~3kH0y`GrMS!wZeHV#i5WMA6lm&_tM;_IZ!RjJF=MR_$~DT2m~pD`2q;k148_ z6P^^FUdyQ_?+CXmsYp!tOt?>z3ku(vdbG^1CMV1MZL$^)`oY>F>`GQ~w2GCKmJybh z%I|&5mpJ0txsb$e@lJGt1n}WvigEl5GsvjS!+7x0FDq)~50vs}S(RKxW|aaO zD~SI#?^e*if6XVEcVn-2g0010qNS#tmY3ljhU3ljkVnw%H_00;I-L_t(| zobBCPXdKrW2k`$nbJ_c@w2~|d$;839PU31pFXkxo@jO>^^nA)bKMviyKTCG=FX=Zn3XHFkhl2_~1 z-erl^_j|Ku=A5%e=iBehxdkhJxg2@3bJm-kd(s_Kd(Pue;n2MVr zg}p8_9N$P;1O*1N>7+jx-VPvAv70;K^*rM#aNP*LbVF=k z{J>PI^x9`zv>zFkc(Wi@mc<#cBg!!tyx+A1fJ|QCjwz7J35Y6nN(>^V;#yE6Jhl2W++O+bf)Dm5hxW3(3#I(tZ4r(~!mR1elyiZE=^R%2FFYezrm@SB_$-LOoN`ZuQs!CIl52Mch07HL( zVWCibS(&s1+zK(m_8?8?#9jt`@sIfU*I}8xt#JHeB&pX}MNy&Nl0x5Ea6v(VkX1a{ z^KgSgxsc4TBgV0(U&789M|hQKQ2}7q#?aTMcq3s6^V44K^re378;#VpoH5M1;@Q@k zO-N^}wm#uul2~y#GZljzVF`E@vWUD3<*qCCGhqKeTo(Ut+J;yRTw7Fob0G2g?>OwboohI@jfti(TCuA$fhGgC~m1 zqZ6h;W|ig9OBjHtirXQX{YK?@v(Y^i%Yi}Vc)44_uK5D?I07_RNk|#909;Oa4}Dqm zyi*JYMoyqmV_UXgLO!anzxyRjj2ilXnyqs=FdRR9HV5E4%@#z+hIL@L_N)0ic>=gT z>*1cwurtQjY-myN03#=mGzGFw_2zR1#1z~J%IxO~$M4#4s4UG&5YmLZmO$2Vv8!wK zJqyjqluR>LTAWlWBx63Ju#>8US4NY1qHT=;1qQMS2oA84?@-?z0jIZmXI4@xd!=B- zZ|2g@Y88MhGaj}_IfhyoS}aX7CM>V!Y0@%-7gKRHD6^l88TzTFE3JV71L=64AM=uV z|A_a%R|0{r8XH}B0c3}Q?D(ja7(Bg@1j%byk zg;f9&mWN~==R2w#g_z3D`z5?GX6P4NX@8?O$gC_OYbSkbE0<=)EoBbF%{=c!G3CbC zw)lam<*t08Py6NFocMt&R`wwV;L!-jP>3zRm~=()EXR7M8DlD@f-*a%avW{ukd=0z zz(6*Qdw(8&PqOeF&!Y#T#s)$L&+}o%4d8?BgSRWL@AmBzK8}e|L%&hyM_Mx!7zk;>BewDHDjN`2w zsw_@3UJlCa$e5v@S+6$Mivj~7Z8kZe1#J&M_5|V*!!^!uMPis7N$R=vZW|$l5JCtc cgsh?e12?}3#|)A}@&Et;07*qoM6N<$f?buhmjD0& literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/end/characters/weapons/spear/spear_enemy.png.import b/final/17-Attack demo with Heartbeast/end/characters/weapons/spear/spear_enemy.png.import new file mode 100644 index 0000000..3a97405 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/weapons/spear/spear_enemy.png.import @@ -0,0 +1,24 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/spear_enemy.png-b325bd4ecef242c2d8570488a23b715b.stex" + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/final/17-Attack demo with Heartbeast/end/characters/weapons/sword/Sword.tscn b/final/17-Attack demo with Heartbeast/end/characters/weapons/sword/Sword.tscn new file mode 100644 index 0000000..22ac01b --- /dev/null +++ b/final/17-Attack demo with Heartbeast/end/characters/weapons/sword/Sword.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://characters/weapons/Weapon.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/weapons/sword/sword_player.png" type="Texture" id=2] + +[node name="Sword" instance=ExtResource( 1 )] + +rotation = 0.0 + +[node name="CollisionPolygon2D" parent="."] + +disabled = true + +[node name="Sprite" parent="."] + +texture = ExtResource( 2 ) + + diff --git a/final/17-Attack demo with Heartbeast/end/characters/weapons/sword/sword_enemy.png b/final/17-Attack demo with Heartbeast/end/characters/weapons/sword/sword_enemy.png new file mode 100644 index 0000000000000000000000000000000000000000..d97d487c9407b5a1901ef8e1973b2dccfa31da82 GIT binary patch literal 2156 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 iS`{P1Fbu;mR`5UP)^LX3(m-SY0000am5g3D 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 literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/start/.import/buddy_green.png-2eb85c58aef2a5294e97d930fe09f0e5.stex b/final/17-Attack demo with Heartbeast/start/.import/buddy_green.png-2eb85c58aef2a5294e97d930fe09f0e5.stex new file mode 100644 index 0000000000000000000000000000000000000000..e74206232d1b383560b176eb1a3dcdb622a562cb GIT binary patch literal 2330 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 Hu0mjfMms}o literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/start/.import/shadow.png-9b88bc6b24165e21f04edb7eaa0e0cce.stex b/final/17-Attack demo with Heartbeast/start/.import/shadow.png-9b88bc6b24165e21f04edb7eaa0e0cce.stex new file mode 100644 index 0000000000000000000000000000000000000000..01415d30d086e888d8826e850b9a94fd31be09b7 GIT binary patch literal 673 zcmV;S0$%+`L{n6E0000f000040000001yWO0001m0ssI|PDdb#P)Ky=6@dF!Vb3jpHsOSB9kUwq22$!iw=(ZpQkcyxJ~S0TlUPC z(8621!7;w$`l%mH6K)&(Qy!bhzg2SKg)$EjY;*hRLJ++x@r`n zC@a-ZuMpLCseWz>QAU~S=c*9(v8jG83sLx->gS>m744~h&I++qVd^UOR0&<252pM& zFWHh*x(@&5bC2ZvZe8?5o_FDP#Tt}UeaHH@+2I1YsTLQdg?24+#Qkuuaro@bNo6`T z)Imp!(g$lmQ}rAhc`zQgoa7KE&(fS!mJ_k0^PX|x_V5*_^KMZp#i_{a!Q0Mb>vM1M zSze+S-I2)Y!SYQeFCXcNuKvf!8kF?n1`odz2cM=1tb^ZjPmD#-Q}Uh|`X@TT53y9? zwJfZAPFMJ8PP^F*bn&hKH@Xj1OWeb=XV0!D?w?&H>_hbz+Wcmw&{U<>00000NkvXX Hu0mjfMms}o literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/start/.import/spear_enemy.png-b325bd4ecef242c2d8570488a23b715b.stex b/final/17-Attack demo with Heartbeast/start/.import/spear_enemy.png-b325bd4ecef242c2d8570488a23b715b.stex new file mode 100644 index 0000000000000000000000000000000000000000..772786ab01488735cfb7732324da033d6f21cc8d GIT binary patch literal 2809 zcmVdyHIF9mhZCzGi1;XJ^~(gR+of z2o|VGAt*v2`bQfighc#@KtyR`6g1IDY*GPZsv#ku7$pK?VzP)rLR#fzgBbC_BGo`? zh-qy>2r2FEb|0O6&AoSK?mhl-=kDCO^Vr$h>9&mLlT12u?!9O3G<&}HcYeR$`5l2m zp=gVLuHRAhSw`L$Jn&@DVrc?PuN*7+)%{$3a_F?&-*OOV`UVt=k0P(F-GQN1w=Go| z^w{+PSB?&K^gi1~34=nhL|z%VorD$)okrr&NEo8lLR1+1sHy;0jSY3~hTA|1gQDx1 zdiK1I^z-f=+p9ho%Y!^B4iYrrmV(D^o|GGalBJ1ZOXpGGolqD`5)u(BA{2%?Mg&)$ z0g+I`py*1bo;$y`QOer3RuGk8^6uBRExeyA$++ckL#`m7oGr4trVAiz@j==U4*`#q zBz`CiQEMS83^7;4idqr%1WKV$v_P*RaLc2*;EYi&^@ZWmE0EFW3sYzG9GGC%MesRAgSe+0QeaVC?u}jUrEM;J4OtCkiu@e{z zg(2#!j0!_3HY>WO!y!*442rHJ_jJYC7!imy`n-HupJj_yY;6kdn|NM^x4pEu4wwM= z_gA)s1N1v%wtTQ8tNYRfT-2wrAtFo?$hndedC7z$Y3AwB1u|=KC}oJW?4~Mluyv=}TJWvr*K399 z&!q%~zwO*6Tn{sT?gbf*jlH66^V{)YB=0klmlPUACPFeMr+Q5>1bn~f%ehb(ycVs9 zR@1MQFeti~$FE-y2N@l-vzKd&Mkn+j zQ;S#;riP!j*q_wJE@0SOup%HCNt_DX^(9&nDvv?YwcPR2r3h*rX|04TYtD&{(~K#& zVvXK0QGnn+*Y*gutk$@4tfcKpi{WAkTTr5*=n{T;{h_C#pL5r=_NU$dTD4uj@4JD;upuS5s82&%0oT1R zVZ3ZbOc$D45tfFRwZvbOIy-@bQ7fXSo)yt#5tk8Z+b~;_2j@N3wf!p;iY}&JC~_sf zbA3{-l zh`9;kOTGb&NO+{mabap;inHTCLZML9Cu0gWWd#>zV9b`B$otIKNxv>H;<_MLkdGvF z9_q8i^T1BvSa^;Xaj6(JJ(Stfr#CvJP$Y>h2o48F2)+kOC}dt(hZO?nd&vfljDxu4deh;B}7g2C?i?%GR)fk zqQxr|ivL?YS%1yJnZWj7H19KNOWZ}C;Xy_uul4BS-dsTrLy&r1h!wBhx;o3W7~p?X*oT zNqFhThYl?-`XS0EI5GFNUGd@(+Za`(n9EGCW zc<%FuPfNciZOLrWV{?DwH4E*Ki-Z~LB_~Bm8_Z=)vDebMd$u4)AgCl2btD?1{n z!;B-gzi2gSL*QpE4yFw8!zouj7q(|CvGDY7RKp=$S=mZ0NR`K+=t_Qf>*46$40C$E zQsO=Nz9jkn(jJI@lG(wOxMjkTdu^{$CeD}e&a_X?4W<_Hy(}9cfk{U)VoRo43o}mi zn&OFZTkZztfO2{I$~n4Lz1|@t^p!59?xXR{zCX2mvO@7uAot99#3Fbv=y`5kPM=;c zF9Q33!PN;~opQM}dVJgorWTj3(&%e4wXjPtV*8A?P~XwgC}k}%+@o`Mt|0dVtW63E zUgI$1!u^&{X|={U|K9VCOsL{a%?rsn6)^TGQ=Yjj(jLzPv`R+P?q1)V~xeOo|SwJZ8{RERgJ>0 z+`jNWUmm%MvNORDTxNUnXSo8`7X9j}N;%Bw-g?;J`>;z5zH;8)l5>M})K! zX6zKoVo)fS$X^C-2WmtC0Naxb>BoL~HD+i9n3 literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/start/.import/sword_enemy.png-41731279fc65f79e376db0eb84917f2f.stex b/final/17-Attack demo with Heartbeast/start/.import/sword_enemy.png-41731279fc65f79e376db0eb84917f2f.stex new file mode 100644 index 0000000000000000000000000000000000000000..5149fe6eb803238938e60ed5334dfd0b4939c648 GIT binary patch literal 2210 zcmV;T2wnF_L{n6@0000l000040000001yWO0001n2mk<3PDdb#P)eTW=q9mhY<%kot!&gf{9Q{v{$RY6~`2K~S(QG=Er9XbY*f zv`H+bMTnx_rO92=OYX9Fx4ZN5^N*R?o!y<;m)o7qZSMKNu+Ka%zjTu zQe^2bJ5jEm7OS>Q*IbKeL&1l#~*TQn~N$AO;%$F!(5?a&utLyfq9l|9RS%0+e1{6;aE zEl=?q-~laaO)F9#ibN5UuVfdvze7<2pj=dTf&0be-Zc8AxwPn5V4bk?yPfq}i`E6E zyRqqvvIxvX^NxReZ#O1e((3nZw-!3G-=cE&eciZSQ-Prrrh-h2%lzo+gT3xnBB=_y z@aqO)yM|M}O1OC_Z*Sg(?1EsfR@XfX52y@Aj_yxa)S!jkuH7VI$9=;eNm=Bn3VZDr z4Z^NDKId;STK7O;{AI5`R{^|sAbn8>T}ai!RuXo-owU4oU&q)Dv~yY|)ajR~HQiBi zv<1Alt#{1ZJ+Pq}LQY`xfi4Ga14HA zdX^*8vmI~KDtf|@kzR1*o``gK0s17Q3WVeHjb!|7PZeRD!{}2J& z6G|?u*uq-Oy+NM9yCpunRFc1sXE~A2sBZy>!tyu|o(lrIukDzv!a&h*q1(zz&oqL{HjN};qQnl zd5h)uWYtfBABo@rc))Osu%#w5J=SA}DFuhIf+GipO};yxRZjp91I4hs(@We%C@UM*@(S{Mp0A5rX{Ho1Pn zU^Ejyx?gu0I<+njES2N}@F!p@TAmat^u!MphT%e^=nBEIzsLKc(KMid=^@2UQwATJ zG?>W63%ulEEv(C3^Q*G3>hL`9-e`G}2N(QMp>?5pS-2)zDQ_tz6V57)rWZ`)6cahc z1zVUa2#du=xrU)aLvdmv%h7F?dJuReERPEn0$52uSl^d7(!E1UqX`(zDBeGzxXOXK zRgcr_(jeGQLxqW92`y?(zZtgR+A)JY+f8=m6;_N01vppcnz>bZcBL$*fUnorvAv6Z zcb`TRL)L(+M-BGOm|Q(-kWEnOvdxZ@Yx3A~SQTR_mDA>t=Uyf&)&u7#_C6}keJS}X^rlb==7i@VN z{J-DB2OAQF?TH^$*J%35Mg*OYgr!4qTV^#+T&V^_jxD=PB?QkknqJebprhnWutuvl znH)Xua8tMbBdmAF;Mn z7i~B1{X8WX7K_5^HDR^Mb75%+I>ds(5;gc{WeQLt!Dn!l59+GGe=70oglQsmDvv*Hc1A4LMl8v3LE(T#qPi+!NPxsk9B2UWj)B?-|d+dArq9DKvw)RGsw#TnczguP%X=d?O^fuMI9a{MYH{Fk=LS~ z#1w={L-~`x*G#b%saG%TGz1-zs>gPR8?sIsWp;%t%7fhL&PI&xFek(G2YzyxHy_rX zdr$~3&T%t0^_o;Y_R>=g9{ZEIQ@o(Ojcr#9q;xr-240HhPu{Wh-pm`Fq%mYudhCGR zeSEPJ^nZ-~QhA2^tR;SFmdLcOUd7E}JCl5qI#F*`(tbJ7pwm}j2V>>Ofj<_n;4bCx zDJ2XwYa@!HSiG2dmp=mq<@sZCjiwoW6L$0mpnVwy;E7;q3;VKaP*;mv(~7>xBPwd? kVpJb(tJ(>SYPKx@2RZq6nzv`x%K!iX07*qoM6N<$f=E3+3IG5A literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/start/.import/sword_player.png-fa08b35650d3d8263f7b1e08cb6ba3c8.stex b/final/17-Attack demo with Heartbeast/start/.import/sword_player.png-fa08b35650d3d8263f7b1e08cb6ba3c8.stex new file mode 100644 index 0000000000000000000000000000000000000000..aaf641d108ef055af4d0900b044fc63c3e9db765 GIT binary patch literal 2550 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 end_position.x \ + or input_direction.x == -1 and position.x < start_position.x: + last_move_direction = input_direction + _change_mind_state(WAIT) + + +func _change_mind_state(new_state): + previous_mind_state = current_mind_state + current_mind_state = new_state + + match current_mind_state: + WAIT: + input_direction = Vector2() + wait_timer.wait_time = 1.0 + wait_timer.start() + MOVE: + input_direction.x = -last_move_direction.x + if last_move_direction.x == 0: + input_direction.x = 1 + wait_timer.stop() + + +func _on_WaitTimer_timeout(): + wait_timer.stop() + if first_ai_cycle: + first_ai_cycle = false + _change_mind_state(MOVE) + return + + _change_state(ATTACK) + _change_mind_state(ACT) + + +func _on_Weapon_attack_finished(): + _change_mind_state(MOVE) + _change_state(IDLE) diff --git a/final/17-Attack demo with Heartbeast/start/characters/enemy/Enemy.tscn b/final/17-Attack demo with Heartbeast/start/characters/enemy/Enemy.tscn new file mode 100644 index 0000000..2db536c --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/enemy/Enemy.tscn @@ -0,0 +1,45 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://characters/Character.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/enemy/Enemy.gd" type="Script" id=2] +[ext_resource path="res://characters/enemy/foe_pink.png" type="Texture" id=3] + +[sub_resource type="RectangleShape2D" id=1] + +custom_solver_bias = 0.0 +extents = Vector2( 20.2295, 16 ) + +[node name="Enemy" instance=ExtResource( 1 )] + +script = ExtResource( 2 ) +max_health = 2 +patrol_distance = 200 + +[node name="Body" parent="."] + +texture = ExtResource( 3 ) +offset = Vector2( 0, -129 ) + +[node name="CollisionShape2D" parent="."] + +shape = SubResource( 1 ) + +[node name="WeaponSpawnPoint" parent="."] + +position = Vector2( 0, -42 ) + +[node name="DisplayDebugInfo" parent="."] + +margin_top = -134.0 +margin_bottom = -120.0 + +[node name="WaitTimer" type="Timer" parent="."] + +process_mode = 1 +wait_time = 1.0 +one_shot = false +autostart = false + +[connection signal="timeout" from="WaitTimer" to="." method="_on_WaitTimer_timeout"] + + diff --git a/final/17-Attack demo with Heartbeast/start/characters/enemy/foe_pink.png b/final/17-Attack demo with Heartbeast/start/characters/enemy/foe_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..b91a0a0b2d4951e4d2d92173ae472568216f49ca GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^Q49=>%pA->R#U^{-9U;Z-O<;Pfnj4m_n$;oAYUQb zBgmJ5p-PQ`p`nF=;TKS-;RORjsR0ASs{{rHs~HRo;stYd1=;{5<^=eJxV}+MYG`O! z!xK**v|S+nf>h!o#iUm%NkFUD@y1`0PJFGJbWtktwp`*x>BQ{<2`^QW9x5gR9jHB} zWIvEnDGBlmW?l50%+pI68iIDxWuc@rv`p#b0xHXTAQa+Qs!PV&=)H!pTfP z^^8g0?k>jWS8L*c9L@rd$YKTtZXpn6ymYtj4^WW3#M9T6{UH|<7pt+I>mm)Ho~52H zjv*Dd-rhM`)Z`%H`mju4o0NNxg<4>=z~evv_{BNzt~lveC$`e6oOL$;D(+ahrJJT| zhrVB$HZSh&(bZw6mgY#VdENW`>TRjgzukHJwy8WwSzGpb-n){e4^m=l7gyJM-kec) z{^G6aQ+q#_dhy>|lA7GsEWb-vU;47&3%?0>*B{Ohw%_Y3vd&oRLinzC@3zJ7etx%P z_up%oizi9#jz9Hng1BEmv?qf5t9L@4qK}9mwf>KlkzwTdpqL2Pt&$PewzJX*3KQP%j%ii W1$bVpHEaS!EQ6=3pUXO@geCwV$1_L( literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/start/characters/enemy/foe_pink.png.import b/final/17-Attack demo with Heartbeast/start/characters/enemy/foe_pink.png.import new file mode 100644 index 0000000..fc2e410 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/enemy/foe_pink.png.import @@ -0,0 +1,24 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/foe_pink.png-e53b2a7e2ae7e41f1caa814d90a4f307.stex" + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/final/17-Attack demo with Heartbeast/start/characters/player/Player.gd b/final/17-Attack demo with Heartbeast/start/characters/player/Player.gd new file mode 100644 index 0000000..9963756 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/player/Player.gd @@ -0,0 +1,21 @@ +extends "res://characters/Character.gd" + + +func _input(event): + if event.is_action_pressed("attack"): + if current_state in [ATTACK, STAGGER, DIE, DEAD]: + return + _change_state(ATTACK) + + +func _physics_process(delta): + input_direction = Vector2() + + if Input.is_action_pressed("move_left"): + input_direction.x = -1 + elif Input.is_action_pressed("move_right"): + input_direction.x = 1 + elif Input.is_action_pressed("move_up"): + input_direction.y = -1 + elif Input.is_action_pressed("move_down"): + input_direction.y = 1 diff --git a/final/17-Attack demo with Heartbeast/start/characters/player/Player.tscn b/final/17-Attack demo with Heartbeast/start/characters/player/Player.tscn new file mode 100644 index 0000000..6bd74bc --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/player/Player.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://characters/Character.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/player/Player.gd" type="Script" id=2] + +[node name="Player" instance=ExtResource( 1 )] + +script = ExtResource( 2 ) +weapon_scene_path = "res://characters/weapons/sword/Sword.tscn" + +[node name="WeaponAnchorPoint" parent="WeaponSpawnPoint"] + +position = Vector2( 46, 8.1054 ) + + diff --git a/final/17-Attack demo with Heartbeast/start/characters/player/buddy_green.png b/final/17-Attack demo with Heartbeast/start/characters/player/buddy_green.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f7f41c7429baa5370704bfd40a380a7900f902 GIT binary patch literal 1650 zcmeHGdpOez82%BDlcgf$h;rmIs&jg%*v+nH+aYqxrIy?iQB1jRtq>~Ou?b7%xOED- zw=uUck8LR{W{jiLD9NpHDpP0uef~QCpXd3$@BQBQukZQZ@5}Z$>Y}4D$s~PyP*M~J`bckt*PQ>Ap}o107$k10NPam_@a_%ZvlXE5CGg_C=fY4|(NHgjG`1c0fxP*jWEJK8PAV#!HU{A-Os&(-s zu-`-|Jcp3Z$25^YDFAX!jU2r5}^Z$J`X4@`Whs0H)~`+?7kX(2Gsz!`>32s)rH1QfT`q ztnn2*xgUF+=h7vCRShEwM5u>iMB6A#FahC?!Wcr7%4G?SsPYydCwLz90s!;V`K=>! zUv8-*Oa4R|Qm1vVuiem73wj^Cs|!zx*`Qy|&W*oBRDLDwUg(UNzox&sk~(#J((Ghb zZT<6?i|g-(GG$I_%i$fS#x56gE=T>yBcIxyky2D#BYvxJrW&iR2~Z3E)dg2Lb8c6i zifoP}_{RePNbh^94a?G%Dp4ze=;o|7t*x%DY47A*1_pplIYb=V`;zp-#Ah!tN?&U! zL%RkXJ+PGLgUjKp4i1pRzUMMcq0MXBXXQoQT@cC zCO?v?ztghWam`Va&~#yeV%Y?)@I~v@46fNMACMcUTL$R*H+eI(t_-p9U0UryK68NSpM?nTY;n~P zgJ0M>E;HU=?2Uv32%foS_MBlwuG%V!DR5tY;LW>1)|Hv60g6k55rRQV?gfTvX^{c0 z`%+>irN-m7Tp#9W9ZZePn0nk{70 ziD#wLak7?VH+RP5tjV|iIxkzy*z{%d81f_k0z4NR9LtK#c=t0?V$Mpn4P>CYKOtgH z8P&6`-!CU1KZ*7knQef~Syl~OiT8t)mldrM_rsHKIFTBzA447CqI?Amu#tGm-tdjp zLxVFccg6XvfPuNjLjtgFQ(10kv#rR^O`~x8hV^+|aoE*#WSJn;a)nQ?AGy|*U7OE5 zq}{K;-tc}*)7&4V2J-7tH~den(t+ig?9QybXE(iZ^7GQD3|3Cu@!(`m7v7rVFV zqW48v?@RhjLz`C*-J8HYD7E%4#7(bQRA1R2CXZH@Q}-4kSHe(V2e5Uw*e6CbV(R1# z`o@`zlH-lzTOb`en^~GtWq@nPF=b<+d>71gIR37p-$!O~WiBX5Qgrx!!Q;{_%5(M- zC7Ez%N7A>7Zc}GGZPoe=Rg%715;#+f0f9_pslZKqpIc1JxFSjgIA73 z@s+&MsAu0=)*oHU=LPtr77cyOx1TMyn^YFAZ`1I4Jw(lhE4br0azPfUCkc(ngK83? zG6ZoJyb3=zk@S0cSZrK$NTpY372F+~IC%hl7_ka2KW>-nE0Qfl@X|JH@QS}zTb{I) daGcuZzkqjG=8X)57^of max_life: + life = max_life + +func get_health_ratio(): + return life / max_life \ No newline at end of file diff --git a/final/17-Attack demo with Heartbeast/start/characters/shared/shadow.png b/final/17-Attack demo with Heartbeast/start/characters/shared/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..77e64665231b9e0746716db0ef9685f4bd4e2817 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^$3WswtPWKvNUlGighbeKUAsDd%c+ucR1=Hd!TAcwQS zBeIx*fm;ZK886+f`vVkYFY)wsWq-)U#KmfC=ekG(DD=V8#W5t}@X;C3V$BLXtjhe# zU7;)A)vp$PyK&1E`xA3{&v3T1w7lqc%S?{e^Um%KnWOimj2me>1N{AYVr&-&XxNZ=dWnLQs`&bzOu6fpaL?1|9K z@64$U-=vS*rLWD1&HrY3{a=>$zWuj8{k_VqxukAg_Ak*$px+rhUHx3vIVCg!0OO&? AH~;_u literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/start/characters/shared/shadow.png.import b/final/17-Attack demo with Heartbeast/start/characters/shared/shadow.png.import new file mode 100644 index 0000000..c343588 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/shared/shadow.png.import @@ -0,0 +1,24 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/shadow.png-7ac08bc6ed7dcf19791e52a1c588d64c.stex" + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/final/17-Attack demo with Heartbeast/start/characters/weapons/Weapon.gd b/final/17-Attack demo with Heartbeast/start/characters/weapons/Weapon.gd new file mode 100644 index 0000000..1fc7f45 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/weapons/Weapon.gd @@ -0,0 +1,41 @@ +extends Area2D + +signal attack_finished + +onready var animation_player = $AnimationPlayer + +enum STATES {IDLE, ATTACK} +var current_state = IDLE + +export(int) var damage = 1 + + +func _ready(): + set_physics_process(false) + + +func attack(): + # Called from the character, when it switches to the ATTACK state + pass + + +func _change_state(new_state): + current_state = new_state + # Initialize the new state + + +func _physics_process(delta): + # Get colliding bodies + + # For each body, check if it's an enemy + # If so, damage it and stop physics process for this attack + # Otherwise it damages targets on every tick + pass + + +func is_owner(node): + # Return true if the node is the weapon's owner + pass + + +# Write AnimationPlayer callback when the attack animation ends diff --git a/final/17-Attack demo with Heartbeast/start/characters/weapons/Weapon.tscn b/final/17-Attack demo with Heartbeast/start/characters/weapons/Weapon.tscn new file mode 100644 index 0000000..d753c76 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/weapons/Weapon.tscn @@ -0,0 +1,177 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://characters/weapons/Weapon.gd" type="Script" id=1] +[ext_resource path="res://characters/weapons/sword/sword_enemy.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] + +resource_name = "_setup" +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:rotation_deg") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath(".:modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath(".:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("CollisionPolygon2D:disabled") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} + +[sub_resource type="Animation" id=2] + +resource_name = "attack" +length = 0.4 +loop = false +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath(".:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/keys = { +"times": PoolRealArray( 0, 0.35, 0.4 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ true, true, false ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("CollisionPolygon2D:disabled") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/keys = { +"times": PoolRealArray( 0, 0.35, 0.4 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ false, false, true ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/keys = { +"times": PoolRealArray( 0, 0.05, 0.2 ), +"transitions": PoolRealArray( 1, 0.473309, 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ), Vector2( 1.3, 1.3 ), Vector2( 1, 1 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath(".:rotation_deg") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/keys = { +"times": PoolRealArray( 0, 0.15, 0.3 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -100.102, 98.7122, 90.0 ] +} + +[node name="Weapon" type="Area2D" groups=[ +"weapon", +]] + +rotation = 1.72285 +input_pickable = false +gravity_vec = Vector2( 0, 1 ) +gravity = 98.0 +linear_damp = 0.1 +angular_damp = 1.0 +monitorable = false +audio_bus_override = false +audio_bus_name = "Master" +script = ExtResource( 1 ) +_sections_unfolded = [ "Collision", "Transform", "Visibility" ] +damage = 1 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." groups=[ +"weapon", +]] + +playback_process_mode = 1 +playback_default_blend_time = 0.0 +root_node = NodePath("..") +anims/_setup = SubResource( 1 ) +anims/attack = SubResource( 2 ) +playback/active = true +playback/speed = 1.0 +blend_times = [ ] +autoplay = "" + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] + +position = Vector2( 1.90735e-06, 0 ) +build_mode = 0 +polygon = PoolVector2Array( 26, -13, 26, 13, 129, 13, 160, 0, 130, -13 ) +one_way_collision = true + +[node name="Sprite" type="Sprite" parent="."] + +scale = Vector2( 1.02945, 1.02945 ) +texture = ExtResource( 2 ) +offset = Vector2( 72, 0 ) +_sections_unfolded = [ "Offset", "Transform" ] + +[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_AnimationPlayer_animation_finished"] + + diff --git a/final/17-Attack demo with Heartbeast/start/characters/weapons/spear/Spear.tscn b/final/17-Attack demo with Heartbeast/start/characters/weapons/spear/Spear.tscn new file mode 100644 index 0000000..7e1e542 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/weapons/spear/Spear.tscn @@ -0,0 +1,149 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://characters/weapons/Weapon.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/weapons/spear/spear_enemy.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] + +resource_name = "_setup" +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:rotation_deg") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath(".:modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath(".:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("CollisionPolygon2D:disabled") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} + +[sub_resource type="Animation" id=2] + +resource_name = "attack" +length = 1.2 +loop = false +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.35, 0.4, 0.45, 0.55, 0.55, 0.6, 0.75, 1.1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 5.29456, 1, 1, 1, 1, 2.46314, 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ), Vector2( -11.0626, 7.31512 ), Vector2( -13.7383, 5.24251 ), Vector2( -14.6302, 2.92606 ), Vector2( -14.6302, 0 ), Vector2( -13.8042, -3.9014 ), Vector2( 103.387, -2.38419e-06 ), Vector2( 98.998, 0 ), Vector2( 91.6829, 0 ), Vector2( 91.6829, 0 ), Vector2( 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("CollisionPolygon2D:disabled") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:rotation_deg") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/keys = { +"times": PoolRealArray( 0, 0.05, 0.3, 0.35, 0.4, 0.45, 0.55, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ 0.0, -2.88659, 1.92508, 0.962542, 0.0, -0.896525, 0.0, 0.0 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Sprite:scale") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/keys = { +"times": PoolRealArray( 0.3, 0.45, 0.55, 0.65 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1, 1.4 ), Vector2( 1, 1 ) ] +} + +[node name="Spear" instance=ExtResource( 1 )] + +rotation = 0.0 + +[node name="AnimationPlayer" parent="."] + +anims/_setup = SubResource( 1 ) +anims/attack = SubResource( 2 ) + +[node name="CollisionPolygon2D" parent="."] + +polygon = PoolVector2Array( 33, 0, 54, 17, 98, 0, 55, -17 ) + +[node name="Sprite" parent="."] + +scale = Vector2( 1, 1 ) +texture = ExtResource( 2 ) +offset = Vector2( -30, 0 ) + + diff --git a/final/17-Attack demo with Heartbeast/start/characters/weapons/spear/spear_enemy.png b/final/17-Attack demo with Heartbeast/start/characters/weapons/spear/spear_enemy.png new file mode 100644 index 0000000000000000000000000000000000000000..9ede6cc0dfabf365d44671bbcbdcca3d41f38538 GIT binary patch literal 2514 zcmV;@2`%=CP)am5g3D z0GVt~3kH0y`GrMS!wZeHV#i5WMA6lm&_tM;_IZ!RjJF=MR_$~DT2m~pD`2q;k148_ z6P^^FUdyQ_?+CXmsYp!tOt?>z3ku(vdbG^1CMV1MZL$^)`oY>F>`GQ~w2GCKmJybh z%I|&5mpJ0txsb$e@lJGt1n}WvigEl5GsvjS!+7x0FDq)~50vs}S(RKxW|aaO zD~SI#?^e*if6XVEcVn-2g0010qNS#tmY3ljhU3ljkVnw%H_00;I-L_t(| zobBCPXdKrW2k`$nbJ_c@w2~|d$;839PU31pFXkxo@jO>^^nA)bKMviyKTCG=FX=Zn3XHFkhl2_~1 z-erl^_j|Ku=A5%e=iBehxdkhJxg2@3bJm-kd(s_Kd(Pue;n2MVr zg}p8_9N$P;1O*1N>7+jx-VPvAv70;K^*rM#aNP*LbVF=k z{J>PI^x9`zv>zFkc(Wi@mc<#cBg!!tyx+A1fJ|QCjwz7J35Y6nN(>^V;#yE6Jhl2W++O+bf)Dm5hxW3(3#I(tZ4r(~!mR1elyiZE=^R%2FFYezrm@SB_$-LOoN`ZuQs!CIl52Mch07HL( zVWCibS(&s1+zK(m_8?8?#9jt`@sIfU*I}8xt#JHeB&pX}MNy&Nl0x5Ea6v(VkX1a{ z^KgSgxsc4TBgV0(U&789M|hQKQ2}7q#?aTMcq3s6^V44K^re378;#VpoH5M1;@Q@k zO-N^}wm#uul2~y#GZljzVF`E@vWUD3<*qCCGhqKeTo(Ut+J;yRTw7Fob0G2g?>OwboohI@jfti(TCuA$fhGgC~m1 zqZ6h;W|ig9OBjHtirXQX{YK?@v(Y^i%Yi}Vc)44_uK5D?I07_RNk|#909;Oa4}Dqm zyi*JYMoyqmV_UXgLO!anzxyRjj2ilXnyqs=FdRR9HV5E4%@#z+hIL@L_N)0ic>=gT z>*1cwurtQjY-myN03#=mGzGFw_2zR1#1z~J%IxO~$M4#4s4UG&5YmLZmO$2Vv8!wK zJqyjqluR>LTAWlWBx63Ju#>8US4NY1qHT=;1qQMS2oA84?@-?z0jIZmXI4@xd!=B- zZ|2g@Y88MhGaj}_IfhyoS}aX7CM>V!Y0@%-7gKRHD6^l88TzTFE3JV71L=64AM=uV z|A_a%R|0{r8XH}B0c3}Q?D(ja7(Bg@1j%byk zg;f9&mWN~==R2w#g_z3D`z5?GX6P4NX@8?O$gC_OYbSkbE0<=)EoBbF%{=c!G3CbC zw)lam<*t08Py6NFocMt&R`wwV;L!-jP>3zRm~=()EXR7M8DlD@f-*a%avW{ukd=0z zz(6*Qdw(8&PqOeF&!Y#T#s)$L&+}o%4d8?BgSRWL@AmBzK8}e|L%&hyM_Mx!7zk;>BewDHDjN`2w zsw_@3UJlCa$e5v@S+6$Mivj~7Z8kZe1#J&M_5|V*!!^!uMPis7N$R=vZW|$l5JCtc cgsh?e12?}3#|)A}@&Et;07*qoM6N<$f?buhmjD0& literal 0 HcmV?d00001 diff --git a/final/17-Attack demo with Heartbeast/start/characters/weapons/spear/spear_enemy.png.import b/final/17-Attack demo with Heartbeast/start/characters/weapons/spear/spear_enemy.png.import new file mode 100644 index 0000000..3a97405 --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/weapons/spear/spear_enemy.png.import @@ -0,0 +1,24 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/spear_enemy.png-b325bd4ecef242c2d8570488a23b715b.stex" + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/final/17-Attack demo with Heartbeast/start/characters/weapons/sword/Sword.tscn b/final/17-Attack demo with Heartbeast/start/characters/weapons/sword/Sword.tscn new file mode 100644 index 0000000..22ac01b --- /dev/null +++ b/final/17-Attack demo with Heartbeast/start/characters/weapons/sword/Sword.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://characters/weapons/Weapon.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/weapons/sword/sword_player.png" type="Texture" id=2] + +[node name="Sword" instance=ExtResource( 1 )] + +rotation = 0.0 + +[node name="CollisionPolygon2D" parent="."] + +disabled = true + +[node name="Sprite" parent="."] + +texture = ExtResource( 2 ) + + diff --git a/final/17-Attack demo with Heartbeast/start/characters/weapons/sword/sword_enemy.png b/final/17-Attack demo with Heartbeast/start/characters/weapons/sword/sword_enemy.png new file mode 100644 index 0000000000000000000000000000000000000000..d97d487c9407b5a1901ef8e1973b2dccfa31da82 GIT binary patch literal 2156 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 iS`{P1Fbu;mR`5UP)^LX3(m-SY0000am5g3D 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