Initial commit: Echoes of the Ashes - Telegram RPG Bot

This commit is contained in:
Joan
2025-10-18 19:21:19 +02:00
commit 3ab412bc09
65 changed files with 14484 additions and 0 deletions

144
gamedata/interactables.json Normal file
View File

@@ -0,0 +1,144 @@
{
"interactables": {
"rubble": {
"id": "rubble",
"name": "Pile of Rubble",
"description": "A scattered pile of debris and broken concrete.",
"image_path": "images/interactables/rubble.png",
"actions": {
"search": {
"id": "search",
"label": "\ud83d\udd0e Search Rubble",
"stamina_cost": 2
}
}
},
"dumpster": {
"id": "dumpster",
"name": "\ud83d\uddd1\ufe0f Dumpster",
"description": "A rusted metal dumpster, possibly containing scavenged goods.",
"image_path": "images/interactables/dumpster.png",
"actions": {
"search_dumpster": {
"id": "search_dumpster",
"label": "\ud83d\udd0e Dig Through Trash",
"stamina_cost": 2
}
}
},
"sedan": {
"id": "sedan",
"name": "\ud83d\ude97 Rusty Sedan",
"description": "An abandoned sedan with rusted doors.",
"image_path": "images/interactables/sedan.png",
"actions": {
"search_glovebox": {
"id": "search_glovebox",
"label": "\ud83d\udd0e Search Glovebox",
"stamina_cost": 1
},
"pop_trunk": {
"id": "pop_trunk",
"label": "\ud83d\udd27 Pop the Trunk",
"stamina_cost": 3
}
}
},
"house": {
"id": "house",
"name": "\ud83c\udfda\ufe0f Abandoned House",
"description": "A dilapidated house with boarded windows.",
"image_path": "images/interactables/house.png",
"actions": {
"search_house": {
"id": "search_house",
"label": "\ud83d\udd0e Search House",
"stamina_cost": 3
}
}
},
"toolshed": {
"id": "toolshed",
"name": "\ud83d\udd28 Tool Shed",
"description": "A small wooden shed, door slightly ajar.",
"image_path": "images/interactables/toolshed.png",
"actions": {
"search_shed": {
"id": "search_shed",
"label": "\ud83d\udd0e Search Shed",
"stamina_cost": 2
}
}
},
"medkit": {
"id": "medkit",
"name": "\ud83c\udfe5 Medical Supply Cabinet",
"description": "A white metal cabinet with a red cross symbol.",
"image_path": "images/interactables/medkit.png",
"actions": {
"search_medkit": {
"id": "search_medkit",
"label": "\ud83d\udd0e Search Cabinet",
"stamina_cost": 2
}
}
},
"vending": {
"id": "vending",
"name": "\ud83e\uddc3 Vending Machine",
"description": "A broken vending machine, glass shattered.",
"image_path": "images/interactables/vending.png",
"actions": {
"break_vending": {
"id": "break_vending",
"label": "\ud83d\udd28 Break Open",
"stamina_cost": 4
}
}
},
"medical_cabinet": {
"id": "medical_cabinet",
"name": "Medical Cabinet",
"description": "A white metal cabinet with a red cross symbol.",
"image_path": "images/interactables/medkit.png",
"actions": {
"search": {
"id": "search",
"label": "\ud83d\udd0e Search Cabinet",
"stamina_cost": 1
}
}
},
"storage_box": {
"id": "storage_box",
"name": "Storage Box",
"description": "A weathered storage container.",
"image_path": "images/interactables/storage_box.png",
"actions": {
"search": {
"id": "search",
"label": "\ud83d\udd0e Search Box",
"stamina_cost": 2
}
}
},
"vending_machine": {
"id": "vending_machine",
"name": "Vending Machine",
"description": "A broken vending machine, glass shattered.",
"image_path": "images/interactables/vending.png",
"actions": {
"break": {
"id": "break",
"label": "\ud83d\udd28 Break Open",
"stamina_cost": 5
},
"search": {
"id": "search",
"label": "\ud83d\udd0e Search Machine",
"stamina_cost": 2
}
}
}
}
}

275
gamedata/items.json Normal file
View File

