boss token and diary
added diary, sprites for projectile and token, attack hitbox changes, added refightability of bosses
This commit is contained in:
@@ -0,0 +1,133 @@
|
|||||||
|
# Light & Dark — Prototype
|
||||||
|
|
||||||
|
A 2D platformer built with **Pygame**. You switch between two forms — **Light** and **Shade** — each with different movement, combat, and ability behavior, all driven by a single shared resource: **Charge (Flow)**.
|
||||||
|
|
||||||
|
> Note: this is a prototype. All progress (quests, boss tokens, broken walls, defeated bosses) is **in-memory** and resets when you restart the game — intentional, for fast testing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Running the game
|
||||||
|
|
||||||
|
```
|
||||||
|
python pygame_test.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Requires Python 3.10+ and `pygame`. Game data (rooms, items, sets, enemies, drops) lives in `data/`. Rooms are edited with the included browser tool: `level_editor_v43.html`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Controls
|
||||||
|
|
||||||
|
| Action | Key |
|
||||||
|
|---|---|
|
||||||
|
| Move | A / D |
|
||||||
|
| Jump | W |
|
||||||
|
| Move down / drop | S |
|
||||||
|
| Heal | Space (hold) |
|
||||||
|
| Melee attack | E |
|
||||||
|
| Ranged shot | Q |
|
||||||
|
| Dash | Tab |
|
||||||
|
| Shatterstep | R |
|
||||||
|
| Tether | X |
|
||||||
|
| Reality Break | C |
|
||||||
|
| Toggle Light/Shade | Left Shift |
|
||||||
|
| Interact / Talk | F |
|
||||||
|
| Inventory | I |
|
||||||
|
| Stats overlay | H |
|
||||||
|
| Pause / Settings | Esc |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## The two forms
|
||||||
|
|
||||||
|
**Light** — faster movement, higher jump, and charge **refills** over time. You take contact damage from enemies.
|
||||||
|
|
||||||
|
**Shade** — slower but tanky: **immune to enemy contact damage**, deals double melee damage, and can use shade-specific gear bonuses. But being in Shade **drains Charge** (and Shade is forced off when Charge hits 0). Shade also drains Charge **twice as fast while clipping inside an enemy**.
|
||||||
|
|
||||||
|
**Charge (Flow)** — base max 100, refills at 20/s in Light, drains at 40/s in Shade. Standing near a **lantern/light source** doubles Charge regeneration. Attacks, dash (Light), ranged shots, and healing all cost Charge.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Abilities (by form)
|
||||||
|
|
||||||
|
| Ability | Key | Light | Shade |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **Melee** | E | 1 damage, costs 1 Charge | **2 damage**, costs 1 Charge |
|
||||||
|
| **Dash** | Tab | Costs 10 Charge; **stuns** enemies hit | Costs 1 HP; deals **4 damage** to enemies hit |
|
||||||
|
| **Ranged** | Q | Costs 5 Charge, 0.45s cooldown, 0.5 damage; **breaks green ability walls** | Same, but 1.0 damage |
|
||||||
|
| **Shatterstep** | R | Spawns a **platform under your feet** while airborne (extra jumps) | On landing, creates a damaging **shockwave AOE** below you |
|
||||||
|
| **Tether** | X | **Binds** the enemy (3s) and **fears** it (runs away) | **Insta-kills** enemies below a HP threshold (normal ⅓, miniboss 20%, boss 5%); otherwise **slows** them |
|
||||||
|
| **Reality Break** | C | Doubles drop & coin rates and glows enemies | **Instantly kills all enemies** but halves drop & coin rates |
|
||||||
|
| **Heal** | Space | Spend Charge to heal over ~2s (slower while healing) | Unavailable |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Combat notes
|
||||||
|
|
||||||
|
- Enemy contact damage only applies in **Light** form.
|
||||||
|
- Boss **shockwave attacks poison** you for 4 seconds: the health bar turns green and you lose 1 HP per second.
|
||||||
|
- Attacks and hits use invincibility frames and knockback; your melee hitbox covers ~30% into your body so close/overlapping hits always connect.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Equipment & Armor Sets
|
||||||
|
|
||||||
|
Slots: **helmet, chest, pants, necklace**. Pieces roll stats (move speed, heal, charge, health, etc.).
|
||||||
|
|
||||||
|
**Rarities:** `tempered` (tier 1) → `attuned` (tier 2) → `awakened` (tier 3, unlocks ability slots). The **Upgrader** NPC turns 5 tempered copies of an item into 1 attuned copy.
|
||||||
|
|
||||||
|
**Sets** (3 pieces of the same set, attuned or better):
|
||||||
|
|
||||||
|
| Set | Summary |
|
||||||
|
|---|---|
|
||||||
|
| Dawnrunner | +HP; awakened adds Light move speed |
|
||||||
|
| Gravemark | +max Charge; awakened adds Charge regen |
|
||||||
|
| Vitalweave | +HP; awakened adds +heal |
|
||||||
|
| Duskwarrior | +Shade damage; awakened restores Charge on Shade hits |
|
||||||
|
| Twister | Removes Shade speed penalty; awakened gives move speed after switching forms |
|
||||||
|
| Paladin | Chance to negate incoming damage; awakened adds +HP |
|
||||||
|
| Luminal Growth | +Charge regen while standing still in Light; awakened also negates damage |
|
||||||
|
| Abyss Cleaver | Chance to heal on kill; awakened also gives move speed on kill |
|
||||||
|
| Umbraflow | Reduces Shade Charge drain |
|
||||||
|
| Adaptive Traveller | Move speed after switching forms; awakened restores Charge on switch |
|
||||||
|
|
||||||
|
The shade-focused sets (**Duskwarrior, Umbraflow, Abyss Cleaver, Adaptive Traveller**) are intentionally **excluded** from early boss and town-shop loot, so you can always complete the remaining sets.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NPCs (Town 1: Gloomreach)
|
||||||
|
|
||||||
|
- **Vendor** — sells basic armor pieces.
|
||||||
|
- **Necklace Vendor** — sells necklaces.
|
||||||
|
- **Upgrader** — attunes 5× tempered → attuned.
|
||||||
|
- **Combat Master** — upgrades your boss token to unlock the **Hard** boss variant.
|
||||||
|
- **Boss Diary** — an interactable book: view your collected boss tokens in a grid, slot/unslot them, and start refights.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Rooms & Progression
|
||||||
|
|
||||||
|
- `room_01` — tutorial. Contains a **quest object** (pink): accept the **"First Kills"** quest (kill 4 normal enemies → 5–15 light coins, repeatable).
|
||||||
|
- `room_02` — first enemies.
|
||||||
|
- `room_07` — hub, branching to the boss, reward room, and town.
|
||||||
|
- `room_boss_01` — **Gloom Warden** fight. Defeating him drops his **boss token**.
|
||||||
|
- `room_reward_01` — reward chest + the **Ranged** ability, locked behind green ability walls.
|
||||||
|
- `room_town_gloomreach` — Town 1 (NPCs above).
|
||||||
|
- `room_boss_refight_01` — diary refight room (same arena, no exits until the boss dies or you die).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Boss Diary & Tokens
|
||||||
|
|
||||||
|
1. Beat the world boss → collect his **token** (teal pickup).
|
||||||
|
2. Bring it to the diary in town and **slot** it (or keep it in your inventory).
|
||||||
|
3. Slotting unlocks **Fight (Normal)**. Upgrading the token at the Combat Master unlocks **Fight (Hard)** — the boss moves and shoots twice as fast.
|
||||||
|
4. Dying in a refight returns you to the diary. Removing a token from the diary sends it back to your inventory, disabling the fight until you re-slot it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## HUD & Stats
|
||||||
|
|
||||||
|
- Top-right: health bar (turns **green while poisoned**), Charge bar, coin counts.
|
||||||
|
- Ability icons with cooldown indicators (top-left).
|
||||||
|
- **H** toggles a detailed overlay: exact HP/Charge, move speeds (both forms), heal duration, attack rate, Charge regen, the lantern buff, and any stat bonuses from gear.
|
||||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 173 B |
Binary file not shown.
|
After Width: | Height: | Size: 212 B |
@@ -130,6 +130,14 @@
|
|||||||
560
|
560
|
||||||
],
|
],
|
||||||
"radius": 180
|
"radius": 180
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quest_giver",
|
||||||
|
"quest_id": "quest_first_kills",
|
||||||
|
"pos": [
|
||||||
|
300,
|
||||||
|
600
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"id": "room_boss_refight_01",
|
||||||
|
"name": "room_boss_refight_01"
|
||||||
|
},
|
||||||
|
"player_spawn": [
|
||||||
|
-240,
|
||||||
|
300
|
||||||
|
],
|
||||||
|
"bounds": {
|
||||||
|
"kill_y": 1400
|
||||||
|
},
|
||||||
|
"platforms": {
|
||||||
|
"ground": [
|
||||||
|
[
|
||||||
|
-500,
|
||||||
|
360,
|
||||||
|
1500,
|
||||||
|
240
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"enemies": [
|
||||||
|
{
|
||||||
|
"type": "boss",
|
||||||
|
"pos": [
|
||||||
|
280,
|
||||||
|
200
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"exits": [
|
||||||
|
{
|
||||||
|
"rect": [
|
||||||
|
-460,
|
||||||
|
300,
|
||||||
|
80,
|
||||||
|
60
|
||||||
|
],
|
||||||
|
"to": "room_town_gloomreach",
|
||||||
|
"spawn_id": "entry_diary",
|
||||||
|
"hint": "Leave",
|
||||||
|
"requires_boss_dead": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ability_doors": [],
|
||||||
|
"entry_spawns": {}
|
||||||
|
}
|
||||||
@@ -42,8 +42,21 @@
|
|||||||
"entry_1": [
|
"entry_1": [
|
||||||
120,
|
120,
|
||||||
300
|
300
|
||||||
|
],
|
||||||
|
"entry_diary": [
|
||||||
|
180,
|
||||||
|
300
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"props": [
|
||||||
|
{
|
||||||
|
"type": "diary",
|
||||||
|
"pos": [
|
||||||
|
180,
|
||||||
|
310
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"npcs": [
|
"npcs": [
|
||||||
{
|
{
|
||||||
"type": "vendor",
|
"type": "vendor",
|
||||||
@@ -65,6 +78,14 @@
|
|||||||
1020,
|
1020,
|
||||||
306
|
306
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "combat_master",
|
||||||
|
"pos": [
|
||||||
|
400,
|
||||||
|
306
|
||||||
|
],
|
||||||
|
"trade_cost": 0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
+875
-104
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user