diff --git a/Classes/Relics/Assets/Relic_BloodMoney.png b/Classes/Relics/Assets/Relic_BloodMoney.png new file mode 100644 index 00000000..f1bef7ea Binary files /dev/null and b/Classes/Relics/Assets/Relic_BloodMoney.png differ diff --git a/Classes/Relics/Assets/Relic_BloodMoney.png.import b/Classes/Relics/Assets/Relic_BloodMoney.png.import new file mode 100644 index 00000000..a765d021 --- /dev/null +++ b/Classes/Relics/Assets/Relic_BloodMoney.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6lpt3cbkdnli" +path="res://.godot/imported/Relic_BloodMoney.png-d130382b6c03f59c21d5962c3d5f6e5a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Relics/Assets/Relic_BloodMoney.png" +dest_files=["res://.godot/imported/Relic_BloodMoney.png-d130382b6c03f59c21d5962c3d5f6e5a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Classes/Relics/Assets/Relic_BrokenDrumstick.png b/Classes/Relics/Assets/Relic_BrokenDrumstick.png new file mode 100644 index 00000000..42287621 Binary files /dev/null and b/Classes/Relics/Assets/Relic_BrokenDrumstick.png differ diff --git a/Classes/Relics/Assets/Relic_BrokenDrumstick.png.import b/Classes/Relics/Assets/Relic_BrokenDrumstick.png.import new file mode 100644 index 00000000..056f3973 --- /dev/null +++ b/Classes/Relics/Assets/Relic_BrokenDrumstick.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8j841tqqkqeb" +path="res://.godot/imported/Relic_BrokenDrumstick.png-94c905ef353da245ad24e71cbd686e66.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Relics/Assets/Relic_BrokenDrumstick.png" +dest_files=["res://.godot/imported/Relic_BrokenDrumstick.png-94c905ef353da245ad24e71cbd686e66.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Classes/Relics/Assets/Relic_LooseChange.png b/Classes/Relics/Assets/Relic_LooseChange.png new file mode 100644 index 00000000..435e58d3 Binary files /dev/null and b/Classes/Relics/Assets/Relic_LooseChange.png differ diff --git a/Classes/Relics/Assets/Relic_LooseChange.png.import b/Classes/Relics/Assets/Relic_LooseChange.png.import new file mode 100644 index 00000000..f00dc84e --- /dev/null +++ b/Classes/Relics/Assets/Relic_LooseChange.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bocp4uhgovyv1" +path="res://.godot/imported/Relic_LooseChange.png-496af612042666a7f384e1eb8d4167ce.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Relics/Assets/Relic_LooseChange.png" +dest_files=["res://.godot/imported/Relic_LooseChange.png-496af612042666a7f384e1eb8d4167ce.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Classes/Relics/Assets/Relic_LuckyDice.png b/Classes/Relics/Assets/Relic_LuckyDice.png new file mode 100644 index 00000000..9fc93f96 Binary files /dev/null and b/Classes/Relics/Assets/Relic_LuckyDice.png differ diff --git a/Classes/Relics/Assets/Relic_LuckyDice.png.import b/Classes/Relics/Assets/Relic_LuckyDice.png.import new file mode 100644 index 00000000..59a603a1 --- /dev/null +++ b/Classes/Relics/Assets/Relic_LuckyDice.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dv8u82rj2vkxu" +path="res://.godot/imported/Relic_LuckyDice.png-88ca6d67d74b2a5f34af4000f643b3a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Relics/Assets/Relic_LuckyDice.png" +dest_files=["res://.godot/imported/Relic_LuckyDice.png-88ca6d67d74b2a5f34af4000f643b3a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Classes/Relics/Assets/Relic_SecondPick.png b/Classes/Relics/Assets/Relic_SecondPick.png new file mode 100644 index 00000000..3691aa71 Binary files /dev/null and b/Classes/Relics/Assets/Relic_SecondPick.png differ diff --git a/Classes/Relics/Assets/Relic_SecondPick.png.import b/Classes/Relics/Assets/Relic_SecondPick.png.import new file mode 100644 index 00000000..63bb10d4 --- /dev/null +++ b/Classes/Relics/Assets/Relic_SecondPick.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbv2j4ysk3ydd" +path="res://.godot/imported/Relic_SecondPick.png-0361bd1bad087f4d81be27c9c5b3fe2b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Relics/Assets/Relic_SecondPick.png" +dest_files=["res://.godot/imported/Relic_SecondPick.png-0361bd1bad087f4d81be27c9c5b3fe2b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Classes/Relics/Assets/Relic_Shortcut.png b/Classes/Relics/Assets/Relic_Shortcut.png new file mode 100644 index 00000000..6df1df7a Binary files /dev/null and b/Classes/Relics/Assets/Relic_Shortcut.png differ diff --git a/Classes/Relics/Assets/Relic_Shortcut.png.import b/Classes/Relics/Assets/Relic_Shortcut.png.import new file mode 100644 index 00000000..13f50861 --- /dev/null +++ b/Classes/Relics/Assets/Relic_Shortcut.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cgcc27uov731g" +path="res://.godot/imported/Relic_Shortcut.png-d03004b4d7d0b125c8da23d3a2ca0db2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Relics/Assets/Relic_Shortcut.png" +dest_files=["res://.godot/imported/Relic_Shortcut.png-d03004b4d7d0b125c8da23d3a2ca0db2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Classes/Relics/Assets/Relic_SpikedShield.png b/Classes/Relics/Assets/Relic_SpikedShield.png new file mode 100644 index 00000000..e6056d94 Binary files /dev/null and b/Classes/Relics/Assets/Relic_SpikedShield.png differ diff --git a/Classes/Relics/Assets/Relic_SpikedShield.png.import b/Classes/Relics/Assets/Relic_SpikedShield.png.import new file mode 100644 index 00000000..b322cbb7 --- /dev/null +++ b/Classes/Relics/Assets/Relic_SpikedShield.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yukvjlpcbpt6" +path="res://.godot/imported/Relic_SpikedShield.png-59642dbb734140b3422c00600f46526b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Relics/Assets/Relic_SpikedShield.png" +dest_files=["res://.godot/imported/Relic_SpikedShield.png-59642dbb734140b3422c00600f46526b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Globals/FunkEngineNameSpace.cs b/Globals/FunkEngineNameSpace.cs index b5a4f214..db26af8c 100644 --- a/Globals/FunkEngineNameSpace.cs +++ b/Globals/FunkEngineNameSpace.cs @@ -365,7 +365,8 @@ private Stages PickRoomType(int x, int y, MapLevels.MapConfig curConfig) } //Random roll for the room type. - float[] validRooms = curConfig.StageOdds; + float[] validRooms = new float[curConfig.StageOdds.Length]; + curConfig.StageOdds.CopyTo(validRooms, 0); foreach ((Stages stage, int height) in curConfig.MinHeights) { if (y < height) diff --git a/Globals/SaveSystem.cs b/Globals/SaveSystem.cs index f5551751..7eb6b5b1 100644 --- a/Globals/SaveSystem.cs +++ b/Globals/SaveSystem.cs @@ -385,6 +385,7 @@ public class SaveFile public int[] NoteIds { get; init; } public int[] RelicIds { get; init; } public int PlayerHealth { get; init; } + public int Shortcuts { get; init; } public SaveFile( ulong rngSeed, @@ -394,7 +395,8 @@ public SaveFile( int[] relicIds, int playerHealth, int area, - int money + int money, + int shortcuts ) { RngSeed = rngSeed; @@ -405,6 +407,7 @@ int money PlayerHealth = playerHealth; Area = area; Money = money; + Shortcuts = shortcuts; } } @@ -420,7 +423,8 @@ public static void SaveGame() relicIds, StageProducer.PlayerStats.CurrentHealth, StageProducer.CurLevel.Id, - StageProducer.PlayerStats.Money + StageProducer.PlayerStats.Money, + StageProducer.PlayerStats.Shortcuts ); string json = JsonSerializer.Serialize(sv); diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs index e0f1eef9..e012edde 100644 --- a/Globals/Scribe.cs +++ b/Globals/Scribe.cs @@ -332,6 +332,141 @@ public partial class Scribe : Node ), } ), + new RelicTemplate( + 10, + "Loose Change", + Rarity.Common, + GD.Load("res://Classes/Relics/Assets/Relic_LooseChange.png"), + new RelicEffect[] + { + new RelicEffect( + BattleEffectTrigger.OnBattleEnd, + 10, + (e, self, val) => + { + e.BD.BattleScore.IncRelicBonus(val); + } + ), + } + ), + new RelicTemplate( + 11, + "Spiked Shield", + Rarity.Rare, + GD.Load("res://Classes/Relics/Assets/Relic_SpikedShield.png"), + new RelicEffect[] + { + new RelicEffect( + BattleEffectTrigger.OnDamageInstance, + 5, + (e, self, val) => + { + if ( + e is BattleDirector.Harbinger.OnDamageInstanceArgs dmgArgs + && dmgArgs.Dmg.Target == e.BD.Player + && dmgArgs.Dmg.Damage > 0 + && e.BD.Player.HasStatus(StatusEffect.Block.GetInstance()) + ) + { + e.BD.DealDamage(Targetting.First, val, null); + } + } + ), + } + ), + new RelicTemplate( + 12, + "Lucky Dice", + Rarity.Uncommon, + GD.Load("res://Classes/Relics/Assets/Relic_LuckyDice.png"), + new RelicEffect[] + { + new RelicEffect( + BattleEffectTrigger.OnPickup, + 1, + (e, self, val) => + { + StageProducer.PlayerStats.Rerolls = 1; + } + ), + } + ), + new RelicTemplate( + 13, + "Shortcut", + Rarity.Uncommon, + GD.Load("res://Classes/Relics/Assets/Relic_Shortcut.png"), + new RelicEffect[] + { + new RelicEffect( + BattleEffectTrigger.OnPickup, + 1, + (e, self, val) => + { + StageProducer.PlayerStats.Shortcuts += 1; + } + ), + } + ), + new RelicTemplate( + 14, + "Second Pick", + Rarity.Uncommon, + GD.Load("res://Classes/Relics/Assets/Relic_SecondPick.png"), + new RelicEffect[] + { + new RelicEffect( + BattleEffectTrigger.NotePlaced, + 20, + (e, self, val) => + { + if (StageProducer.GlobalRng.RandiRange(1, 100) <= val) + e.BD.NPB.IncreaseCharge(StageProducer.PlayerStats.MaxComboBar); + } + ), + } + ), + new RelicTemplate( + 15, + "Broken Drumstick", + Rarity.Uncommon, + GD.Load("res://Classes/Relics/Assets/Relic_BrokenDrumstick.png"), + new RelicEffect[] + { + new RelicEffect( + BattleEffectTrigger.OnBattleStart, + 10, + (e, self, val) => + { + //TODO: make damage scale with current act + e.BD.DealDamage(Targetting.All, val, e.BD.Player); + } + ), + } + ), + new RelicTemplate( + 16, + "Blood Money", + Rarity.Epic, + GD.Load("res://Classes/Relics/Assets/Relic_BloodMoney.png"), + new RelicEffect[] + { + new RelicEffect( + BattleEffectTrigger.OnDamageInstance, + 10, + (e, self, val) => + { + if ( + e is BattleDirector.Harbinger.OnDamageInstanceArgs dmgArgs + && dmgArgs.Dmg.Target == e.BD.Player + && e.BD.Player.GetCurrentHealth() + < StageProducer.PlayerStats.MaxHealth / 2 + ) + StageProducer.PlayerStats.Money += val; + } + ), + } + ), }; public static readonly SongTemplate[] SongDictionary = new[] //Generalize and make pools for areas/room types diff --git a/Globals/StageProducer.cs b/Globals/StageProducer.cs index 5be42be8..c3a01789 100644 --- a/Globals/StageProducer.cs +++ b/Globals/StageProducer.cs @@ -103,6 +103,7 @@ private bool LoadGame() } PlayerStats.CurrentHealth = sv.PlayerHealth; PlayerStats.Money = sv.Money; + PlayerStats.Shortcuts = sv.Shortcuts; IsInitialized = true; return true; } diff --git a/Globals/Translations/Translations.csv b/Globals/Translations/Translations.csv index acd641cc..2c762eec 100644 --- a/Globals/Translations/Translations.csv +++ b/Globals/Translations/Translations.csv @@ -80,6 +80,20 @@ RELIC_MEDKIT_NAME,Medkit,"急救包" RELIC_MEDKIT_TOOLTIP,"A small kit with medical supplies. Heals you a bit after each loop.","包含一些医疗用品的小包,每次循环后恢复少量生命。" RELIC_VINYLRECORD_NAME,Vinyl Record,"黑胶唱片" RELIC_VINYLRECORD_TOOLTIP,"Right round, right round. All loop effects trigger twice.","把我转起来,把我转起来。所有循环效果触发两次。" +RELIC_LOOSECHANGE_NAME,Loose Change,零钱 +RELIC_LOOSECHANGE_TOOLTIP,"Gain extra money after battles.","战斗后获得额外金钱。" +RELIC_SPIKEDSHIELD_NAME,Spiked Shield,尖刺之盾 +RELIC_SPIKEDSHIELD_TOOLTIP,"Deal damage when you lose a charge of block.","失去格挡层数时造成伤害。" +RELIC_LUCKYDICE_NAME,Lucky Dice,幸运骰子 +RELIC_LUCKYDICE_TOOLTIP,"Gain one reroll for reward selections.","获得一次奖励重选。" +RELIC_SHORTCUT_NAME,Shortcut,捷径 +RELIC_SHORTCUT_TOOLTIP,"Can choose any path regardless of connections, but only once.","可无视路径连接选择任意路线,但仅限一次。" +RELIC_SECONDPICK_NAME,Second Pick,备用拨片 +RELIC_SECONDPICK_TOOLTIP,"Placing a note has a 20% chance to instantly refill the combo bar.","每次演奏音符时,有20%的几率立即填满连击槽。" +RELIC_BROKENDRUMSTICK_NAME,Broken Drumstick,破碎的鼓棒 +RELIC_BROKENDRUMSTICK_TOOLTIP,"Enemies start combat damaged.","敌人在战斗开始时受到伤害。" +RELIC_BLOODMONEY_NAME,Blood Money,血腥钱袋 +RELIC_BLOODMONEY_TOOLTIP,"Gain money when taking damage below half health.","在生命值低于一半时受到伤害可获得金钱。" INVENTORY_TAB_NOTES,Notes,乐谱 INVENTORY_TAB_RELICS,Relics,遗物 OPTIONS_VOLUME_LABEL,Master Volume,最终音量设置 @@ -88,6 +102,7 @@ HOW_TO_PLAY,How to Play,如何游玩 HOW_TO_PLAY_BLOCK1,"Hit notes to\nbuild combo","点击音符\n以建立连击" HOW_TO_PLAY_BLOCK2,"Place notes when\ncombo is full","当连击满\n时放置音符" HOW_TO_PLAY_BLOCK3,"Only placed notes\nhave effects","只有已放置\n的音符才有效" +SCORING_RELICS,"Loose Change income:","零钱收入:" TUTORIAL_NODYING,"No dying during a tutorial!",(TODO) TUTORIAL_DIALOGUE_1,"Hello, welcome to Midnight Riff!",(TODO) TUTORIAL_DIALOGUE_2,"This is a rhythm game where notes more right to left.",(TODO) diff --git a/Scenes/BattleDirector/Scripts/BattleDirector.cs b/Scenes/BattleDirector/Scripts/BattleDirector.cs index f0a59fc0..db8e3011 100644 --- a/Scenes/BattleDirector/Scripts/BattleDirector.cs +++ b/Scenes/BattleDirector/Scripts/BattleDirector.cs @@ -110,7 +110,7 @@ public override void _Ready() Harbinger.Instance.InvokeBattleStarted(); } - private ScoringScreen.ScoreGuide _battleScore; + public ScoringScreen.ScoreGuide BattleScore; private void InitScoringGuide() { @@ -119,20 +119,20 @@ private void InitScoringGuide() { baseMoney += enem.BaseMoney; } - _battleScore = new ScoringScreen.ScoreGuide(baseMoney, Player.GetCurrentHealth()); + BattleScore = new ScoringScreen.ScoreGuide(baseMoney, Player.GetCurrentHealth()); Harbinger.Instance.NotePlaced += (_) => { - _battleScore.IncPlaced(); + BattleScore.IncPlaced(); }; Harbinger.Instance.NoteHit += (_) => { - _battleScore.IncHits(); + BattleScore.IncHits(); }; Harbinger.Instance.NoteHit += (e) => { if (e is Harbinger.NoteHitArgs { Timing: Timing.Perfect }) - _battleScore.IncPerfects(); - _battleScore.IncHits(); + BattleScore.IncPerfects(); + BattleScore.IncHits(); }; } @@ -290,7 +290,6 @@ private void CheckBattleStatus(PuppetTemplate puppet) //Called when a puppet die { if (!IsBattleWon()) return; - Harbinger.Instance.InvokeBattleEnded(); CM.ProcessMode = ProcessModeEnum.Disabled; tween.TweenCallback(Callable.From(OnBattleWon)); } @@ -303,10 +302,11 @@ private bool IsBattleWon() private void OnBattleWon() { + Harbinger.Instance.InvokeBattleEnded(); CleanUpRelics(); - _battleScore.SetEndHp(Player.GetCurrentHealth()); + BattleScore.SetEndHp(Player.GetCurrentHealth()); Audio.ProcessMode = ProcessModeEnum.Always; - ScoringScreen.CreateScore(this, _battleScore).Finished += () => + ScoringScreen.CreateScore(this, BattleScore).Finished += () => { ShowRewardSelection(3); }; diff --git a/Scenes/Maps/Scripts/Cartographer.cs b/Scenes/Maps/Scripts/Cartographer.cs index 94573f16..b60a8a17 100644 --- a/Scenes/Maps/Scripts/Cartographer.cs +++ b/Scenes/Maps/Scripts/Cartographer.cs @@ -85,18 +85,32 @@ private void DrawMapSprite(MapGrid.Room room) newButton.CustomMinimumSize = MapIconSize; newButton.IconAlignment = HorizontalAlignment.Center; AddChild(newButton); + bool isChild = StageProducer.GetCurRoom().Children.Contains(room.Idx); + + // checks if the next room is one below current room, player has shortcuts + bool isLaneChangeAllowed = + room.Y == StageProducer.GetCurRoom().Y + 1 && StageProducer.PlayerStats.Shortcuts > 0; + //button is disabled if it is not a child of current room. - if (!StageProducer.GetCurRoom().Children.Contains(room.Idx)) + //unless player has charges of lane changing + if (!isChild && !isLaneChangeAllowed) { newButton.Disabled = true; newButton.FocusMode = Control.FocusModeEnum.None; } else { - newButton.GrabFocus(); - _focusedButton = newButton; + //grab focus on children paths, to really make sure user wants to use a charge of maplanechanges + if (isChild) + { + newButton.GrabFocus(); + _focusedButton = newButton; + } newButton.Pressed += () => { + if (!isChild) + StageProducer.PlayerStats.Shortcuts--; + EnterStage(room.Idx, newButton); }; _validButtons = _validButtons.Append(newButton).ToArray(); diff --git a/Scenes/Puppets/Scripts/PlayerStats.cs b/Scenes/Puppets/Scripts/PlayerStats.cs index 78cd0653..237aa5ca 100644 --- a/Scenes/Puppets/Scripts/PlayerStats.cs +++ b/Scenes/Puppets/Scripts/PlayerStats.cs @@ -14,6 +14,7 @@ public partial class PlayerStats : Resource public int NotesToIncreaseCombo = 4; public int RewardAmountModifier = 0; public int Rerolls = 0; + public int Shortcuts = 0; //Array in order of descending rarities, Legendary -> ... Common. Int odds out of 100. public int[] RarityOdds = [1, 5, 10, 20, 100]; diff --git a/Scenes/Puppets/Scripts/PuppetTemplate.cs b/Scenes/Puppets/Scripts/PuppetTemplate.cs index b530fd76..9f69c969 100644 --- a/Scenes/Puppets/Scripts/PuppetTemplate.cs +++ b/Scenes/Puppets/Scripts/PuppetTemplate.cs @@ -192,5 +192,13 @@ public void RemoveStatusEffect(StatusEffect effect) StatusEffects.Remove(effect); effect.QueueFree(); } + + public bool HasStatus(StatusEffect effect) + { + int index = StatusEffects.FindIndex(sEff => sEff.StatusName == effect.StatusName); + if (index != -1) + return true; + return false; + } #endregion } diff --git a/Scenes/UI/ScoreScreen.tscn b/Scenes/UI/ScoreScreen.tscn index 79c212ce..30ff0c18 100644 --- a/Scenes/UI/ScoreScreen.tscn +++ b/Scenes/UI/ScoreScreen.tscn @@ -6,7 +6,7 @@ [ext_resource type="Texture2D" uid="uid://burj10os057fx" path="res://Scenes/UI/Assets/UI_CrystalFrameInset.png" id="3_usavq"] [ext_resource type="Theme" uid="uid://d37e3tpsbxwak" path="res://Scenes/UI/Assets/GeneralTheme.tres" id="4_1rsqt"] -[node name="ScoreScreen" type="CanvasLayer" node_paths=PackedStringArray("_styleLabel", "_styleAmount", "_perfectsLabel", "_perfectsAmount", "_placedLabel", "_placedAmount", "_totalLabel", "_totalAmount", "_acceptButton")] +[node name="ScoreScreen" type="CanvasLayer" node_paths=PackedStringArray("_styleLabel", "_styleAmount", "_perfectsLabel", "_perfectsAmount", "_placedLabel", "_placedAmount", "_totalLabel", "_totalAmount", "_relicLabel", "_relicAmount", "_acceptButton")] process_mode = 3 script = ExtResource("1_ma4hf") _styleLabel = NodePath("Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/LabelMargin/LabelVbox/StyleLabel") @@ -17,6 +17,8 @@ _placedLabel = NodePath("Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/B _placedAmount = NodePath("Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/ScoreMargin/LabelVbox/PlacedLabel") _totalLabel = NodePath("Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/LabelMargin/LabelVbox/TotalLabel") _totalAmount = NodePath("Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/ScoreMargin/LabelVbox/TotalLabel") +_relicLabel = NodePath("Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/LabelMargin/LabelVbox/RelicLabel") +_relicAmount = NodePath("Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/ScoreMargin/LabelVbox/RelicLabel") _acceptButton = NodePath("Bg/WindowMargin/PanelBg/VBoxContainer/ButtonMargin/AcceptButton") [node name="Bg" type="NinePatchRect" parent="."] @@ -144,6 +146,10 @@ text = "SCORING_PERFECTS" layout_mode = 2 text = "SCORING_PLACED" +[node name="RelicLabel" type="Label" parent="Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/LabelMargin/LabelVbox"] +layout_mode = 2 +text = "SCORING_RELICS" + [node name="Placeholder" type="Label" parent="Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/LabelMargin/LabelVbox"] layout_mode = 2 @@ -181,6 +187,11 @@ layout_mode = 2 text = "999" horizontal_alignment = 2 +[node name="RelicLabel" type="Label" parent="Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/ScoreMargin/LabelVbox"] +layout_mode = 2 +text = "999" +horizontal_alignment = 2 + [node name="Placeholder" type="Label" parent="Bg/WindowMargin/PanelBg/VBoxContainer/MarginContainer/BottomPanelBg/HBoxContainer/ScoreMargin/LabelVbox"] layout_mode = 2 horizontal_alignment = 2 diff --git a/Scenes/UI/Scripts/ScoringScreen.cs b/Scenes/UI/Scripts/ScoringScreen.cs index 1d5a757b..8aa47176 100644 --- a/Scenes/UI/Scripts/ScoringScreen.cs +++ b/Scenes/UI/Scripts/ScoringScreen.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Godot; public partial class ScoringScreen : CanvasLayer @@ -11,6 +12,7 @@ public struct ScoreGuide public int TotalHits = 0; public int TotalPerfects = 0; public int TotalPlaced = 0; + public int RelicBonus = 0; public float StartingHealth = 0; public float EndingHealth = 0; @@ -40,6 +42,11 @@ public void IncPlaced() TotalPlaced++; } + public void IncRelicBonus(int amount) + { + RelicBonus += amount; + } + public void SetEndHp(float amount) { EndingHealth = amount; @@ -70,13 +77,20 @@ public void SetEndHp(float amount) [Export] private Label _totalAmount; + [Export] + private Label _relicLabel; + + [Export] + private Label _relicAmount; + [Export] private Button _acceptButton; private int _totalBaseMoney; private float _perfectMulti; private float _placedMulti; - private int FinalMoney => (int)(_totalBaseMoney * _perfectMulti * _placedMulti); + private int _relicBonus; + private int FinalMoney => (int)(_totalBaseMoney * _perfectMulti * _placedMulti) + _relicBonus; public delegate void FinishedHandler(); public event FinishedHandler Finished; @@ -111,6 +125,7 @@ private void GenerateScore(ScoreGuide info) if (float.IsNaN(_perfectMulti)) _perfectMulti = 1; _placedMulti = Math.Max(2 - (float)Math.Abs(info.TotalPlaced - info.BaseMoney) / 10, 1); + _relicBonus = info.RelicBonus; DrawScoreLabels(); } @@ -124,9 +139,15 @@ private int CalcTotalBase(ScoreGuide info) private void DrawScoreLabels() { + if (_relicBonus <= 0) + { + _relicLabel.Visible = false; + _relicAmount.Visible = false; + } _styleAmount.Text = $"{_totalBaseMoney}"; _perfectsAmount.Text = $"X{_perfectMulti:0.00}"; _placedAmount.Text = $"X{_placedMulti:0.00}"; + _relicAmount.Text = $"+{_relicBonus}"; _totalAmount.Text = $"{FinalMoney}"; }