@@ -0,0 +1,275 @@
{
"items": {
"scrap_metal": {
"name": "Scrap Metal",
"type": "resource",
"weight": 0.5,
"volume": 0.2,
"emoji": "\u2699\ufe0f"
},
"rusty_nails": {
"name": "Rusty Nails",
"weight": 0.2,
"volume": 0.1,
"type": "resource",
"emoji": "\ud83d\udccc"
},
"wood_planks": {
"name": "Wood Planks",
"weight": 3.0,
"volume": 2.0,
"type": "resource",
"emoji": "\ud83e\udeb5"
},
"cloth_scraps": {
"name": "Cloth Scraps",
"weight": 0.1,
"volume": 0.2,
"type": "resource",
"emoji": "\ud83e\uddf5"
},
"cloth": {
"name": "Cloth",
"weight": 0.1,
"volume": 0.2,
"type": "resource",
"emoji": "\ud83e\uddf5"
},
"plastic_bottles": {
"name": "Plastic Bottles",
"weight": 0.05,
"volume": 0.3,
"type": "resource",
"emoji": "\ud83c\udf76"
},
"bone": {
"name": "Bone",
"weight": 0.3,
"volume": 0.1,
"type": "resource",
"emoji": "\ud83e\uddb4"
},
"raw_meat": {
"name": "Raw Meat",
"weight": 0.5,
"volume": 0.2,
"type": "resource",
"emoji": "\ud83e\udd69"
},
"animal_hide": {
"name": "Animal Hide",
"weight": 0.4,
"volume": 0.3,
"type": "resource",
"emoji": "\ud83e\udde4"
},
"mutant_tissue": {
"name": "Mutant Tissue",
"weight": 0.2,
"volume": 0.1,
"type": "resource",
"emoji": "\ud83e\uddec"
},
"infected_tissue": {
"name": "Infected Tissue",
"weight": 0.2,
"volume": 0.1,
"type": "resource",
"emoji": "\u2623\ufe0f"
},
"stale_chocolate_bar": {
"name": "Stale Chocolate Bar",
"weight": 0.1,
"volume": 0.1,
"type": "consumable",
"hp_restore": 10,
"emoji": "\ud83c\udf6b"
},
"canned_beans": {
"name": "Canned Beans",
"weight": 0.4,
"volume": 0.2,
"type": "consumable",
"hp_restore": 20,
"stamina_restore": 5,
"emoji": "\ud83e\udd6b"
},
"canned_food": {
"name": "Canned Food",
"weight": 0.4,
"volume": 0.2,
"type": "consumable",
"hp_restore": 25,
"stamina_restore": 5,
"emoji": "\ud83e\udd6b"
},
"bottled_water": {
"name": "Bottled Water",
"weight": 0.5,
"volume": 0.3,
"type": "consumable",
"stamina_restore": 10,
"emoji": "\ud83d\udca7"
},
"water_bottle": {
"name": "Water Bottle",
"weight": 0.5,
"volume": 0.3,
"type": "consumable",
"stamina_restore": 10,
"emoji": "\ud83d\udca7"
},
"energy_bar": {
"name": "Energy Bar",
"weight": 0.1,
"volume": 0.1,
"type": "consumable",
"stamina_restore": 15,
"emoji": "\ud83c\udf6b"
},
"mystery_pills": {
"name": "Mystery Pills",
"weight": 0.05,
"volume": 0.05,
"type": "consumable",
"hp_restore": 30,
"emoji": "\ud83d\udc8a"
},
"first_aid_kit": {
"name": "First Aid Kit",
"description": "A professional medical kit with bandages, antiseptic, and pain relievers.",
"weight": 0.8,
"volume": 0.5,
"type": "consumable",
"hp_restore": 50,
"emoji": "\ud83e\ude79"
},
"bandage": {
"name": "Bandage",
"description": "Clean cloth bandages for treating minor wounds.",
"weight": 0.1,
"volume": 0.1,
"type": "consumable",
"hp_restore": 15,
"emoji": "\ud83e\ude79"
},
"medical_supplies": {
"name": "Medical Supplies",
"description": "Assorted medical supplies scavenged from a clinic.",
"weight": 0.6,
"volume": 0.4,
"type": "consumable",
"hp_restore": 40,
"emoji": "\u2695\ufe0f"
},
"antibiotics": {
"name": "Antibiotics",
"description": "Pills that fight infections. Expired, but better than nothing.",
"weight": 0.1,
"volume": 0.1,
"type": "consumable",
"hp_restore": 20,
"emoji": "\ud83d\udc8a"
},
"tire_iron": {
"name": "Tire Iron",
"description": "A heavy metal tool. Makes a decent improvised weapon.",
"weight": 2.0,
"volume": 1.0,
"type": "weapon",
"slot": "hand",
"damage_min": 3,
"damage_max": 7,
"emoji": "\ud83d\udd27"
},
"baseball_bat": {
"name": "Baseball Bat",
"description": "Wooden bat with dents and bloodstains. Someone used this before you.",
"weight": 1.0,
"volume": 1.5,
"type": "weapon",
"slot": "hand",
"damage_min": 2,
"damage_max": 6,
"emoji": "\u26be"
},
"rusty_knife": {
"name": "Rusty Knife",
"description": "A dull, rusted blade. Better than your fists.",
"weight": 0.3,
"volume": 0.2,
"type": "weapon",
"slot": "hand",
"damage_min": 2,
"damage_max": 5,
"emoji": "\ud83d\udd2a"
},
"knife": {
"name": "Knife",
"description": "A sharp survival knife in decent condition.",
"weight": 0.3,
"volume": 0.2,
"type": "weapon",
"slot": "hand",
"damage_min": 3,
"damage_max": 6,
"emoji": "\ud83d\udd2a"
},
"rusty_pipe": {
"name": "Rusty Pipe",
"description": "Heavy metal pipe. Crude but effective.",
"weight": 1.5,
"volume": 0.8,
"type": "weapon",
"slot": "hand",
"damage_min": 4,
"damage_max": 8,
"emoji": "\ud83d\udd29"
},
"tattered_rucksack": {
"name": "Tattered Rucksack",
"description": "An old backpack with torn straps. Still functional.",
"weight": 1.0,
"volume": 0,
"type": "equipment",
"slot": "back",
"capacity_weight": 10,
"capacity_volume": 10,
"emoji": "\ud83c\udf92"
},
"hiking_backpack": {
"name": "Hiking Backpack",
"description": "A quality backpack with multiple compartments.",
"weight": 1.5,
"volume": 0,
"type": "equipment",
"slot": "back",
"capacity_weight": 20,
"capacity_volume": 20,
"emoji": "\ud83c\udf92"
},
"flashlight": {
"name": "Flashlight",
"description": "A battery-powered flashlight. Batteries low but working.",
"weight": 0.3,
"volume": 0.2,
"type": "equipment",
"slot": "tool",
"emoji": "\ud83d\udd26"
},
"old_photograph": {
"name": "Old Photograph",
"weight": 0.01,
"volume": 0.01,
"type": "quest",
"emoji": "\ud83d\udcf7"
},
"key_ring": {
"name": "Key Ring",
"weight": 0.1,
"volume": 0.05,
"type": "quest",
"emoji": "\ud83d\udd11"
}
}
}

