From e12acb0238738a06d7976c4525ffd62995ce1c76 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sat, 23 Aug 2025 00:38:46 +0200 Subject: [PATCH] Add initial implementation of game mechanics and resources management --- .editorconfig | 4 + .gitattributes | 2 + .gitignore | 3 + ParasiticGod.csproj | 10 + ParasiticGod.sln | 19 ++ Resources/Effects/Add_1000_Followers.tres | 9 + Resources/Effects/Add_10_Followers.tres | 9 + Resources/Effects/Add_5_Corruption.tres | 9 + Resources/Miracles/Fertility Blessing.tres | 13 + Resources/Miracles/God power.tres | 12 + .../Tiers/Followers/follower_tier_1.tres | 8 + .../Tiers/Followers/follower_tier_2.tres | 10 + .../Tiers/Followers/follower_tier_3.tres | 10 + .../Tiers/Followers/follower_tier_4.tres | 10 + .../Tiers/Followers/follower_tier_5.tres | 10 + Resources/Tiers/Huts/hut_tier_1.tres | 10 + Resources/Tiers/Huts/hut_tier_2.tres | 10 + Resources/Tiers/Huts/hut_tier_3.tres | 10 + Scenes/Followers/FollowerMarker.tscn | 13 + Scenes/Followers/followers_tier_1.tscn | 12 + Scenes/Followers/followers_tier_2.tscn | 29 +++ Scenes/Followers/followers_tier_3.tscn | 49 ++++ Scenes/Followers/followers_tier_4.tscn | 68 ++++++ Scenes/Followers/followers_tier_5.tscn | 88 +++++++ Scenes/Huts/HutMarker.tscn | 14 ++ Scenes/Huts/hut_tier_1.tscn | 12 + Scenes/Huts/hut_tier_2.tscn | 17 ++ Scenes/Huts/hut_tier_3.tscn | 22 ++ Scenes/Main/Main.cs | 44 ++++ Scenes/Main/Main.cs.uid | 1 + Scenes/Main/Main.tscn | 229 ++++++++++++++++++ Scenes/Main/MiracleButton.cs | 42 ++++ Scenes/Main/MiracleButton.cs.uid | 1 + Scenes/Main/MiraclePanel.cs | 61 +++++ Scenes/Main/MiraclePanel.cs.uid | 1 + Scenes/Main/miracle_button.tscn | 9 + Scripts/Core/Effects/AddResourceEffect.cs | 29 +++ Scripts/Core/Effects/AddResourceEffect.cs.uid | 1 + Scripts/Core/Effects/ApplyBuffEffect.cs | 24 ++ Scripts/Core/Effects/ApplyBuffEffect.cs.uid | 1 + Scripts/Core/Effects/Buff.cs | 7 + Scripts/Core/Effects/Buff.cs.uid | 1 + Scripts/Core/Effects/ConvertResourceEffect.cs | 36 +++ .../Core/Effects/ConvertResourceEffect.cs.uid | 1 + Scripts/Core/Effects/DestroySelfEffect.cs | 11 + Scripts/Core/Effects/DestroySelfEffect.cs.uid | 1 + Scripts/Core/Effects/Effect.cs | 8 + Scripts/Core/Effects/Effect.cs.uid | 1 + Scripts/Core/Effects/ModifyStatEffect.cs | 30 +++ Scripts/Core/Effects/ModifyStatEffect.cs.uid | 1 + Scripts/Core/Effects/ResourceType.cs | 3 + Scripts/Core/Effects/ResourceType.cs.uid | 1 + Scripts/Core/Effects/UnlockMiracleEffect.cs | 16 ++ .../Core/Effects/UnlockMiracleEffect.cs.uid | 1 + Scripts/Core/GameLogic.cs | 43 ++++ Scripts/Core/GameLogic.cs.uid | 1 + Scripts/Core/GameState.cs | 27 +++ Scripts/Core/GameState.cs.uid | 1 + Scripts/Core/Miracle.cs.uid | 1 + Scripts/Core/MiracleDefinition.cs | 18 ++ Scripts/Core/MiracleDefinition.cs.uid | 1 + Scripts/Core/MiracleDto.cs | 38 +++ Scripts/Core/MiracleDto.cs.uid | 1 + Scripts/Core/MiracleLoader.cs | 113 +++++++++ Scripts/Core/MiracleLoader.cs.uid | 1 + Scripts/Core/TierDefinition.cs | 10 + Scripts/Core/TierDefinition.cs.uid | 1 + Scripts/Follower.cs | 10 + Scripts/Follower.cs.uid | 1 + Scripts/FollowerMarker.cs | 27 +++ Scripts/FollowerMarker.cs.uid | 1 + Scripts/PopulationVisualizer.cs | 116 +++++++++ Scripts/PopulationVisualizer.cs.uid | 1 + Scripts/Singletons/GameBus.cs | 76 ++++++ Scripts/Singletons/GameBus.cs.uid | 1 + Shaders/corruption_shader.gdshader | 30 +++ Shaders/corruption_shader.gdshader.uid | 1 + Sprites/Follower.png | Bin 0 -> 5669 bytes Sprites/Follower.png.import | 34 +++ Sprites/Hut.png | Bin 0 -> 103074 bytes Sprites/Hut.png.import | 34 +++ Sprites/Tree.png | Bin 0 -> 33878 bytes Sprites/Tree.png.import | 34 +++ Sprites/Untitled_Artwork (1).png.import | 34 +++ Sprites/Untitled_Artwork (2).png.import | 34 +++ Sprites/Untitled_Artwork.png.import | 34 +++ Sprites/globe.svg | 133 ++++++++++ Sprites/globe.svg.import | 37 +++ icon.svg | 1 + icon.svg.import | 37 +++ project.godot | 33 +++ 91 files changed, 2018 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 ParasiticGod.csproj create mode 100644 ParasiticGod.sln create mode 100644 Resources/Effects/Add_1000_Followers.tres create mode 100644 Resources/Effects/Add_10_Followers.tres create mode 100644 Resources/Effects/Add_5_Corruption.tres create mode 100644 Resources/Miracles/Fertility Blessing.tres create mode 100644 Resources/Miracles/God power.tres create mode 100644 Resources/Tiers/Followers/follower_tier_1.tres create mode 100644 Resources/Tiers/Followers/follower_tier_2.tres create mode 100644 Resources/Tiers/Followers/follower_tier_3.tres create mode 100644 Resources/Tiers/Followers/follower_tier_4.tres create mode 100644 Resources/Tiers/Followers/follower_tier_5.tres create mode 100644 Resources/Tiers/Huts/hut_tier_1.tres create mode 100644 Resources/Tiers/Huts/hut_tier_2.tres create mode 100644 Resources/Tiers/Huts/hut_tier_3.tres create mode 100644 Scenes/Followers/FollowerMarker.tscn create mode 100644 Scenes/Followers/followers_tier_1.tscn create mode 100644 Scenes/Followers/followers_tier_2.tscn create mode 100644 Scenes/Followers/followers_tier_3.tscn create mode 100644 Scenes/Followers/followers_tier_4.tscn create mode 100644 Scenes/Followers/followers_tier_5.tscn create mode 100644 Scenes/Huts/HutMarker.tscn create mode 100644 Scenes/Huts/hut_tier_1.tscn create mode 100644 Scenes/Huts/hut_tier_2.tscn create mode 100644 Scenes/Huts/hut_tier_3.tscn create mode 100644 Scenes/Main/Main.cs create mode 100644 Scenes/Main/Main.cs.uid create mode 100644 Scenes/Main/Main.tscn create mode 100644 Scenes/Main/MiracleButton.cs create mode 100644 Scenes/Main/MiracleButton.cs.uid create mode 100644 Scenes/Main/MiraclePanel.cs create mode 100644 Scenes/Main/MiraclePanel.cs.uid create mode 100644 Scenes/Main/miracle_button.tscn create mode 100644 Scripts/Core/Effects/AddResourceEffect.cs create mode 100644 Scripts/Core/Effects/AddResourceEffect.cs.uid create mode 100644 Scripts/Core/Effects/ApplyBuffEffect.cs create mode 100644 Scripts/Core/Effects/ApplyBuffEffect.cs.uid create mode 100644 Scripts/Core/Effects/Buff.cs create mode 100644 Scripts/Core/Effects/Buff.cs.uid create mode 100644 Scripts/Core/Effects/ConvertResourceEffect.cs create mode 100644 Scripts/Core/Effects/ConvertResourceEffect.cs.uid create mode 100644 Scripts/Core/Effects/DestroySelfEffect.cs create mode 100644 Scripts/Core/Effects/DestroySelfEffect.cs.uid create mode 100644 Scripts/Core/Effects/Effect.cs create mode 100644 Scripts/Core/Effects/Effect.cs.uid create mode 100644 Scripts/Core/Effects/ModifyStatEffect.cs create mode 100644 Scripts/Core/Effects/ModifyStatEffect.cs.uid create mode 100644 Scripts/Core/Effects/ResourceType.cs create mode 100644 Scripts/Core/Effects/ResourceType.cs.uid create mode 100644 Scripts/Core/Effects/UnlockMiracleEffect.cs create mode 100644 Scripts/Core/Effects/UnlockMiracleEffect.cs.uid create mode 100644 Scripts/Core/GameLogic.cs create mode 100644 Scripts/Core/GameLogic.cs.uid create mode 100644 Scripts/Core/GameState.cs create mode 100644 Scripts/Core/GameState.cs.uid create mode 100644 Scripts/Core/Miracle.cs.uid create mode 100644 Scripts/Core/MiracleDefinition.cs create mode 100644 Scripts/Core/MiracleDefinition.cs.uid create mode 100644 Scripts/Core/MiracleDto.cs create mode 100644 Scripts/Core/MiracleDto.cs.uid create mode 100644 Scripts/Core/MiracleLoader.cs create mode 100644 Scripts/Core/MiracleLoader.cs.uid create mode 100644 Scripts/Core/TierDefinition.cs create mode 100644 Scripts/Core/TierDefinition.cs.uid create mode 100644 Scripts/Follower.cs create mode 100644 Scripts/Follower.cs.uid create mode 100644 Scripts/FollowerMarker.cs create mode 100644 Scripts/FollowerMarker.cs.uid create mode 100644 Scripts/PopulationVisualizer.cs create mode 100644 Scripts/PopulationVisualizer.cs.uid create mode 100644 Scripts/Singletons/GameBus.cs create mode 100644 Scripts/Singletons/GameBus.cs.uid create mode 100644 Shaders/corruption_shader.gdshader create mode 100644 Shaders/corruption_shader.gdshader.uid create mode 100644 Sprites/Follower.png create mode 100644 Sprites/Follower.png.import create mode 100644 Sprites/Hut.png create mode 100644 Sprites/Hut.png.import create mode 100644 Sprites/Tree.png create mode 100644 Sprites/Tree.png.import create mode 100644 Sprites/Untitled_Artwork (1).png.import create mode 100644 Sprites/Untitled_Artwork (2).png.import create mode 100644 Sprites/Untitled_Artwork.png.import create mode 100644 Sprites/globe.svg create mode 100644 Sprites/globe.svg.import create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/ParasiticGod.csproj b/ParasiticGod.csproj new file mode 100644 index 0000000..9f33686 --- /dev/null +++ b/ParasiticGod.csproj @@ -0,0 +1,10 @@ + + + net8.0 + true + parasiticgod + + + + + \ No newline at end of file diff --git a/ParasiticGod.sln b/ParasiticGod.sln new file mode 100644 index 0000000..3600dba --- /dev/null +++ b/ParasiticGod.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ParasiticGod", "ParasiticGod.csproj", "{0731AE2A-7020-4CF0-B094-E5A85E6F7CD7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + ExportDebug|Any CPU = ExportDebug|Any CPU + ExportRelease|Any CPU = ExportRelease|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0731AE2A-7020-4CF0-B094-E5A85E6F7CD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0731AE2A-7020-4CF0-B094-E5A85E6F7CD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0731AE2A-7020-4CF0-B094-E5A85E6F7CD7}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU + {0731AE2A-7020-4CF0-B094-E5A85E6F7CD7}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU + {0731AE2A-7020-4CF0-B094-E5A85E6F7CD7}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU + {0731AE2A-7020-4CF0-B094-E5A85E6F7CD7}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU + EndGlobalSection +EndGlobal diff --git a/Resources/Effects/Add_1000_Followers.tres b/Resources/Effects/Add_1000_Followers.tres new file mode 100644 index 0000000..b132a13 --- /dev/null +++ b/Resources/Effects/Add_1000_Followers.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="AddResourceEffect" load_steps=2 format=3 uid="uid://bs5iwc5lsdu0r"] + +[ext_resource type="Script" uid="uid://flyhl4i86han" path="res://Scripts/Core/Effects/AddResourceEffect.cs" id="1_2o4it"] + +[resource] +script = ExtResource("1_2o4it") +TargetResource = 1 +Value = 10000.0 +metadata/_custom_type_script = "uid://flyhl4i86han" diff --git a/Resources/Effects/Add_10_Followers.tres b/Resources/Effects/Add_10_Followers.tres new file mode 100644 index 0000000..059db1d --- /dev/null +++ b/Resources/Effects/Add_10_Followers.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="AddResourceEffect" load_steps=2 format=3 uid="uid://dxiaxhggfqcyb"] + +[ext_resource type="Script" uid="uid://flyhl4i86han" path="res://Scripts/Core/Effects/AddResourceEffect.cs" id="1_2xs1x"] + +[resource] +script = ExtResource("1_2xs1x") +TargetResource = 1 +Value = 100.0 +metadata/_custom_type_script = "uid://flyhl4i86han" diff --git a/Resources/Effects/Add_5_Corruption.tres b/Resources/Effects/Add_5_Corruption.tres new file mode 100644 index 0000000..39d0d47 --- /dev/null +++ b/Resources/Effects/Add_5_Corruption.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="AddResourceEffect" load_steps=2 format=3 uid="uid://dd17hc8jju5ek"] + +[ext_resource type="Script" uid="uid://flyhl4i86han" path="res://Scripts/Core/Effects/AddResourceEffect.cs" id="1_pce0a"] + +[resource] +script = ExtResource("1_pce0a") +TargetResource = 2 +Value = 5.0 +metadata/_custom_type_script = "uid://flyhl4i86han" diff --git a/Resources/Miracles/Fertility Blessing.tres b/Resources/Miracles/Fertility Blessing.tres new file mode 100644 index 0000000..d609c95 --- /dev/null +++ b/Resources/Miracles/Fertility Blessing.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="MiracleDefinition" load_steps=4 format=3 uid="uid://df3cq0eb82x0i"] + +[ext_resource type="Resource" uid="uid://dd17hc8jju5ek" path="res://Resources/Effects/Add_5_Corruption.tres" id="1_jmmaa"] +[ext_resource type="Script" uid="uid://cfn3mx12xism5" path="res://Scripts/Core/MiracleDefinition.cs" id="1_oh2pa"] +[ext_resource type="Resource" uid="uid://dxiaxhggfqcyb" path="res://Resources/Effects/Add_10_Followers.tres" id="2_lg4lk"] + +[resource] +script = ExtResource("1_oh2pa") +Name = "Fertility Blessing" +FaithCost = 100.0 +FollowersRequired = 0 +Effects = Array[Resource]([ExtResource("2_lg4lk"), ExtResource("1_jmmaa")]) +metadata/_custom_type_script = "uid://cfn3mx12xism5" diff --git a/Resources/Miracles/God power.tres b/Resources/Miracles/God power.tres new file mode 100644 index 0000000..8a4f919 --- /dev/null +++ b/Resources/Miracles/God power.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="MiracleDefinition" load_steps=3 format=3 uid="uid://ckdc32ptfjhx6"] + +[ext_resource type="Resource" uid="uid://bs5iwc5lsdu0r" path="res://Resources/Effects/Add_1000_Followers.tres" id="1_bkpio"] +[ext_resource type="Script" uid="uid://cfn3mx12xism5" path="res://Scripts/Core/MiracleDefinition.cs" id="3_oqu5j"] + +[resource] +script = ExtResource("3_oqu5j") +Name = "GOD POWER" +FaithCost = 1.0 +FollowersRequired = 0 +Effects = Array[Resource]([ExtResource("1_bkpio")]) +metadata/_custom_type_script = "uid://cfn3mx12xism5" diff --git a/Resources/Tiers/Followers/follower_tier_1.tres b/Resources/Tiers/Followers/follower_tier_1.tres new file mode 100644 index 0000000..c3f7636 --- /dev/null +++ b/Resources/Tiers/Followers/follower_tier_1.tres @@ -0,0 +1,8 @@ +[gd_resource type="Resource" script_class="TierDefinition" load_steps=2 format=3 uid="uid://8ooxfo2wdbhu"] + +[ext_resource type="Script" uid="uid://c7hh0cy0yrdt8" path="res://Scripts/Core/TierDefinition.cs" id="1_wydwg"] + +[resource] +script = ExtResource("1_wydwg") +Threshold = 0 +metadata/_custom_type_script = "uid://c7hh0cy0yrdt8" diff --git a/Resources/Tiers/Followers/follower_tier_2.tres b/Resources/Tiers/Followers/follower_tier_2.tres new file mode 100644 index 0000000..774076c --- /dev/null +++ b/Resources/Tiers/Followers/follower_tier_2.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TierDefinition" load_steps=3 format=3 uid="uid://cejeb3467iiyl"] + +[ext_resource type="PackedScene" uid="uid://c2d3ageprpd0o" path="res://Scenes/Followers/followers_tier_1.tscn" id="1_qgnom"] +[ext_resource type="Script" uid="uid://c7hh0cy0yrdt8" path="res://Scripts/Core/TierDefinition.cs" id="2_3uaiv"] + +[resource] +script = ExtResource("2_3uaiv") +Scene = ExtResource("1_qgnom") +Threshold = 0 +metadata/_custom_type_script = "uid://c7hh0cy0yrdt8" diff --git a/Resources/Tiers/Followers/follower_tier_3.tres b/Resources/Tiers/Followers/follower_tier_3.tres new file mode 100644 index 0000000..8fd872e --- /dev/null +++ b/Resources/Tiers/Followers/follower_tier_3.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TierDefinition" load_steps=3 format=3 uid="uid://q0rha23lx4wl"] + +[ext_resource type="PackedScene" uid="uid://8jnnbe76xjhl" path="res://Scenes/Followers/followers_tier_2.tscn" id="1_a7myf"] +[ext_resource type="Script" uid="uid://c7hh0cy0yrdt8" path="res://Scripts/Core/TierDefinition.cs" id="2_5dexb"] + +[resource] +script = ExtResource("2_5dexb") +Scene = ExtResource("1_a7myf") +Threshold = 50 +metadata/_custom_type_script = "uid://c7hh0cy0yrdt8" diff --git a/Resources/Tiers/Followers/follower_tier_4.tres b/Resources/Tiers/Followers/follower_tier_4.tres new file mode 100644 index 0000000..a374449 --- /dev/null +++ b/Resources/Tiers/Followers/follower_tier_4.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TierDefinition" load_steps=3 format=3 uid="uid://i1oo0q84q8ps"] + +[ext_resource type="PackedScene" uid="uid://gqqycnreclv2" path="res://Scenes/Followers/followers_tier_3.tscn" id="1_6rce8"] +[ext_resource type="Script" uid="uid://c7hh0cy0yrdt8" path="res://Scripts/Core/TierDefinition.cs" id="2_slqj0"] + +[resource] +script = ExtResource("2_slqj0") +Scene = ExtResource("1_6rce8") +Threshold = 300 +metadata/_custom_type_script = "uid://c7hh0cy0yrdt8" diff --git a/Resources/Tiers/Followers/follower_tier_5.tres b/Resources/Tiers/Followers/follower_tier_5.tres new file mode 100644 index 0000000..8b11b40 --- /dev/null +++ b/Resources/Tiers/Followers/follower_tier_5.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TierDefinition" load_steps=3 format=3 uid="uid://bwu8k7cyjhf8c"] + +[ext_resource type="PackedScene" uid="uid://iairc1nudt6c" path="res://Scenes/Followers/followers_tier_5.tscn" id="1_h1dq7"] +[ext_resource type="Script" uid="uid://c7hh0cy0yrdt8" path="res://Scripts/Core/TierDefinition.cs" id="2_w5iq4"] + +[resource] +script = ExtResource("2_w5iq4") +Scene = ExtResource("1_h1dq7") +Threshold = 30000 +metadata/_custom_type_script = "uid://c7hh0cy0yrdt8" diff --git a/Resources/Tiers/Huts/hut_tier_1.tres b/Resources/Tiers/Huts/hut_tier_1.tres new file mode 100644 index 0000000..59c042b --- /dev/null +++ b/Resources/Tiers/Huts/hut_tier_1.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TierDefinition" load_steps=3 format=3 uid="uid://bbkbssvptkyvh"] + +[ext_resource type="Script" uid="uid://c7hh0cy0yrdt8" path="res://Scripts/Core/TierDefinition.cs" id="1_ei6wr"] +[ext_resource type="PackedScene" uid="uid://dbg6c4m1v1rsh" path="res://Scenes/Huts/hut_tier_1.tscn" id="1_uho8r"] + +[resource] +script = ExtResource("1_ei6wr") +Scene = ExtResource("1_uho8r") +Threshold = 40000 +metadata/_custom_type_script = "uid://c7hh0cy0yrdt8" diff --git a/Resources/Tiers/Huts/hut_tier_2.tres b/Resources/Tiers/Huts/hut_tier_2.tres new file mode 100644 index 0000000..faadb81 --- /dev/null +++ b/Resources/Tiers/Huts/hut_tier_2.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TierDefinition" load_steps=3 format=3 uid="uid://co2sdpwpajjqi"] + +[ext_resource type="PackedScene" uid="uid://cd4hc5b87uyqm" path="res://Scenes/Huts/hut_tier_2.tscn" id="1_trlm4"] +[ext_resource type="Script" uid="uid://c7hh0cy0yrdt8" path="res://Scripts/Core/TierDefinition.cs" id="2_vr1nw"] + +[resource] +script = ExtResource("2_vr1nw") +Scene = ExtResource("1_trlm4") +Threshold = 600000 +metadata/_custom_type_script = "uid://c7hh0cy0yrdt8" diff --git a/Resources/Tiers/Huts/hut_tier_3.tres b/Resources/Tiers/Huts/hut_tier_3.tres new file mode 100644 index 0000000..3534c61 --- /dev/null +++ b/Resources/Tiers/Huts/hut_tier_3.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="TierDefinition" load_steps=3 format=3 uid="uid://b8k30qsd434dp"] + +[ext_resource type="PackedScene" uid="uid://dh6g38sit4hna" path="res://Scenes/Huts/hut_tier_3.tscn" id="1_ex2nw"] +[ext_resource type="Script" uid="uid://c7hh0cy0yrdt8" path="res://Scripts/Core/TierDefinition.cs" id="2_74x2g"] + +[resource] +script = ExtResource("2_74x2g") +Scene = ExtResource("1_ex2nw") +Threshold = 1200000 +metadata/_custom_type_script = "uid://c7hh0cy0yrdt8" diff --git a/Scenes/Followers/FollowerMarker.tscn b/Scenes/Followers/FollowerMarker.tscn new file mode 100644 index 0000000..0555681 --- /dev/null +++ b/Scenes/Followers/FollowerMarker.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://cqkye7yykakns"] + +[ext_resource type="Script" uid="uid://djaf0gv8s7qib" path="res://Scripts/FollowerMarker.cs" id="1_e1v1v"] +[ext_resource type="Texture2D" uid="uid://dcs48aa84w21u" path="res://icon.svg" id="2_woadh"] + +[node name="FollowerMarker" type="Marker2D"] +script = ExtResource("1_e1v1v") +metadata/_custom_type_script = "uid://djaf0gv8s7qib" + +[node name="Sprite2D" type="Sprite2D" parent="."] +visible = false +scale = Vector2(0.235, 0.235) +texture = ExtResource("2_woadh") diff --git a/Scenes/Followers/followers_tier_1.tscn b/Scenes/Followers/followers_tier_1.tscn new file mode 100644 index 0000000..49c9181 --- /dev/null +++ b/Scenes/Followers/followers_tier_1.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=3 format=3 uid="uid://c2d3ageprpd0o"] + +[ext_resource type="Script" uid="uid://cj5libcgnhjml" path="res://Scripts/Follower.cs" id="1_ifsko"] +[ext_resource type="Texture2D" uid="uid://dhrbjqmhqdpef" path="res://Sprites/Follower.png" id="1_miahy"] + +[node name="FollowersTier1" type="Node2D"] +script = ExtResource("1_ifsko") +metadata/_custom_type_script = "uid://cj5libcgnhjml" + +[node name="Follower" type="Sprite2D" parent="."] +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_miahy") diff --git a/Scenes/Followers/followers_tier_2.tscn b/Scenes/Followers/followers_tier_2.tscn new file mode 100644 index 0000000..46b12db --- /dev/null +++ b/Scenes/Followers/followers_tier_2.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=3 uid="uid://8jnnbe76xjhl"] + +[ext_resource type="Script" uid="uid://cj5libcgnhjml" path="res://Scripts/Follower.cs" id="1_1fjl1"] +[ext_resource type="Texture2D" uid="uid://dhrbjqmhqdpef" path="res://Sprites/Follower.png" id="1_dwkko"] + +[node name="FollowersTier2" type="Node2D"] +script = ExtResource("1_1fjl1") +Tier = 1 +metadata/_custom_type_script = "uid://cj5libcgnhjml" + +[node name="Follower" type="Sprite2D" parent="."] +position = Vector2(-4.39999, -4) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_dwkko") + +[node name="Follower2" type="Sprite2D" parent="."] +position = Vector2(-0.399994, -4) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_dwkko") + +[node name="Follower3" type="Sprite2D" parent="."] +position = Vector2(4.60001, -4) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_dwkko") + +[node name="Follower4" type="Sprite2D" parent="."] +position = Vector2(7.60001, -4) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_dwkko") diff --git a/Scenes/Followers/followers_tier_3.tscn b/Scenes/Followers/followers_tier_3.tscn new file mode 100644 index 0000000..7a3baf2 --- /dev/null +++ b/Scenes/Followers/followers_tier_3.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=3 format=3 uid="uid://gqqycnreclv2"] + +[ext_resource type="Script" uid="uid://cj5libcgnhjml" path="res://Scripts/Follower.cs" id="1_dfylr"] +[ext_resource type="Texture2D" uid="uid://dhrbjqmhqdpef" path="res://Sprites/Follower.png" id="1_ep0q4"] + +[node name="FollowersTier3" type="Node2D"] +script = ExtResource("1_dfylr") +Tier = 2 +metadata/_custom_type_script = "uid://cj5libcgnhjml" + +[node name="Follower" type="Sprite2D" parent="."] +position = Vector2(-11.4, -12) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ep0q4") + +[node name="Follower2" type="Sprite2D" parent="."] +position = Vector2(-7.39999, -12) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ep0q4") + +[node name="Follower3" type="Sprite2D" parent="."] +position = Vector2(-2.39999, -12) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ep0q4") + +[node name="Follower4" type="Sprite2D" parent="."] +position = Vector2(0.600006, -12) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ep0q4") + +[node name="Follower5" type="Sprite2D" parent="."] +position = Vector2(2.60001, -9.53674e-07) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ep0q4") + +[node name="Follower6" type="Sprite2D" parent="."] +position = Vector2(6.60001, -9.53674e-07) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ep0q4") + +[node name="Follower7" type="Sprite2D" parent="."] +position = Vector2(11.6, -9.53674e-07) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ep0q4") + +[node name="Follower8" type="Sprite2D" parent="."] +position = Vector2(14.6, -9.53674e-07) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ep0q4") diff --git a/Scenes/Followers/followers_tier_4.tscn b/Scenes/Followers/followers_tier_4.tscn new file mode 100644 index 0000000..d79f530 --- /dev/null +++ b/Scenes/Followers/followers_tier_4.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=3 format=3 uid="uid://c04rof865kdfb"] + +[ext_resource type="Script" uid="uid://cj5libcgnhjml" path="res://Scripts/Follower.cs" id="1_0bt7d"] +[ext_resource type="Texture2D" uid="uid://dhrbjqmhqdpef" path="res://Sprites/Follower.png" id="1_ttwdp"] + +[node name="FollowersTier4" type="Node2D"] +script = ExtResource("1_0bt7d") +metadata/_custom_type_script = "uid://cj5libcgnhjml" + +[node name="Follower" type="Sprite2D" parent="."] +position = Vector2(-5.39999, -17) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower2" type="Sprite2D" parent="."] +position = Vector2(-1.39999, -17) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower3" type="Sprite2D" parent="."] +position = Vector2(3.60001, -17) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower4" type="Sprite2D" parent="."] +position = Vector2(6.60001, -17) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower5" type="Sprite2D" parent="."] +position = Vector2(8.60001, -5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower6" type="Sprite2D" parent="."] +position = Vector2(12.6, -5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower7" type="Sprite2D" parent="."] +position = Vector2(17.6, -5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower8" type="Sprite2D" parent="."] +position = Vector2(20.6, -5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower9" type="Sprite2D" parent="."] +position = Vector2(-18.4, -5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower10" type="Sprite2D" parent="."] +position = Vector2(-14.4, -5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower11" type="Sprite2D" parent="."] +position = Vector2(-9.39999, -5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") + +[node name="Follower12" type="Sprite2D" parent="."] +position = Vector2(-6.39999, -5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_ttwdp") diff --git a/Scenes/Followers/followers_tier_5.tscn b/Scenes/Followers/followers_tier_5.tscn new file mode 100644 index 0000000..cb60f26 --- /dev/null +++ b/Scenes/Followers/followers_tier_5.tscn @@ -0,0 +1,88 @@ +[gd_scene load_steps=3 format=3 uid="uid://iairc1nudt6c"] + +[ext_resource type="Script" uid="uid://cj5libcgnhjml" path="res://Scripts/Follower.cs" id="1_4yvkn"] +[ext_resource type="Texture2D" uid="uid://dhrbjqmhqdpef" path="res://Sprites/Follower.png" id="1_28luu"] + +[node name="FollowersTier5" type="Node2D"] +script = ExtResource("1_4yvkn") +metadata/_custom_type_script = "uid://cj5libcgnhjml" + +[node name="Follower" type="Sprite2D" parent="."] +position = Vector2(-7.39999, -15) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower2" type="Sprite2D" parent="."] +position = Vector2(-3.39999, -15) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower3" type="Sprite2D" parent="."] +position = Vector2(1.60001, -15) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower4" type="Sprite2D" parent="."] +position = Vector2(4.60001, -15) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower5" type="Sprite2D" parent="."] +position = Vector2(6.60001, -3) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower6" type="Sprite2D" parent="."] +position = Vector2(10.6, -3) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower7" type="Sprite2D" parent="."] +position = Vector2(15.6, -3) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower8" type="Sprite2D" parent="."] +position = Vector2(18.6, -3) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower9" type="Sprite2D" parent="."] +position = Vector2(-20.4, -3) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower10" type="Sprite2D" parent="."] +position = Vector2(-16.4, -3) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower11" type="Sprite2D" parent="."] +position = Vector2(-11.4, -3) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower12" type="Sprite2D" parent="."] +position = Vector2(-8.39999, -3) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower13" type="Sprite2D" parent="."] +position = Vector2(-7.39999, 5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower14" type="Sprite2D" parent="."] +position = Vector2(-3.39999, 5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower15" type="Sprite2D" parent="."] +position = Vector2(1.60001, 5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") + +[node name="Follower16" type="Sprite2D" parent="."] +position = Vector2(4.60001, 5) +scale = Vector2(0.2, 0.2) +texture = ExtResource("1_28luu") diff --git a/Scenes/Huts/HutMarker.tscn b/Scenes/Huts/HutMarker.tscn new file mode 100644 index 0000000..a2a5a45 --- /dev/null +++ b/Scenes/Huts/HutMarker.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=3 uid="uid://be5d0d3aweg0l"] + +[ext_resource type="Script" uid="uid://djaf0gv8s7qib" path="res://Scripts/FollowerMarker.cs" id="1_yfid6"] +[ext_resource type="Texture2D" uid="uid://dcs48aa84w21u" path="res://icon.svg" id="2_om77d"] + +[node name="HutMarker" type="Marker2D"] +script = ExtResource("1_yfid6") +metadata/_custom_type_script = "uid://djaf0gv8s7qib" + +[node name="Sprite2D" type="Sprite2D" parent="."] +visible = false +modulate = Color(0.605674, 1.66051e-06, 3.85046e-07, 1) +scale = Vector2(0.235, 0.235) +texture = ExtResource("2_om77d") diff --git a/Scenes/Huts/hut_tier_1.tscn b/Scenes/Huts/hut_tier_1.tscn new file mode 100644 index 0000000..3af5494 --- /dev/null +++ b/Scenes/Huts/hut_tier_1.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=3 format=3 uid="uid://dbg6c4m1v1rsh"] + +[ext_resource type="Script" uid="uid://cj5libcgnhjml" path="res://Scripts/Follower.cs" id="1_ymswo"] +[ext_resource type="Texture2D" uid="uid://clnujxe12l86u" path="res://Sprites/Hut.png" id="2_1pksg"] + +[node name="HutTier1" type="Node2D"] +script = ExtResource("1_ymswo") +metadata/_custom_type_script = "uid://cj5libcgnhjml" + +[node name="Hut" type="Sprite2D" parent="."] +scale = Vector2(0.2, 0.2) +texture = ExtResource("2_1pksg") diff --git a/Scenes/Huts/hut_tier_2.tscn b/Scenes/Huts/hut_tier_2.tscn new file mode 100644 index 0000000..05af487 --- /dev/null +++ b/Scenes/Huts/hut_tier_2.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=3 uid="uid://cd4hc5b87uyqm"] + +[ext_resource type="Script" uid="uid://cj5libcgnhjml" path="res://Scripts/Follower.cs" id="1_22ax8"] +[ext_resource type="Texture2D" uid="uid://clnujxe12l86u" path="res://Sprites/Hut.png" id="2_xvtw0"] + +[node name="HutTier2" type="Node2D"] +script = ExtResource("1_22ax8") +metadata/_custom_type_script = "uid://cj5libcgnhjml" + +[node name="Hut" type="Sprite2D" parent="."] +scale = Vector2(0.2, 0.2) +texture = ExtResource("2_xvtw0") + +[node name="Hut2" type="Sprite2D" parent="."] +position = Vector2(27, 0) +scale = Vector2(0.2, 0.2) +texture = ExtResource("2_xvtw0") diff --git a/Scenes/Huts/hut_tier_3.tscn b/Scenes/Huts/hut_tier_3.tscn new file mode 100644 index 0000000..7ef5509 --- /dev/null +++ b/Scenes/Huts/hut_tier_3.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=3 format=3 uid="uid://dh6g38sit4hna"] + +[ext_resource type="Script" uid="uid://cj5libcgnhjml" path="res://Scripts/Follower.cs" id="1_ltla2"] +[ext_resource type="Texture2D" uid="uid://clnujxe12l86u" path="res://Sprites/Hut.png" id="2_un0i8"] + +[node name="HutTier3" type="Node2D"] +script = ExtResource("1_ltla2") +metadata/_custom_type_script = "uid://cj5libcgnhjml" + +[node name="Hut" type="Sprite2D" parent="."] +scale = Vector2(0.2, 0.2) +texture = ExtResource("2_un0i8") + +[node name="Hut2" type="Sprite2D" parent="."] +position = Vector2(27, 0) +scale = Vector2(0.2, 0.2) +texture = ExtResource("2_un0i8") + +[node name="Hut3" type="Sprite2D" parent="."] +position = Vector2(-46, 0) +scale = Vector2(0.2, 0.2) +texture = ExtResource("2_un0i8") diff --git a/Scenes/Main/Main.cs b/Scenes/Main/Main.cs new file mode 100644 index 0000000..7a02ec5 --- /dev/null +++ b/Scenes/Main/Main.cs @@ -0,0 +1,44 @@ +using Godot; +using ParasiticGod.Scripts.Core; +using ParasiticGod.Scripts.Singletons; + +namespace ParasiticGod.Scenes.Main; + +public partial class Main : Node +{ + [Export] private Label _faithLabel; + [Export] private Label _followersLabel; + [Export] private Label _corruptionLabel; + [Export] private MiraclePanel _miraclePanel; + [Export] private Sprite2D _worldSprite; + [Export] private Color _deadWorldColor = new Color("#581845"); + + public override void _Ready() + { + GameBus.Instance.StateChanged += OnStateChanged; + + _miraclePanel.PopulateInitialButtons(GameBus.Instance.AllMiracles); + } + + public override void _ExitTree() + { + GameBus.Instance.StateChanged -= OnStateChanged; + } + + private void OnStateChanged(GameState newState) + { + _faithLabel.Text = $"Faith: {newState.Faith:F0} (+{newState.FaithPerSecond:F1}/s)"; + _followersLabel.Text = $"Followers: {newState.Followers}"; + _corruptionLabel.Text = $"Corruption: {newState.Corruption:F0}%"; + + UpdateWorldVisuals(newState.Corruption); + } + + private void UpdateWorldVisuals(double corruption) + { + if (_worldSprite.Material is not ShaderMaterial shaderMaterial) return; + + var ratio = (float)corruption / 100.0f; + shaderMaterial.SetShaderParameter("corruption_level", ratio); + } +} \ No newline at end of file diff --git a/Scenes/Main/Main.cs.uid b/Scenes/Main/Main.cs.uid new file mode 100644 index 0000000..33a69e1 --- /dev/null +++ b/Scenes/Main/Main.cs.uid @@ -0,0 +1 @@ +uid://t71ewkpa5uqs diff --git a/Scenes/Main/Main.tscn b/Scenes/Main/Main.tscn new file mode 100644 index 0000000..67f8355 --- /dev/null +++ b/Scenes/Main/Main.tscn @@ -0,0 +1,229 @@ +[gd_scene load_steps=18 format=3 uid="uid://bfil8sd154327"] + +[ext_resource type="Script" uid="uid://t71ewkpa5uqs" path="res://Scenes/Main/Main.cs" id="1_p8rbg"] +[ext_resource type="Script" uid="uid://b77vh831r1e3c" path="res://Scenes/Main/MiraclePanel.cs" id="2_hcu3t"] +[ext_resource type="PackedScene" uid="uid://rj1fsdlhju5y" path="res://Scenes/Main/miracle_button.tscn" id="3_qdkat"] +[ext_resource type="Texture2D" uid="uid://dg6ac3jb1366r" path="res://Sprites/globe.svg" id="4_i3fi7"] +[ext_resource type="PackedScene" uid="uid://be5d0d3aweg0l" path="res://Scenes/Huts/HutMarker.tscn" id="6_cv8e0"] +[ext_resource type="Script" uid="uid://dj2wyrq07gfp2" path="res://Scripts/PopulationVisualizer.cs" id="8_cv8e0"] +[ext_resource type="Resource" uid="uid://8ooxfo2wdbhu" path="res://Resources/Tiers/Followers/follower_tier_1.tres" id="9_hkvnm"] +[ext_resource type="Shader" uid="uid://bf8nk145fjkgh" path="res://Shaders/corruption_shader.gdshader" id="9_wgovn"] +[ext_resource type="Resource" uid="uid://cejeb3467iiyl" path="res://Resources/Tiers/Followers/follower_tier_2.tres" id="10_5ci8a"] +[ext_resource type="PackedScene" uid="uid://cqkye7yykakns" path="res://Scenes/Followers/FollowerMarker.tscn" id="11_5ci8a"] +[ext_resource type="Resource" uid="uid://q0rha23lx4wl" path="res://Resources/Tiers/Followers/follower_tier_3.tres" id="11_18xdc"] +[ext_resource type="Resource" uid="uid://i1oo0q84q8ps" path="res://Resources/Tiers/Followers/follower_tier_4.tres" id="12_epx8f"] +[ext_resource type="Resource" uid="uid://bwu8k7cyjhf8c" path="res://Resources/Tiers/Followers/follower_tier_5.tres" id="13_hcu3t"] +[ext_resource type="Resource" uid="uid://bbkbssvptkyvh" path="res://Resources/Tiers/Huts/hut_tier_1.tres" id="14_18xdc"] +[ext_resource type="Resource" uid="uid://co2sdpwpajjqi" path="res://Resources/Tiers/Huts/hut_tier_2.tres" id="15_epx8f"] +[ext_resource type="Resource" uid="uid://b8k30qsd434dp" path="res://Resources/Tiers/Huts/hut_tier_3.tres" id="16_hcu3t"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_cv8e0"] +shader = ExtResource("9_wgovn") +shader_parameter/terrain_color = Color(0.152941, 0.682353, 0.376471, 1) +shader_parameter/corrupted_color = Color(0.3, 0.1, 0.2, 1) +shader_parameter/corruption_level = 0.0 +shader_parameter/tolerance = 0.1 + +[node name="World" type="Node2D" node_paths=PackedStringArray("_faithLabel", "_followersLabel", "_corruptionLabel", "_miraclePanel", "_worldSprite")] +script = ExtResource("1_p8rbg") +_faithLabel = NodePath("UiLayer/Control/MarginContainer/Main/Top/FaithLabel") +_followersLabel = NodePath("UiLayer/Control/MarginContainer/Main/Top/FollowersLabel") +_corruptionLabel = NodePath("UiLayer/Control/MarginContainer/Main/Top/CorruptionLabel") +_miraclePanel = NodePath("UiLayer/Control/MarginContainer/Main/Bottom") +_worldSprite = NodePath("World Sprite") + +[node name="UiLayer" type="CanvasLayer" parent="."] + +[node name="Control" type="Control" parent="UiLayer"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="UiLayer/Control"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 8 +theme_override_constants/margin_top = 8 +theme_override_constants/margin_right = 8 +theme_override_constants/margin_bottom = 8 + +[node name="Main" type="VBoxContainer" parent="UiLayer/Control/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 + +[node name="Top" type="HBoxContainer" parent="UiLayer/Control/MarginContainer/Main"] +layout_mode = 2 + +[node name="FaithLabel" type="Label" parent="UiLayer/Control/MarginContainer/Main/Top"] +layout_mode = 2 +text = "Faith Label" + +[node name="FollowersLabel" type="Label" parent="UiLayer/Control/MarginContainer/Main/Top"] +layout_mode = 2 +text = "FollowersLabel" + +[node name="CorruptionLabel" type="Label" parent="UiLayer/Control/MarginContainer/Main/Top"] +layout_mode = 2 +text = "CorruptionLabel" + +[node name="Bottom" type="GridContainer" parent="UiLayer/Control/MarginContainer/Main"] +layout_mode = 2 +size_flags_vertical = 6 +columns = 3 +script = ExtResource("2_hcu3t") +_miracleButtonScene = ExtResource("3_qdkat") + +[node name="Camera2D" type="Camera2D" parent="."] + +[node name="World Sprite" type="Sprite2D" parent="."] +material = SubResource("ShaderMaterial_cv8e0") +position = Vector2(-34, -25) +scale = Vector2(2.41247, 2.41247) +texture = ExtResource("4_i3fi7") +metadata/_edit_lock_ = true + +[node name="Hut Markers" type="Node2D" parent="."] + +[node name="HutMarker" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(-1, -29) + +[node name="HutMarker2" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(124, -45) + +[node name="HutMarker3" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(301, -41) + +[node name="HutMarker4" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(392, -192) + +[node name="HutMarker5" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(267, -207) + +[node name="HutMarker6" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(418, -292) + +[node name="HutMarker7" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(491, -413) + +[node name="HutMarker8" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(613, -173) + +[node name="HutMarker9" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(465, -76) + +[node name="HutMarker10" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(352, 168) + +[node name="HutMarker11" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(382, 347) + +[node name="HutMarker12" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(88, 365) + +[node name="HutMarker13" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(-111, 431) + +[node name="HutMarker14" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(175, 513) + +[node name="HutMarker15" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(-228, 311) + +[node name="HutMarker16" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(-439, 282) + +[node name="HutMarker17" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(-334, 162) + +[node name="HutMarker18" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(-341, 428) + +[node name="HutMarker19" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(-148, 567) + +[node name="HutMarker20" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(65, 472) + +[node name="HutMarker21" parent="Hut Markers" instance=ExtResource("6_cv8e0")] +position = Vector2(-209, 28) + +[node name="Followers Markers" type="Node2D" parent="."] + +[node name="FollowerMarker" parent="Followers Markers" instance=ExtResource("11_5ci8a")] + +[node name="FollowerMarker2" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(97, 1) + +[node name="FollowerMarker3" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(222, -34) + +[node name="FollowerMarker4" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(317, -127) + +[node name="FollowerMarker5" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(508, -175) + +[node name="FollowerMarker6" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(568, -317) + +[node name="FollowerMarker7" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(636, -27) + +[node name="FollowerMarker8" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(575, 144) + +[node name="FollowerMarker9" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(365, 215) + +[node name="FollowerMarker10" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(134, 371) + +[node name="FollowerMarker11" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(21, 563) + +[node name="FollowerMarker12" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(-39, 469) + +[node name="FollowerMarker13" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(-257, 402) + +[node name="FollowerMarker14" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(-178, 229) + +[node name="FollowerMarker15" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(-304, 206) + +[node name="FollowerMarker16" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(-463, 349) + +[node name="FollowerMarker17" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(-240, 42) + +[node name="FollowerMarker18" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(-88, -32) + +[node name="FollowerMarker19" parent="Followers Markers" instance=ExtResource("11_5ci8a")] +position = Vector2(82, -234) + +[node name="FollowerPopulationVisualizer" type="Node" parent="." node_paths=PackedStringArray("_markersContainer")] +script = ExtResource("8_cv8e0") +_markersContainer = NodePath("../Followers Markers") +_tiers = Array[Object]([ExtResource("9_hkvnm"), ExtResource("10_5ci8a"), ExtResource("11_18xdc"), ExtResource("12_epx8f"), ExtResource("13_hcu3t")]) +metadata/_custom_type_script = "uid://dj2wyrq07gfp2" + +[node name="HutPopulationVisualizer" type="Node" parent="." node_paths=PackedStringArray("_markersContainer")] +script = ExtResource("8_cv8e0") +_markersContainer = NodePath("../Hut Markers") +_unitsPerMarker = 1 +_tiers = Array[Object]([ExtResource("14_18xdc"), ExtResource("15_epx8f"), ExtResource("16_hcu3t")]) +metadata/_custom_type_script = "uid://dj2wyrq07gfp2" diff --git a/Scenes/Main/MiracleButton.cs b/Scenes/Main/MiracleButton.cs new file mode 100644 index 0000000..a881377 --- /dev/null +++ b/Scenes/Main/MiracleButton.cs @@ -0,0 +1,42 @@ +using Godot; +using ParasiticGod.Scripts.Core; +using ParasiticGod.Scripts.Singletons; + +namespace ParasiticGod.Scenes.Main; + +public partial class MiracleButton : Button +{ + private MiracleDefinition _miracle; + + public override void _Ready() + { + if (_miracle == null) + { + GD.PrintErr($"MiracleButton '{Name}' has no MiracleDefinition assigned."); + SetProcess(false); + return; + } + + Text = $"{_miracle.Name}\nCost: {_miracle.FaithCost} Faith"; + + Pressed += OnPressed; + } + + public override void _ExitTree() + { + Pressed -= OnPressed; + } + + private void OnPressed() + { + GameBus.Instance.PerformMiracle(_miracle); + } + + public void SetMiracle(MiracleDefinition miracle) + { + _miracle = miracle; + Text = $"{_miracle.Name}\nCost: {_miracle.FaithCost} Faith"; + } + + public MiracleDefinition GetMiracle() { return _miracle; } +} \ No newline at end of file diff --git a/Scenes/Main/MiracleButton.cs.uid b/Scenes/Main/MiracleButton.cs.uid new file mode 100644 index 0000000..bfadcf5 --- /dev/null +++ b/Scenes/Main/MiracleButton.cs.uid @@ -0,0 +1 @@ +uid://ctjmwgucwh3le diff --git a/Scenes/Main/MiraclePanel.cs b/Scenes/Main/MiraclePanel.cs new file mode 100644 index 0000000..14b273e --- /dev/null +++ b/Scenes/Main/MiraclePanel.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using Godot; +using ParasiticGod.Scripts.Core; +using ParasiticGod.Scripts.Singletons; + +namespace ParasiticGod.Scenes.Main; + +public partial class MiraclePanel : GridContainer +{ + [Export] private PackedScene _miracleButtonScene; + + public override void _Ready() + { + GameBus.Instance.MiraclesUnlocked += OnMiraclesUnlocked; + GameBus.Instance.MiracleCompleted += OnMiracleCompleted; + } + + public override void _ExitTree() + { + GameBus.Instance.MiraclesUnlocked -= OnMiraclesUnlocked; + GameBus.Instance.MiracleCompleted -= OnMiracleCompleted; + } + + public void PopulateInitialButtons(Dictionary miracles) + { + foreach (var miracle in miracles.Values) + { + if (miracle.UnlockedByDefault) + { + AddButtonForMiracle(miracle); + } + } + } + + private void OnMiraclesUnlocked(List miracles) + { + foreach (var miracle in miracles) + { + AddButtonForMiracle(miracle); + } + } + + private void OnMiracleCompleted(MiracleDefinition miracle) + { + foreach (var child in GetChildren()) + { + if (child is MiracleButton button && button.GetMiracle() == miracle) + { + button.QueueFree(); + break; + } + } + } + + private void AddButtonForMiracle(MiracleDefinition miracle) + { + var buttonInstance = _miracleButtonScene.Instantiate(); + buttonInstance.SetMiracle(miracle); + AddChild(buttonInstance); + } +} \ No newline at end of file diff --git a/Scenes/Main/MiraclePanel.cs.uid b/Scenes/Main/MiraclePanel.cs.uid new file mode 100644 index 0000000..e426907 --- /dev/null +++ b/Scenes/Main/MiraclePanel.cs.uid @@ -0,0 +1 @@ +uid://b77vh831r1e3c diff --git a/Scenes/Main/miracle_button.tscn b/Scenes/Main/miracle_button.tscn new file mode 100644 index 0000000..da0fe07 --- /dev/null +++ b/Scenes/Main/miracle_button.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://rj1fsdlhju5y"] + +[ext_resource type="Script" uid="uid://ctjmwgucwh3le" path="res://Scenes/Main/MiracleButton.cs" id="1_sxcu0"] + +[node name="MiracleButton" type="Button"] +custom_minimum_size = Vector2(128, 64) +offset_right = 8.0 +offset_bottom = 8.0 +script = ExtResource("1_sxcu0") diff --git a/Scripts/Core/Effects/AddResourceEffect.cs b/Scripts/Core/Effects/AddResourceEffect.cs new file mode 100644 index 0000000..e82dcf1 --- /dev/null +++ b/Scripts/Core/Effects/AddResourceEffect.cs @@ -0,0 +1,29 @@ +using System; +using Godot; + +namespace ParasiticGod.Scripts.Core.Effects; + +[GlobalClass] +public partial class AddResourceEffect : Effect +{ + [Export] public ResourceType TargetResource { get; set; } + [Export] public double Value { get; set; } + + public override void Execute(GameState state) + { + switch (TargetResource) + { + case ResourceType.Faith: + state.Faith += Value; + break; + case ResourceType.Followers: + state.Followers += (long)Value; + break; + case ResourceType.Corruption: + state.Corruption += Value; + break; + default: + throw new ArgumentOutOfRangeException(); + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Effects/AddResourceEffect.cs.uid b/Scripts/Core/Effects/AddResourceEffect.cs.uid new file mode 100644 index 0000000..d5958f4 --- /dev/null +++ b/Scripts/Core/Effects/AddResourceEffect.cs.uid @@ -0,0 +1 @@ +uid://flyhl4i86han diff --git a/Scripts/Core/Effects/ApplyBuffEffect.cs b/Scripts/Core/Effects/ApplyBuffEffect.cs new file mode 100644 index 0000000..2603146 --- /dev/null +++ b/Scripts/Core/Effects/ApplyBuffEffect.cs @@ -0,0 +1,24 @@ +using Godot; + +namespace ParasiticGod.Scripts.Core.Effects; + +[GlobalClass] +public partial class ApplyBuffEffect : Effect +{ + public enum BuffTarget { FaithGeneration } + + [Export] public BuffTarget TargetStat { get; set; } + [Export] public float Multiplier { get; set; } = 2.0f; + [Export] public double Duration { get; set; } = 30.0; + + public override void Execute(GameState gameState) + { + var newBuff = new Buff + { + Multiplier = Multiplier, + Duration = Duration + }; + + gameState.ActiveBuffs.Add(newBuff); + } +} \ No newline at end of file diff --git a/Scripts/Core/Effects/ApplyBuffEffect.cs.uid b/Scripts/Core/Effects/ApplyBuffEffect.cs.uid new file mode 100644 index 0000000..e55178d --- /dev/null +++ b/Scripts/Core/Effects/ApplyBuffEffect.cs.uid @@ -0,0 +1 @@ +uid://cmhd8jmckgtep diff --git a/Scripts/Core/Effects/Buff.cs b/Scripts/Core/Effects/Buff.cs new file mode 100644 index 0000000..5960920 --- /dev/null +++ b/Scripts/Core/Effects/Buff.cs @@ -0,0 +1,7 @@ +namespace ParasiticGod.Scripts.Core.Effects; + +public class Buff +{ + public float Multiplier { get; set; } = 1.0f; + public double Duration { get; set; } +} \ No newline at end of file diff --git a/Scripts/Core/Effects/Buff.cs.uid b/Scripts/Core/Effects/Buff.cs.uid new file mode 100644 index 0000000..c43cb59 --- /dev/null +++ b/Scripts/Core/Effects/Buff.cs.uid @@ -0,0 +1 @@ +uid://c5fq6vt4uyce2 diff --git a/Scripts/Core/Effects/ConvertResourceEffect.cs b/Scripts/Core/Effects/ConvertResourceEffect.cs new file mode 100644 index 0000000..b224565 --- /dev/null +++ b/Scripts/Core/Effects/ConvertResourceEffect.cs @@ -0,0 +1,36 @@ +using Godot; + +namespace ParasiticGod.Scripts.Core.Effects; + +[GlobalClass] +public partial class ConvertResourceEffect : Effect +{ + [Export] public ResourceType FromResource { get; set; } + [Export] public double FromAmount { get; set; } + [Export] public ResourceType ToResource { get; set; } + [Export] public double ToAmount { get; set; } + + public override void Execute(GameState gameState) + { + double GetValue(ResourceType type) => type switch { + ResourceType.Faith => gameState.Faith, + ResourceType.Followers => gameState.Followers, + ResourceType.Corruption => gameState.Corruption, + _ => 0 + }; + + void SetValue(ResourceType type, double value) { + switch(type) { + case ResourceType.Faith: gameState.Faith = value; break; + case ResourceType.Followers: gameState.Followers = (long)value; break; + case ResourceType.Corruption: gameState.Corruption = value; break; + } + } + + if (GetValue(FromResource) >= FromAmount) + { + SetValue(FromResource, GetValue(FromResource) - FromAmount); + SetValue(ToResource, GetValue(ToResource) + ToAmount); + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Effects/ConvertResourceEffect.cs.uid b/Scripts/Core/Effects/ConvertResourceEffect.cs.uid new file mode 100644 index 0000000..3496c59 --- /dev/null +++ b/Scripts/Core/Effects/ConvertResourceEffect.cs.uid @@ -0,0 +1 @@ +uid://chiq1n5fde3eo diff --git a/Scripts/Core/Effects/DestroySelfEffect.cs b/Scripts/Core/Effects/DestroySelfEffect.cs new file mode 100644 index 0000000..04510d8 --- /dev/null +++ b/Scripts/Core/Effects/DestroySelfEffect.cs @@ -0,0 +1,11 @@ +using Godot; + +namespace ParasiticGod.Scripts.Core.Effects; + +[GlobalClass] +public partial class DestroySelfEffect : Effect +{ + public override void Execute(GameState gameState) + { + } +} \ No newline at end of file diff --git a/Scripts/Core/Effects/DestroySelfEffect.cs.uid b/Scripts/Core/Effects/DestroySelfEffect.cs.uid new file mode 100644 index 0000000..fe3be25 --- /dev/null +++ b/Scripts/Core/Effects/DestroySelfEffect.cs.uid @@ -0,0 +1 @@ +uid://dhnma6yerqpwn diff --git a/Scripts/Core/Effects/Effect.cs b/Scripts/Core/Effects/Effect.cs new file mode 100644 index 0000000..582f474 --- /dev/null +++ b/Scripts/Core/Effects/Effect.cs @@ -0,0 +1,8 @@ +using Godot; + +namespace ParasiticGod.Scripts.Core.Effects; + +public abstract partial class Effect : Resource +{ + public abstract void Execute(GameState gameState); +} \ No newline at end of file diff --git a/Scripts/Core/Effects/Effect.cs.uid b/Scripts/Core/Effects/Effect.cs.uid new file mode 100644 index 0000000..6a918dd --- /dev/null +++ b/Scripts/Core/Effects/Effect.cs.uid @@ -0,0 +1 @@ +uid://c1futvi1xm03q diff --git a/Scripts/Core/Effects/ModifyStatEffect.cs b/Scripts/Core/Effects/ModifyStatEffect.cs new file mode 100644 index 0000000..8f7e5a0 --- /dev/null +++ b/Scripts/Core/Effects/ModifyStatEffect.cs @@ -0,0 +1,30 @@ +using Godot; + +namespace ParasiticGod.Scripts.Core.Effects; + +[GlobalClass] +public partial class ModifyStatEffect : Effect +{ + public enum Stat { FaithPerFollower } + public enum Operation { Add, Multiply } + + [Export] public Stat TargetStat { get; set; } + [Export] public Operation Op { get; set; } + [Export] public double Value { get; set; } + + public override void Execute(GameState gameState) + { + if (TargetStat == Stat.FaithPerFollower) + { + switch (Op) + { + case Operation.Add: + gameState.FaithPerFollower += Value; + break; + case Operation.Multiply: + gameState.FaithPerFollower *= Value; + break; + } + } + } +} \ No newline at end of file diff --git a/Scripts/Core/Effects/ModifyStatEffect.cs.uid b/Scripts/Core/Effects/ModifyStatEffect.cs.uid new file mode 100644 index 0000000..7542c56 --- /dev/null +++ b/Scripts/Core/Effects/ModifyStatEffect.cs.uid @@ -0,0 +1 @@ +uid://dy6avn8snuuq1 diff --git a/Scripts/Core/Effects/ResourceType.cs b/Scripts/Core/Effects/ResourceType.cs new file mode 100644 index 0000000..9c94cb1 --- /dev/null +++ b/Scripts/Core/Effects/ResourceType.cs @@ -0,0 +1,3 @@ +namespace ParasiticGod.Scripts.Core.Effects; + +public enum ResourceType { Faith, Followers, Corruption } \ No newline at end of file diff --git a/Scripts/Core/Effects/ResourceType.cs.uid b/Scripts/Core/Effects/ResourceType.cs.uid new file mode 100644 index 0000000..174fcdb --- /dev/null +++ b/Scripts/Core/Effects/ResourceType.cs.uid @@ -0,0 +1 @@ +uid://do6aurfs8oif0 diff --git a/Scripts/Core/Effects/UnlockMiracleEffect.cs b/Scripts/Core/Effects/UnlockMiracleEffect.cs new file mode 100644 index 0000000..0067840 --- /dev/null +++ b/Scripts/Core/Effects/UnlockMiracleEffect.cs @@ -0,0 +1,16 @@ +using Godot; +using Godot.Collections; + +namespace ParasiticGod.Scripts.Core.Effects; + +[GlobalClass] +public partial class UnlockMiracleEffect : Effect +{ + [Export] + public Array MiraclesToUnlock { get; set; } + + public override void Execute(GameState gameState) + { + + } +} \ No newline at end of file diff --git a/Scripts/Core/Effects/UnlockMiracleEffect.cs.uid b/Scripts/Core/Effects/UnlockMiracleEffect.cs.uid new file mode 100644 index 0000000..8986c04 --- /dev/null +++ b/Scripts/Core/Effects/UnlockMiracleEffect.cs.uid @@ -0,0 +1 @@ +uid://c1oieyvbcqjcc diff --git a/Scripts/Core/GameLogic.cs b/Scripts/Core/GameLogic.cs new file mode 100644 index 0000000..3f71034 --- /dev/null +++ b/Scripts/Core/GameLogic.cs @@ -0,0 +1,43 @@ +using System; + +namespace ParasiticGod.Scripts.Core; + +public class GameLogic +{ + public void UpdateGameState(GameState state, double delta) + { + state.Faith += state.FaithPerSecond * delta; + + for (var i = state.ActiveBuffs.Count - 1; i >= 0; i--) + { + var buff = state.ActiveBuffs[i]; + buff.Duration -= delta; + if (buff.Duration <= 0) + { + state.ActiveBuffs.RemoveAt(i); + } + } + } + + public bool TryToPerformMiracle(GameState state, MiracleDefinition miracle) + { + if (state.Faith < miracle.FaithCost || state.Followers < miracle.FollowersRequired) + { + return false; + } + + state.Faith -= miracle.FaithCost; + + if (miracle.Effects != null) + { + foreach (var effect in miracle.Effects) + { + effect.Execute(state); + } + } + + state.Corruption = Math.Clamp(state.Corruption, 0, 100); + + return true; + } +} \ No newline at end of file diff --git a/Scripts/Core/GameLogic.cs.uid b/Scripts/Core/GameLogic.cs.uid new file mode 100644 index 0000000..cf49f79 --- /dev/null +++ b/Scripts/Core/GameLogic.cs.uid @@ -0,0 +1 @@ +uid://bgnfh4rd780td diff --git a/Scripts/Core/GameState.cs b/Scripts/Core/GameState.cs new file mode 100644 index 0000000..fdf3791 --- /dev/null +++ b/Scripts/Core/GameState.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using ParasiticGod.Scripts.Core.Effects; + +namespace ParasiticGod.Scripts.Core; + +public class GameState +{ + public double Faith { get; set; } = 50.0; + public double FaithPerFollower { get; set; } = 0.5; + public long Followers { get; set; } = 40; + public double Corruption { get; set; } = 0.0; + + public List ActiveBuffs { get; } = []; + + public double FaithPerSecond + { + get + { + var totalMultiplier = 1.0; + foreach (var buff in ActiveBuffs) + { + totalMultiplier *= buff.Multiplier; + } + return Followers * FaithPerFollower * totalMultiplier; + } + } +} \ No newline at end of file diff --git a/Scripts/Core/GameState.cs.uid b/Scripts/Core/GameState.cs.uid new file mode 100644 index 0000000..b91d684 --- /dev/null +++ b/Scripts/Core/GameState.cs.uid @@ -0,0 +1 @@ +uid://d3on25ypcw528 diff --git a/Scripts/Core/Miracle.cs.uid b/Scripts/Core/Miracle.cs.uid new file mode 100644 index 0000000..8db7e82 --- /dev/null +++ b/Scripts/Core/Miracle.cs.uid @@ -0,0 +1 @@ +uid://cerwpe1s25yim diff --git a/Scripts/Core/MiracleDefinition.cs b/Scripts/Core/MiracleDefinition.cs new file mode 100644 index 0000000..7d13dac --- /dev/null +++ b/Scripts/Core/MiracleDefinition.cs @@ -0,0 +1,18 @@ +using Godot; +using Godot.Collections; +using ParasiticGod.Scripts.Core.Effects; + +namespace ParasiticGod.Scripts.Core; + +[GlobalClass] +public partial class MiracleDefinition : Resource +{ + public string Id { get; set; } + public bool UnlockedByDefault { get; set; } + + [Export] public string Name { get; set; } + [Export] public double FaithCost { get; set; } + [Export] public long FollowersRequired { get; set; } + + [Export] public Array Effects { get; set; } +} \ No newline at end of file diff --git a/Scripts/Core/MiracleDefinition.cs.uid b/Scripts/Core/MiracleDefinition.cs.uid new file mode 100644 index 0000000..ff589e2 --- /dev/null +++ b/Scripts/Core/MiracleDefinition.cs.uid @@ -0,0 +1 @@ +uid://cfn3mx12xism5 diff --git a/Scripts/Core/MiracleDto.cs b/Scripts/Core/MiracleDto.cs new file mode 100644 index 0000000..e6d74e8 --- /dev/null +++ b/Scripts/Core/MiracleDto.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using ParasiticGod.Scripts.Core.Effects; + +namespace ParasiticGod.Scripts.Core; + +public class EffectDto +{ + public string Type { get; set; } + // --- For "AddResource" Effect --- + public ResourceType TargetResource { get; set; } + public double Value { get; set; } + + // --- For "ApplyBuff" Effect --- + public ApplyBuffEffect.BuffTarget TargetBuffStat { get; set; } + public float Multiplier { get; set; } + public double Duration { get; set; } + + // --- For "ConvertResource" Effect --- + public ResourceType FromResource { get; set; } + public double FromAmount { get; set; } + public ResourceType ToResource { get; set; } + public double ToAmount { get; set; } + + // --- For "ModifyStat" Effect --- + public ModifyStatEffect.Stat TargetStat { get; set; } + public ModifyStatEffect.Operation Op { get; set; } + + public List MiraclesToUnlock { get; set; } +} + +public class MiracleDto +{ + public string Name { get; set; } + public double FaithCost { get; set; } + public long FollowersRequired { get; set; } + public bool UnlockedByDefault { get; set; } + public List Effects { get; set; } +} \ No newline at end of file diff --git a/Scripts/Core/MiracleDto.cs.uid b/Scripts/Core/MiracleDto.cs.uid new file mode 100644 index 0000000..289f573 --- /dev/null +++ b/Scripts/Core/MiracleDto.cs.uid @@ -0,0 +1 @@ +uid://ba8j34h6ps8di diff --git a/Scripts/Core/MiracleLoader.cs b/Scripts/Core/MiracleLoader.cs new file mode 100644 index 0000000..58847b0 --- /dev/null +++ b/Scripts/Core/MiracleLoader.cs @@ -0,0 +1,113 @@ +using System; +using System.Text.Json; +using Godot; +using Godot.Collections; +using Newtonsoft.Json; +using ParasiticGod.Scripts.Core.Effects; + +namespace ParasiticGod.Scripts.Core; + +public static class MiracleLoader +{ + private static readonly System.Collections.Generic.Dictionary EffectRegistry = new() + { + { "AddResource", typeof(AddResourceEffect) }, + { "ApplyBuff", typeof(ApplyBuffEffect) }, + { "ConvertResource", typeof(ConvertResourceEffect) }, + { "ModifyStat", typeof(ModifyStatEffect) }, + { "UnlockMiracle", typeof(UnlockMiracleEffect) }, + { "DestroySelf", typeof(DestroySelfEffect) } + }; + + public static System.Collections.Generic.Dictionary LoadMiraclesFromDirectory(string path) + { + var loadedMiracles = new System.Collections.Generic.Dictionary(); + using var dir = DirAccess.Open(path); + if (dir == null) return loadedMiracles; + + dir.ListDirBegin(); + var fileName = dir.GetNext(); + while (!string.IsNullOrEmpty(fileName)) + { + if (!dir.CurrentIsDir() && fileName.EndsWith(".json")) + { + var filePath = path.PathJoin(fileName); + var fileNameNoExt = fileName.GetBaseName(); + var miracle = LoadMiracleFromFile(filePath, fileNameNoExt); // Pass the ID + if (miracle != null) + { + loadedMiracles.Add(fileNameNoExt, miracle); + } + } + fileName = dir.GetNext(); + } + + GD.Print($"Loaded {loadedMiracles.Count} miracles from {path}"); + return loadedMiracles; + } + + private static MiracleDefinition LoadMiracleFromFile(string filePath, string miracleId) + { + var fileContent = FileAccess.GetFileAsString(filePath); + if (string.IsNullOrEmpty(fileContent)) + { + GD.PushError($"Failed to read file or file is empty: {filePath}"); + return null; + } + + var miracleDto = JsonConvert.DeserializeObject(fileContent); + if (miracleDto == null) + { + GD.PushError($"Failed to deserialize miracle JSON: {filePath}"); + return null; + } + + var miracleDef = new MiracleDefinition + { + Id = miracleId, + UnlockedByDefault = miracleDto.UnlockedByDefault, + Name = miracleDto.Name, + FaithCost = miracleDto.FaithCost, + FollowersRequired = miracleDto.FollowersRequired, + Effects = [] + }; + + foreach (var effectDto in miracleDto.Effects) + { + if (EffectRegistry.TryGetValue(effectDto.Type, out var effectType)) + { + var effectInstance = (Effect)Activator.CreateInstance(effectType); + switch (effectInstance) + { + case AddResourceEffect addResourceEffect: + addResourceEffect.TargetResource = effectDto.TargetResource; + addResourceEffect.Value = effectDto.Value; + break; + case ApplyBuffEffect applyBuffEffect: + applyBuffEffect.TargetStat = effectDto.TargetBuffStat; + applyBuffEffect.Multiplier = effectDto.Multiplier; + applyBuffEffect.Duration = effectDto.Duration; + break; + case ConvertResourceEffect convertResourceEffect: + convertResourceEffect.FromResource = effectDto.FromResource; + convertResourceEffect.FromAmount = effectDto.FromAmount; + convertResourceEffect.ToResource = effectDto.ToResource; + convertResourceEffect.ToAmount = effectDto.ToAmount; + break; + case ModifyStatEffect modifyStatEffect: + modifyStatEffect.TargetStat = effectDto.TargetStat; + modifyStatEffect.Op = effectDto.Op; + modifyStatEffect.Value = effectDto.Value; + break; + case UnlockMiracleEffect unlockMiracleEffect: + unlockMiracleEffect.MiraclesToUnlock = new Array(effectDto.MiraclesToUnlock); + break; + } + + miracleDef.Effects.Add(effectInstance); + } + } + + return miracleDef; + } +} \ No newline at end of file diff --git a/Scripts/Core/MiracleLoader.cs.uid b/Scripts/Core/MiracleLoader.cs.uid new file mode 100644 index 0000000..939607d --- /dev/null +++ b/Scripts/Core/MiracleLoader.cs.uid @@ -0,0 +1 @@ +uid://bpagwiy55t230 diff --git a/Scripts/Core/TierDefinition.cs b/Scripts/Core/TierDefinition.cs new file mode 100644 index 0000000..b4e58d3 --- /dev/null +++ b/Scripts/Core/TierDefinition.cs @@ -0,0 +1,10 @@ +using Godot; + +namespace ParasiticGod.Scripts.Core; + +[GlobalClass] +public partial class TierDefinition : Resource +{ + [Export] public PackedScene Scene { get; private set; } + [Export] public long Threshold { get; private set; } +} \ No newline at end of file diff --git a/Scripts/Core/TierDefinition.cs.uid b/Scripts/Core/TierDefinition.cs.uid new file mode 100644 index 0000000..8aa123d --- /dev/null +++ b/Scripts/Core/TierDefinition.cs.uid @@ -0,0 +1 @@ +uid://c7hh0cy0yrdt8 diff --git a/Scripts/Follower.cs b/Scripts/Follower.cs new file mode 100644 index 0000000..fb28994 --- /dev/null +++ b/Scripts/Follower.cs @@ -0,0 +1,10 @@ +using Godot; + +namespace ParasiticGod.Scripts; + +[GlobalClass] +public partial class Follower : Node2D +{ + public enum FollowerTier { Tier1, Tier2, Tier3, Tier4, Tier5 } + [Export] public FollowerTier Tier { get; private set; } +} \ No newline at end of file diff --git a/Scripts/Follower.cs.uid b/Scripts/Follower.cs.uid new file mode 100644 index 0000000..b93d17e --- /dev/null +++ b/Scripts/Follower.cs.uid @@ -0,0 +1 @@ +uid://cj5libcgnhjml diff --git a/Scripts/FollowerMarker.cs b/Scripts/FollowerMarker.cs new file mode 100644 index 0000000..59af2f7 --- /dev/null +++ b/Scripts/FollowerMarker.cs @@ -0,0 +1,27 @@ +using Godot; + +namespace ParasiticGod.Scripts; + +[GlobalClass] +public partial class FollowerMarker : Marker2D +{ + public bool IsOccupied { get; private set; } + public Follower FollowerInstance { get; private set; } + + public void PlaceFollower(Follower followerInstance) + { + if (IsOccupied) return; + AddChild(followerInstance); + followerInstance.Position = Vector2.Zero; + IsOccupied = true; + FollowerInstance = followerInstance; + } + + public void RemoveFollower() + { + if (!IsOccupied) return; + FollowerInstance.QueueFree(); + FollowerInstance = null; + IsOccupied = false; + } +} \ No newline at end of file diff --git a/Scripts/FollowerMarker.cs.uid b/Scripts/FollowerMarker.cs.uid new file mode 100644 index 0000000..1f0ce4a --- /dev/null +++ b/Scripts/FollowerMarker.cs.uid @@ -0,0 +1 @@ +uid://djaf0gv8s7qib diff --git a/Scripts/PopulationVisualizer.cs b/Scripts/PopulationVisualizer.cs new file mode 100644 index 0000000..c4c4266 --- /dev/null +++ b/Scripts/PopulationVisualizer.cs @@ -0,0 +1,116 @@ +using System.Collections.Generic; +using Godot; +using Godot.Collections; +using ParasiticGod.Scripts.Core; +using ParasiticGod.Scripts.Singletons; + +namespace ParasiticGod.Scripts; + +[GlobalClass] +public partial class PopulationVisualizer : Node +{ + [Export] private Node2D _markersContainer; + [Export] private int _unitsPerMarker = 5; + [Export] private Array _tiers; + + private readonly List _markers = []; + private long _lastKnownUnitCount = -1; + private int _lastKnownTierIndex = -1; + private bool _isUpdating = false; + + public override void _Ready() + { + foreach (var child in _markersContainer.GetChildren()) + { + if (child is FollowerMarker marker) + { + _markers.Add(marker); + } + } + + GameBus.Instance.StateChanged += OnStateChanged; + } + + public override void _ExitTree() + { + GameBus.Instance.StateChanged -= OnStateChanged; + } + + private void OnStateChanged(GameState newState) + { + if (_isUpdating) return; + + var currentUnitCount = newState.Followers; + + var currentMarkersToShow = (int)currentUnitCount / _unitsPerMarker; + var lastMarkersToShow = (int)_lastKnownUnitCount / _unitsPerMarker; + var newTierIndex = GetTierIndex(currentUnitCount); + + if (currentMarkersToShow != lastMarkersToShow || newTierIndex != _lastKnownTierIndex) + { + UpdateVisualsProgressively(currentUnitCount, newTierIndex); + } + } + + private int GetTierIndex(long currentUnitCount) + { + for (var i = _tiers.Count - 1; i >= 0; i--) + { + if (currentUnitCount >= _tiers[i].Threshold) + { + return i; + } + } + return -1; + } + + private async void UpdateVisualsProgressively(long currentUnitCount, int newTierIndex) + { + _isUpdating = true; + + if (newTierIndex < 0) + { + _isUpdating = false; + return; + } + + var followersToShow = (int)currentUnitCount / _unitsPerMarker; + var currentTier = _tiers[newTierIndex]; + + for (var i = 0; i < _markers.Count; i++) + { + var marker = _markers[i]; + var needsChange = false; + + if (i < followersToShow) + { + // Note: The 'Follower' script would need a way to know its tier index or resource path + // to do a perfect comparison. For now, we'll just check for occupancy. + if (!marker.IsOccupied || _lastKnownTierIndex != newTierIndex) + { + if (marker.IsOccupied) marker.RemoveFollower(); + var followerInstance = currentTier.Scene.Instantiate(); + marker.PlaceFollower(followerInstance); + needsChange = true; + } + } + else + { + if (marker.IsOccupied) + { + marker.RemoveFollower(); + needsChange = true; + } + } + + if (needsChange) + { + await ToSignal(GetTree().CreateTimer(0.1f), SceneTreeTimer.SignalName.Timeout); + } + } + + _lastKnownUnitCount = currentUnitCount; + _lastKnownTierIndex = newTierIndex; + _isUpdating = false; + } +} \ No newline at end of file diff --git a/Scripts/PopulationVisualizer.cs.uid b/Scripts/PopulationVisualizer.cs.uid new file mode 100644 index 0000000..fb59598 --- /dev/null +++ b/Scripts/PopulationVisualizer.cs.uid @@ -0,0 +1 @@ +uid://dj2wyrq07gfp2 diff --git a/Scripts/Singletons/GameBus.cs b/Scripts/Singletons/GameBus.cs new file mode 100644 index 0000000..9de14bb --- /dev/null +++ b/Scripts/Singletons/GameBus.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using Godot; +using ParasiticGod.Scripts.Core; +using ParasiticGod.Scripts.Core.Effects; + +namespace ParasiticGod.Scripts.Singletons; + +public partial class GameBus : Node +{ + public static GameBus Instance { get; private set; } + public Dictionary AllMiracles { get; private set; } + + private readonly GameState _gameState = new(); + private readonly GameLogic _gameLogic = new(); + + public event Action StateChanged; + public event Action MiraclePerformed; + public event Action> MiraclesUnlocked; + public event Action MiracleCompleted; + + public override void _EnterTree() + { + Instance = this; + AllMiracles = MiracleLoader.LoadMiraclesFromDirectory("user://Mods/Miracles"); + } + + public override void _ExitTree() + { + Instance = null; + } + + public override void _Process(double delta) + { + _gameLogic.UpdateGameState(_gameState, delta); + StateChanged?.Invoke(_gameState); + + if (_gameState.Corruption >= 100) + { + GD.Print("The world has died!"); + GetTree().Quit(); // For now + } + } + + public void PerformMiracle(MiracleDefinition miracle) + { + if (_gameLogic.TryToPerformMiracle(_gameState, miracle)) + { + MiraclePerformed?.Invoke(miracle); + + var miraclesToUnlock = new List(); + foreach (var effect in miracle.Effects) + { + if (effect is UnlockMiracleEffect unlockEffect) + { + foreach (var id in unlockEffect.MiraclesToUnlock) + { + if (AllMiracles.TryGetValue(id, out var def)) + { + miraclesToUnlock.Add(def); + } + } + } + else if (effect is DestroySelfEffect) + { + MiracleCompleted?.Invoke(miracle); + } + } + + if (miraclesToUnlock.Count > 0) + { + MiraclesUnlocked?.Invoke(miraclesToUnlock); + } + } + } +} \ No newline at end of file diff --git a/Scripts/Singletons/GameBus.cs.uid b/Scripts/Singletons/GameBus.cs.uid new file mode 100644 index 0000000..077a62d --- /dev/null +++ b/Scripts/Singletons/GameBus.cs.uid @@ -0,0 +1 @@ +uid://bxtp262r58pb6 diff --git a/Shaders/corruption_shader.gdshader b/Shaders/corruption_shader.gdshader new file mode 100644 index 0000000..30967d7 --- /dev/null +++ b/Shaders/corruption_shader.gdshader @@ -0,0 +1,30 @@ +shader_type canvas_item; + +// The color of the healthy terrain you want to target. +uniform vec4 terrain_color : source_color = vec4(0.0, 1.0, 0.0, 1.0); +// The color the terrain will turn into as it gets corrupted. +uniform vec4 corrupted_color : source_color = vec4(0.3, 0.1, 0.2, 1.0); +// This value will be controlled by your C# script (from 0.0 to 1.0). +uniform float corruption_level : hint_range(0.0, 1.0); +// A small tolerance to catch pixels that aren't *exactly* the terrain color. +uniform float tolerance : hint_range(0.0, 0.5) = 0.1; + +void fragment() { + // Get the original color of the pixel from the sprite's texture. + vec4 original_color = texture(TEXTURE, UV); + + // Calculate the difference between this pixel's color and the healthy terrain color. + // The distance() function is great for comparing colors. + float color_difference = distance(original_color.rgb, terrain_color.rgb); + + // Check if the difference is within our tolerance. + if (color_difference < tolerance) { + // If it's a terrain pixel, mix the original terrain color with the + // corrupted color based on the corruption_level. + vec3 final_color = mix(terrain_color.rgb, corrupted_color.rgb, corruption_level); + COLOR = vec4(final_color, original_color.a); + } else { + // If it's not a terrain pixel (i.e., it's ocean), leave it unchanged. + COLOR = original_color; + } +} diff --git a/Shaders/corruption_shader.gdshader.uid b/Shaders/corruption_shader.gdshader.uid new file mode 100644 index 0000000..625477e --- /dev/null +++ b/Shaders/corruption_shader.gdshader.uid @@ -0,0 +1 @@ +uid://bf8nk145fjkgh diff --git a/Sprites/Follower.png b/Sprites/Follower.png new file mode 100644 index 0000000000000000000000000000000000000000..f5912bced358fbaa928be0e7db00c4abc31dff96 GIT binary patch literal 5669 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�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

6oworM$fk=d*O9p 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 + + + diff --git a/Sprites/globe.svg.import b/Sprites/globe.svg.import new file mode 100644 index 0000000..af517c3 --- /dev/null +++ b/Sprites/globe.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dg6ac3jb1366r" +path="res://.godot/imported/globe.svg-9c419d879d7f9a7e66b36bfc4b4ebd76.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Sprites/globe.svg" +dest_files=["res://.godot/imported/globe.svg-9c419d879d7f9a7e66b36bfc4b4ebd76.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..9d8b7fa --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..0b99d95 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcs48aa84w21u" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..f2025ed --- /dev/null +++ b/project.godot @@ -0,0 +1,33 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Parasitic God" +run/main_scene="uid://bfil8sd154327" +config/features=PackedStringArray("4.4", "C#", "GL Compatibility") +boot_splash/show_image=false +boot_splash/fullsize=false +boot_splash/use_filter=false +config/icon="res://icon.svg" + +[autoload] + +GameBus="*res://Scripts/Singletons/GameBus.cs" + +[dotnet] + +project/assembly_name="ParasiticGod" + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +environment/defaults/default_clear_color=Color(0.160784, 0.501961, 0.72549, 1)