From 97f690c0f173de8751770c6c867a6a6d707e985d Mon Sep 17 00:00:00 2001 From: cornerloan Date: Sun, 20 Apr 2025 23:02:12 -0700 Subject: [PATCH 1/4] added 2 note types - added debug button to refill energy, the number 9 - added echo note, deals increased damage with each loop - added explosive note, deals damage to all enemies --- Classes/Notes/Assets/Note_PlayerEcho.png | Bin 0 -> 1079 bytes .../Notes/Assets/Note_PlayerEcho.png.import | 34 ++++++++++++++++++ Classes/Notes/Assets/Note_PlayerExplosive.png | Bin 0 -> 1129 bytes .../Assets/Note_PlayerExplosive.png.import | 34 ++++++++++++++++++ Classes/Notes/Note.cs | 5 +++ .../Assets/Status_Mulligan.png.import | 34 ++++++++++++++++++ Globals/Scribe.cs | 33 +++++++++++++++++ .../BattleDirector/Scripts/BattleDirector.cs | 10 ++++++ 8 files changed, 150 insertions(+) create mode 100644 Classes/Notes/Assets/Note_PlayerEcho.png create mode 100644 Classes/Notes/Assets/Note_PlayerEcho.png.import create mode 100644 Classes/Notes/Assets/Note_PlayerExplosive.png create mode 100644 Classes/Notes/Assets/Note_PlayerExplosive.png.import create mode 100644 Classes/StatusEffects/Assets/Status_Mulligan.png.import diff --git a/Classes/Notes/Assets/Note_PlayerEcho.png b/Classes/Notes/Assets/Note_PlayerEcho.png new file mode 100644 index 0000000000000000000000000000000000000000..41996f88b260aa981a9e7c475d6a668a68fc5d7c GIT binary patch literal 1079 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFg9j7I|q0=J1Z0v<)>xlq%tsQ zoS!<;+Jo6qqGkUaFBcK+;EsqG!L?fqm8Jhf~e)`WUi`XRJ)V4b=H6a!%YnErtWB^6KitU zo$)+6yX&pby;XOD_iiXXI&*H|t}}T_J_biktkf#6otUsVKFnRDf5#j5*FSc9{mU$z z`6%kJ&~b^^HzZW;U-8$Kzh0`u{B+4R4HMhn|El>}${*~0@H^gp-~U=3UjKrZA%9=H zO8gVp8*ued`-Oe1&%;B{-f8X5eNl5pYF*$Ysg$ghB75eZGC%8loOg@PwCdGwii`L; zUuJ!h`o_P&T=%AT>Akx#w{Oo+*ZTXHq2g-MO4a18AAoVfS>O>_%)p?h1j3A~9^IV; z6l6>Cc6VVo&fw1AZZCb{5Kx4@#M9T6{Us9@I|tX%g=)1xA;}Wgh!W@g+}zZ>5(ej@ z)Wnk16ovB4k_-iRPv3y>Mm}+1T(@V2M3hAM`dB6B=jtV<HIW;5GqpB!1xXLdixhgx^GDY3qj+e`( z!U||YZfZ%QLPc&)Ua?h$trFN^DKRGXOam#J2J;$^?dHBFIWRLmRL>ikOW)$RS7$vxA5L{R(8kLk1K~ z@X$@o0|se1Fzj@u%-{xwd%dTNV@QPi+p7mT4=C`oKHQ?5CU*RU&bkbJ-YE@%w>6yZ zv&V&eu-6b`JTRlE-(dON2wp}G4&H=k55ZgN$F@cqlxi?(hal3E}Z7Jc+)bqc-=cs&Cu%%+lm;i(&Qe@ ToZ$2nlmxlq%tsQ zoS!<;+Jo6qqGkUaFBcK+;EsqG!L?fqm8Jhf~e)`WUi`XRJ)V4b=H6a!%YnErtWB^6KitU zo$)+6yX&pby;XOD_iiXXI&*H|t}}T_J_biktkf#6otUsVKFnRDf5#j5*FSc9{mU$z z`6%kJ&~b^^HzZW;U-8$Kzh0`u{B+4R4HMhn|El>}${*~0@H^gp-~U=3UjKrZA%9=H zO8gVp8*ued`-Oe1&%;B{-f8X5eNl5pYF*$Ysg$ghB75eZGC%8loOg@PwCdGwii`L; zUuJ!h`o_P&T=%AT>Akx#w{Oo+*ZTXHq2g-MO4a18AAoVfS>O>_%)p?h1j3A~9^IV; z6l6>Cc6VVo&fw1AZZCb{5Kx4@#M9T6{Us9@I|tX%g=)1xA;}Wgh!W@g+}zZ>5(ej@ z)Wnk16ovB4k_-iRPv3y>Mm}+1T(@V2M3hAM`dB6B=jtV<HIW;5GqpB!1xXLdixhgx^GDY3qj+e`( z!U||YZfZ%QLPc&)Ua?h$trFN^DKRGXOam#J2J;$^?dHBFIWRLmRL>ikOW)$RS7$vxA5L{R(8kLk1K~ z@X$@o0|se1Fzj@u%-{xw`$kU}$B+p3x0ek0nhkhZFZf$BmZYw^(p=agx8V7jD;u?& zq<1)ra`xmp3A=jy@J&#C@>rta+}zls+!H&*h4yWg=45nRxXq|!`_)-{R~}|xQoH1e zID5SP`=hf?|53fTq;%oi>@BrtPdhwgIIH8r@u|9Q&y7p}J-_R78XGb(*uGb}Yrn("res://Classes/Notes/Assets/Note_PlayerExplosive.png"), + null, + 1, + (director, note, timing) => + { + if (timing == Timing.Miss) + return; + director.DealDamage(Targetting.All, (int)timing * note.GetBaseVal(), null); + }, + 1f, + Targetting.All + ), + new Note( + 8, + "PlayerEcho", + "Deals more damage with each loop.", + GD.Load("res://Classes/Notes/Assets/Note_PlayerEcho.png"), + null, + 1, + (director, note, timing) => + { + if (timing == Timing.Miss) + return; + GD.Print($"Dealing {note.GetBaseVal()} damage"); + director.DealDamage(note, (int)timing * note.GetBaseVal(), director.Player); + note.SetBaseVal(note.GetBaseVal() + 1); + GD.Print($"Increasing to {note.GetBaseVal()} damage."); + } + ), }; public static readonly RelicTemplate[] RelicDictionary = new[] diff --git a/Scenes/BattleDirector/Scripts/BattleDirector.cs b/Scenes/BattleDirector/Scripts/BattleDirector.cs index 8e105c1b..6a83124c 100644 --- a/Scenes/BattleDirector/Scripts/BattleDirector.cs +++ b/Scenes/BattleDirector/Scripts/BattleDirector.cs @@ -133,6 +133,11 @@ public override void _UnhandledInput(InputEvent @event) { DebugKillEnemy(); } + + if (eventKey.Keycode == Key.Key9) + { + DebugRefillEnergy(); + } } } @@ -511,4 +516,9 @@ private void DebugKillEnemy() enemy.TakeDamage(new DamageInstance(1000, null, enemy)); } } + + private void DebugRefillEnergy() + { + NPB.IncreaseCharge(100); + } } From 556874ceb20f204a8e71177f2bea7d6d4f99550f Mon Sep 17 00:00:00 2001 From: cornerloan Date: Mon, 21 Apr 2025 20:49:45 -0700 Subject: [PATCH 2/4] added poison note & status --- Classes/Notes/Assets/Note_PlayerPoison.png | Bin 0 -> 1091 bytes .../Notes/Assets/Note_PlayerPoison.png.import | 34 ++++++++++++++++++ .../StatusEffects/Assets/Status_Poison.png | Bin 0 -> 662 bytes .../Assets/Status_Poison.png.import | 34 ++++++++++++++++++ Classes/StatusEffects/StatusEffect.cs | 24 +++++++++++++ Globals/Scribe.cs | 16 +++++++-- 6 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 Classes/Notes/Assets/Note_PlayerPoison.png create mode 100644 Classes/Notes/Assets/Note_PlayerPoison.png.import create mode 100644 Classes/StatusEffects/Assets/Status_Poison.png create mode 100644 Classes/StatusEffects/Assets/Status_Poison.png.import diff --git a/Classes/Notes/Assets/Note_PlayerPoison.png b/Classes/Notes/Assets/Note_PlayerPoison.png new file mode 100644 index 0000000000000000000000000000000000000000..5ed8f2ac8ca91dc8d270cdc9010ea3a120fdfcc1 GIT binary patch literal 1091 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFg9j7I|q0=J1Z0v<)>xlq%tsQ zoS!<;+Jo6qqGkUaFBcK+;EsqG!L?fqm8Jhf~e)`WUi`XRJ)V4b=H6a!%YnErtWB^6KitU zo$)+6yX&pby;XOD_iiXXI&*H|t}}T_J_biktkf#6otUsVKFnRDf5#j5*FSc9{mU$z z`6%kJ&~b^^HzZW;U-8$Kzh0`u{B+4R4HMhn|El>}${*~0@H^gp-~U=3UjKrZA%9=H zO8gVp8*ued`-Oe1&%;B{-f8X5eNl5pYF*$Ysg$ghB75eZGC%8loOg@PwCdGwii`L; zUuJ!h`o_P&T=%AT>Akx#w{Oo+*ZTXHq2g-MO4a18AAoVfS>O>_%)p?h1j3A~9^IV; z6l6>Cc6VVo&fw1AZZCb{5Kx4@#M9T6{Us9@I|tX%g=)1xA;}Wgh!W@g+}zZ>5(ej@ z)Wnk16ovB4k_-iRPv3y>Mm}+1T(@V2M3hAM`dB6B=jtV<HIW;5GqpB!1xXLdixhgx^GDY3qj+e`( z!U||YZfZ%QLPc&)Ua?h$trFN^DKRGXOam#J2J;$^?dHBFIWRLmRL>ikOW)$RS7$vxA5L{R(8kLk1K~ z@X$@o0|se1Fzj@u%-{xwd$*^HV@QO1a)Jcw;slWioMmCH|L;eN{*#ZL6LO$M&mrI7 z0bhcPxB?5Gyj_p!jojQ^PqXgEI|2^ddSbd08&b|*;bYu%@ZsV1|Bs7!G#l1vEKrju zJ+OlL1e=$1?LY0@FOt7@HoQ2*JU##Y&wRyOJUI<31P-KHnlc3PEl>rjyimZfRI^s3 cr^%6*q5Xs)|yBtNcQetFn_VQ`GJ4 zc)4sUtbiuurj{fsROII56ON0GHI_ zN%^HEwo0X?nJHFjiD{-uDJiD9Nr}cOx`u`+iMoj?#)i5n#>Oe;riK zGN53Bhi+;fFi6XRVW%@?1~)L=XL!0ehFJI~rz9jK-1z15&7N8EK=dm^<;U03H~la6 zf4%s$AgkK!xReHIgPUKJcG<)+Tt3{Q=ctw7D6a5Cwq$zH8zvn#10#b4H(T("res://Classes/StatusEffects/Assets/Status_Mulligan.png") ) .SetTags(true); + + private static readonly Action PoisonEffect = (e, self) => + { + if (e is BattleDirector.Harbinger.LoopEventArgs) + { + if (self.Sufferer != null) + { + self.Sufferer.TakeDamage(new DamageInstance(self.Count, null, null)); + self.DecCount(); + } + } + }; + + /// + /// On loop, the owner takes damage equal to number of stacks, then the count gets decremented. + /// + public static readonly StatusEffect Poison = new StatusEffect() + .InitStatus( + "Poison", + PoisonEffect, + BattleEffectTrigger.OnLoop, + GD.Load("res://Classes/StatusEffects/Assets/Status_Poison.png") + ) + .SetTags(true); #endregion private BattleEffectTrigger _trigger; diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs index 1a990514..812e41b3 100644 --- a/Globals/Scribe.cs +++ b/Globals/Scribe.cs @@ -140,10 +140,22 @@ public partial class Scribe : Node { if (timing == Timing.Miss) return; - GD.Print($"Dealing {note.GetBaseVal()} damage"); director.DealDamage(note, (int)timing * note.GetBaseVal(), director.Player); note.SetBaseVal(note.GetBaseVal() + 1); - GD.Print($"Increasing to {note.GetBaseVal()} damage."); + } + ), + new Note( + 9, + "PlayerPoison", + "Applies stacks of poison based on timing.", + GD.Load("res://Classes/Notes/Assets/Note_PlayerPoison.png"), + null, + 1, + (director, note, timing) => + { + if (timing == Timing.Miss) + return; + director.AddStatus(Targetting.First, StatusEffect.Poison.GetInstance((int)timing)); } ), }; From 4b11aa5a2933b6d363c52802d0293a7fb1fd7998 Mon Sep 17 00:00:00 2001 From: cornerloan Date: Mon, 21 Apr 2025 22:18:34 -0700 Subject: [PATCH 3/4] added translations --- Globals/Translations/Translations.csv | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Globals/Translations/Translations.csv b/Globals/Translations/Translations.csv index 2e37e78c..81994a67 100644 --- a/Globals/Translations/Translations.csv +++ b/Globals/Translations/Translations.csv @@ -48,6 +48,12 @@ NOTE_PLAYERQUARTER_NAME,PlayerQuarter,玩家一分之一 NOTE_PLAYERQUARTER_TOOLTIP,"Basic note at a quarter of the cost.","以四分之一的耗费时间量发出基础音符" NOTE_PLAYERBLOCK_NAME,PlayerBlock,玩家格挡 NOTE_PLAYERBLOCK_TOOLTIP,"Gives player one charge of block.","给予玩家一层格挡充能。" +NOTE_PLAYEREXPLOSIVE_NAME,PlayerExplosive,玩家炸药 +NOTE_PLAYEREXPLOSIVE_TOOLTIP,"Deals damage to all enemies.","对所有敌人造成伤害" +NOTE_PLAYERECHO_NAME,PlayerEcho,玩家回声 +NOTE_PLAYERECHO_TOOLTIP,"Deals more damage with each loop.","每次循环造成更多伤害" +NOTE_PLAYERPOISON_NAME,PlayerPoison,玩家中毒 +NOTE_PLAYERPOISON_TOOLTIP,"Applies stacks of poison based on timing.","根据时机施加中毒层数" RELIC_BREAKFAST_NAME,Breakfast,早餐 RELIC_BREAKFAST_TOOLTIP,"Increases max hp.",提高最大生命值 RELIC_GOODVIBES_NAME,Good Vibes,良好消息 From a1599f7f7380d75feb7831b26ae83a73658a9b07 Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Mon, 21 Apr 2025 22:54:55 -0700 Subject: [PATCH 4/4] Fix issue with note target type not getting cloned --- Classes/Notes/Note.cs | 3 ++- Classes/StatusEffects/StatusEffect.cs | 14 ++++++-------- Globals/Scribe.cs | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Classes/Notes/Note.cs b/Classes/Notes/Note.cs index 9df9daae..f6b47e3d 100644 --- a/Classes/Notes/Note.cs +++ b/Classes/Notes/Note.cs @@ -60,7 +60,8 @@ public Note Clone() Owner, _baseVal, NoteEffect, - CostModifier + CostModifier, + TargetType ); return newNote; } diff --git a/Classes/StatusEffects/StatusEffect.cs b/Classes/StatusEffects/StatusEffect.cs index b3cdf71c..5229e49f 100644 --- a/Classes/StatusEffects/StatusEffect.cs +++ b/Classes/StatusEffects/StatusEffect.cs @@ -68,14 +68,12 @@ public partial class StatusEffect : TextureRect, IBattleEvent private static readonly Action PoisonEffect = (e, self) => { - if (e is BattleDirector.Harbinger.LoopEventArgs) - { - if (self.Sufferer != null) - { - self.Sufferer.TakeDamage(new DamageInstance(self.Count, null, null)); - self.DecCount(); - } - } + if (e is not BattleDirector.Harbinger.LoopEventArgs) + return; + if (self.Sufferer == null) + return; + self.Sufferer.TakeDamage(new DamageInstance(self.Count, null, null)); //TODO: More robust damage types + self.DecCount(); }; /// diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs index 812e41b3..a339e390 100644 --- a/Globals/Scribe.cs +++ b/Globals/Scribe.cs @@ -124,7 +124,7 @@ public partial class Scribe : Node { if (timing == Timing.Miss) return; - director.DealDamage(Targetting.All, (int)timing * note.GetBaseVal(), null); + director.DealDamage(note, (int)timing * note.GetBaseVal(), director.Player); }, 1f, Targetting.All