1438
gamedata/locations.json Normal file

File diff suppressed because it is too large Load Diff

465
gamedata/npcs.json Normal file
View File

@@ -0,0 +1,465 @@
{
"npcs": {
"feral_dog": {
"npc_id": "feral_dog",
"name": "Feral Dog",
"description": "A wild, mangy dog with desperate hunger in its eyes. Its ribs are visible beneath matted fur.",
"emoji": "🐕",
"hp_min": 15,
"hp_max": 25,
"damage_min": 3,
"damage_max": 7,
"defense": 0,
"xp_reward": 10,
"loot_table": [
{
"item_id": "raw_meat",
"quantity_min": 1,
"quantity_max": 2,
"drop_chance": 0.6
},
{
"item_id": "animal_hide",
"quantity_min": 1,
"quantity_max": 1,
"drop_chance": 0.3
}
],
"corpse_loot": [
{
"item_id": "raw_meat",
"quantity_min": 1,
"quantity_max": 3,
"required_tool": null
},
{
"item_id": "animal_hide",
"quantity_min": 1,
"quantity_max": 1,
"required_tool": "knife"
}
],
"flee_chance": 0.3,
"status_inflict_chance": 0.15,
"image_url": "images/npcs/feral_dog.png",
"death_message": "The feral dog whimpers and collapses. Perhaps it was just hungry..."
},
"raider_scout": {
"npc_id": "raider_scout",
"name": "Raider Scout",
"description": "A lone raider wearing makeshift armor. They eye you with hostile intent.",
"emoji": "🏴‍☠️",
"hp_min": 30,
"hp_max": 45,
"damage_min": 5,
"damage_max": 12,
"defense": 2,
"xp_reward": 25,
"loot_table": [
{
"item_id": "water_bottle",
"quantity_min": 1,
"quantity_max": 1,
"drop_chance": 0.4
},
{
"item_id": "canned_food",
"quantity_min": 1,
"quantity_max": 2,
"drop_chance": 0.5
},
{
"item_id": "bandage",
"quantity_min": 1,
"quantity_max": 3,
"drop_chance": 0.6
},
{
"item_id": "rusty_pipe",
"quantity_min": 1,
"quantity_max": 1,
"drop_chance": 0.3
}
],
"corpse_loot": [
{
"item_id": "scrap_metal",
"quantity_min": 2,
"quantity_max": 4,
"required_tool": null
},
{
"item_id": "cloth",
"quantity_min": 1,
"quantity_max": 2,
"required_tool": "knife"
}
],
"flee_chance": 0.2,
"status_inflict_chance": 0.1,
"image_url": "images/npcs/raider_scout.png",
"death_message": "The raider scout falls with a final gasp. Their supplies are yours."
},
"mutant_rat": {
"npc_id": "mutant_rat",
"name": "Mutant Rat",
"description": "A grotesquely large rat, its fur patchy and eyes glowing with unnatural light.",
"emoji": "🐀",
"hp_min": 10,
"hp_max": 18,
"damage_min": 2,
"damage_max": 5,
"defense": 0,
"xp_reward": 8,
"loot_table": [
{
"item_id": "raw_meat",
"quantity_min": 1,
"quantity_max": 1,
"drop_chance": 0.4
}
],
"corpse_loot": [
{
"item_id": "raw_meat",
"quantity_min": 1,
"quantity_max": 2,
"required_tool": null
},
{
"item_id": "mutant_tissue",
"quantity_min": 1,
"quantity_max": 1,
"required_tool": "knife"
}
],
"flee_chance": 0.5,
"status_inflict_chance": 0.25,
"image_url": "images/npcs/mutant_rat.png",
"death_message": "The mutant rat squeals its last and goes still."
},
"infected_human": {
"npc_id": "infected_human",
"name": "Infected Human",
"description": "Once human, now something else. Their movements are jerky and their skin shows signs of advanced infection.",
"emoji": "🧟",
"hp_min": 35,
"hp_max": 50,
"damage_min": 6,
"damage_max": 10,
"defense": 1,
"xp_reward": 30,
"loot_table": [
{
"item_id": "medical_supplies",
"quantity_min": 1,
"quantity_max": 1,
"drop_chance": 0.2
},
{
"item_id": "antibiotics",
"quantity_min": 1,
"quantity_max": 1,
"drop_chance": 0.15
}
],
"corpse_loot": [
{
"item_id": "infected_tissue",
"quantity_min": 1,
"quantity_max": 2,
"required_tool": "knife"
},
{
"item_id": "bone",
"quantity_min": 1,
"quantity_max": 3,
"required_tool": "knife"
}
],
"flee_chance": 0.1,
"status_inflict_chance": 0.3,
"image_url": "images/npcs/infected_human.png",
"death_message": "The infected human finally finds peace in death."
},
"scavenger": {
"npc_id": "scavenger",
"name": "Hostile Scavenger",
"description": "Another survivor, but this one sees you as competition. They won't share territory.",
"emoji": "💀",
"hp_min": 25,
"hp_max": 40,
"damage_min": 4,
"damage_max": 9,
"defense": 3,
"xp_reward": 20,
"loot_table": [
{
"item_id": "water_bottle",
"quantity_min": 1,
"quantity_max": 2,
"drop_chance": 0.5
},
{
"item_id": "canned_food",
"quantity_min": 1,
"quantity_max": 2,
"drop_chance": 0.5
},
{
"item_id": "bandage",
"quantity_min": 1,
"quantity_max": 2,
"drop_chance": 0.4
},
{
"item_id": "knife",
"quantity_min": 1,
"quantity_max": 1,
"drop_chance": 0.2
},
{
"item_id": "flashlight",
"quantity_min": 1,
"quantity_max": 1,
"drop_chance": 0.3
}
],
"corpse_loot": [
{
"item_id": "cloth",
"quantity_min": 1,
"quantity_max": 3,
"required_tool": null
},
{
"item_id": "scrap_metal",
"quantity_min": 1,
"quantity_max": 2,
"required_tool": null
}
],
"flee_chance": 0.25,
"status_inflict_chance": 0.05,
"image_url": "images/npcs/scavenger.png",
"death_message": "The scavenger's struggle ends. Survival has no mercy."
}
},
"danger_levels": {
"start_point": {
"danger_level": 0,
"encounter_rate": 0.0,
"wandering_chance": 0.0
},
"gas_station": {
"danger_level": 0,
"encounter_rate": 0.0,
"wandering_chance": 0.0
},
"residential": {
"danger_level": 1,
"encounter_rate": 0.10,
"wandering_chance": 0.20
},
"park": {
"danger_level": 1,
"encounter_rate": 0.10,
"wandering_chance": 0.20
},
"clinic": {
"danger_level": 2,
"encounter_rate": 0.20,
"wandering_chance": 0.35
},
"plaza": {
"danger_level": 2,
"encounter_rate": 0.15,
"wandering_chance": 0.30
},
"warehouse": {
"danger_level": 2,
"encounter_rate": 0.18,
"wandering_chance": 0.32
},
"warehouse_interior": {
"danger_level": 2,
"encounter_rate": 0.22,
"wandering_chance": 0.40
},
"overpass": {
"danger_level": 3,
"encounter_rate": 0.30,
"wandering_chance": 0.45
},
"office_building": {
"danger_level": 3,
"encounter_rate": 0.25,
"wandering_chance": 0.40
},
"office_interior": {
"danger_level": 3,
"encounter_rate": 0.35,
"wandering_chance": 0.50
},
"subway": {
"danger_level": 4,
"encounter_rate": 0.35,
"wandering_chance": 0.50
},
"subway_tunnels": {
"danger_level": 4,
"encounter_rate": 0.45,
"wandering_chance": 0.65
}
},
"spawn_tables": {
"start_point": [],
"gas_station": [],
"residential": [
{
"npc_id": "feral_dog",
"weight": 60
},
{
"npc_id": "mutant_rat",
"weight": 40
}
],
"park": [
{
"npc_id": "feral_dog",
"weight": 50
},
{
"npc_id": "mutant_rat",
"weight": 50
}
],
"clinic": [
{
"npc_id": "infected_human",
"weight": 40
},
{
"npc_id": "mutant_rat",
"weight": 30
},
{
"npc_id": "scavenger",
"weight": 30
}
],
"plaza": [
{
"npc_id": "raider_scout",
"weight": 40
},
{
"npc_id": "scavenger",
"weight": 35
},
{
"npc_id": "feral_dog",
"weight": 25
}
],
"warehouse": [
{
"npc_id": "raider_scout",
"weight": 45
},
{
"npc_id": "scavenger",
"weight": 35
},
{
"npc_id": "mutant_rat",
"weight": 20
}
],
"warehouse_interior": [
{
"npc_id": "raider_scout",
"weight": 50
},
{
"npc_id": "scavenger",
"weight": 30
},
{
"npc_id": "mutant_rat",
"weight": 20
}
],
"overpass": [
{
"npc_id": "raider_scout",
"weight": 50
},
{
"npc_id": "infected_human",
"weight": 30
},
{
"npc_id": "scavenger",
"weight": 20
}
],
"office_building": [
{
"npc_id": "raider_scout",
"weight": 45
},
{
"npc_id": "infected_human",
"weight": 35
},
{
"npc_id": "scavenger",
"weight": 20
}
],
"office_interior": [
{
"npc_id": "infected_human",
"weight": 50
},
{
"npc_id": "raider_scout",
"weight": 30
},
{
"npc_id": "scavenger",
"weight": 20
}
],
"subway": [
{
"npc_id": "infected_human",
"weight": 50
},
{
"npc_id": "raider_scout",
"weight": 30
},
{
"npc_id": "mutant_rat",
"weight": 20
}
],
"subway_tunnels": [
{
"npc_id": "infected_human",
"weight": 60
},
{
"npc_id": "raider_scout",
"weight": 25
},
{
"npc_id": "mutant_rat",
"weight": 15
}
]
}
}