Compare commits
10 Commits
7e8ccb061a
...
master
Author | SHA1 | Date | |
---|---|---|---|
f81a237f01 | |||
47281a098d | |||
5dd8e6fff9 | |||
0747595f2b | |||
2bf0f4a360 | |||
bdcc0d5089 | |||
1b3657b03a | |||
6d8139fd44 | |||
cdd944b9b5 | |||
c0d18507e3 |
15
Dialogue/tutorial.dialogue
Normal file
15
Dialogue/tutorial.dialogue
Normal file
@@ -0,0 +1,15 @@
|
||||
~ start
|
||||
Narrator: You are a newborn god, a consciousness adrift in the cosmos.
|
||||
|
||||
Narrator: Below you, a nascent world teems with life. A small tribe of followers has begun to worship you. Their belief is your existence.
|
||||
|
||||
Narrator: Your goal is simple: nurture this civilization until they can reach for the stars and carry you with them.
|
||||
|
||||
Narrator: Grant them miracles to grow their population and advance their industry. Click the buttons on the right to see your powers.
|
||||
|
||||
Narrator: But be warned... your divine presence is a paradox. Every miracle that helps your followers also poisons their world, corrupting it.
|
||||
|
||||
Narrator: If the world's corruption reaches 100%, it will be consumed, and you along with it.
|
||||
|
||||
Narrator: Guide them. Grow them. But do not destroy them before they can escape. Their fate, and yours, is in your hands.
|
||||
=> END
|
16
Dialogue/tutorial.dialogue.import
Normal file
16
Dialogue/tutorial.dialogue.import
Normal file
@@ -0,0 +1,16 @@
|
||||
[remap]
|
||||
|
||||
importer="dialogue_manager"
|
||||
importer_version=15
|
||||
type="Resource"
|
||||
uid="uid://dxgpvgx7axp88"
|
||||
path="res://.godot/imported/tutorial.dialogue-20e92c929aa826a6ba83a2adbbdba7f9.tres"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Dialogue/tutorial.dialogue"
|
||||
dest_files=["res://.godot/imported/tutorial.dialogue-20e92c929aa826a6ba83a2adbbdba7f9.tres"]
|
||||
|
||||
[params]
|
||||
|
||||
defaults=true
|
37
Mods/Events/a_plague_descends.json
Normal file
37
Mods/Events/a_plague_descends.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"id": "event_plague_descends",
|
||||
"title": "A Plague Descends",
|
||||
"description": "A virulent disease is sweeping through the population, sickening your followers and halting progress. Drastic measures may be required.",
|
||||
"meanTimeToHappen": 300,
|
||||
"trigger": {
|
||||
"minFollowers": 500,
|
||||
"maxCorruption": 80
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "We must sacrifice the sick.",
|
||||
"tooltip": "Immediately lose 20% of your Followers, but the plague is stopped.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "ModifyStat",
|
||||
"targetStat": "Followers",
|
||||
"op": "Multiply",
|
||||
"value": 0.8
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "We will pray for their recovery.",
|
||||
"tooltip": "Lose all passive Follower generation for 120 seconds as the plague runs its course.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "ApplyBuff",
|
||||
"buffId": "plague_debuff",
|
||||
"targetStat": "FollowersPerSecond",
|
||||
"multiplier": 0,
|
||||
"duration": 120
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
34
Mods/Events/a_prophets_rise.json
Normal file
34
Mods/Events/a_prophets_rise.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"id": "event_prophets_rise",
|
||||
"title": "A Prophet's Rise",
|
||||
"description": "A charismatic leader has emerged among your followers, inspiring them to new heights of devotion and ingenuity. How shall you guide their efforts?",
|
||||
"meanTimeToHappen": 200,
|
||||
"trigger": {
|
||||
"minFollowers": 800,
|
||||
"maxCorruption": 60
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "Focus their zeal on industry.",
|
||||
"tooltip": "Gain a large, one-time boost to Production.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "AddResource",
|
||||
"targetResource": "Production",
|
||||
"value": 750
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Inspire a population boom.",
|
||||
"tooltip": "Gain a large, one-time boost to Followers.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "AddResource",
|
||||
"targetResource": "Followers",
|
||||
"value": 250
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
38
Mods/Events/divine_inspiration.json
Normal file
38
Mods/Events/divine_inspiration.json
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"id": "event_divine_inspiration",
|
||||
"title": "Divine Inspiration",
|
||||
"description": "You feel a surge of pure cosmic energy. You can channel this power to inspire your followers in their efforts to either build or cleanse.",
|
||||
"meanTimeToHappen": 250,
|
||||
"trigger": {
|
||||
"minFollowers": 1500,
|
||||
"maxCorruption": 75
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "Inspire frantic construction.",
|
||||
"tooltip": "Greatly increases all passive Production for 2 minutes.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "ApplyBuff",
|
||||
"buffId": "inspiration_production_buff",
|
||||
"targetStat": "ProductionPerSecond",
|
||||
"multiplier": 3,
|
||||
"duration": 120
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Inspire planetary healing.",
|
||||
"tooltip": "Greatly reduces all passive Corruption for 2 minutes.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "ApplyBuff",
|
||||
"buffId": "inspiration_cleansing_buff",
|
||||
"targetStat": "CorruptionPerSecond",
|
||||
"multiplier": -2,
|
||||
"duration": 120
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
24
Mods/Events/doomsday.json
Normal file
24
Mods/Events/doomsday.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"id": "event_dooms_day",
|
||||
"title": "DOOMS DAY!",
|
||||
"description": "A catastrophic event is unfolding, threatening to annihilate everything in its path",
|
||||
"meanTimeToHappen": 2000,
|
||||
"trigger": {
|
||||
"minFollowers": 500,
|
||||
"maxCorruption": 99
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "NOT TODAY...",
|
||||
"tooltip": "Increase Corruption by 200. (Instant game over)",
|
||||
"effects": [
|
||||
{
|
||||
"type": "ModifyStat",
|
||||
"targetStat": "Corruption",
|
||||
"op": "Add",
|
||||
"value": 200
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
35
Mods/Events/ecological_collapse.json
Normal file
35
Mods/Events/ecological_collapse.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"id": "event_ecological_collapse",
|
||||
"title": "Ecological Collapse",
|
||||
"description": "The planet's ecosystem has reached a breaking point. Widespread famine and resource scarcity are imminent. We must choose what to prioritize for survival.",
|
||||
"meanTimeToHappen": 400,
|
||||
"trigger": {
|
||||
"minFollowers": 3000,
|
||||
"maxCorruption": 85
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "Ration food for the workers.",
|
||||
"tooltip": "Maintain your production, but lose a significant number of followers to famine.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "AddResource",
|
||||
"targetResource": "Followers",
|
||||
"value": -1000
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Divert all efforts to food production.",
|
||||
"tooltip": "Save your population, but suffer a permanent blow to your industrial efficiency.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "ModifyStat",
|
||||
"targetStat": "ProductionPerFollower",
|
||||
"op": "Multiply",
|
||||
"value": 0.75
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
23
Mods/Events/good_harvest.json
Normal file
23
Mods/Events/good_harvest.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"id": "event_good_harvest",
|
||||
"title": "Bountiful Harvest",
|
||||
"description": "A miraculous confluence of weather and soil fertility has led to an unexpectedly large harvest. Our granaries are overflowing!",
|
||||
"meanTimeToHappen": 120,
|
||||
"trigger": {
|
||||
"minFollowers": 100,
|
||||
"maxCorruption": 50
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "A true blessing!",
|
||||
"tooltip": "Gain a large amount (500) of Faith.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "AddResource",
|
||||
"targetResource": "Faith",
|
||||
"value": 500
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
24
Mods/Events/industrial_breakthrough.json
Normal file
24
Mods/Events/industrial_breakthrough.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"id": "event_industrial_breakthrough",
|
||||
"title": "Industrial Breakthrough",
|
||||
"description": "One of your followers has made a revolutionary discovery in manufacturing techniques! This will permanently increase the efficiency of all future industry.",
|
||||
"meanTimeToHappen": 240,
|
||||
"trigger": {
|
||||
"minFollowers": 1000,
|
||||
"maxCorruption": 70
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "A brilliant mind!",
|
||||
"tooltip": "Permanently increases base Production Per Second by 2.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "ModifyStat",
|
||||
"targetStat": "ProductionPerSecond",
|
||||
"op": "Add",
|
||||
"value": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
35
Mods/Events/unstable_rift.json
Normal file
35
Mods/Events/unstable_rift.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"id": "event_unstable_rift",
|
||||
"title": "Unstable Rift",
|
||||
"description": "The planet groans under the weight of your power. A rift of pure corruption has torn open, spewing filth into the environment.",
|
||||
"meanTimeToHappen": 180,
|
||||
"trigger": {
|
||||
"minFollowers": 2000,
|
||||
"maxCorruption": 90
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "Seal it with our power.",
|
||||
"tooltip": "Lose a large amount of Production to seal the rift.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "AddResource",
|
||||
"targetResource": "Production",
|
||||
"value": -1000
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "This is a necessary evil.",
|
||||
"tooltip": "The rift remains, permanently increasing passive Corruption gain.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "ModifyStat",
|
||||
"targetStat": "CorruptionPerSecond",
|
||||
"op": "Add",
|
||||
"value": 0.5
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
146
README.md
146
README.md
@@ -1,52 +1,65 @@
|
||||
# Parasitic God
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
---
|
||||
|
||||
## The Concept
|
||||
|
||||
You are a nascent god, tethered to a small tribe of followers on a vibrant, living world. Their worship is your lifeblood, their growth your only purpose. You grant them miracles, blessing them with bountiful harvests and inspiring great works.
|
||||
|
||||
But your power comes at a cost. Every miracle that nurtures your civilization also poisons the planet. The soil turns barren, the forests wither, and the sky darkens. You are their savior and their apocalypse.
|
||||
|
||||
---
|
||||
|
||||
## The Mission
|
||||
|
||||
Guide your people from a simple tribe to a star-faring civilization capable of escaping the dying world. Manage your resources **Faith**, **Followers**, and **Production** while trying to keep the planet's ever-rising **Corruption** at bay.
|
||||
|
||||
Unlock new ages of technology, build a network of cities, and perform the final, desperate miracle to launch your followers into the stars before you consume everything.
|
||||
|
||||
---
|
||||
|
||||
## Features
|
||||
* **Exponential Growth**
|
||||
|
||||
- **Exponential Growth**
|
||||
Watch a handful of followers grow into a massive civilization with huts, cities, and procedural road networks.
|
||||
|
||||
* **A World That Reacts**
|
||||
- **A World That Reacts**
|
||||
See the direct consequences of your actions as the vibrant globe fades to a corrupted wasteland and forests vanish based on your decisions.
|
||||
|
||||
* **Deeply Moddable**
|
||||
The entire game from miracles and their effects to the visual tiers of your civilization is driven by simple JSON files. If you can edit a text file, you can mod this game.
|
||||
- **Deeply Moddable**
|
||||
The entire game—from miracles and their effects to the visual tiers of your civilization—is driven by simple JSON files. If you can edit a text file, you can mod this game.
|
||||
|
||||
* **Strategic Resource Management**
|
||||
- **Strategic Resource Management**
|
||||
Balance the generation of multiple resources and make difficult choices. Will you sacrifice followers to purge corruption, or push for industrial growth at any cost?
|
||||
|
||||
---
|
||||
|
||||
## Modding Your Universe
|
||||
|
||||
This game was built from the ground up to be modified. You can add new miracles, change existing ones, and even define new visual tiers for your civilization.
|
||||
This game was built from the ground up to be modified. You can add new miracles, create random events, and even define new visual tiers for your civilization.
|
||||
|
||||
### Finding the Mods Folder
|
||||
|
||||
First, you need to find the game's `user data` directory. The game will create a `Mods` folder here on its first launch.
|
||||
The game creates a `Mods` folder in its user data directory on first launch:
|
||||
|
||||
* **Windows:** `%APPDATA%\Godot\app_userdata\ParasiticGod\Mods\`
|
||||
* **macOS:** `~/Library/Application Support/Godot/app_userdata/ParasiticGod/Mods/`
|
||||
* **Linux:** `~/.local/share/godot/app_userdata/ParasiticGod/Mods/`
|
||||
- **Windows:** `%APPDATA%\Godot\app_userdata\ParasiticGod\Mods\`
|
||||
- **macOS:** `~/Library/Application Support/Godot/app_userdata/ParasiticGod/Mods/`
|
||||
- **Linux:** `~/.local/share/godot/app_userdata/ParasiticGod/Mods/`
|
||||
|
||||
Inside, you'll find two folders: `Miracles` and `Tiers`.
|
||||
Inside, you'll find three folders: `Miracles`, `Tiers`, and `Events`.
|
||||
The game also loads a set of base mods from its installation directory (`res://Mods`). Any files you place in the user folder will be added to or override the base game's content.
|
||||
|
||||
---
|
||||
|
||||
### Creating a New Miracle
|
||||
|
||||
To add a new miracle, simply create a new `.json` file in the `Mods/Miracles` folder. The filename will be its unique **ID** (e.g., `my_cool_miracle.json`).
|
||||
|
||||
Here is a template with all available fields:
|
||||
To add a new miracle, create a JSON file in `Mods/Miracles`.
|
||||
The filename becomes its unique **ID** (e.g., `my_cool_miracle.json`):
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -55,7 +68,7 @@ Here is a template with all available fields:
|
||||
"followersRequired": 50,
|
||||
"productionRequired": 0,
|
||||
"unlockedByDefault": true,
|
||||
"advancesToAge": "",
|
||||
"advancesToAge": "The Cool Age",
|
||||
"effects": [
|
||||
{
|
||||
"type": "AddResource",
|
||||
@@ -64,28 +77,46 @@ Here is a template with all available fields:
|
||||
}
|
||||
]
|
||||
}
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
### Creating a New Event
|
||||
|
||||
To add a new random event, create a JSON file in `Mods/Events`:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "event_my_event",
|
||||
"title": "A Thing Happened!",
|
||||
"description": "Something unexpected occurred. What will you do?",
|
||||
"meanTimeToHappen": 120,
|
||||
"trigger": {
|
||||
"minFollowers": 100,
|
||||
"maxCorruption": 50
|
||||
},
|
||||
"options": [
|
||||
{
|
||||
"text": "Do the thing!",
|
||||
"tooltip": "Gain 50 Production.",
|
||||
"effects": [
|
||||
{
|
||||
"type": "AddResource",
|
||||
"targetResource": "Production",
|
||||
"value": 50
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Available Effect Types
|
||||
---
|
||||
|
||||
This is the core of the modding system. Each miracle can have one or more effects.
|
||||
### Modifying Visual Tiers
|
||||
|
||||
| Type | Description | Parameters |
|
||||
| :--- | :--- | :--- |
|
||||
| **`AddResource`** | Adds or subtracts from a core stat. | `targetResource` (Stat), `value` (number) |
|
||||
| **`ConvertResource`** | Trades one resource for another. | `fromResource` (Stat), `fromAmount` (number), `toResource` (Stat), `toAmount` (number) |
|
||||
| **`ModifyStat`** | Permanently changes a passive stat. | `targetStat` (Stat), `op` ("Add" or "Multiply"), `value` (number) |
|
||||
| **`ApplyBuff`** | Applies a temporary multiplier. | `targetStat` (Stat), `multiplier` (number), `duration` (seconds) |
|
||||
| **`UnlockMiracle`** | Unlocks other miracles. | `miraclesToUnlock` (list of miracle IDs) |
|
||||
| **`DestroySelf`** | Removes the miracle's button after use. | (No parameters) |
|
||||
|
||||
**Valid Stat Names:** `Faith`, `Followers`, `Corruption`, `Production`, `ProductionPerSecond`, `CorruptionPerSecond`, `FaithPerFollower`.
|
||||
|
||||
### Modifying Tiers
|
||||
|
||||
You can change the progression of visuals like followers and huts by editing the files in `Mods/Tiers`. For example, to change when followers get new looks, edit `follower_tiers.json`.
|
||||
|
||||
The format is a list of tiers, sorted by their threshold.
|
||||
You can change the visual progression of followers, huts, and temples by editing the files in `Mods/Tiers`.
|
||||
The format is a list of tiers, sorted by threshold:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -93,37 +124,54 @@ The format is a list of tiers, sorted by their threshold.
|
||||
{
|
||||
"tierEnum": "Tier1",
|
||||
"threshold": 0,
|
||||
"scenePath": "res://Scenes/Followers/followers_tier_1.tscn"
|
||||
},
|
||||
{
|
||||
"tierEnum": "Tier2",
|
||||
"threshold": 200,
|
||||
"scenePath": "res://Scenes/Followers/followers_tier_2.tscn"
|
||||
"imagePath": "user://Mods/Tiers/Huts/my_custom_hut.png",
|
||||
"scale": { "x": 1.0, "y": 1.0 }
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
* **`tierEnum`**: Must be one of `Tier1`, `Tier2`, `Tier3`, `Tier4`, `Tier5`.
|
||||
* **`threshold`**: The number of followers (or other stat) needed to unlock this visual.
|
||||
* **`scenePath`**: The path to the Godot scene (`.tscn`) to display for this tier. You can even point to your own custom scenes if you're an advanced modder\!
|
||||
* **tierEnum**: Must be one of `Tier1` through `Tier10`.
|
||||
* **threshold**: The number of followers needed to unlock this visual.
|
||||
* **imagePath**: The path to the image file. Use `user://` for mods or `res://` for base assets.
|
||||
* **scale**: Optional X/Y scale multiplier for the image.
|
||||
|
||||
-----
|
||||
---
|
||||
|
||||
## 📊 Project Stats
|
||||
📦 **Lines of Code:**
|
||||
### Available Effect Types
|
||||
|
||||
Both miracles and event options use this list of effects:
|
||||
|
||||
| Type | Description | Parameters |
|
||||
| ------------------- | ----------------------------------- | ---------------------------------------------------------- |
|
||||
| **AddResource** | Adds or subtracts from a core stat. | `targetResource` (Stat), `value` (number) |
|
||||
| **ConvertResource** | Trades one resource for another. | `fromResource`, `fromAmount`, `toResource`, `toAmount` |
|
||||
| **ModifyStat** | Permanently changes a passive stat. | `targetStat`, `op` ("Add" or "Multiply"), `value` |
|
||||
| **ApplyBuff** | Applies a temporary multiplier. | `buffId`, `targetStat`, `multiplier`, `duration` (seconds) |
|
||||
| **UnlockMiracle** | Unlocks other miracles. | `miraclesToUnlock` (list of IDs) |
|
||||
| **DestroySelf** | Removes the miracle's button. | (No parameters) |
|
||||
| **Win** | Triggers the game's win condition. | (No parameters) |
|
||||
|
||||
**Valid Stat Names:**
|
||||
`Faith`, `Followers`, `Corruption`, `Production`, `ProductionPerSecond`, `CorruptionPerSecond`, `FollowersPerSecond`, `FaithPerFollower`, `ProductionPerFollower`
|
||||
|
||||
---
|
||||
|
||||
## Project Stats
|
||||
|
||||
**Lines of Code:**
|
||||

|
||||
|
||||
📈 **Repo Activity:**
|
||||
**Repo Activity:**
|
||||

|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
This project is open source. See the [LICENSE](https://www.google.com/search?q=./LICENSE) file for details.
|
||||
This project is open source. See the [LICENSE](./LICENSE.txt) file for details.
|
||||
|
||||
-----
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -131,4 +179,4 @@ While the core code is complete for the jam, you can help by:
|
||||
|
||||
* Reporting bugs or balance issues.
|
||||
* Creating cool new miracles and sharing them.
|
||||
* Spreading the word\!
|
||||
* Spreading the word!
|
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=22 format=3 uid="uid://bfil8sd154327"]
|
||||
[gd_scene load_steps=27 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"]
|
||||
@@ -16,10 +16,17 @@
|
||||
[ext_resource type="PackedScene" uid="uid://8w7tvsgkev1y" path="res://Scenes/tree.tscn" id="8_hcu3t"]
|
||||
[ext_resource type="Shader" uid="uid://bf8nk145fjkgh" path="res://Shaders/corruption_shader.gdshader" id="9_wgovn"]
|
||||
[ext_resource type="PackedScene" uid="uid://cqkye7yykakns" path="res://Scenes/Followers/FollowerMarker.tscn" id="11_5ci8a"]
|
||||
[ext_resource type="Script" uid="uid://djmtle2h3yd2e" path="res://Scripts/Components/PauseManager.cs" id="11_xggvw"]
|
||||
[ext_resource type="PackedScene" uid="uid://wysxqe44rxhf" path="res://Scenes/TempleMarker.tscn" id="14_udh0u"]
|
||||
[ext_resource type="PackedScene" uid="uid://xk2xirjd1sma" path="res://Scenes/moddable_visual.tscn" id="17_qdkat"]
|
||||
[ext_resource type="Script" uid="uid://furbvcmw31bx" path="res://Scripts/Components/ForestVisualizer.cs" id="18_qdkat"]
|
||||
[ext_resource type="Script" uid="uid://cw8gpeaq3yfjn" path="res://Scripts/Components/RoadManager.cs" id="19_qdkat"]
|
||||
[ext_resource type="Script" uid="uid://2ipbgwlx1ld1" path="res://Scripts/Components/EventManager.cs" id="22_iwp64"]
|
||||
[ext_resource type="PackedScene" uid="uid://gdejd44km3co" path="res://Scenes/UI/event_popup.tscn" id="23_4etfk"]
|
||||
[ext_resource type="Script" uid="uid://dvmrpbba7plsf" path="res://Scripts/EnableMainThemeMusic.cs" id="24_4etfk"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xggvw"]
|
||||
bg_color = Color(0, 0, 0, 0.733333)
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_cv8e0"]
|
||||
shader = ExtResource("9_wgovn")
|
||||
@@ -37,7 +44,10 @@ _productionLabel = NodePath("UiLayer/Control/Main/Top/ProductionLabel")
|
||||
_miraclePanel = NodePath("UiLayer/Control/Main/ScrollContainer/Bottom")
|
||||
_worldSprite = NodePath("World Sprite")
|
||||
|
||||
[node name="UiLayer" type="CanvasLayer" parent="."]
|
||||
[node name="UiLayer" type="CanvasLayer" parent="." node_paths=PackedStringArray("_pauseButton", "_pauseMenu")]
|
||||
script = ExtResource("11_xggvw")
|
||||
_pauseButton = NodePath("MarginContainer/Button")
|
||||
_pauseMenu = NodePath("PanelContainer")
|
||||
|
||||
[node name="Control" type="Control" parent="UiLayer"]
|
||||
layout_mode = 3
|
||||
@@ -48,6 +58,7 @@ grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="Main" type="MarginContainer" parent="UiLayer/Control"]
|
||||
layout_mode = 1
|
||||
@@ -58,6 +69,7 @@ grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 0
|
||||
mouse_filter = 2
|
||||
theme_override_constants/margin_left = 8
|
||||
theme_override_constants/margin_top = 8
|
||||
theme_override_constants/margin_right = 8
|
||||
@@ -67,6 +79,7 @@ theme_override_constants/margin_bottom = 8
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 0
|
||||
mouse_filter = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="FaithLabel" type="Label" parent="UiLayer/Control/Main/Top"]
|
||||
@@ -124,6 +137,44 @@ stream = ExtResource("6_32vk6")
|
||||
[node name="BuffAdded" type="AudioStreamPlayer" parent="UiLayer/Control/Main/ScrollContainer2/HBoxContainer"]
|
||||
stream = ExtResource("7_crdpj")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="UiLayer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/margin_left = 4
|
||||
theme_override_constants/margin_top = 4
|
||||
theme_override_constants/margin_right = 4
|
||||
theme_override_constants/margin_bottom = 4
|
||||
|
||||
[node name="Button" type="Button" parent="UiLayer/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
size_flags_vertical = 0
|
||||
focus_mode = 0
|
||||
text = "Pause"
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="UiLayer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
mouse_filter = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_xggvw")
|
||||
|
||||
[node name="Label" type="Label" parent="UiLayer/PanelContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 1
|
||||
text = "Paused"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
uppercase = true
|
||||
|
||||
[node name="Notification Layer" type="CanvasLayer" parent="." node_paths=PackedStringArray("_sfx")]
|
||||
layer = 3
|
||||
script = ExtResource("6_iwp64")
|
||||
@@ -133,6 +184,14 @@ _sfx = NodePath("Advance Age")
|
||||
[node name="Advance Age" type="AudioStreamPlayer" parent="Notification Layer"]
|
||||
stream = ExtResource("8_4etfk")
|
||||
|
||||
[node name="CenterContainer" type="CenterContainer" parent="Notification Layer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="Camera2D" type="Camera2D" parent="."]
|
||||
|
||||
[node name="World Sprite" type="Sprite2D" parent="."]
|
||||
@@ -5627,3 +5686,12 @@ _unitsPerMarker = 1
|
||||
Category = 2
|
||||
_moddableVisualScene = ExtResource("17_qdkat")
|
||||
metadata/_custom_type_script = "uid://dj2wyrq07gfp2"
|
||||
|
||||
[node name="EventManager" type="Node" parent="." node_paths=PackedStringArray("_eventPopupContainer")]
|
||||
script = ExtResource("22_iwp64")
|
||||
_eventPopupScene = ExtResource("23_4etfk")
|
||||
_eventPopupContainer = NodePath("../Notification Layer/CenterContainer")
|
||||
metadata/_custom_type_script = "uid://2ipbgwlx1ld1"
|
||||
|
||||
[node name="Node" type="Node" parent="."]
|
||||
script = ExtResource("24_4etfk")
|
||||
|
8
Scenes/UI/event_option_button.tscn
Normal file
8
Scenes/UI/event_option_button.tscn
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_scene format=3 uid="uid://b2o5rufqn8dpf"]
|
||||
|
||||
[node name="EventOptionButton" type="Button"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
37
Scenes/UI/event_popup.tscn
Normal file
37
Scenes/UI/event_popup.tscn
Normal file
@@ -0,0 +1,37 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://gdejd44km3co"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://h1x5eqt0lc5m" path="res://Scripts/UI/EventPopup.cs" id="1_lkb7n"]
|
||||
[ext_resource type="PackedScene" uid="uid://b2o5rufqn8dpf" path="res://Scenes/UI/event_option_button.tscn" id="2_gk0qx"]
|
||||
|
||||
[node name="EventPopup" type="PanelContainer" node_paths=PackedStringArray("_titleLabel", "_descriptionLabel", "_optionsContainer")]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_lkb7n")
|
||||
_titleLabel = NodePath("VBoxContainer/Title")
|
||||
_descriptionLabel = NodePath("VBoxContainer/Description")
|
||||
_optionsContainer = NodePath("VBoxContainer/OptionButtons")
|
||||
_optionButtonScene = ExtResource("2_gk0qx")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
alignment = 1
|
||||
|
||||
[node name="Title" type="Label" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 6
|
||||
text = "TITLE"
|
||||
|
||||
[node name="Description" type="RichTextLabel" parent="VBoxContainer"]
|
||||
custom_minimum_size = Vector2(320, 128)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
fit_content = true
|
||||
|
||||
[node name="OptionButtons" type="VBoxContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
@@ -1,7 +1,9 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://kcla4knp80mq"]
|
||||
[gd_scene load_steps=6 format=3 uid="uid://kcla4knp80mq"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cbdokimy0qarg" path="res://Scripts/MainMenu.cs" id="1_8fo1c"]
|
||||
[ext_resource type="PackedScene" uid="uid://cmhvni5njpmee" path="res://Scenes/main_menu.tscn" id="2_ek8ke"]
|
||||
[ext_resource type="AudioStream" uid="uid://defdxbv24q6l1" path="res://Sfx/The Hollow Throne.mp3" id="3_ek8ke"]
|
||||
[ext_resource type="Script" uid="uid://bif3eyfa1lgl4" path="res://Scripts/DisableMainThemeMusic.cs" id="4_eoghk"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_i2yjh"]
|
||||
bg_color = Color(0, 0, 0, 1)
|
||||
@@ -44,3 +46,12 @@ vertical_alignment = 1
|
||||
layout_mode = 2
|
||||
text = "Quit"
|
||||
flat = true
|
||||
|
||||
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
|
||||
stream = ExtResource("3_ek8ke")
|
||||
volume_db = -3.0
|
||||
autoplay = true
|
||||
parameters/looping = true
|
||||
|
||||
[node name="Node" type="Node" parent="."]
|
||||
script = ExtResource("4_eoghk")
|
||||
|
@@ -1,9 +1,10 @@
|
||||
[gd_scene load_steps=6 format=3 uid="uid://cmhvni5njpmee"]
|
||||
[gd_scene load_steps=7 format=3 uid="uid://cmhvni5njpmee"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cbdokimy0qarg" path="res://Scripts/MainMenu.cs" id="1_1ehe0"]
|
||||
[ext_resource type="FontFile" uid="uid://wofoiaejxgsp" path="res://Fonts/Playful Boxes.otf" id="1_28flt"]
|
||||
[ext_resource type="Texture2D" uid="uid://d2wi2cs20q2b6" path="res://Parasitic_God.png" id="1_48xlc"]
|
||||
[ext_resource type="PackedScene" uid="uid://bfil8sd154327" path="res://Scenes/Main/Main.tscn" id="2_ce3w2"]
|
||||
[ext_resource type="PackedScene" uid="uid://kvpk5wrcp3rv" path="res://Scenes/tutorial_scene.tscn" id="2_ce3w2"]
|
||||
[ext_resource type="Script" uid="uid://dvmrpbba7plsf" path="res://Scripts/EnableMainThemeMusic.cs" id="5_n45e2"]
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_48xlc"]
|
||||
font = ExtResource("1_28flt")
|
||||
@@ -65,3 +66,6 @@ text = "Play"
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 30
|
||||
text = "Exit"
|
||||
|
||||
[node name="Node" type="Node" parent="."]
|
||||
script = ExtResource("5_n45e2")
|
||||
|
10
Scenes/main_theme_music.tscn
Normal file
10
Scenes/main_theme_music.tscn
Normal file
@@ -0,0 +1,10 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://b7we8gtene47t"]
|
||||
|
||||
[ext_resource type="AudioStream" uid="uid://wm3vocs0kkk8" path="res://Sfx/MainTheme.mp3" id="1_f0c52"]
|
||||
|
||||
[node name="MainThemeMusic" type="AudioStreamPlayer"]
|
||||
process_mode = 3
|
||||
stream = ExtResource("1_f0c52")
|
||||
volume_db = -5.0
|
||||
autoplay = true
|
||||
parameters/looping = true
|
26
Scenes/tutorial_scene.tscn
Normal file
26
Scenes/tutorial_scene.tscn
Normal file
@@ -0,0 +1,26 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://kvpk5wrcp3rv"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d08d3pi7sx8k3" path="res://Scripts/UI/TutorialScene.cs" id="1_epmsy"]
|
||||
[ext_resource type="PackedScene" uid="uid://bfil8sd154327" path="res://Scenes/Main/Main.tscn" id="2_mw53g"]
|
||||
[ext_resource type="Resource" uid="uid://dxgpvgx7axp88" path="res://Dialogue/tutorial.dialogue" id="3_oaf0i"]
|
||||
[ext_resource type="Texture2D" uid="uid://dg6ac3jb1366r" path="res://Sprites/globe.svg" id="4_7u0dx"]
|
||||
|
||||
[node name="TutorialScene" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_epmsy")
|
||||
_mainGameScene = ExtResource("2_mw53g")
|
||||
_tutorialDialogue = ExtResource("3_oaf0i")
|
||||
|
||||
[node name="World" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 195.0
|
||||
offset_top = -98.0
|
||||
offset_right = 915.0
|
||||
offset_bottom = 732.0
|
||||
texture = ExtResource("4_7u0dx")
|
||||
expand_mode = 4
|
@@ -1,7 +1,9 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://dtuyx1f5fa8sy"]
|
||||
[gd_scene load_steps=6 format=3 uid="uid://dtuyx1f5fa8sy"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cbdokimy0qarg" path="res://Scripts/MainMenu.cs" id="1_a00f1"]
|
||||
[ext_resource type="PackedScene" uid="uid://cmhvni5njpmee" path="res://Scenes/main_menu.tscn" id="2_awi1s"]
|
||||
[ext_resource type="AudioStream" uid="uid://46kqkf4ckqek" path="res://Sfx/Ascend Beyond.mp3" id="3_awi1s"]
|
||||
[ext_resource type="Script" uid="uid://bif3eyfa1lgl4" path="res://Scripts/DisableMainThemeMusic.cs" id="4_bwc64"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_i2yjh"]
|
||||
bg_color = Color(0, 0, 0, 1)
|
||||
@@ -43,3 +45,12 @@ vertical_alignment = 1
|
||||
layout_mode = 2
|
||||
text = "Quit"
|
||||
flat = true
|
||||
|
||||
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
|
||||
stream = ExtResource("3_awi1s")
|
||||
volume_db = -3.0
|
||||
autoplay = true
|
||||
parameters/looping = true
|
||||
|
||||
[node name="Node" type="Node" parent="."]
|
||||
script = ExtResource("4_bwc64")
|
||||
|
73
Scripts/Components/EventManager.cs
Normal file
73
Scripts/Components/EventManager.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
using Limbo.Console.Sharp;
|
||||
using ParasiticGod.Scripts.Core;
|
||||
using ParasiticGod.Scripts.Singletons;
|
||||
using ParasiticGod.Scripts.UI;
|
||||
|
||||
namespace ParasiticGod.Scripts.Components;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class EventManager : Node
|
||||
{
|
||||
[Export] private double _checkInterval = 5.0;
|
||||
[Export] private PackedScene _eventPopupScene;
|
||||
[Export] private Container _eventPopupContainer;
|
||||
|
||||
private List<EventDefinition> _allEvents;
|
||||
private Timer _timer;
|
||||
private RandomNumberGenerator _rng = new();
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
RegisterConsoleCommands();
|
||||
_allEvents = GameBus.Instance.AllEvents;
|
||||
|
||||
_timer = new Timer { WaitTime = _checkInterval, Autostart = true };
|
||||
AddChild(_timer);
|
||||
_timer.Timeout += OnCheckEvents;
|
||||
}
|
||||
|
||||
private void OnCheckEvents()
|
||||
{
|
||||
if (GetTree().Paused) return;
|
||||
|
||||
var state = GameBus.Instance.CurrentState;
|
||||
|
||||
foreach (var ev in _allEvents)
|
||||
{
|
||||
if (state.Get(Stat.Followers) < ev.Trigger.MinFollowers) continue;
|
||||
if (state.Get(Stat.Corruption) > ev.Trigger.MaxCorruption) continue;
|
||||
|
||||
var probability = _checkInterval / ev.MeanTimeToHappen;
|
||||
if (_rng.Randf() < probability)
|
||||
{
|
||||
FireEvent(ev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void FireEvent(EventDefinition eventDef)
|
||||
{
|
||||
GameBus.Instance.SetPause(true);
|
||||
|
||||
var popup = _eventPopupScene.Instantiate<EventPopup>();
|
||||
_eventPopupContainer.AddChild(popup);
|
||||
popup.DisplayEvent(eventDef);
|
||||
}
|
||||
|
||||
[ConsoleCommand("trigger_event", "Triggers an event by its ID for testing purposes.")]
|
||||
private void TriggerEventCommand(string eventId)
|
||||
{
|
||||
var eventDef = _allEvents.Find(e => e.Id == eventId);
|
||||
if (eventDef != null)
|
||||
{
|
||||
FireEvent(eventDef);
|
||||
}
|
||||
else
|
||||
{
|
||||
GD.PushError($"No event found with ID: {eventId}");
|
||||
}
|
||||
}
|
||||
}
|
1
Scripts/Components/EventManager.cs.uid
Normal file
1
Scripts/Components/EventManager.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://2ipbgwlx1ld1
|
43
Scripts/Components/PauseManager.cs
Normal file
43
Scripts/Components/PauseManager.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
using Godot;
|
||||
using ParasiticGod.Scripts.Singletons;
|
||||
|
||||
namespace ParasiticGod.Scripts.Components;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class PauseManager : CanvasLayer
|
||||
{
|
||||
[Export] private Button _pauseButton;
|
||||
[Export] private Control _pauseMenu;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
ProcessMode = ProcessModeEnum.Always;
|
||||
_pauseMenu.Hide();
|
||||
_pauseButton.Pressed += TogglePause;
|
||||
|
||||
GameBus.Instance.PauseStateChanged += OnPauseStateChanged;
|
||||
}
|
||||
|
||||
public override void _Input(InputEvent @event)
|
||||
{
|
||||
if (@event.IsActionPressed("pause")) TogglePause();
|
||||
}
|
||||
|
||||
public override void _ExitTree()
|
||||
{
|
||||
if (GameBus.Instance != null)
|
||||
{
|
||||
GameBus.Instance.PauseStateChanged -= OnPauseStateChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void TogglePause()
|
||||
{
|
||||
GameBus.Instance.SetPause(!GetTree().Paused);
|
||||
}
|
||||
|
||||
private void OnPauseStateChanged(bool isPaused)
|
||||
{
|
||||
_pauseMenu.Visible = isPaused;
|
||||
}
|
||||
}
|
1
Scripts/Components/PauseManager.cs.uid
Normal file
1
Scripts/Components/PauseManager.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://djmtle2h3yd2e
|
22
Scripts/Core/EventDefinition.cs
Normal file
22
Scripts/Core/EventDefinition.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System.Collections.Generic;
|
||||
using Godot.Collections;
|
||||
using ParasiticGod.Scripts.Core.Effects;
|
||||
|
||||
namespace ParasiticGod.Scripts.Core;
|
||||
|
||||
public class EventDefinition
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public int MeanTimeToHappen { get; set; }
|
||||
public EventTriggerDto Trigger { get; set; }
|
||||
public List<EventOptionDefinition> Options { get; set; } = [];
|
||||
}
|
||||
|
||||
public class EventOptionDefinition
|
||||
{
|
||||
public string Text { get; set; }
|
||||
public string Tooltip { get; set; }
|
||||
public Array<Effect> Effects { get; set; }
|
||||
}
|
1
Scripts/Core/EventDefinition.cs.uid
Normal file
1
Scripts/Core/EventDefinition.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ilyr01u70ciw
|
46
Scripts/Core/EventDto.cs
Normal file
46
Scripts/Core/EventDto.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
using System.Collections.Generic;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ParasiticGod.Scripts.Core;
|
||||
|
||||
public class EventTriggerDto
|
||||
{
|
||||
[JsonProperty("minFollowers")]
|
||||
public long MinFollowers { get; set; } = 0;
|
||||
|
||||
[JsonProperty("maxCorruption")]
|
||||
public double MaxCorruption { get; set; } = 100;
|
||||
}
|
||||
|
||||
public class EventOptionDto
|
||||
{
|
||||
[JsonProperty("text")]
|
||||
public string Text { get; set; }
|
||||
|
||||
[JsonProperty("tooltip")]
|
||||
public string Tooltip { get; set; }
|
||||
|
||||
[JsonProperty("effects")]
|
||||
public List<EffectDto> Effects { get; set; }
|
||||
}
|
||||
|
||||
public class EventDto
|
||||
{
|
||||
[JsonProperty("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonProperty("title")]
|
||||
public string Title { get; set; }
|
||||
|
||||
[JsonProperty("description")]
|
||||
public string Description { get; set; }
|
||||
|
||||
[JsonProperty("meanTimeToHappen")]
|
||||
public int MeanTimeToHappen { get; set; } = 100; // in game days
|
||||
|
||||
[JsonProperty("trigger")]
|
||||
public EventTriggerDto Trigger { get; set; }
|
||||
|
||||
[JsonProperty("options")]
|
||||
public List<EventOptionDto> Options { get; set; }
|
||||
}
|
1
Scripts/Core/EventDto.cs.uid
Normal file
1
Scripts/Core/EventDto.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://nwwqn028soa5
|
71
Scripts/Core/EventLoader.cs
Normal file
71
Scripts/Core/EventLoader.cs
Normal file
@@ -0,0 +1,71 @@
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ParasiticGod.Scripts.Core;
|
||||
|
||||
public static class EventLoader
|
||||
{
|
||||
public static List<EventDefinition> LoadAllEvents()
|
||||
{
|
||||
var loadedEvents = new Dictionary<string, EventDefinition>();
|
||||
|
||||
LoadEventsFromPath("res://Mods/Events", loadedEvents);
|
||||
LoadEventsFromPath("user://Mods/Events", loadedEvents);
|
||||
|
||||
GD.Print($"Finished loading. Total unique events: {loadedEvents.Count}");
|
||||
return new List<EventDefinition>(loadedEvents.Values);
|
||||
}
|
||||
|
||||
private static void LoadEventsFromPath(string path, Dictionary<string, EventDefinition> events)
|
||||
{
|
||||
if (!DirAccess.DirExistsAbsolute(path)) return;
|
||||
|
||||
using var dir = DirAccess.Open(path);
|
||||
dir.ListDirBegin();
|
||||
var fileName = dir.GetNext();
|
||||
while (!string.IsNullOrEmpty(fileName))
|
||||
{
|
||||
if (!dir.CurrentIsDir() && fileName.EndsWith(".json"))
|
||||
{
|
||||
var filePath = path.PathJoin(fileName);
|
||||
var ev = LoadEventFromFile(filePath);
|
||||
if (ev != null)
|
||||
{
|
||||
events[ev.Id] = ev; // Add or overwrite
|
||||
}
|
||||
}
|
||||
fileName = dir.GetNext();
|
||||
}
|
||||
}
|
||||
|
||||
private static EventDefinition LoadEventFromFile(string filePath)
|
||||
{
|
||||
var fileContent = FileAccess.GetFileAsString(filePath);
|
||||
if (string.IsNullOrEmpty(fileContent)) return null;
|
||||
|
||||
var dto = JsonConvert.DeserializeObject<EventDto>(fileContent);
|
||||
if (dto == null) return null;
|
||||
|
||||
var eventDef = new EventDefinition
|
||||
{
|
||||
Id = dto.Id,
|
||||
Title = dto.Title,
|
||||
Description = dto.Description,
|
||||
MeanTimeToHappen = dto.MeanTimeToHappen,
|
||||
Trigger = dto.Trigger
|
||||
};
|
||||
|
||||
foreach (var optionDto in dto.Options)
|
||||
{
|
||||
var optionDef = new EventOptionDefinition
|
||||
{
|
||||
Text = optionDto.Text,
|
||||
Tooltip = optionDto.Tooltip,
|
||||
Effects = MiracleLoader.ConvertEffectDtos(optionDto.Effects)
|
||||
};
|
||||
eventDef.Options.Add(optionDef);
|
||||
}
|
||||
return eventDef;
|
||||
}
|
||||
}
|
1
Scripts/Core/EventLoader.cs.uid
Normal file
1
Scripts/Core/EventLoader.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ceimix3ejnadj
|
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
using Newtonsoft.Json;
|
||||
@@ -86,7 +87,17 @@ public static class MiracleLoader
|
||||
Effects = []
|
||||
};
|
||||
|
||||
foreach (var effectDto in miracleDto.Effects)
|
||||
var effects = ConvertEffectDtos(miracleDto.Effects);
|
||||
miracleDef.Effects = effects;
|
||||
return miracleDef;
|
||||
}
|
||||
|
||||
public static Array<Effect> ConvertEffectDtos(List<EffectDto> dtos)
|
||||
{
|
||||
var effects = new Array<Effect>();
|
||||
if (dtos == null) return effects;
|
||||
|
||||
foreach (var effectDto in dtos)
|
||||
{
|
||||
if (EffectRegistry.TryGetValue(effectDto.Type, out var effectType))
|
||||
{
|
||||
@@ -118,11 +129,9 @@ public static class MiracleLoader
|
||||
unlockMiracleEffect.MiraclesToUnlock = new Array<string>(effectDto.MiraclesToUnlock);
|
||||
break;
|
||||
}
|
||||
|
||||
miracleDef.Effects.Add(effectInstance);
|
||||
effects.Add(effectInstance);
|
||||
}
|
||||
}
|
||||
|
||||
return miracleDef;
|
||||
return effects;
|
||||
}
|
||||
}
|
12
Scripts/DisableMainThemeMusic.cs
Normal file
12
Scripts/DisableMainThemeMusic.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using Godot;
|
||||
|
||||
namespace ParasiticGod.Scripts;
|
||||
|
||||
public partial class DisableMainThemeMusic : Node
|
||||
{
|
||||
public override void _Ready()
|
||||
{
|
||||
var mainThemeMusic = GetNodeOrNull<AudioStreamPlayer>("/root/MainThemeMusic");
|
||||
mainThemeMusic?.Stop();
|
||||
}
|
||||
}
|
1
Scripts/DisableMainThemeMusic.cs.uid
Normal file
1
Scripts/DisableMainThemeMusic.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bif3eyfa1lgl4
|
15
Scripts/EnableMainThemeMusic.cs
Normal file
15
Scripts/EnableMainThemeMusic.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using Godot;
|
||||
|
||||
namespace ParasiticGod.Scripts;
|
||||
|
||||
public partial class EnableMainThemeMusic : Node
|
||||
{
|
||||
public override void _Ready()
|
||||
{
|
||||
var mainThemeMusic = GetNodeOrNull<AudioStreamPlayer>("/root/MainThemeMusic");
|
||||
if (mainThemeMusic is { Playing: false })
|
||||
{
|
||||
mainThemeMusic.Play();
|
||||
}
|
||||
}
|
||||
}
|
1
Scripts/EnableMainThemeMusic.cs.uid
Normal file
1
Scripts/EnableMainThemeMusic.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dvmrpbba7plsf
|
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
using Limbo.Console.Sharp;
|
||||
using ParasiticGod.Scripts.Core;
|
||||
using ParasiticGod.Scripts.Core.Effects;
|
||||
@@ -10,10 +11,11 @@ namespace ParasiticGod.Scripts.Singletons;
|
||||
public partial class GameBus : Node
|
||||
{
|
||||
public static GameBus Instance { get; private set; }
|
||||
public Dictionary<string, MiracleDefinition> AllMiracles { get; private set; }
|
||||
public System.Collections.Generic.Dictionary<string, MiracleDefinition> AllMiracles { get; private set; }
|
||||
public List<TierDefinition> FollowerTiers { get; private set; }
|
||||
public List<TierDefinition> HutTiers { get; private set; }
|
||||
public List<TierDefinition> TempleTiers { get; private set; }
|
||||
public List<EventDefinition> AllEvents { get; private set; }
|
||||
|
||||
private PackedScene _gameOverScene = GD.Load<PackedScene>("res://Scenes/game_over.tscn");
|
||||
private PackedScene _winScene = GD.Load<PackedScene>("res://Scenes/win_screen.tscn");
|
||||
@@ -30,11 +32,13 @@ public partial class GameBus : Node
|
||||
public event Action PopulationVisualsUpdated;
|
||||
public event Action<string> AgeAdvanced;
|
||||
public event Action GameWon;
|
||||
public event Action<bool> PauseStateChanged;
|
||||
|
||||
public override void _EnterTree()
|
||||
{
|
||||
Instance = this;
|
||||
AllMiracles = MiracleLoader.LoadAllMiracles();
|
||||
AllEvents = EventLoader.LoadAllEvents();
|
||||
FollowerTiers = TierLoader.LoadTiers("res://Mods/Tiers/follower_tiers.json", "user://Mods/Tiers/follower_tiers.json");
|
||||
HutTiers = TierLoader.LoadTiers("res://Mods/Tiers/hut_tiers.json","user://Mods/Tiers/hut_tiers.json");
|
||||
TempleTiers = TierLoader.LoadTiers("res://Mods/Tiers/temple_tiers.json","user://Mods/Tiers/temple_tiers.json");
|
||||
@@ -124,9 +128,24 @@ public partial class GameBus : Node
|
||||
GameWon?.Invoke();
|
||||
}
|
||||
|
||||
public void ExecuteEffects(Array<Effect> effects)
|
||||
{
|
||||
foreach (var effect in effects)
|
||||
{
|
||||
effect.Execute(_gameState);
|
||||
}
|
||||
SetPause(false);
|
||||
}
|
||||
|
||||
public void SubscribeToStat(Stat stat, Action<double> listener) => _gameState.Subscribe(stat, listener);
|
||||
public void UnsubscribeFromStat(Stat stat, Action<double> listener) => _gameState.Unsubscribe(stat, listener);
|
||||
|
||||
public void SetPause(bool isPaused)
|
||||
{
|
||||
GetTree().Paused = isPaused;
|
||||
PauseStateChanged?.Invoke(isPaused);
|
||||
}
|
||||
|
||||
public GameState CurrentState => _gameState;
|
||||
|
||||
[ConsoleCommand("set_stat", "Sets the value of a specified stat.")]
|
||||
|
76
Scripts/UI/EventPopup.cs
Normal file
76
Scripts/UI/EventPopup.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using Godot;
|
||||
using ParasiticGod.Scripts.Core;
|
||||
using ParasiticGod.Scripts.Singletons;
|
||||
|
||||
namespace ParasiticGod.Scripts.UI;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class EventPopup : PanelContainer
|
||||
{
|
||||
[Export] private Label _titleLabel;
|
||||
[Export] private RichTextLabel _descriptionLabel;
|
||||
[Export] private VBoxContainer _optionsContainer;
|
||||
[Export] private PackedScene _optionButtonScene; // A scene for a single button
|
||||
[Export] private float _choiceTimeout = 30.0f;
|
||||
|
||||
private EventDefinition _eventDef;
|
||||
private Timer _timeoutTimer;
|
||||
private readonly RandomNumberGenerator _rng = new();
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
ProcessMode = ProcessModeEnum.Always;
|
||||
}
|
||||
|
||||
public void DisplayEvent(EventDefinition eventDef)
|
||||
{
|
||||
_eventDef = eventDef;
|
||||
_titleLabel.Text = eventDef.Title;
|
||||
_descriptionLabel.Text = eventDef.Description;
|
||||
|
||||
foreach (var child in _optionsContainer.GetChildren())
|
||||
{
|
||||
child.QueueFree();
|
||||
}
|
||||
|
||||
foreach (var option in eventDef.Options)
|
||||
{
|
||||
var button = _optionButtonScene.Instantiate<Button>();
|
||||
button.Text = option.Text;
|
||||
button.TooltipText = option.Tooltip;
|
||||
|
||||
button.Pressed += () =>
|
||||
{
|
||||
_timeoutTimer.Stop();
|
||||
HandleChoice(option);
|
||||
};
|
||||
|
||||
_optionsContainer.AddChild(button);
|
||||
}
|
||||
|
||||
_timeoutTimer = new Timer { WaitTime = _choiceTimeout, OneShot = true };
|
||||
AddChild(_timeoutTimer);
|
||||
_timeoutTimer.Timeout += OnTimeout;
|
||||
_timeoutTimer.Start();
|
||||
}
|
||||
|
||||
private void OnTimeout()
|
||||
{
|
||||
if (_eventDef.Options.Count > 0)
|
||||
{
|
||||
var randomIndex = _rng.RandiRange(0, _eventDef.Options.Count - 1);
|
||||
HandleChoice(_eventDef.Options[randomIndex]);
|
||||
}
|
||||
else
|
||||
{
|
||||
QueueFree();
|
||||
GetTree().Paused = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleChoice(EventOptionDefinition option)
|
||||
{
|
||||
GameBus.Instance.ExecuteEffects(option.Effects);
|
||||
QueueFree();
|
||||
}
|
||||
}
|
1
Scripts/UI/EventPopup.cs.uid
Normal file
1
Scripts/UI/EventPopup.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://h1x5eqt0lc5m
|
29
Scripts/UI/TutorialScene.cs
Normal file
29
Scripts/UI/TutorialScene.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using DialogueManagerRuntime;
|
||||
using Godot;
|
||||
|
||||
namespace ParasiticGod.Scripts.UI;
|
||||
|
||||
public partial class TutorialScene : Control
|
||||
{
|
||||
[Export] private PackedScene _mainGameScene;
|
||||
[Export] private Resource _tutorialDialogue;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
DialogueManager.DialogueEnded += OnDialogueEnded;
|
||||
DialogueManager.ShowExampleDialogueBalloon(_tutorialDialogue, "start");
|
||||
}
|
||||
|
||||
public override void _ExitTree()
|
||||
{
|
||||
DialogueManager.DialogueEnded -= OnDialogueEnded;
|
||||
}
|
||||
|
||||
private void OnDialogueEnded(Resource resource)
|
||||
{
|
||||
if (resource == _tutorialDialogue)
|
||||
{
|
||||
GetTree().ChangeSceneToPacked(_mainGameScene);
|
||||
}
|
||||
}
|
||||
}
|
1
Scripts/UI/TutorialScene.cs.uid
Normal file
1
Scripts/UI/TutorialScene.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://d08d3pi7sx8k3
|
BIN
Sfx/Ascend Beyond.mp3
Normal file
BIN
Sfx/Ascend Beyond.mp3
Normal file
Binary file not shown.
19
Sfx/Ascend Beyond.mp3.import
Normal file
19
Sfx/Ascend Beyond.mp3.import
Normal file
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="mp3"
|
||||
type="AudioStreamMP3"
|
||||
uid="uid://46kqkf4ckqek"
|
||||
path="res://.godot/imported/Ascend Beyond.mp3-225c648bac3dc986f75992f9d3ccb96d.mp3str"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/Ascend Beyond.mp3"
|
||||
dest_files=["res://.godot/imported/Ascend Beyond.mp3-225c648bac3dc986f75992f9d3ccb96d.mp3str"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
BIN
Sfx/MainTheme.mp3
Normal file
BIN
Sfx/MainTheme.mp3
Normal file
Binary file not shown.
19
Sfx/MainTheme.mp3.import
Normal file
19
Sfx/MainTheme.mp3.import
Normal file
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="mp3"
|
||||
type="AudioStreamMP3"
|
||||
uid="uid://wm3vocs0kkk8"
|
||||
path="res://.godot/imported/MainTheme.mp3-212a5702d6d6fce08090316bf842178d.mp3str"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/MainTheme.mp3"
|
||||
dest_files=["res://.godot/imported/MainTheme.mp3-212a5702d6d6fce08090316bf842178d.mp3str"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
BIN
Sfx/The Hollow Throne.mp3
Normal file
BIN
Sfx/The Hollow Throne.mp3
Normal file
Binary file not shown.
19
Sfx/The Hollow Throne.mp3.import
Normal file
19
Sfx/The Hollow Throne.mp3.import
Normal file
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="mp3"
|
||||
type="AudioStreamMP3"
|
||||
uid="uid://defdxbv24q6l1"
|
||||
path="res://.godot/imported/The Hollow Throne.mp3-2205b1087f253cf81b97a8caaea58efc.mp3str"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/The Hollow Throne.mp3"
|
||||
dest_files=["res://.godot/imported/The Hollow Throne.mp3-2205b1087f253cf81b97a8caaea58efc.mp3str"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://cx3lujtdnjgbd"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_1.wav-7cbb56ae27212293a53b44b25ca63aa1.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_1.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_1.wav-7cbb56ae27212293a53b44b25ca63aa1.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://d1ojjdhkye60a"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_10.wav-90ddfa78058d85aa9ad63fff5c97ca16.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_10.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_10.wav-90ddfa78058d85aa9ad63fff5c97ca16.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://rqiatqrim2ej"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_11.wav-7e6ae22c23408d14e8e5f12526df9be6.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_11.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_11.wav-7e6ae22c23408d14e8e5f12526df9be6.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://s13wrqeinabo"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_12.wav-c64d956571bc7960f7f3021c8c047031.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_12.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_12.wav-c64d956571bc7960f7f3021c8c047031.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://bdauyaf3m1ii6"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_13.wav-b432c83d18ec2528b5dd55c9e6eb6e26.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_13.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_13.wav-b432c83d18ec2528b5dd55c9e6eb6e26.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://b3tiilkhxedmc"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_14.wav-4b60ebf5c2442a0bbbd4db41353e2797.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_14.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_14.wav-4b60ebf5c2442a0bbbd4db41353e2797.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://blic15k83hbp5"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_15.wav-9a647996664e80a0d3942b61168ce672.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_15.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_15.wav-9a647996664e80a0d3942b61168ce672.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://c4632bogkmg5h"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_16.wav-76d966d41c556ba7145673f9724f6af7.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_16.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_16.wav-76d966d41c556ba7145673f9724f6af7.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://boo1lqccxcbu6"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_17.wav-30edf21c9a00a9e8a25dfd196b130de0.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_17.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_17.wav-30edf21c9a00a9e8a25dfd196b130de0.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://flpvi8s8psm6"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_18.wav-ab5167bf0b3994c80d3b7898b397b97e.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_18.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_18.wav-ab5167bf0b3994c80d3b7898b397b97e.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://bcpcsfjo2uswe"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_19.wav-c7f9aec3f5b2dd3a1d34a251d65759cd.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_19.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_19.wav-c7f9aec3f5b2dd3a1d34a251d65759cd.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://c01ftvj3i4oc4"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_2.wav-cef5290c13b504eab580953dd33c0aa5.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_2.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_2.wav-cef5290c13b504eab580953dd33c0aa5.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://dcp5c5scviebc"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_20.wav-ea47d81b2f83cf198a153b09175cb228.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_20.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_20.wav-ea47d81b2f83cf198a153b09175cb228.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://cy31bm14a6omt"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_21.wav-0fe9870134ba463a82bdfe1e4d94a03b.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_21.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_21.wav-0fe9870134ba463a82bdfe1e4d94a03b.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://ysbmpwuqpim8"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_23.wav-8c0d86195ff5413fd407292756c1d336.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_23.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_23.wav-8c0d86195ff5413fd407292756c1d336.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://dhqa03l7kw03m"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_24.wav-837c322c15e20e4fe5fbb885cace11fd.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_24.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_24.wav-837c322c15e20e4fe5fbb885cace11fd.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://cyyuh1xr8itfm"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_25.wav-d22550b01678995f53fce1c625d55b16.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_25.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_25.wav-d22550b01678995f53fce1c625d55b16.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://b3yg0w0qt46we"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_26.wav-6bef22aab496d713297b287eb10bfc41.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_26.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_26.wav-6bef22aab496d713297b287eb10bfc41.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://dykqhqwngulw1"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_27.wav-42306e4c486a9a557e36feefdd50d3f0.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_27.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_27.wav-42306e4c486a9a557e36feefdd50d3f0.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://dqtslrqmarhjo"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_28.wav-2e9c3f1bf9225b0f1d87fe8ea72a90b3.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_28.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_28.wav-2e9c3f1bf9225b0f1d87fe8ea72a90b3.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://bsrgi55la2b1a"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_29.wav-f98662b8b39c10edf191c81e73a9a926.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_29.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_29.wav-f98662b8b39c10edf191c81e73a9a926.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://dr6eserw65udy"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_3.wav-595acc8321e40525bc22cca51bae9220.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_3.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_3.wav-595acc8321e40525bc22cca51bae9220.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://bhqnn0tvgc7xs"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_30.wav-d5ba0ff830dfe39e52bcf39c17b29dcd.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_30.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_30.wav-d5ba0ff830dfe39e52bcf39c17b29dcd.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://c4vj8lxy0p62u"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_31.wav-57d309d9a1bda39c87ad7b1f713c0a85.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_31.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_31.wav-57d309d9a1bda39c87ad7b1f713c0a85.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://dor20ljq5q7gd"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_32.wav-40724843de9f754ccfab7dadc92e8e87.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_32.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_32.wav-40724843de9f754ccfab7dadc92e8e87.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://bieunboco42me"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_33.wav-664fbe0a3c0b8160885971af1e55e038.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_33.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_33.wav-664fbe0a3c0b8160885971af1e55e038.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://b3btdu1v8t482"
|
||||
path="res://.godot/imported/UI_SFX_Pack_61_34.wav-5c3244297eb7410ab8776167819f4504.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Sfx/UI_SFX_Pack_61_34.wav"
|
||||
dest_files=["res://.godot/imported/UI_SFX_Pack_61_34.wav-5c3244297eb7410ab8776167819f4504.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user