From 0626c2981a3f47426be83733710b8c35c5ae7f1b Mon Sep 17 00:00:00 2001 From: David Seguin Date: Mon, 20 May 2024 01:09:59 +0000 Subject: [PATCH 01/23] Weekly Changelog 2024-05-13 to 2024-05-20 --- data/changelog.txt | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/data/changelog.txt b/data/changelog.txt index 1eee118716bf3..5c61cfcbf2c41 100644 --- a/data/changelog.txt +++ b/data/changelog.txt @@ -119,6 +119,8 @@ Unhardcode and limbify attack vectors Add new function follower_present for use in JSON Graphical construction preview Resume butchering +The player can swap between defined outfits with the 'set of clothes' item +Limbify consumption times ## Content: @@ -244,6 +246,13 @@ Add XL and XS versions for french maid clothes/aprons/hats Fridges and freezers. What do you mean 'we already have some'? New portal monsters: unviable life forms Challenge start - hunted forever. Starts with the nemesis, but it comes back stronger everytime it dies +Add More Nightmares +Adds a new globally unique special to spawn in the ocean : an Oil Platform ! +Added tarot cards as a variant of playing cards and added Ouija board as a playable board game. +Overhaul and flesh out Barry Isherwood's rescue mission +gas forge recipe learned from fabrication books +Adds the last remaining natural frog species native to New England. +Prepper Militia Community ## Interface: @@ -306,6 +315,10 @@ Show NEW! in List Items menu Adding spell name to the casting... widget Adding Classless as a supernatural category Mission UI migrated to imGUI +Provide a visual UI for changing vehicle part shapes +Don't show gun without default ammo defined as an option in reload ui +Rename cover ---> concealment +Updates the Terminus font @@ -460,6 +473,15 @@ Aftershock: New combat bionics Aftershock: Add a space station clothes store [MoM] Using psionics in or near the Nether is more powerful, but also more risky [No Hope] Adds a difficulty setting prompt to determine item spawn rates +[MoM] Rework Combat Sense with modern enchants +[MoM] Add triffid psions +[MoM] Feral telekinetics have no inherent armor, they use their powers instead +[MA] Starting a new game works again +[MoM] EoC-ify Eater drain attack +Aftershock: Add poison based bullets, grenades and 'toxic flamethrower' +Give Liam opinions in XE +[Magiclysm] Update Dark Sight to scale with spell level +[MoM] Switch Stutterstep effect to an enchant percentage ## Balance: @@ -529,6 +551,13 @@ Unattended crops that are ready to harvest will die if not harvested before thei Make Quadcopter Drones Produce Sound Make most plastic and glass containers transparent Added limb blocking to bionic styles +Tweak Wind Turbine Recipe Learning +Land prisons also keep you out +The average skill level of NPCs will rise over time +Fix Up Travel Toilets +Add Craft, Uncraft, Furniture version, and Construction to Fancy Tables +Finished Auditing vehicle parts json for breaks_into +Adjust Pile of Leaves Deconstruct/Smash ## Bugfixes: @@ -692,6 +721,23 @@ Maybe prevent rare crater generation error AIM: Now moving all items will not move favourite items, if other items are present. Misc repair kit draws ammo from around player and inventory, opposed to an internal ammunition pocket. Fixed issue where Android gesture inputs were not recognized by ImGui windows +Fix heat func fault, correct the null check, remove the original heat_food duplicate bug. +xs_gloves_wool_fingerless and xl_gloves_wool_fingerless did not have relevant PREFIX flags. +Fix health dreams when you are ill +Fixed arrows disappearing when unwielded +fix assert in diary info panel clamp +fix draw_critter_above bounds check +Check validity of Win32 file names +Duct tape described as liquid +Gives an explanation for why the TALON UGV Liberty Edition turns into the regular TALON UGV M16A4. +Added the Ouija board to appropriate loot pools. +Fix crash from reachability zones checking dead NPCs and mark reachability zones for hallucinations +The old wool staple recipe resulted in mass and yarn duplication. We respect the law of conservation of energy here. +Fix for massive slowdown when NPC crafting speed drops below 0.0 +Fix a typo in consumption.cpp +Removes MP18, PLR 16, OA 93, M231, Mossberg Brownie +Pseudo terrain appearing in fields when using mods is fixed (won't affect existing fields) +Add foraging activity to outpost faction camp ## Performance: @@ -719,6 +765,7 @@ Skip MGOAL_Find_Item if the player is busy. Avoid wasteful loop in map special road connections Decrease memory overhead by about 200MB or about 15% by slimming down mapgen data structure. Faster ascii overmap drawing +Optimize item::stacks as well as allocation patterns in item and elsewhere ## Infrastructure: @@ -775,6 +822,7 @@ Deleted the ImGui enable/disable toggle, turns on ImGui globally in CDDA Use test enumerating item spawns to make assertions about the rate of appearance of different items. Add perceived kwarg to pain_eval math function, apply it in Mind Over Matter refactored ImTuis drawing code to fix a black screen issue, and to improve performance +Adjust how `open_container` affects `Character::dispose_item` ## Build: @@ -793,6 +841,7 @@ CMake: Add LLVM build for Windows and other linker fixes Use one precompiled header Fix zlib old-style-cast build breakage Fix crash with imgui and CMake +Update Flatpak manifest to use clang and include the default soundpack ## I18N and A11Y: From fcaa497f09db7859cb1110a9dcc66b73209bc988 Mon Sep 17 00:00:00 2001 From: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Date: Sun, 19 May 2024 21:13:12 -0500 Subject: [PATCH 02/23] Apply suggestions from code review --- data/changelog.txt | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/data/changelog.txt b/data/changelog.txt index 5c61cfcbf2c41..4b82db965100e 100644 --- a/data/changelog.txt +++ b/data/changelog.txt @@ -246,11 +246,9 @@ Add XL and XS versions for french maid clothes/aprons/hats Fridges and freezers. What do you mean 'we already have some'? New portal monsters: unviable life forms Challenge start - hunted forever. Starts with the nemesis, but it comes back stronger everytime it dies -Add More Nightmares Adds a new globally unique special to spawn in the ocean : an Oil Platform ! Added tarot cards as a variant of playing cards and added Ouija board as a playable board game. Overhaul and flesh out Barry Isherwood's rescue mission -gas forge recipe learned from fabrication books Adds the last remaining natural frog species native to New England. Prepper Militia Community @@ -318,7 +316,6 @@ Mission UI migrated to imGUI Provide a visual UI for changing vehicle part shapes Don't show gun without default ammo defined as an option in reload ui Rename cover ---> concealment -Updates the Terminus font @@ -473,15 +470,9 @@ Aftershock: New combat bionics Aftershock: Add a space station clothes store [MoM] Using psionics in or near the Nether is more powerful, but also more risky [No Hope] Adds a difficulty setting prompt to determine item spawn rates -[MoM] Rework Combat Sense with modern enchants [MoM] Add triffid psions -[MoM] Feral telekinetics have no inherent armor, they use their powers instead -[MA] Starting a new game works again -[MoM] EoC-ify Eater drain attack Aftershock: Add poison based bullets, grenades and 'toxic flamethrower' Give Liam opinions in XE -[Magiclysm] Update Dark Sight to scale with spell level -[MoM] Switch Stutterstep effect to an enchant percentage ## Balance: @@ -551,13 +542,7 @@ Unattended crops that are ready to harvest will die if not harvested before thei Make Quadcopter Drones Produce Sound Make most plastic and glass containers transparent Added limb blocking to bionic styles -Tweak Wind Turbine Recipe Learning -Land prisons also keep you out The average skill level of NPCs will rise over time -Fix Up Travel Toilets -Add Craft, Uncraft, Furniture version, and Construction to Fancy Tables -Finished Auditing vehicle parts json for breaks_into -Adjust Pile of Leaves Deconstruct/Smash ## Bugfixes: @@ -721,23 +706,11 @@ Maybe prevent rare crater generation error AIM: Now moving all items will not move favourite items, if other items are present. Misc repair kit draws ammo from around player and inventory, opposed to an internal ammunition pocket. Fixed issue where Android gesture inputs were not recognized by ImGui windows -Fix heat func fault, correct the null check, remove the original heat_food duplicate bug. -xs_gloves_wool_fingerless and xl_gloves_wool_fingerless did not have relevant PREFIX flags. -Fix health dreams when you are ill Fixed arrows disappearing when unwielded -fix assert in diary info panel clamp -fix draw_critter_above bounds check -Check validity of Win32 file names -Duct tape described as liquid -Gives an explanation for why the TALON UGV Liberty Edition turns into the regular TALON UGV M16A4. -Added the Ouija board to appropriate loot pools. -Fix crash from reachability zones checking dead NPCs and mark reachability zones for hallucinations The old wool staple recipe resulted in mass and yarn duplication. We respect the law of conservation of energy here. Fix for massive slowdown when NPC crafting speed drops below 0.0 -Fix a typo in consumption.cpp Removes MP18, PLR 16, OA 93, M231, Mossberg Brownie Pseudo terrain appearing in fields when using mods is fixed (won't affect existing fields) -Add foraging activity to outpost faction camp ## Performance: From 262e0858f75d2727baa23757c15d2ac9ca9cf019 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Wed, 22 May 2024 11:23:51 +0200 Subject: [PATCH 03/23] Explicit roof on storehouse 1 --- .../modular_storehouse_construction.json | 450 +++++++++++++++++- .../modular_storehouse_palettes.json | 40 +- 2 files changed, 471 insertions(+), 19 deletions(-) diff --git a/data/json/mapgen/basecamps/expansion/modular_storehouse/version_1/modular_storehouse_construction.json b/data/json/mapgen/basecamps/expansion/modular_storehouse/version_1/modular_storehouse_construction.json index ede85ac46f01c..9d5c923f05c6e 100644 --- a/data/json/mapgen/basecamps/expansion/modular_storehouse/version_1/modular_storehouse_construction.json +++ b/data/json/mapgen/basecamps/expansion/modular_storehouse/version_1/modular_storehouse_construction.json @@ -35,11 +35,51 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room0_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + " rrrr", + " rrrr", + " rrrr", + " rrrr", + " rrrr", + " rrrr" + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room0_construction_east", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbms_room0_construction" ], "x": 15, "y": 9 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbms_room0_construction" ], "x": 15, "y": 9, "z": 0 }, + { "chunks": [ "fbms_room0_roof_construction" ], "x": 15, "y": 9, "z": 1 } + ] + } }, { "type": "mapgen", @@ -77,11 +117,51 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room1_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + "rrrr ", + "rrrr ", + "rrrr ", + "rrrr ", + "rrrr ", + "rrrr " + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room1_construction_west", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbms_room1_construction" ], "x": 3, "y": 9 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbms_room1_construction" ], "x": 3, "y": 9, "z": 0 }, + { "chunks": [ "fbms_room1_roof_construction" ], "x": 3, "y": 9, "z": 1 } + ] + } }, { "type": "mapgen", @@ -119,11 +199,51 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room2_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + " ", + " ", + " ", + " rrr", + " rrr", + " rrr" + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room2_construction_northwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbms_room2_construction" ], "x": 3, "y": 3 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbms_room2_construction" ], "x": 3, "y": 3, "z": 0 }, + { "chunks": [ "fbms_room2_roof_construction" ], "x": 3, "y": 3, "z": 1 } + ] + } }, { "type": "mapgen", @@ -161,11 +281,51 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room3_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + " rrr", + " rrr", + " rrr", + " ", + " ", + " " + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room3_construction_southwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbms_room3_construction" ], "x": 3, "y": 15 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbms_room3_construction" ], "x": 3, "y": 15, "z": 0 }, + { "chunks": [ "fbms_room3_roof_construction" ], "x": 3, "y": 15, "z": 1 } + ] + } }, { "type": "mapgen", @@ -203,11 +363,51 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room4_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + " ", + " ", + " ", + "rrr ", + "rrr ", + "rrr " + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room4_construction_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbms_room4_construction" ], "x": 15, "y": 3 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbms_room4_construction" ], "x": 15, "y": 3, "z": 0 }, + { "chunks": [ "fbms_room4_roof_construction" ], "x": 15, "y": 3, "z": 1 } + ] + } }, { "type": "mapgen", @@ -245,11 +445,51 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room5_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + "rrr ", + "rrr ", + "rrr ", + " ", + " ", + " " + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room5_construction_southeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbms_room5_construction" ], "x": 15, "y": 15 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbms_room5_construction" ], "x": 15, "y": 15, "z": 0 }, + { "chunks": [ "fbms_room5_roof_construction" ], "x": 15, "y": 15, "z": 1 } + ] + } }, { "type": "mapgen", @@ -287,11 +527,51 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room6_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + "rrrrrr", + "rrrrrr", + "rrrrrr", + " rrrr ", + " rrrr ", + "rrrrrr" + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room6_construction_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbms_room6_construction" ], "x": 9, "y": 15 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbms_room6_construction" ], "x": 9, "y": 15, "z": 0 }, + { "chunks": [ "fbms_room6_roof_construction" ], "x": 9, "y": 15, "z": 1 } + ] + } }, { "type": "mapgen", @@ -329,11 +609,51 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room7_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + "rrrrrr", + " rrrr ", + " rrrr ", + "rrrrrr", + "rrrrrr", + "rrrrrr" + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room7_construction_north", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbms_room7_construction" ], "x": 9, "y": 3 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbms_room7_construction" ], "x": 9, "y": 3, "z": 0 }, + { "chunks": [ "fbms_room7_roof_construction" ], "x": 9, "y": 3, "z": 1 } + ] + } }, { "type": "mapgen", @@ -371,6 +691,41 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room8_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + "rrrrrr", + "rrrrrr", + "rrrrrr", + "rrrrrr", + "rrrrrr", + "rrrrrr" + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "method": "json", @@ -407,6 +762,41 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room9_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + " rr", + " rr", + " rr", + " rr", + " rr", + " rr" + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "method": "json", @@ -443,15 +833,53 @@ "palettes": [ { "param": "fbms_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbms_room10_roof_construction", + "object": { + "parameters": { + "fbms_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbms_concrete_palette", + "fbms_log_palette", + "fbms_metal_palette", + "fbms_migo_resin_palette", + "fbms_rammed_earth_palette", + "fbms_rock_palette", + "fbms_wad_palette", + "fbms_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + "rr ", + "rr ", + "rr ", + "rr ", + "rr ", + "rr " + ], + "palettes": [ { "param": "fbms_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbms_room8_construction_center", "method": "json", "object": { "place_nested": [ - { "chunks": [ "fbms_room9_construction" ], "x": 3, "y": 9 }, - { "chunks": [ "fbms_room10_construction" ], "x": 15, "y": 9 }, - { "chunks": [ "fbms_room8_construction" ], "x": 9, "y": 9 } + { "chunks": [ "fbms_room8_construction" ], "x": 9, "y": 9, "z": 0 }, + { "chunks": [ "fbms_room8_roof_construction" ], "x": 9, "y": 9, "z": 1 }, + { "chunks": [ "fbms_room9_construction" ], "x": 3, "y": 9, "z": 0 }, + { "chunks": [ "fbms_room9_roof_construction" ], "x": 3, "y": 9, "z": 1 }, + { "chunks": [ "fbms_room10_construction" ], "x": 15, "y": 9, "z": 0 }, + { "chunks": [ "fbms_room10_roof_construction" ], "x": 15, "y": 9, "z": 1 } ] } } diff --git a/data/json/mapgen/basecamps/expansion/modular_storehouse/version_1/modular_storehouse_palettes.json b/data/json/mapgen/basecamps/expansion/modular_storehouse/version_1/modular_storehouse_palettes.json index 9db486df66b91..b99b872dc47c0 100644 --- a/data/json/mapgen/basecamps/expansion/modular_storehouse/version_1/modular_storehouse_palettes.json +++ b/data/json/mapgen/basecamps/expansion/modular_storehouse/version_1/modular_storehouse_palettes.json @@ -8,49 +8,73 @@ { "type": "palette", "id": "fbms_concrete_palette", - "terrain": { ".": "t_thconc_floor", "d": "t_door_metal_c", "o": "t_window_no_curtains", "w": "t_sconc_wall" }, + "terrain": { + ".": "t_thconc_floor", + "d": "t_door_metal_c", + "o": "t_window_no_curtains", + "r": "t_concrete_roof", + "w": "t_sconc_wall" + }, "furniture": { ".": "f_clear", "d": "f_clear", "o": "f_clear", "w": "f_clear" } }, { "type": "palette", "id": "fbms_log_palette", - "terrain": { ".": "t_floor", "d": "t_door_c", "o": "t_window_no_curtains", "w": "t_wall_log" }, + "terrain": { ".": "t_floor", "d": "t_door_c", "o": "t_window_no_curtains", "r": "t_wood_treated_roof", "w": "t_wall_log" }, "furniture": { ".": "f_clear", "d": "f_clear", "o": "f_clear", "w": "f_clear" } }, { "type": "palette", "id": "fbms_metal_palette", - "terrain": { ".": "t_scrap_floor", "d": "t_door_metal_c", "o": "t_window_no_curtains", "w": "t_scrap_wall" }, + "terrain": { + ".": "t_scrap_floor", + "d": "t_door_metal_c", + "o": "t_window_no_curtains", + "r": "t_metal_flat_roof", + "w": "t_scrap_wall" + }, "furniture": { ".": "f_clear", "d": "f_clear", "o": "f_clear", "w": "f_clear" } }, { "type": "palette", "id": "fbms_migo_resin_palette", - "terrain": { ".": "t_floor_resin", "d": "t_resin_hole_c", "o": "t_wall_resin_cage", "w": "t_wall_resin" }, + "terrain": { ".": "t_floor_resin", "d": "t_resin_hole_c", "o": "t_wall_resin_cage", "r": "t_resin_roof", "w": "t_wall_resin" }, "furniture": { ".": "f_clear", "d": "f_clear", "o": "f_clear", "w": "f_clear" } }, { "type": "palette", "id": "fbms_rammed_earth_palette", - "terrain": { ".": "t_floor_primitive", "d": "t_door_makeshift_c", "o": "t_window_empty", "w": "t_wall_rammed_earth" }, + "terrain": { + ".": "t_floor_primitive", + "d": "t_door_makeshift_c", + "o": "t_window_empty", + "r": "t_log_sod_roof", + "w": "t_wall_rammed_earth" + }, "furniture": { ".": "f_clear", "d": "f_clear", "o": "f_clear", "w": "f_clear" } }, { "type": "palette", "id": "fbms_rock_palette", - "terrain": { ".": "t_floor", "d": "t_door_c", "o": "t_window_no_curtains", "w": "t_rock_wall" }, + "terrain": { ".": "t_floor", "d": "t_door_c", "o": "t_window_no_curtains", "r": "t_wood_treated_roof", "w": "t_rock_wall" }, "furniture": { ".": "f_clear", "d": "f_clear", "o": "f_clear", "w": "f_clear" } }, { "type": "palette", "id": "fbms_wad_palette", - "terrain": { ".": "t_floor_primitive", "d": "t_door_makeshift_c", "o": "t_wall_wattle_half", "w": "t_wall_wattle" }, + "terrain": { + ".": "t_floor_primitive", + "d": "t_door_makeshift_c", + "o": "t_wall_wattle_half", + "r": "t_log_sod_roof", + "w": "t_wall_wattle" + }, "furniture": { ".": "f_clear", "d": "f_clear", "o": "f_clear", "w": "f_clear" } }, { "type": "palette", "id": "fbms_wood_palette", - "terrain": { ".": "t_floor", "d": "t_door_c", "o": "t_window_no_curtains", "w": "t_wall_wood" }, + "terrain": { ".": "t_floor", "d": "t_door_c", "o": "t_window_no_curtains", "r": "t_wood_treated_roof", "w": "t_wall_wood" }, "furniture": { ".": "f_clear", "d": "f_clear", "o": "f_clear", "w": "f_clear" } } ] From 6e7cfae02707fea3d1415af6021818182bebb59d Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Wed, 22 May 2024 15:42:49 -0400 Subject: [PATCH 04/23] Spellbook doesn't try to load invalid spells (#74008) --- src/magic.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/magic.cpp b/src/magic.cpp index 694d0409e57c5..788ad2f60b99b 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -1953,6 +1953,10 @@ void known_magic::deserialize( const JsonObject &data ) std::string id = jo.get_string( "id" ); spell_id sp = spell_id( id ); int xp = jo.get_int( "xp" ); + if( !sp.is_valid() ) { + DebugLog( D_WARNING, D_MAIN ) << "Tried to load bad spell: " << sp.c_str(); + continue; + } if( knows_spell( sp ) ) { spellbook[sp].set_exp( xp ); } else { From a6114b19dc7d875b276ac2ec48e085c1d8359bed Mon Sep 17 00:00:00 2001 From: Karol1223 <68503002+Karol1223@users.noreply.github.com> Date: Wed, 22 May 2024 21:45:19 +0200 Subject: [PATCH 05/23] Minor string and item category changes (#74003) * hatred * chick --- data/json/items/fluff.json | 6 +++--- data/json/items/generic.json | 1 + data/json/monsters/bird.json | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/data/json/items/fluff.json b/data/json/items/fluff.json index 4b25aaaac6852..64e3bdc23f86d 100644 --- a/data/json/items/fluff.json +++ b/data/json/items/fluff.json @@ -1639,6 +1639,7 @@ "type": "GENERIC", "id": "sketch", "copy-from": "paper", + "category": "other", "name": { "str_sp": "sketch" }, "description": "A piece of graphite-based artwork someone has drawn on a spare sheet of paper.", "price": "0 cent", @@ -1680,6 +1681,7 @@ "type": "GENERIC", "id": "painting", "copy-from": "sheet_canvas", + "category": "other", "name": { "str_sp": "painting" }, "description": "A painting that someone has made.", "price": "100 USD", @@ -1719,7 +1721,6 @@ "color": "light_gray", "name": { "str": "stone sculpture" }, "description": "A medium-sized stone sculpture.", - "category": "spare_parts", "material": "stone", "weight": "7884 g", "volume": "20813 ml", @@ -1769,8 +1770,7 @@ "symbol": ";", "color": "brown", "name": { "str": "clay sculpture" }, - "description": "A medium-sized clay sculpture.", - "category": "spare_parts", + "description": "A small clay sculpture.", "material": "clay", "weight": "150 g", "volume": "94 ml", diff --git a/data/json/items/generic.json b/data/json/items/generic.json index f5183ba83ec0c..74895eebacd1a 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -3403,6 +3403,7 @@ "description": "A rather outdated light bulb used in all sorts of lighting equipment.", "symbol": ",", "color": "white", + "category": "spare_parts", "material": [ "glass" ], "weight": "10 g", "volume": "250 ml", diff --git a/data/json/monsters/bird.json b/data/json/monsters/bird.json index e468c01c4c1ff..c6f2fd0f61c86 100644 --- a/data/json/monsters/bird.json +++ b/data/json/monsters/bird.json @@ -112,7 +112,7 @@ "id": "mon_crow", "type": "MONSTER", "name": { "str": "American crow" }, - "description": "A small, elegant black bird, famous for its distinctive call. An intelligent bird, there is a glitter of mischief behind its eyes.", + "description": "A fairly large, elegant black bird, famous for its distinctive call. An intelligent bird, there is a glitter of mischief behind its eyes.", "copy-from": "mon_bird_flying_base", "color": "dark_gray", "stomach_size": 30, @@ -356,8 +356,8 @@ { "abstract": "mon_generic_chick_tiny", "type": "MONSTER", - "name": { "str": "brown chick" }, - "description": "A tiny darkly-colored chick, it could be from a number of different species.", + "name": { "str": "grey chick" }, + "description": "A tiny dull-colored chick, it could be from a number of different species.", "copy-from": "mon_generic_chick", "volume": "7 ml", "weight": "5 g", From 1c4d7c1aaa01d67c0f7e92aa2c95b65ec00361bc Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Wed, 22 May 2024 21:46:58 +0200 Subject: [PATCH 06/23] Added roof on airport ATC tower (#74000) --- .../mapgen/airport/s_airport_private.json | 35 +++++++++++++++++++ .../overmap/overmap_special/specials.json | 1 + .../overmap_terrain_transportation.json | 2 +- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/data/json/mapgen/airport/s_airport_private.json b/data/json/mapgen/airport/s_airport_private.json index abe9f991da14a..1d91467dd6049 100644 --- a/data/json/mapgen/airport/s_airport_private.json +++ b/data/json/mapgen/airport/s_airport_private.json @@ -291,5 +291,40 @@ "furniture": { "f": "f_console_broken", "e": "f_table", "E": "f_chair" }, "place_loot": [ { "group": "office_mess", "chance": 80, "repeat": [ 5 ], "x": [ 10, 13 ], "y": [ 2, 5 ] } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_atc_4" ], + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " -------- ", + " -......- ", + " -......- ", + " -..X...- ", + " -...:..- ", + " -..A...- ", + " -......- ", + " -------- ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } } ] diff --git a/data/json/overmap/overmap_special/specials.json b/data/json/overmap/overmap_special/specials.json index ce30f6485ec9f..667eb860b3be4 100644 --- a/data/json/overmap/overmap_special/specials.json +++ b/data/json/overmap/overmap_special/specials.json @@ -6788,6 +6788,7 @@ { "point": [ -1, 0, 0 ], "overmap": "s_air_atc_south" }, { "point": [ -1, 0, 1 ], "overmap": "s_air_atc_2_south" }, { "point": [ -1, 0, 2 ], "overmap": "s_air_atc_3_south" }, + { "point": [ -1, 0, 3 ], "overmap": "s_air_atc_4_south" }, { "point": [ -6, 1, 0 ], "overmap": "special_field" }, { "point": [ -5, 1, 0 ], "overmap": "s_air_runway_r_south" }, { "point": [ -4, 1, 0 ], "overmap": "s_air_runway_south" }, diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json b/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json index cf93d3124b06d..2fcd75c6b7f70 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json @@ -225,7 +225,7 @@ }, { "type": "overmap_terrain", - "id": [ "control_tower_0", "control_tower_1", "control_tower_2", "s_air_atc", "s_air_atc_2", "s_air_atc_3" ], + "id": [ "control_tower_0", "control_tower_1", "control_tower_2", "s_air_atc", "s_air_atc_2", "s_air_atc_3", "s_air_atc_4" ], "name": "control tower", "sym": "X", "color": "i_light_gray", From e854ba361777d2c088c6eea395887e01ffeadb00 Mon Sep 17 00:00:00 2001 From: Nick Owens Date: Wed, 22 May 2024 12:48:36 -0700 Subject: [PATCH 07/23] remove guns from behindcounter (#73997) rivtech guns should probably not appear in say, a pharmacy shelf. --- .../itemgroups/Locations_MapExtras/locations_commercial.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json index 91e2a33956b0f..d2412532795ef 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json +++ b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json @@ -15,8 +15,6 @@ { "item": "cigar_punch", "prob": 8 }, { "item": "sponge", "prob": 10 }, { "group": "ammo_pocket_batteries_full", "prob": 50 }, - { "item": "rm103a_pistol", "prob": 1 }, - { "item": "rm228", "prob": 2 }, { "item": "vibrator", "prob": 3, "charges": [ 0, 100 ] }, { "item": "condom", "prob": 5, "count": [ 1, 3 ] }, { "item": "mag_porn", "prob": 20 }, From 8bf5502f5585e2d7384785ce1accc71f80572ab7 Mon Sep 17 00:00:00 2001 From: NetSysFire <59517351+NetSysFire@users.noreply.github.com> Date: Wed, 22 May 2024 21:49:05 +0200 Subject: [PATCH 08/23] add some more resources in the new issue dialogue, remove discussions (#73996) --- .github/ISSUE_TEMPLATE/config.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 8a76593c2334a..e1fa8b0328038 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,11 +1,14 @@ blank_issues_enabled: false contact_links: + - name: Found typos? + url: https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files#editing-files-in-another-users-repository + about: They are trivial to fix, even for absolute beginners. Fixing them yourself is faster than reporting them. And you get credit for fixing them, too! + - name: Translations + url: https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/TRANSLATING.md + about: Typos or other non-technical errors in translations? Go here. - name: Tileset Issues url: https://github.com/I-am-Erk/CDDA-Tilesets/issues about: For issues concerning the built-in tilesets. - - name: Github Discussion - url: https://github.com/CleverRaven/Cataclysm-DDA/discussions - about: For nonspecific feature requests, balance concerns, and questions about the game, prefer opening a discussion to an issue. - name: Project Forums url: https://discourse.cataclysmdda.org/ about: For even more general discussion with the community, consider posting on the forums. From 5661f1c49a9de3caad60d9824170e8fa2f62b6fe Mon Sep 17 00:00:00 2001 From: inogenous <123803852+inogenous@users.noreply.github.com> Date: Wed, 22 May 2024 21:50:35 +0200 Subject: [PATCH 09/23] Bugfix: Prevent segfault when butcher target disappears (#73990) Stops butchering when the butcher target corpse has been either raised or moved. Prevents segfault caused by dereferencing an invalid `item_location`. --- src/activity_handlers.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 05db524e634cc..fb00061fc7e31 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -477,7 +477,12 @@ void activity_handlers::butcher_do_turn( player_activity *act, Character * ) const butcher_type action = get_butcher_type( act ); const double progress = static_cast( act->moves_total - act->moves_left ) / act->moves_total; - item &corpse_item = *act->targets.back(); + item_location target = act->targets.back(); + if( !target || !target->is_corpse() ) { + act->set_to_null(); + return; + } + item &corpse_item = *target; corpse_item.set_var( butcher_progress_var( action ), progress ); } From 50164ffcbb5f71092ba7fa94a0b12501e7e296ed Mon Sep 17 00:00:00 2001 From: Brambor Date: Wed, 22 May 2024 21:51:40 +0200 Subject: [PATCH 10/23] Fix: throwing items from outside the inventory (#73987) --- src/npc_attack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/npc_attack.cpp b/src/npc_attack.cpp index 16f5963fc5c51..5a817e37df53c 100644 --- a/src/npc_attack.cpp +++ b/src/npc_attack.cpp @@ -727,7 +727,7 @@ npc_attack_rating npc_attack_throw::evaluate( // please don't throw your pants... return effectiveness; } - const inventory &available_weapons = source.crafting_inventory( -1 ); + const inventory &available_weapons = source.crafting_inventory( tripoint_zero, -1 ); if( &thrown_item == source.evaluate_best_weapon() && available_weapons.amount_of( thrown_item.typeId() ) <= 1 && available_weapons.charges_of( thrown_item.typeId() ) <= 1 ) { From 501cbaf356e4a48ba373e10bc8d02bf4f093a437 Mon Sep 17 00:00:00 2001 From: Brambor Date: Wed, 22 May 2024 21:54:09 +0200 Subject: [PATCH 11/23] change JSON_INFO.md "inherits_flags" (#73986) --- doc/JSON_INFO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 4645fc9f8460e..19ed86807891e 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -4036,7 +4036,7 @@ Any Item can be a container. To add the ability to contain things to an item, yo "sealed_data": { "spoil_multiplier": 0.0 } // If a pocket has sealed_data, it will be sealed when the item spawns. The sealed version of the pocket will override the unsealed version of the same datatype. - "inherits_flags": true // if a pocket inherits flags it means any flags that the items inside have contribute to the item that has the pockets itself. + "inherits_flags": true // Items in this pocket pass their flags to the parent item. } ] ``` From 952a01be63ec14ebeafff2b6df2b31b2d3f8415a Mon Sep 17 00:00:00 2001 From: NetSysFire <59517351+NetSysFire@users.noreply.github.com> Date: Wed, 22 May 2024 21:55:16 +0200 Subject: [PATCH 12/23] some more detailed instructions in the bug report template (#73981) --- .github/ISSUE_TEMPLATE/bug_report.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 5d3708598a27a..a5bff07930f8e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -26,8 +26,11 @@ body: placeholder: | Write N/A if not applicable. - - this bug report is unlikely to get resolved without a save file, unless it's trivially + - This bug report is unlikely to get resolved without a save file, unless it's trivially reproducible or the reproduction steps are complete. + - Ideally, prepare the save so the reproduction steps can be followed immediately after + loading, so the person trying to reproduce this does not need to do unrelated manual + steps such as walking somewhere first. validations: required: true @@ -35,7 +38,10 @@ body: id: steps-to-reproduce attributes: label: Steps to reproduce - description: Steps to reproduce the behavior. + description: | + Steps to reproduce the behavior. + **Check your mods!** Make sure to test which mod (if any) is actually causing the issue. + The less unrelated mods involved in this, the easier to reproduce and confirm it. placeholder: | 1. Make a player with a gun, magazine, and some ammo. 2. Try to aim at a wall. From 6975cd4ce9aaf26bc7105785e0c620f8bcc552fc Mon Sep 17 00:00:00 2001 From: Tealc <45678006+TealcOneill@users.noreply.github.com> Date: Wed, 22 May 2024 13:56:36 -0600 Subject: [PATCH 13/23] Standardize tolerance messages (#73970) * Standardize tolerance messages Standardizes the language used for heat and cold tolerances and fixes a typo. * V2 Adds newer version after discussion with Procyonae * Imsodumb Fixed le dumb * Evenlessdumber --- data/json/mutations/mutations.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/mutations/mutations.json b/data/json/mutations/mutations.json index bbd0cca5b7646..322fb754e1343 100644 --- a/data/json/mutations/mutations.json +++ b/data/json/mutations/mutations.json @@ -9498,7 +9498,7 @@ "id": "RESISTCHILL", "name": { "str": "Cold Tolerance" }, "points": 1, - "description": "You fare better than most in colder climates and are less bothered by lower temperatures. Note that while you are slightly less prone to developing frostbite as a result, you aren't any better at dealing with the symptoms.", + "description": "You fare better than most in colder climates and are less bothered by lower temperatures. Note that while it will take more cold and exposure for you to suffer the effects of frostbite, you aren't any better at dealing with the symptoms.", "starting_trait": true, "changes_to": [ "STRONGER_RESISTCHILL" ], "types": [ "ACCLIMATIZATION", "ECTOTHERMIC" ], @@ -9523,7 +9523,7 @@ "id": "RESISTWARM", "name": { "str": "Heat Tolerance" }, "points": 1, - "description": "You fare better than most in warmer climates and are less bothered by hotter temperatures. Note that while you it will take more heat and exposure for you to suffer from sunstroke, this will not make dealing with its consequences any easier.", + "description": "You fare better than most in warmer climates and are less bothered by hotter temperatures. Note that while it will take more heat and exposure for you to suffer the effects of sunstroke, you aren't any better at dealing with the symptoms.", "starting_trait": true, "changes_to": [ "STRONGER_RESISTWARM" ], "category": [ "FISH", "CEPHALOPOD", "GASTROPOD", "LIZARD", "BATRACHIAN", "PLANT" ], From 903a01689a34db4ca61571526e0745072e8f7081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=B2=E8=80=85?= Date: Thu, 23 May 2024 04:08:58 +0800 Subject: [PATCH 14/23] Fix some formatting in the document (#74001) * docs: Add the missing vertical line of table Reusable EOCs * docs: Fix header hierarchy for mapgen_id * docs: Add empty line around the table --- doc/EFFECT_ON_CONDITION.md | 8 +++++--- doc/EXAMINE.md | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/EFFECT_ON_CONDITION.md b/doc/EFFECT_ON_CONDITION.md index 9ae57378b0553..4a7fbecdbfff0 100644 --- a/doc/EFFECT_ON_CONDITION.md +++ b/doc/EFFECT_ON_CONDITION.md @@ -966,6 +966,7 @@ check do you stand in a cloud of smoke | Avatar | Character | NPC | Monster | Furniture | Item | | ------ | --------- | --------- | ---- | ------- | --- | | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | + #### Examples Create a popup with message `You have died. Continue as one of your followers?` ```json @@ -1145,9 +1146,10 @@ Check whether the eoc `test_condition` would use its true or false effect # Reusable EOCs: The code base supports the use of reusable EOCs, you can use these to get guaranteed effects by passing in specific variables. The codebase supports the following: -EOC Name | Description | Variables | ---------------------- | --------- | ----------- | -EOC_RandEnc | Spawns a random encounter at the specified `omt` with mapgen update `map_update` that is later removed with `map_removal`. It has a 1 in `chance` chance of happening and can only occur after `days_till_spawn`. Can optionally only happen if `random_enc_condition` is true | `map_update`: a mapgen update ID
`omt`: overmap tile ID where this happens
`map_removal`: a mapgen update ID
`chance`: an integer
`days_till_spawn`: an integer
`random_enc_condition`: a set condition +| EOC Name | Description | Variables | +| --------------------- | --------- | ----------- | +| EOC_RandEnc | Spawns a random encounter at the specified `omt` with mapgen update `map_update` that is later removed with `map_removal`. It has a 1 in `chance` chance of happening and can only occur after `days_till_spawn`. Can optionally only happen if `random_enc_condition` is true | `map_update`: a mapgen update ID
`omt`: overmap tile ID where this happens
`map_removal`: a mapgen update ID
`chance`: an integer
`days_till_spawn`: an integer
`random_enc_condition`: a set condition | + # EVENT EOCs: EVENT EOCs trigger on in game events specified in the event_type enum in `event.h`. When an EVENT EOC triggers it tries to perform the EOC on the NPC that is the focus of the event and if it cannot determine one, triggers on the avatar. So any cata_event that has a field for "avatar_id", "character", "attacker", "killer", "npc" will potentially resolve to another npc rather than the avatar, based on who the event triggers for. diff --git a/doc/EXAMINE.md b/doc/EXAMINE.md index 06af858048cd8..a8b4aa3f2167c 100644 --- a/doc/EXAMINE.md +++ b/doc/EXAMINE.md @@ -98,7 +98,7 @@ Integer (0 or greater). For cards with the `PRESERVE_SPAWN_OMT` flag, how many overmap tiles away a card can spawn and be accepted for this cardreader. For cards without the flag, this field is ignored. -### `mapgen_id` +#### `mapgen_id` Optional. String. Update mapgen ID to apply on opening the door. From 96401952f59e5afa30f1815da298904cbf97b746 Mon Sep 17 00:00:00 2001 From: AshenColors <3249074+AshenColors@users.noreply.github.com> Date: Wed, 22 May 2024 16:09:48 -0400 Subject: [PATCH 15/23] Update AppStream metadata to 0.G release (#73930) --- .../org.cataclysmdda.CataclysmDDA.appdata.xml | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/data/xdg/org.cataclysmdda.CataclysmDDA.appdata.xml b/data/xdg/org.cataclysmdda.CataclysmDDA.appdata.xml index ec0ddfaabff3c..6bc78a3cb9a46 100644 --- a/data/xdg/org.cataclysmdda.CataclysmDDA.appdata.xml +++ b/data/xdg/org.cataclysmdda.CataclysmDDA.appdata.xml @@ -71,6 +71,81 @@ cataclysm-tiles + + +

+ We are proud to announce that 0.G “Gaiman” stable release has arrived! Two years have + passed since the release of the stable version 0.F “Frank”, two years of unprecedented + turmoil in the real world that delayed our planned release of the next stable. These two + years have seen many IRL job changes among the dev team, new contributors to CleverRaven, + and a couple of babies joining members' families. The 0.G release is more than double the + size of the 0.F release, a distinction that we keep trying and failing to avoid. Even more + than previous stable versions, this release features a massive range of bugfixes, code and + content additions, and new features. 10,293 new game entities were added, 11,643,312 lines + of source code were inserted, and 5,022,361 lines were deleted. This included several new + language translations, multiple new tilesets; including some isometric tileset demos, and + multiple new mods in addition to base game content and features. +

+

+ This cycle was started, tilting at our perennial windmill of a six to nine month release + cycle. Shortly thereafter, Covid locked down the world but not contributions to DDA! There + are many incredible changes that have entered the game and several ancient issues that + have been closed. The skill system has been greatly expanded with many new proficiencies + and many new ways to learn them, as well as the groundwork for practice-based skill + improvement, including a skill rust system that doesn't suck because it caps effective + skill loss and regenerates faster than regular skill gain. Appliance based stationary + power grids now exist. Turning vehicles now present complete walls that block out + monsters, fields and more from crossing from the outside to the inside of the vehicle. Map + memory is now unlimited, so you will no longer forget places you haven't been to recently. + Cardio has finally been modeled so that your endurance will increase if you spend your + days running and working hard or exercising. Perspiration is now modeled, your character + running around the middle of summer in full plate mail won't immediately overheat. Now + your character will perspire and thirst will increase until you are dehydrated at which + point overheating will begin. Hydrate yourselves accordingly! +

+

+ In addition to the above issue/request resolving features above, there are a number of new + features that haven't necessarily been on the roadmap for a long time but came to fruition + during this experimental cycle. The amount of UI based contributions has gone through the + roof this cycle and created tons of options around how your fully customizable sidebar + looks, the color theme for your UI is also fully customizable with multiple shipped + options, along with updates and improvements to action explanations, tutorials and the + github process itself, which while not visible to people who only play the game makes a + huge difference in the quality and amount of contributions added to Cataclysm: Dark Days + Ahead. You can now passively purify water by boiling it by placing it in a fireproof + container on a fire or near an extreme heat source. A new hobby tab in character creation + allows you to choose traits and skills that go together that represent how you spent your + time before the end of the world. Monster weak points now exist, allowing your strikes to + critically hit. You can learn proficiencies that will increase your likelihood to + critically hit these weak points by researching and dissecting monsters. Speaking of + monsters, we've adjusted the aggression system so that some more intelligent monsters will + recognize whether they were attacked by another monster or the player and will remain + passive or gain hostility depending on who harmed them. A lone zombie will no longer turn + a pack of wild dogs permanently hostile to you. Finally, Effect on Condition brings a + scripting pseudo language to Cataclysm. Some of its key uses in 0.G have been the + introduction of portal storms, NPC faction development over time, the ability to take over + a follower after pc death, and random encounters in already explored maps. +

+

+ During this time modders have added a half dozen new in repo mods: Innawoods for the + survival from scratch you crave, Backrooms which takes place in the neverending backrooms + dimension, Massachusetts mod for people who desire geographic accuracy, Xedra Evolved a + science fantasy mod with weird magic and vampirism, Tropicataclysm for your Cataclysm at a + warmer latitude, and the Megafauna mod which targets an ancient epoch with creatures that + outsize our modern equivalents, similar to Dinomod. In addition to this Magiclysm, + Dinomod, and Aftershock have received dozens of new PRs each to a scale that would be + equal to or larger than paid DLC for a AAA game. +

+

+ We, the DDA team, have had a great time creating new content and worlds to explore and we + hope that you enjoy them and if a mood takes you, that you join us in creating more in the + future. +

+
+ + https://github.com/CleverRaven/Cataclysm-DDA/tree/0.G-branch/data/changelog.txt +
+

From 2d02175371f6ff3361407ae004b50e121e0221c4 Mon Sep 17 00:00:00 2001 From: Marc Date: Wed, 22 May 2024 21:42:20 -0600 Subject: [PATCH 16/23] Add new locations to Aftershock (#73988) * Add Shuttle Landing Pad Mapgen to Aftershock Exo Planet * Update shuttlepad layout and add sealed shipping crates to Aftershock. * Add Malamute Freight Transport to Aftershock * Update freight transport. Increase monster spawns and alter layout slightly. * Format JSON to match style guides * Restore deleted shuttlepad * Fix broken broken JSON and remove unimplemented mapgen Aftershock * Fix typo * Lint JSON * Fix description on sealed intermodal crate * Add General Store to Aftershock Exoplanet * Lint general store JSON * Fix description on Open Intermodal crate * Minor Updates to Mapgen Aftershock * Add lights to Aftershock Mapgen. * Fix General Store second floor generating ground instead of air * Remove water spawn in colonist wardrobe Aftershock --- .../Aftershock/itemgroups/food_groups.json | 5 + .../Aftershock/itemgroups/kitchen_groups.json | 7 + .../Aftershock/itemgroups/money_groups.json | 35 ++++ .../Aftershock/itemgroups/sealed_crates.json | 45 +++++ data/mods/Aftershock/maps/city_buildings.json | 21 +++ .../furniture_habitat.json | 47 +++++ .../terrain_habitat_floor.json | 25 +++ .../terrain_spaceship.json | 22 +++ .../maps/mapgen/freight_transport.json | 125 +++++++++++++ .../Aftershock/maps/mapgen/general_store.json | 176 ++++++++++++++++++ .../Aftershock/maps/mapgen/shuttle_pad.json | 78 ++++++++ .../Aftershock/maps/overmap_specials.json | 15 ++ .../mods/Aftershock/maps/overmap_terrain.json | 38 ++++ data/mods/Aftershock/ter_fur_transform.json | 10 + .../aftershock_exoplanet/region_settings.json | 4 +- 15 files changed, 651 insertions(+), 2 deletions(-) create mode 100644 data/mods/Aftershock/itemgroups/sealed_crates.json create mode 100644 data/mods/Aftershock/maps/mapgen/freight_transport.json create mode 100644 data/mods/Aftershock/maps/mapgen/general_store.json create mode 100644 data/mods/Aftershock/maps/mapgen/shuttle_pad.json diff --git a/data/mods/Aftershock/itemgroups/food_groups.json b/data/mods/Aftershock/itemgroups/food_groups.json index c14bd1eef16dc..c5efe1b6d3b4c 100644 --- a/data/mods/Aftershock/itemgroups/food_groups.json +++ b/data/mods/Aftershock/itemgroups/food_groups.json @@ -11,6 +11,11 @@ [ "afs_caffex", 50 ] ] }, + { + "type": "item_group", + "id": "afs_cheap_drinks", + "items": [ [ "afs_h2o", 90 ], [ "afs_calorie_water", 50 ], [ "afs_sundew", 50 ], [ "afs_caffex", 50 ] ] + }, { "id": "afs_spices", "type": "item_group", diff --git a/data/mods/Aftershock/itemgroups/kitchen_groups.json b/data/mods/Aftershock/itemgroups/kitchen_groups.json index 79cf063f25233..da13f74b20ab6 100644 --- a/data/mods/Aftershock/itemgroups/kitchen_groups.json +++ b/data/mods/Aftershock/itemgroups/kitchen_groups.json @@ -29,5 +29,12 @@ { "group": "afs_stored_veggies", "prob": 10, "count": [ 1, 2 ] }, { "group": "afs_ruined_food", "prob": 50, "count": [ 1, 7 ] } ] + }, + { + "id": "afs_old_beverage_storage", + "type": "item_group", + "subtype": "collection", + "//": "A fridge or equivalent storing drinks from before the discontinuity. Should only contain nonperishable food and spawn in ruins.", + "items": [ { "group": "afs_cheap_drinks", "prob": 10, "count": [ 1, 5 ] } ] } ] diff --git a/data/mods/Aftershock/itemgroups/money_groups.json b/data/mods/Aftershock/itemgroups/money_groups.json index 383b2071ac80f..7de2adf439a9c 100644 --- a/data/mods/Aftershock/itemgroups/money_groups.json +++ b/data/mods/Aftershock/itemgroups/money_groups.json @@ -12,5 +12,40 @@ { "item": "UICA_50d", "count": 10 }, { "item": "UICA_1d", "count": 10 } ] + }, + { + "id": "afs_banknotes", + "type": "item_group", + "items": [ + { "item": "UICA_1000d", "prob": 1 }, + { "item": "UICA_100d", "prob": 5 }, + { "item": "UICA_10d", "prob": 10 }, + { "item": "UICA_50d", "prob": 7 }, + { "item": "UICA_1d", "prob": 25 } + ] + }, + { + "id": "afs_cash_safe", + "type": "item_group", + "items": [ { "group": "afs_banknotes", "count": [ 33, 55 ] } ] + }, + { + "id": "afs_register_full", + "type": "item_group", + "container-item": "cash_register", + "items": [ { "group": "afs_banknotes", "count": [ 5, 33 ] } ] + }, + { + "id": "afs_register_looted", + "type": "item_group", + "//": "If aftershock adds it's own lore correct survivor notes this could be a place to put one", + "container-item": "cash_register", + "items": [ { "group": "afs_banknotes", "prob": 15, "count": [ 1, 2 ] } ] + }, + { + "id": "afs_register_random", + "subtype": "distribution", + "type": "item_group", + "items": [ { "group": "afs_register_full", "prob": 45 }, { "group": "afs_register_looted", "prob": 55 } ] } ] diff --git a/data/mods/Aftershock/itemgroups/sealed_crates.json b/data/mods/Aftershock/itemgroups/sealed_crates.json new file mode 100644 index 0000000000000..86dd41efd4f41 --- /dev/null +++ b/data/mods/Aftershock/itemgroups/sealed_crates.json @@ -0,0 +1,45 @@ +[ + { + "type": "item_group", + "id": "afs_crate_civ_rand", + "//": "Genral civilian goods weighted for rarity", + "subtype": "distribution", + "entries": [ + { "group": "afs_crate_food", "prob": 4 }, + { "group": "afs_crate_clothing", "prob": 2 }, + { "group": "afs_crate_medical", "prob": 1 }, + { "group": "afs_civilian_armory", "prob": 1, "count": [ 2, 5 ] } + ] + }, + { + "type": "item_group", + "id": "afs_crate_food", + "subtype": "collection", + "//": "Perserved food shipped in from off world.", + "entries": [ + { "group": "afs_stored_meals", "prob": 50, "count": [ 3, 8 ] }, + { "group": "afs_dry_goods", "prob": 100, "count": [ 3, 5 ] } + ] + }, + { + "type": "item_group", + "id": "afs_crate_clothing", + "subtype": "collection", + "//": "Multiple sets of clothing goods. Increased likelyhood of a bag due the difficulty of getting into a crate in the first place.", + "entries": [ + { "group": "afs_colonist_outfit", "prob": 100, "count": [ 3, 6 ] }, + { "group": "afs_colonist_bags", "prob": 80, "count": [ 1, 2 ] } + ] + }, + { + "type": "item_group", + "id": "afs_crate_medical", + "subtype": "collection", + "//": "Civilian Grade Medical supplies with a low chance of rare medical goods.", + "entries": [ + { "group": "drugs_pharmacy", "prob": 100, "count": [ 3, 6 ] }, + { "item": "afs_synth_blood", "prob": 30, "count": [ 1, 3 ] }, + { "item": "afs_medigel", "prob": 60, "count": [ 1, 3 ] } + ] + } +] diff --git a/data/mods/Aftershock/maps/city_buildings.json b/data/mods/Aftershock/maps/city_buildings.json index 8446ece5b311c..4a90a924d8324 100644 --- a/data/mods/Aftershock/maps/city_buildings.json +++ b/data/mods/Aftershock/maps/city_buildings.json @@ -122,5 +122,26 @@ { "point": [ 0, 0, 1 ], "overmap": "afs_shelter_1_roof_north" } ], "locations": [ "land" ] + }, + { + "id": "afs_general_store_1", + "type": "city_building", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "afs_general_store_n1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "afs_general_store_n2_north" }, + { "point": [ 0, 0, 2 ], "overmap": "afs_general_store_n3_north" } + ], + "locations": [ "land" ] + }, + { + "id": "afs_shuttle_pad", + "type": "city_building", + "overmaps": [ + { "point": [ 1, 0, 0 ], "overmap": "afs_shuttle_pad_a1_south" }, + { "point": [ 0, 0, 0 ], "overmap": "afs_shuttle_pad_a2_south" }, + { "point": [ 1, 0, 1 ], "overmap": "afs_shuttle_pad_a1_roof_south" }, + { "point": [ 0, 0, 1 ], "overmap": "afs_shuttle_pad_a2_roof_south" } + ], + "locations": [ "land" ] } ] diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json b/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json index 5e786193d2fce..d5998a0c7ca09 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json @@ -186,5 +186,52 @@ { "item": "circuit", "count": [ 0, 1 ] } ] } + }, + { + "type": "furniture", + "id": "f_intermodal_crate_open", + "name": "intermodal shipping crate", + "description": "A sealed metal crate used to ferry cargo to and from orbit. This one appears to be open.", + "required_str": 12, + "symbol": "O", + "bgcolor": "brown", + "move_cost_mod": -1, + "coverage": 60, + "flags": [ "TRANSPARENT", "MOUNTABLE", "SHORT", "SMALL_HIDE", "PLACE_ITEM", "CONTAINER" ], + "bash": { + "str_min": 40, + "str_max": 200, + "sound": "screeching metal!", + "sound_fail": "whump!", + "items": [ + { "item": "steel_chunk", "count": [ 1, 5 ] }, + { "item": "scrap", "count": [ 1, 5 ] }, + { "item": "afs_circuitry_1", "count": [ 1, 2 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_sealed_intermodal_crate", + "name": "sealed intermodal crate", + "description": "A sealed metal crate used to ferry cargo to and from orbit. This one appears to be secured with an electric lock.", + "required_str": 12, + "symbol": "O", + "bgcolor": "brown", + "move_cost_mod": -1, + "coverage": 60, + "oxytorch": { "result": "f_intermodal_crate_open", "duration": "14 seconds" }, + "flags": [ "TRANSPARENT", "MOUNTABLE", "SHORT", "SMALL_HIDE", "PLACE_ITEM", "CONTAINER", "SEALED" ], + "bash": { + "str_min": 40, + "str_max": 200, + "sound": "screeching metal!", + "sound_fail": "whump!", + "items": [ + { "item": "steel_chunk", "count": [ 1, 5 ] }, + { "item": "scrap", "count": [ 1, 5 ] }, + { "item": "afs_circuitry_1", "count": [ 1, 2 ] } + ] + } } ] diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_habitat_floor.json b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_habitat_floor.json index 0eb0c260f1cd8..29e770b16d339 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_habitat_floor.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_habitat_floor.json @@ -24,5 +24,30 @@ { "item": "rebar", "count": [ 0, 4 ] } ] } + }, + { + "type": "terrain", + "id": "t_metal_floor_olight_inactive", + "name": "metal floor, with inactive overhead light", + "description": "High-quality and tough checkered metal flooring to reduce the risk of slips and falls, with a still-functioning inactive light attached to the ceiling above.", + "looks_like": "t_metal_floor_olight", + "symbol": ".", + "color": "light_cyan", + "connect_groups": "METALFLOOR", + "connects_to": "METALFLOOR", + "move_cost": 2, + "roof": "t_metal_roof", + "flags": [ "TRANSPARENT", "INDOORS", "FLAT", "ROAD" ], + "bash": { + "str_min": 4, + "str_max": 12, + "sound": "glass breaking!", + "sound_fail": "whack!", + "sound_vol": 16, + "sound_fail_vol": 10, + "ter_set": "t_metal_floor", + "items": [ { "item": "glass_shard", "count": [ 8, 16 ] } ] + }, + "shoot": { "chance_to_hit": 0, "reduce_damage": [ 0, 0 ], "reduce_damage_laser": [ 0, 0 ], "destroy_damage": [ 2, 8 ] } } ] diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_spaceship.json b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_spaceship.json index 691adbac35393..53c62d6d30942 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_spaceship.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_spaceship.json @@ -24,6 +24,28 @@ ] } }, + { + "type": "terrain", + "id": "t_afs_broken_treads", + "name": "broken treads", + "description": "A large set of broken and frozen over vehicle treads.", + "flags": [ "NOITEM", "NO_SCENT", "AUTO_WALL_SYMBOL", "MINEABLE", "BLOCK_WIND", "TRANSPARENT", "SHORT" ], + "symbol": "LINE_OXOX", + "color": "white", + "move_cost": 5, + "bash": { + "str_min": 100, + "str_max": 400, + "sound": "metal screeching!", + "sound_fail": "clang!", + "ter_set": "t_null", + "items": [ + { "item": "afs_material_2", "count": [ 1, 2 ] }, + { "item": "afs_material_1", "count": [ 2, 8 ] }, + { "item": "scrap", "count": [ 6, 24 ] } + ] + } + }, { "type": "terrain", "id": "t_afs_gun_ship_hull_wall", diff --git a/data/mods/Aftershock/maps/mapgen/freight_transport.json b/data/mods/Aftershock/maps/mapgen/freight_transport.json new file mode 100644 index 0000000000000..92b5ea1275ca8 --- /dev/null +++ b/data/mods/Aftershock/maps/mapgen/freight_transport.json @@ -0,0 +1,125 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "afs_freight_transport_a1", "afs_freight_transport_a2" ] ], + "object": { + "fill_ter": "t_metal_floor", + "rows": [ + " ", + " ", + " ", + " ", + " ñññññññññññ ", + " -_-_- -__- ññññññ ñññññññ ", + " ---Foj----II--- -_- --!-- -__-__- ", + " ---yh...U-LL..qq---I---...-----G.H.G-- ", + " #.#yh.,ss-E...,.....q-l...l-22-G.,.G---- ", + " ---B.....!..f-_---..q-l...l-..---1---hc_ ", + " --!--ee-,hS_3!.1,..!..,..-....5..!.,c_ ", + " ---$.$----..f-_---7.q-l....!....,..--hc_ ", + " #.#.,.-OP-E...,.....q-l....-6f4....f---- ", + " ---$$.!,i-LL..qq---I---...-----fL.fE-- ", + " ---w-T----II--- -_- --!-- -__-__- ", + " -_-_- -__- ññññññ ñññññññ ", + " ñññññññññññ ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "afs_habitat_structure", "afs_habitat_mech_furnishing", "afs_habitat_residential_furnishing" ], + "terrain": { + "ñ": "t_afs_broken_treads", + "1": "t_door_metal_locked", + "_": "t_reinforced_glass_shutter_open", + "3": "t_nuclear_reactor" + }, + "furniture": { + "I": "f_sealed_intermodal_crate", + "$": "f_sleep_pod", + "e": "f_entertainment_center", + "4": "f_monomolecularsaw", + "6": "f_3dprinter", + "2": "f_drone_recharge_station", + "H": "f_exo_gantry", + "G": "f_rack", + "B": "f_bookcase", + "T": "f_habitat_bathroom", + "S": "f_atmospheric_control", + "i": "f_water_heater", + "w": "f_habitat_storage_board" + }, + "liquids": { "i": { "liquid": "water_clean", "amount": [ 0, 100 ] } }, + "place_item": [ { "item": "television", "repeat": 1, "x": 10, "y": 10 } ], + "items": { + "3": { "item": "nuclear_reactor" }, + "2": { "item": "old_industrial_bot_storage", "chance": 20 }, + "H": { "item": "afs_exosuit_worker", "chance": 60 }, + "G": { "item": "afs_civilian_armory", "chance": 80, "repeat": [ 1, 3 ] }, + "I": { "item": "afs_crate_civ_rand" }, + "B": { "item": "homebooks", "repeat": [ 2, 3 ] }, + "F": { "item": "afs_old_food_storage", "chance": 60 }, + "w": { "item": "afs_colonist_outfit", "chance": 60 } + }, + "place_monster": [ + { "group": "AFS_GROUP_ROBOT_LOW_RISK", "x": [ 7, 23 ], "y": [ 7, 13 ], "pack_size": [ 1, 4 ], "chance": 40 }, + { "group": "AFS_GROUP_RUIN_MOXIE", "x": [ 0, 23 ], "y": [ 0, 3 ], "pack_size": [ 1, 4 ], "chance": 50 }, + { "group": "AFS_GROUP_RUIN_MOXIE", "x": [ 0, 23 ], "y": [ 17, 23 ], "pack_size": [ 1, 2 ], "chance": 100 }, + { "group": "AFS_GROUP_RUIN_MOXIE", "x": [ 24, 47 ], "y": [ 17, 23 ], "pack_size": [ 1, 2 ], "chance": 70 } + ], + "computers": { + "7": { + "name": "MALAMUTE REACTOR CONTROL", + "security": 5, + "options": [ { "name": "UNLOCK REACTOR DOORS", "action": "unlock" } ], + "failures": [ { "action": "shutdown" }, { "action": "alarm" } ] + }, + "5": { + "name": "MALAMUTE ARMORY CONTROL", + "security": 3, + "options": [ { "name": "UNLOCK ARMORY DOORS", "action": "unlock" } ], + "failures": [ { "action": "shutdown" }, { "action": "alarm" } ] + } + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "afs_freight_transport_roof_a1", "afs_freight_transport_roof_a2" ] ], + "object": { + "fill_ter": "t_metal_floor", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ..... .... ", + " ............... ... ..... ....... ", + " ..&................................... ", + " .==A.....MM............===A............. ", + " ..&..............................MM..... ", + " .....................XX.........X..... ", + " ..&..............................MM..... ", + " .==A.....MM............===A............. ", + " ..&................................... ", + " ............... ... ..... ....... ", + " ..... .... ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } + } +] diff --git a/data/mods/Aftershock/maps/mapgen/general_store.json b/data/mods/Aftershock/maps/mapgen/general_store.json new file mode 100644 index 0000000000000..c5f14a4c54abc --- /dev/null +++ b/data/mods/Aftershock/maps/mapgen/general_store.json @@ -0,0 +1,176 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": "afs_general_store_n1", + "object": { + "fill_ter": "t_metal_floor", + "rows": [ + " ", + " ///// ", + " //nn.! ", + " /L.,.! ", + " /L.../ A ", + " ///!!//=/////=///// ", + " /.......nllll.nBBB// ", + " /..,......,.....,..# ", + " =.......neeee.nttt// ", + " =.......ngggg.nppp/ ", + " /ccccc....,.....,.= ", + " /..,.C./ffff//+//+/ ", + " /nrrr/+//////,./,./ ", + " //////..ge.i/nb/nb/ ", + " /.,.+..,ge,I/////// ", + " #.s./p..ge...+,.// ", + " ''//=//!////////// ", + " ''''''/.,SO/' ", + " ''//#///' ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "afs_habitat_structure", "afs_habitat_residential_furnishing" ], + "terrain": { " ": "t_open_air", "'": "t_flat_roof", "r": "t_carpet_red", ",": "t_metal_floor_olight_inactive" }, + "furniture": { + "b": "f_habitat_bathroom", + "e": "f_entertainment_center", + "d": "f_dishwasher", + "$": "f_sleep_pod", + "B": "f_bookcase", + "f": "f_fridge", + "w": "f_water_heater", + "P": "f_water_purifier", + "O": "f_ECU", + "S": "f_atmospheric_control" + }, + "liquids": { "w": { "liquid": "water_clean", "amount": [ 0, 100 ] } }, + "place_item": [ { "item": "television", "repeat": 1, "x": 11, "y": 15 } ], + "items": { + "B": { "item": "homebooks", "repeat": [ 2, 3 ] }, + "f": { "item": "afs_old_food_storage", "chance": 60 }, + "q": { "item": "afs_old_food_storage", "chance": 60 } + }, + "place_nested": [ { "chunks": [ [ "null", 80 ], [ "afs_map_lights_on", 20 ] ], "x": 0, "y": 0 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "afs_general_store_n3", + "object": { + "fill_ter": "t_metal_floor", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ................ ", + " ................... ", + " ........&&......... ", + " ................... ", + " ................... ", + " .................. ", + " ...A.............. ", + " ...A==.......X..... ", + " ................... ", + " .................. ", + " ................ ", + " ...... ", + " ...... ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_map_lights_on", + "object": { + "mapgensize": [ 24, 24 ], + "place_ter_furn_transforms": [ { "transform": "afs_lights_on", "x": [ 0, 23 ], "y": [ 0, 23 ] } ] + } + } +] diff --git a/data/mods/Aftershock/maps/mapgen/shuttle_pad.json b/data/mods/Aftershock/maps/mapgen/shuttle_pad.json new file mode 100644 index 0000000000000..f4a012fe8c35d --- /dev/null +++ b/data/mods/Aftershock/maps/mapgen/shuttle_pad.json @@ -0,0 +1,78 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "afs_shuttle_pad_a1", "afs_shuttle_pad_a2" ] ], + "object": { + "fill_ter": "t_metal_floor", + "rows": [ + " ", + " ññññññññññññññññññññññññññññññññññññ////////// ", + " ñ //E&qq/v.h/ ", + " ñ $$$$$ $$$$ $$$$ $$ $$$$$$$$ #..,ö.+.kk/ ", + " ñ $$''''''''''''''''''''''''''''$$//&.qq/.,./ ", + " ñ $'''''' '''' ' '''''' ' '''$ //+////+// ", + " ñ $'''''' '' ''' '''' ''' '''$ =.,../..l/ ", + " ñ '''$$'' ''''$$''''' ''$$''' =ccc./,.l/ ", + " ñ $'''$''' '''''''' ''''' ''$''' /===//!/// ", + " ñ $''' ''' '' '' ''' ''''''$ /./ ñ ", + " ñ $'''' ''''' ''''''''''''''''''$'' '''/!/ ñ ", + " ñ $'' ''' '''$$''' ''' ''''$''' '' '' ñ ", + " ñ $' ''' ''$$'' ''' ''''$'' ''''' ñ ", + " ñ $''''''''' ' '''''''''''' ' $'''''' ' ñ ", + " ñ '''' ''''' '''''' '' ''' '' ' ñ ", + " ñ '''$' ' ''''''''' '''''$'''$ '' ñ ", + " ñ '''$$''''' ''$$''''''' '$$'''$ ''' ''' ñ ", + " ñ $''''' ''''' ''' '' ''' '' ''' '' '' ' ñ ", + " ñ $''''' '''''' '' '' '''$ ''''''' ñ ", + " ñ $$''''' ''''' '' ''' '''' ''''$$ ''' '' ñ ", + " ñ $$$$ $$$$$ $$$$$$$ $$$$$$$ '' ñ ", + " ñ ''' ñ ", + " ññññññññññññññññññññññññññññññññññññññññ'''ñññ ", + " " + ], + "palettes": [ "afs_habitat_structure", "afs_habitat_mech_furnishing" ], + "terrain": { "'": "t_thconc_floor_no_roof", "$": "t_sidewalk", "ñ": "t_chainfence", ",": "t_metal_floor_olight_inactive" }, + "furniture": { "&": "f_sealed_intermodal_crate", "e": "f_intermodal_crate_open" }, + "items": { "&": [ { "item": "afs_crate_civ_rand" } ] }, + "monster": { "ö": { "monster": "mon_skitterbot" } }, + "place_monster": [ { "group": "AFS_GROUP_RUIN_MOXIE", "x": [ 2, 22 ], "y": [ 2, 22 ], "pack_size": [ 1, 2 ], "chance": 50 } ], + "place_nested": [ { "chunks": [ [ "null", 80 ], [ "afs_map_lights_on", 20 ] ], "x": 24, "y": 0 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "afs_shuttle_pad_a1_roof", "afs_shuttle_pad_a2_roof" ] ], + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " .......... ", + " ........X.. ", + " ....&&..... ", + " ........... ", + " ..A....... ", + " ..A=...... ", + " .......... ", + " .......... ", + " ... ", + " ... ", + " ... ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } + } +] diff --git a/data/mods/Aftershock/maps/overmap_specials.json b/data/mods/Aftershock/maps/overmap_specials.json index 676a88294b56f..0c9801053d85b 100644 --- a/data/mods/Aftershock/maps/overmap_specials.json +++ b/data/mods/Aftershock/maps/overmap_specials.json @@ -231,5 +231,20 @@ "city_sizes": [ 0, -1 ], "occurrences": [ 1, 1 ], "flags": [ "GLOBALLY_UNIQUE", "MAN_MADE", "EXOPLANET" ] + }, + { + "type": "overmap_special", + "id": "frieght transport", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "afs_freight_transport_a1_north" }, + { "point": [ 1, 0, 0 ], "overmap": "afs_freight_transport_a2_north" }, + { "point": [ 0, 0, 1 ], "overmap": "afs_freight_transport_roof_a1_north" }, + { "point": [ 1, 0, 1 ], "overmap": "afs_freight_transport_roof_a2_north" } + ], + "locations": [ "open_air", "land" ], + "city_distance": [ 35, -1 ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 0, 2 ], + "flags": [ "MAN_MADE", "EXOPLANET" ] } ] diff --git a/data/mods/Aftershock/maps/overmap_terrain.json b/data/mods/Aftershock/maps/overmap_terrain.json index c66decaddf6d3..0afa296fda6f3 100644 --- a/data/mods/Aftershock/maps/overmap_terrain.json +++ b/data/mods/Aftershock/maps/overmap_terrain.json @@ -408,5 +408,43 @@ "color": "i_red", "see_cost": 2, "flags": [ "SOURCE_FOOD", "SOURCE_GUN", "SOURCE_AMMO" ] + }, + { + "type": "overmap_terrain", + "name": "Shuttle Landing Pad", + "spawns": { "group": "GROUP_ZOMBIE", "population": [ 2, 5 ], "chance": 80 }, + "id": [ "afs_shuttle_pad_a1", "afs_shuttle_pad_a2", "afs_shuttle_pad_a1_roof", "afs_shuttle_pad_a2_roof" ], + "sym": "-", + "color": "light_blue", + "see_cost": 3, + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "name": "Malamute Transport Wreck", + "spawns": { "group": "GROUP_ZOMBIE", "population": [ 2, 5 ], "chance": 80 }, + "id": [ + "afs_freight_transport_a1", + "afs_freight_transport_a2", + "afs_freight_transport_roof_a1", + "afs_freight_transport_roof_a2" + ], + "sym": "M", + "color": "light_gray", + "see_cost": 3, + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "name": "General Store", + "spawns": { "group": "GROUP_ZOMBIE", "population": [ 2, 5 ], "chance": 80 }, + "id": [ "afs_general_store_n1", "afs_general_store_n2", "afs_general_store_n3" ], + "sym": "g", + "color": "light_green", + "see_cost": 3, + "mondensity": 2, + "flags": [ "SIDEWALK" ] } ] diff --git a/data/mods/Aftershock/ter_fur_transform.json b/data/mods/Aftershock/ter_fur_transform.json index fe9a8006434d9..cc84f0020d63a 100644 --- a/data/mods/Aftershock/ter_fur_transform.json +++ b/data/mods/Aftershock/ter_fur_transform.json @@ -14,5 +14,15 @@ "type": "ter_furn_transform", "id": "engine_overload_transform", "terrain": [ { "result": [ "t_afs_gun_ship_engine_console_burnt" ], "valid_terrain": [ "t_afs_gun_ship_engine_console" ] } ] + }, + { + "type": "ter_furn_transform", + "id": "afs_lights_on", + "terrain": [ { "result": "t_metal_floor_olight", "valid_terrain": [ "t_metal_floor_olight_inactive" ] } ] + }, + { + "type": "ter_furn_transform", + "id": "afs_lights_off", + "terrain": [ { "result": "t_metal_floor_olight_inactive", "valid_terrain": [ "t_metal_floor_olight" ] } ] } ] diff --git a/data/mods/aftershock_exoplanet/region_settings.json b/data/mods/aftershock_exoplanet/region_settings.json index 67d63b01b44cd..273b439f2cc15 100644 --- a/data/mods/aftershock_exoplanet/region_settings.json +++ b/data/mods/aftershock_exoplanet/region_settings.json @@ -34,8 +34,8 @@ "park_radius": 20, "park_sigma": 80, "houses": { "afs_city_ruinfield": 400, "afs_formless_ruins_dynamic": 600, "afs_house_1": 300 }, - "parks": { "afs_city_ruinfield": 100 }, - "shops": { "afs_augmentation_clinic_1": 400, "afs_astrobiology_lab": 400 } + "parks": { "afs_city_ruinfield": 100, "afs_shuttle_pad": 10 }, + "shops": { "afs_augmentation_clinic_1": 400, "afs_astrobiology_lab": 400, "afs_general_store_1": 400 } }, "weather": { "base_temperature": -50.0, From 6b13a7410320f2e2dca3560f00fd0912959381d3 Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Thu, 23 May 2024 08:46:42 -0500 Subject: [PATCH 17/23] [Magiclysm] Being grabbed makes SOMATIC spells harder to cast (#74011) * Create eoc_spell_difficulty_modifiers.json * Specify mod * Add separate EoC for hands --- .../eoc_spell_difficulty_modifiers.json | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 data/mods/Magiclysm/eoc_spell_difficulty_modifiers.json diff --git a/data/mods/Magiclysm/eoc_spell_difficulty_modifiers.json b/data/mods/Magiclysm/eoc_spell_difficulty_modifiers.json new file mode 100644 index 0000000000000..06231672efae2 --- /dev/null +++ b/data/mods/Magiclysm/eoc_spell_difficulty_modifiers.json @@ -0,0 +1,44 @@ +[ + { + "type": "effect_on_condition", + "id": "EOC_GRABBED_ARMS_MAKES_SOMATIC_SPELLS_HARDER", + "eoc_type": "EVENT", + "required_event": "opens_spellbook", + "condition": { + "and": [ + { "or": [ { "u_has_effect": "grabbed", "bodypart": "arm_r" }, { "u_has_effect": "grabbed", "bodypart": "arm_l" } ] }, + { "not": { "u_has_flag": "SUBTLE_SPELL" } } + ] + }, + "effect": [ + { + "math": [ + "u_spellcasting_adjustment('difficulty', 'mod': 'magiclysm', 'flag_whitelist': 'SOMATIC' )", + "=", + "(u_effect_intensity('grabbed', 'bodypart': 'arm_l') + u_effect_intensity('grabbed', 'bodypart': 'arm_r') ) / 10" + ] + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_GRABBED_HANDS_MAKES_SOMATIC_SPELLS_HARDER", + "eoc_type": "EVENT", + "required_event": "opens_spellbook", + "condition": { + "and": [ + { "or": [ { "u_has_effect": "grabbed", "bodypart": "hand_r" }, { "u_has_effect": "grabbed", "bodypart": "hand_l" } ] }, + { "not": { "u_has_flag": "SUBTLE_SPELL" } } + ] + }, + "effect": [ + { + "math": [ + "u_spellcasting_adjustment('difficulty', 'mod': 'magiclysm', 'flag_whitelist': 'SOMATIC' )", + "=", + "(u_effect_intensity('grabbed', 'bodypart': 'hand_l') + u_effect_intensity('grabbed', 'bodypart': 'hand_r') ) / 5" + ] + } + ] + } +] From 74eb195f9ee725f8c6f6c3f447706b96cb796727 Mon Sep 17 00:00:00 2001 From: TheMurderUnicorn Date: Thu, 23 May 2024 09:47:59 -0400 Subject: [PATCH 18/23] Make Skunks Less Bloodthirsty (#74010) * Make Skunks Less Bloodthirsty * I deleted fear by mistake -_- --- data/json/monsters/mammal.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/json/monsters/mammal.json b/data/json/monsters/mammal.json index 74dafbe5a780c..effb5f5c1f6f0 100644 --- a/data/json/monsters/mammal.json +++ b/data/json/monsters/mammal.json @@ -2669,8 +2669,8 @@ "material": [ "flesh" ], "symbol": "s", "color": "black_white", - "//": "Aggression note - No matter what anger triggers I gave the skunk they would never spray, HAD to raise aggression. Its not a perfect solution but don't lower their aggression or they won't spray anymore", - "aggression": 15, + "//": "Note on Aggression and triggers, keeping player_close as both anger and fear triggers gives me the desired result, I don't know if it causes issues somehow but it's the hacky way I found to get them to behave properly with spraying 'defensively'.", + "aggression": 7, "morale": 10, "melee_dice": 1, "melee_dice_sides": 4, @@ -2690,7 +2690,7 @@ "stomach_size": 50, "harvest": "skunk_with_skull", "families": [ "prof_intro_biology", "prof_physiology" ], - "anger_triggers": [ "FRIEND_ATTACKED", "HURT" ], + "anger_triggers": [ "FRIEND_ATTACKED", "HURT", "PLAYER_CLOSE" ], "fear_triggers": [ "PLAYER_CLOSE" ], "flags": [ "SEES", From bd419f9ff269bf277393ce3c79930a3f3242dfe5 Mon Sep 17 00:00:00 2001 From: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Date: Thu, 23 May 2024 11:50:35 -0500 Subject: [PATCH 19/23] Apply suggestions from code review Co-authored-by: David Seguin --- data/changelog.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/data/changelog.txt b/data/changelog.txt index 4b82db965100e..337b868f89aa3 100644 --- a/data/changelog.txt +++ b/data/changelog.txt @@ -120,7 +120,6 @@ Add new function follower_present for use in JSON Graphical construction preview Resume butchering The player can swap between defined outfits with the 'set of clothes' item -Limbify consumption times ## Content: @@ -247,9 +246,7 @@ Fridges and freezers. What do you mean 'we already have some'? New portal monsters: unviable life forms Challenge start - hunted forever. Starts with the nemesis, but it comes back stronger everytime it dies Adds a new globally unique special to spawn in the ocean : an Oil Platform ! -Added tarot cards as a variant of playing cards and added Ouija board as a playable board game. Overhaul and flesh out Barry Isherwood's rescue mission -Adds the last remaining natural frog species native to New England. Prepper Militia Community @@ -314,8 +311,6 @@ Adding spell name to the casting... widget Adding Classless as a supernatural category Mission UI migrated to imGUI Provide a visual UI for changing vehicle part shapes -Don't show gun without default ammo defined as an option in reload ui -Rename cover ---> concealment @@ -707,9 +702,7 @@ AIM: Now moving all items will not move favourite items, if other items are pres Misc repair kit draws ammo from around player and inventory, opposed to an internal ammunition pocket. Fixed issue where Android gesture inputs were not recognized by ImGui windows Fixed arrows disappearing when unwielded -The old wool staple recipe resulted in mass and yarn duplication. We respect the law of conservation of energy here. Fix for massive slowdown when NPC crafting speed drops below 0.0 -Removes MP18, PLR 16, OA 93, M231, Mossberg Brownie Pseudo terrain appearing in fields when using mods is fixed (won't affect existing fields) @@ -795,7 +788,6 @@ Deleted the ImGui enable/disable toggle, turns on ImGui globally in CDDA Use test enumerating item spawns to make assertions about the rate of appearance of different items. Add perceived kwarg to pain_eval math function, apply it in Mind Over Matter refactored ImTuis drawing code to fix a black screen issue, and to improve performance -Adjust how `open_container` affects `Character::dispose_item` ## Build: From 61addf81c051affaa1ddb26cb04515293bb0ebe7 Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Thu, 23 May 2024 15:06:53 -0400 Subject: [PATCH 20/23] Sane-ify in-vehicle movement size checks (#74004) * Common Creature::can_move_to_vehicle_tile definition * Fix most of the movement logic * Remove duplicate cramped space code in effects processing * Use midpoints of size classes * Zombies try to bash through cargo * Use an overload so we can stop passing dummy values --- src/character.cpp | 105 +++------------------------------------------- src/character.h | 3 -- src/creature.cpp | 89 +++++++++++++++++++++++++++++++++++++++ src/creature.h | 4 ++ src/game.cpp | 10 ++++- src/monmove.cpp | 69 ++++-------------------------- src/monster.cpp | 52 ++--------------------- src/monster.h | 2 - src/npc.cpp | 10 ++++- src/npcmove.cpp | 16 ++++++- 10 files changed, 141 insertions(+), 219 deletions(-) diff --git a/src/character.cpp b/src/character.cpp index 7358568e69bfa..6f1f1bcc82a3b 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -8021,63 +8021,6 @@ std::string Character::weapname_ammo() const } } -// Tests to see if a character has room to enter a vehicle tile. -bool Character::move_in_vehicle( Creature *c, const tripoint &dest_loc ) const -{ - map &m = get_map(); - const optional_vpart_position vp_there = m.veh_at( dest_loc ); - if( vp_there ) { - vehicle &veh = vp_there->vehicle(); - units::volume capacity = 0_ml; - units::volume free_cargo = 0_ml; - auto cargo_parts = veh.get_parts_at( dest_loc, "CARGO", part_status_flag::any ); - for( vehicle_part *&part : cargo_parts ) { - vehicle_stack contents = veh.get_items( *part ); - const optional_vpart_position vp = m.veh_at( dest_loc ); - // Check for obstacles and appliances to prevent squishing when the part is - // not a vehicle or when the player is not actually entering the tile IE grabbing. - if( !vp.part_with_feature( "CARGO_PASSABLE", false ) && - !vp.part_with_feature( "APPLIANCE", false ) && !vp.part_with_feature( "OBSTACLE", false ) ) { - capacity += contents.max_volume(); - free_cargo += contents.free_volume(); - } - } - if( capacity > 0_ml ) { - // First, we'll try to squeeze in. Open-topped vehicle parts have more room for us. - if( !veh.enclosed_at( dest_loc ) ) { - free_cargo *= 1.2; - } - const creature_size size = get_size(); - if( ( size == creature_size::tiny && free_cargo < 15625_ml ) || - ( size == creature_size::small && free_cargo < 31250_ml ) || - ( size == creature_size::medium && free_cargo < 62500_ml ) || - ( size == creature_size::large && free_cargo < 125000_ml ) || - ( size == creature_size::huge && free_cargo < 250000_ml ) ) { - if( ( size == creature_size::tiny && free_cargo < 11719_ml ) || - ( size == creature_size::small && free_cargo < 23438_ml ) || - ( size == creature_size::medium && free_cargo < 46875_ml ) || - ( size == creature_size::large && free_cargo < 93750_ml ) || - ( size == creature_size::huge && free_cargo < 187500_ml ) ) { - add_msg_if_player( m_warning, _( "There's not enough room for you to fit there." ) ); - return false; // Even if we squeeze, there's no room. - } - c->add_effect( effect_cramped_space, 2_turns, true ); - return true; - } - } - const optional_vpart_position vp = m.veh_at( dest_loc ); - // Sufficiently gigantic characters aren't comfortable in stock seats, roof or no. - if( in_vehicle && get_size() == creature_size::huge && !vp.part_with_feature( "AISLE", false ) && - !vp.part_with_feature( "HUGE_OK", false ) && !has_effect( effect_cramped_space ) ) { - add_msg_if_player( m_warning, _( "You barely fit in this tiny human vehicle." ) ); - add_msg_if_npc( m_warning, _( "%s has to really cram their huge body to fit." ), c->disp_name() ); - c->add_effect( effect_cramped_space, 2_turns, true ); - return true; - } - } - return true; -} - void Character::on_hit( Creature *source, bodypart_id bp_hit, float /*difficulty*/, dealt_projectile_attack const *const proj ) { @@ -11127,52 +11070,14 @@ void Character::process_effects() } // Being stuck in tight spaces sucks. TODO: could be expanded to apply to non-vehicle conditions. - if( has_effect( effect_cramped_space ) ) { - map &here = get_map(); - const tripoint your_pos = pos(); - const optional_vpart_position vp_there = here.veh_at( your_pos ); - if( !vp_there ) { - remove_effect( effect_cramped_space ); - return; - } - if( is_npc() && !has_effect( effect_narcosis ) && has_effect( effect_cramped_space ) ) { + bool cramped = has_effect( effect_cramped_space ); + // return is intentionally discarded, sets cramped if appropriate + can_move_to_vehicle_tile( get_map().getglobal( pos() ), cramped ); + if( cramped ) { + if( is_npc() && !has_effect( effect_narcosis ) ) { npc &as_npc = dynamic_cast( *this ); as_npc.complain_about( "cramped_vehicle", 30_minutes, "", false ); } - bool is_cramped_space = false; - vehicle &veh = vp_there->vehicle(); - units::volume capacity = 0_ml; - units::volume free_cargo = 0_ml; - auto cargo_parts = veh.get_parts_at( your_pos, "CARGO", part_status_flag::any ); - for( vehicle_part *&part : cargo_parts ) { - vehicle_stack contents = veh.get_items( *part ); - const optional_vpart_position vp = here.veh_at( your_pos ); - if( !vp.part_with_feature( "CARGO_PASSABLE", false ) ) { - capacity += contents.max_volume(); - free_cargo += contents.free_volume(); - } - const creature_size size = get_size(); - if( capacity > 0_ml ) { - // Open-topped vehicle parts have more room. - if( !veh.enclosed_at( your_pos ) ) { - free_cargo *= 1.2; - } - if( ( size == creature_size::tiny && free_cargo < 15625_ml ) || - ( size == creature_size::small && free_cargo < 31250_ml ) || - ( size == creature_size::medium && free_cargo < 62500_ml ) || - ( size == creature_size::large && free_cargo < 125000_ml ) || - ( size == creature_size::huge && free_cargo < 250000_ml ) ) { - is_cramped_space = true; - } - } - if( get_size() == creature_size::huge && !vp.part_with_feature( "AISLE", false ) && - !vp.part_with_feature( "HUGE_OK", false ) ) { - is_cramped_space = true; - } - } - if( !is_cramped_space ) { - remove_effect( effect_cramped_space ); - } } Creature::process_effects(); diff --git a/src/character.h b/src/character.h index 892a63ab069ce..4d6ff1037d900 100644 --- a/src/character.h +++ b/src/character.h @@ -1438,9 +1438,6 @@ class Character : public Creature, public visitable void dismount(); void forced_dismount(); - /** Attempt to enter a tile in a vehicle */ - bool move_in_vehicle( Creature *c, const tripoint &dest_loc ) const; - bool is_deaf() const; bool is_mute() const; // Get the specified limb score. If bp is defined, only the scores from that body part type are summed. diff --git a/src/creature.cpp b/src/creature.cpp index e23fd24dacce4..552408de0daf9 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -192,6 +192,95 @@ void Creature::setpos( const tripoint &p ) on_move( old_loc ); } +static units::volume size_to_volume( creature_size size_class ) +{ + // returns midpoint of size from volume_to_size, minus 1_ml + // e.g. max tiny size is 7500, max small size is 46250, we return + // 46250+7500 / 2 - 1_ml = 26875_ml - 1ml + // This is still stupid and both of these functions should be merged into one single source of truth. + if( size_class == creature_size::tiny ) { + return 3749_ml; + } else if( size_class == creature_size::small ) { + return 26874_ml; + } else if( size_class == creature_size::medium ) { + return 77124_ml; + } else if( size_class == creature_size::large ) { + return 295874_ml; + } + return 741874_ml; +} + +bool Creature::can_move_to_vehicle_tile( const tripoint_abs_ms &loc, bool &cramped ) const +{ + map &here = get_map(); + const optional_vpart_position vp_there = here.veh_at( loc ); + if( !vp_there ) { + return true; + } + + const monster *mon = as_monster(); + + vehicle &veh = vp_there->vehicle(); + + std::vector cargo_parts; + cargo_parts = veh.get_parts_at( here.bub_from_abs( loc ), "CARGO", part_status_flag::any ); + + units::volume capacity = 0_ml; + units::volume free_cargo = 0_ml; + for( vehicle_part *part : cargo_parts ) { + vehicle_stack contents = veh.get_items( *part ); + if( !vp_there.part_with_feature( "CARGO_PASSABLE", false ) && + !vp_there.part_with_feature( "APPLIANCE", false ) && + !vp_there.part_with_feature( "OBSTACLE", false ) ) { + capacity += contents.max_volume(); + free_cargo += contents.free_volume(); + } + } + if( capacity > 0_ml ) { + // First, we'll try to squeeze in. Open-topped vehicle parts have more room to step over cargo. + if( !veh.enclosed_at( here.getlocal( loc ) ) ) { + free_cargo *= 1.2; + } + const creature_size size = get_size(); + units::volume critter_volume; + if( mon ) { + critter_volume = mon->get_volume(); + } else { + critter_volume = size_to_volume( size ); + } + + if( critter_volume > free_cargo ) { + return false; + } + + if( critter_volume > size_to_volume( creature_size::large ) && + !vp_there.part_with_feature( "HUGE_OK", false ) ) { + return false; + } + + if( critter_volume < free_cargo * 1.33 ) { + if( !mon || !( mon->type->bodytype == "snake" || mon->type->bodytype == "blob" || + mon->type->bodytype == "fish" || + has_flag( mon_flag_PLASTIC ) || has_flag( mon_flag_SMALL_HIDER ) ) ) { + cramped = true; + } + } + + if( size == creature_size::huge && !vp_there.part_with_feature( "AISLE", false ) && + !vp_there.part_with_feature( "HUGE_OK", false ) ) { + cramped = true; + } + } + + return true; +} + +bool Creature::can_move_to_vehicle_tile( const tripoint_abs_ms &loc ) const +{ + bool dummy = false; + return can_move_to_vehicle_tile( loc, dummy ); +} + void Creature::move_to( const tripoint_abs_ms &loc ) { const tripoint_abs_ms old_loc = get_location(); diff --git a/src/creature.h b/src/creature.h index bc7b0ee7247cd..3748417a7db3e 100644 --- a/src/creature.h +++ b/src/creature.h @@ -318,6 +318,10 @@ class Creature : public viewer return get_location().z(); } void setpos( const tripoint &p ); + /** Checks if the creature fits into a given tile. Set the boolean argument to true if the creature would barely fit. */ + bool can_move_to_vehicle_tile( const tripoint_abs_ms &loc, bool &cramped ) const; + /** Helper overload for when the boolean is discardable */ + bool can_move_to_vehicle_tile( const tripoint_abs_ms &loc ) const; /** Moves the creature to the given location and calls the on_move() handler. */ void move_to( const tripoint_abs_ms &loc ); diff --git a/src/game.cpp b/src/game.cpp index 5c362bf943639..2b6505973d610 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -245,6 +245,7 @@ static const efftype_id effect_asked_to_train( "asked_to_train" ); static const efftype_id effect_blind( "blind" ); static const efftype_id effect_bouldering( "bouldering" ); static const efftype_id effect_contacts( "contacts" ); +static const efftype_id effect_cramped_space( "cramped_space" ); static const efftype_id effect_docile( "docile" ); static const efftype_id effect_downed( "downed" ); static const efftype_id effect_fake_common_cold( "fake_common_cold" ); @@ -10724,7 +10725,9 @@ bool game::walk_move( const tripoint &dest_loc, const bool via_ramp, const bool } u.set_underwater( false ); - if( vp_there && !u.move_in_vehicle( static_cast( &u ), dest_loc ) ) { + bool cramped = false; + if( vp_there && !u.can_move_to_vehicle_tile( get_map().getglobal( dest_loc ), cramped ) ) { + add_msg( m_warning, _( "There's not enough room for you to fit there." ) ); return false; } @@ -10941,6 +10944,11 @@ bool game::walk_move( const tripoint &dest_loc, const bool via_ramp, const bool start_hauling( oldpos ); } + if( cramped ) { // passed by reference, can_move_to_vehicle_tile sets to true if actually cramped + add_msg( m_warning, _( "You barely fit in this tiny human vehicle." ) ); + u.add_effect( effect_cramped_space, 2_turns, true ); + } + on_move_effects(); return true; diff --git a/src/monmove.cpp b/src/monmove.cpp index cbda3a0a14b7f..52135afd9afa5 100644 --- a/src/monmove.cpp +++ b/src/monmove.cpp @@ -132,64 +132,6 @@ static bool z_is_valid( int z ) return z >= -OVERMAP_DEPTH && z <= OVERMAP_HEIGHT; } -bool monster::monster_move_in_vehicle( const tripoint &p ) const -{ - map &m = get_map(); - monster critter = *this; - const optional_vpart_position vp = m.veh_at( p ); - if( vp.has_value() ) { - vehicle &veh = vp->vehicle(); - units::volume capacity = 0_ml; - units::volume free_cargo = 0_ml; - auto cargo_parts = veh.get_parts_at( p, "CARGO", part_status_flag::any ); - for( vehicle_part *&part : cargo_parts ) { - vehicle_stack contents = veh.get_items( *part ); - if( !vp.part_with_feature( "CARGO_PASSABLE", false ) && - !vp.part_with_feature( "APPLIANCE", false ) && !vp.part_with_feature( "OBSTACLE", false ) ) { - capacity += contents.max_volume(); - free_cargo += contents.free_volume(); - } - } - if( capacity > 0_ml ) { - // First, we'll try to squeeze in. Open-topped vehicle parts have more room to step over cargo. - if( !veh.enclosed_at( p ) ) { - free_cargo *= 1.2; - } - if( !veh.enclosed_at( p ) && flies() ) { - return true; // No amount of cargo will block a flying monster if there's no roof. - } - const creature_size size = get_size(); - if( ( size == creature_size::tiny && free_cargo < 15625_ml ) || - ( size == creature_size::small && free_cargo < 31250_ml ) || - ( size == creature_size::medium && free_cargo < 62500_ml ) || - ( size == creature_size::large && free_cargo < 125000_ml ) || - ( size == creature_size::huge && free_cargo < 250000_ml ) ) { - if( ( size == creature_size::tiny && free_cargo < 11719_ml ) || - ( size == creature_size::small && free_cargo < 23438_ml ) || - ( size == creature_size::medium && free_cargo < 46875_ml ) || - ( size == creature_size::large && free_cargo < 93750_ml ) || - ( size == creature_size::huge && free_cargo < 187500_ml ) || - ( get_volume() > 850000_ml && !vp.part_with_feature( "HUGE_OK", false ) ) ) { - return false; // Return false if there's just no room whatsoever. Anything over 850 liters will simply never fit in a vehicle part that isn't specifically made for it. - // I'm sorry but you can't let a kaiju ride shotgun. - } - if( type->bodytype == "snake" || type->bodytype == "blob" || type->bodytype == "fish" || - has_flag( mon_flag_PLASTIC ) || has_flag( mon_flag_SMALL_HIDER ) ) { - return true; // Return true if we're wiggly enough to be fine with cramped space. - } - critter.add_effect( effect_cramped_space, 2_turns, true ); - return true; // Otherwise we add the effect and return true. - } - if( size == creature_size::huge && !vp.part_with_feature( "AISLE", false ) && - !vp.part_with_feature( "HUGE_OK", false ) ) { - critter.add_effect( effect_cramped_space, 2_turns, true ); - return true; // Sufficiently gigantic creatures have trouble in stock seats, roof or no. - } - } - } - return true; -} - bool monster::will_move_to( const tripoint &p ) const { map &here = get_map(); @@ -1691,7 +1633,8 @@ bool monster::bash_at( const tripoint &p ) return false; } - bool try_bash = !can_move_to( p ) || one_in( 3 ); + const bool too_cramped = !can_move_to_vehicle_tile( get_map().getglobal( p ) ); + bool try_bash = !can_move_to( p ) || one_in( 3 ) || too_cramped; if( !try_bash ) { return false; } @@ -1701,7 +1644,7 @@ bool monster::bash_at( const tripoint &p ) } map &here = get_map(); - if( !( here.is_bashable_furn( p ) || here.veh_at( p ).obstacle_at_part() ) ) { + if( !( here.is_bashable_furn( p ) || here.veh_at( p ).obstacle_at_part() || too_cramped ) ) { // if the only thing here is road or flat, rarely bash it bool flat_ground = here.has_flag( ter_furn_flag::TFLAG_ROAD, p ) || here.has_flag( ter_furn_flag::TFLAG_FLAT, p ); @@ -1872,7 +1815,8 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, } } - if( here.veh_at( p ).part_with_feature( VPFLAG_CARGO, true ) && !monster_move_in_vehicle( p ) ) { + bool cramped = false; // applies an effect if monster does end up moving there + if( !can_move_to_vehicle_tile( here.getglobal( p ), cramped ) ) { return false; } @@ -1970,6 +1914,9 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, optional_vpart_position vp_dest = here.veh_at( destination ); if( vp_dest ) { vp_dest->vehicle().invalidate_mass(); + if( cramped ) { + add_effect( effect_cramped_space, 2_turns, true ); + } } if( is_hallucination() ) { //Hallucinations don't do any of the stuff after this point diff --git a/src/monster.cpp b/src/monster.cpp index f3d567e159eca..4c1b8d67baa64 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -3357,54 +3357,10 @@ void monster::process_effects() } } - // Apply or remove the cramped_space effect, which needs specific information about the monster's surroundings. - map &here = get_map(); - const tripoint z_pos = pos(); - const optional_vpart_position vp = here.veh_at( z_pos ); - if( has_effect( effect_cramped_space ) && !vp.has_value() ) { - remove_effect( effect_cramped_space ); - } - if( vp.has_value() ) { - vehicle &veh = vp->vehicle(); - units::volume capacity = 0_ml; - units::volume free_cargo = 0_ml; - auto cargo_parts = veh.get_parts_at( z_pos, "CARGO", part_status_flag::any ); - for( vehicle_part *&part : cargo_parts ) { - vehicle_stack contents = veh.get_items( *part ); - const vpart_info &vpinfo = part->info(); - if( !vp.part_with_feature( "CARGO_PASSABLE", false ) ) { - capacity += vpinfo.size; - free_cargo += contents.free_volume(); - } - } - const creature_size size = get_size(); - if( capacity > 0_ml ) { - // Open-topped vehicle parts have more room, and are always free space for fliers. - if( !veh.enclosed_at( z_pos ) ) { - free_cargo *= 1.2; - if( flies() ) { - remove_effect( effect_cramped_space ); - return; - } - } - if( ( size == creature_size::tiny && free_cargo < 15625_ml ) || - ( size == creature_size::small && free_cargo < 31250_ml ) || - ( size == creature_size::medium && free_cargo < 62500_ml ) || - ( size == creature_size::large && free_cargo < 125000_ml ) || - ( size == creature_size::huge && free_cargo < 250000_ml ) ) { - if( !has_effect( effect_cramped_space ) ) { - add_effect( effect_cramped_space, 2_turns, true ); - } - return; - } - } - if( get_size() == creature_size::huge && !vp.part_with_feature( "AISLE", false ) && - !vp.part_with_feature( "HUGE_OK", false ) ) { - if( !has_effect( effect_cramped_space ) ) { - add_effect( effect_cramped_space, 2_turns, true ); - } - return; - } + bool cramped = false; + // return is intentionally discarded, sets cramped if appropriate + can_move_to_vehicle_tile( get_map().getglobal( pos() ), cramped ); + if( !cramped ) { remove_effect( effect_cramped_space ); } diff --git a/src/monster.h b/src/monster.h index ac1ec921d0fb1..a4c334b18496f 100644 --- a/src/monster.h +++ b/src/monster.h @@ -214,8 +214,6 @@ class monster : public Creature bool will_move_to( const tripoint &p ) const; bool know_danger_at( const tripoint &p ) const; - bool monster_move_in_vehicle( const tripoint &p ) const; - bool will_reach( const point &p ); // Do we have plans to get to (x, y)? int turns_to_reach( const point &p ); // How long will it take? diff --git a/src/npc.cpp b/src/npc.cpp index c75b92c6a74e5..6d27ccb1f1c73 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -3357,8 +3357,14 @@ std::unordered_set npc::get_path_avoid() const } for( const tripoint &p : here.points_in_radius( pos(), 6 ) ) { - if( sees_dangerous_field( p ) || ( here.veh_at( p ).part_with_feature( VPFLAG_CARGO, true ) && - !move_in_vehicle( const_cast( this ), p ) ) ) { + if( sees_dangerous_field( p ) ) { + ret.insert( p ); + } + } + + // Why is this in path avoid if they can't move there at all? + for( const tripoint &p : here.points_in_radius( pos(), 6 ) ) { + if( !can_move_to_vehicle_tile( here.getglobal( p ) ) ) { ret.insert( p ); } } diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 6b841d3eb3a62..4c2a0632c5a83 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -119,6 +119,7 @@ static const efftype_id effect_bite( "bite" ); static const efftype_id effect_bleed( "bleed" ); static const efftype_id effect_bouldering( "bouldering" ); static const efftype_id effect_catch_up( "catch_up" ); +static const efftype_id effect_cramped_space( "cramped_space" ); static const efftype_id effect_disinfected( "disinfected" ); static const efftype_id effect_hit_by_player( "hit_by_player" ); static const efftype_id effect_hypovolemia( "hypovolemia" ); @@ -403,7 +404,7 @@ bool npc::could_move_onto( const tripoint &p ) const if( !here.passable( p ) ) { return false; } - if( !move_in_vehicle( const_cast( this ), p ) ) { + if( !can_move_to_vehicle_tile( here.getglobal( p ) ) ) { return false; } @@ -2898,7 +2899,7 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo } } - if( here.veh_at( p ).part_with_feature( VPFLAG_CARGO, true ) && !move_in_vehicle( this, p ) ) { + if( !can_move_to_vehicle_tile( here.getglobal( p ) ) ) { auto other_points = here.get_dir_circle( pos(), p ); for( const tripoint &ot : other_points ) { if( could_move_onto( ot ) && ( nomove == nullptr || nomove->find( ot ) == nomove->end() ) ) { @@ -3141,6 +3142,17 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo } here.creature_on_trap( *this ); here.creature_in_field( *this ); + + bool cramped = false; + if( !can_move_to_vehicle_tile( here.getglobal( p ), cramped ) ) { + debugmsg( "NPC %s somehow moved to a too-cramped vehicle tile", disp_name() ); + } else if( cramped ) { //set by above call to Creature::can_move_to_vehicle_tile + if( !has_effect( effect_cramped_space ) ) { + add_msg_if_player_sees( *this, m_warning, + string_format( _( "%s has to really cram their huge body to fit." ), disp_name() ) ); + } + add_effect( effect_cramped_space, 2_turns, true ); + } } } From bac4b1046b1381a5a4c5d92c7b1e8878e58935d5 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Thu, 23 May 2024 21:15:42 +0200 Subject: [PATCH 21/23] Explicit roofs on workshop version 2 expansion (#74018) * Explicit roofs on workshop version 2 expansion * Update data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_common.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../version_2/modular_workshop_common.json | 55 ++--- .../modular_workshop_construction.json | 220 +++++++++++++++++- .../version_2/modular_workshop_palettes.json | 79 ++++++- 3 files changed, 307 insertions(+), 47 deletions(-) diff --git a/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_common.json b/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_common.json index 0e6af01a11217..0ed9f49f4d1ae 100644 --- a/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_common.json +++ b/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_common.json @@ -1,26 +1,4 @@ [ - { - "type": "palette", - "id": "fbmw_2_common_palette", - "terrain": { ";": "t_dirt" }, - "furniture": { - "t": "f_table", - "L": "f_dresser", - "x": "f_kiln_empty", - "f": "f_forge_rock", - "c": "f_workbench", - "h": "f_stool", - "A": "f_anvil", - "r": "f_rack_wood", - "Q": "f_bellows", - "b": "f_bench", - "z": "f_55gal_firebarrel", - "k": "f_clay_kiln", - "M": "f_armchair", - "B": "f_bookcase", - ";": "f_clear" - } - }, { "type": "mapgen", "method": "json", @@ -69,10 +47,11 @@ "method": "json", "object": { "set": [ - { "point": "furniture", "id": "f_fireplace", "x": 14, "y": 17 }, - { "point": "furniture", "id": "f_forge_rock", "x": 16, "y": 17 }, - { "point": "furniture", "id": "f_table", "x": 17, "y": 17 }, - { "point": "furniture", "id": "f_dresser", "x": 18, "y": 17 } + { "point": "furniture", "id": "f_fireplace", "x": 14, "y": 17, "z": 0 }, + { "point": "furniture", "id": "f_chimney", "x": 14, "y": 17, "z": 1 }, + { "point": "furniture", "id": "f_forge_rock", "x": 16, "y": 17, "z": 0 }, + { "point": "furniture", "id": "f_table", "x": 17, "y": 17, "z": 0 }, + { "point": "furniture", "id": "f_dresser", "x": 18, "y": 17, "z": 0 } ], "place_loot": [ { "item": "makeshift_hammer", "x": 17, "y": 17, "chance": 100 } ] } @@ -83,8 +62,8 @@ "method": "json", "object": { "set": [ - { "point": "furniture", "id": "f_kiln_empty", "x": 17, "y": 14 }, - { "point": "furniture", "id": "f_kiln_empty", "x": 18, "y": 14 } + { "point": "furniture", "id": "f_kiln_empty", "x": 17, "y": 14, "z": 0 }, + { "point": "furniture", "id": "f_kiln_empty", "x": 18, "y": 14, "z": 0 } ], "place_loot": [ { "item": "crucible", "x": 17, "y": 17, "chance": 100 } ] } @@ -154,7 +133,12 @@ "type": "mapgen", "update_mapgen_id": "fbmw_2_common_pottery", "method": "json", - "object": { "set": [ { "point": "furniture", "id": "f_clay_kiln", "x": 1, "y": 18 } ] } + "object": { + "set": [ + { "point": "furniture", "id": "f_clay_kiln", "x": 1, "y": 18, "z": 0 }, + { "point": "furniture", "id": "f_chimney", "x": 1, "y": 18, "z": 1 } + ] + } }, { "type": "mapgen", @@ -184,12 +168,13 @@ "method": "json", "object": { "set": [ - { "point": "furniture", "id": "f_bookcase", "x": 1, "y": 8 }, - { "point": "furniture", "id": "f_forge_rock", "x": 3, "y": 8 }, - { "point": "furniture", "id": "f_bookcase", "x": 1, "y": 9 }, - { "point": "furniture", "id": "f_bookcase", "x": 1, "y": 10 }, - { "point": "furniture", "id": "f_armchair", "x": 2, "y": 10 }, - { "point": "furniture", "id": "f_workbench", "x": 3, "y": 10 } + { "point": "furniture", "id": "f_bookcase", "x": 1, "y": 8, "z": 0 }, + { "point": "furniture", "id": "f_forge_rock", "x": 3, "y": 8, "z": 0 }, + { "point": "furniture", "id": "f_chimney", "x": 3, "y": 8, "z": 1 }, + { "point": "furniture", "id": "f_bookcase", "x": 1, "y": 9, "z": 0 }, + { "point": "furniture", "id": "f_bookcase", "x": 1, "y": 10, "z": 0 }, + { "point": "furniture", "id": "f_armchair", "x": 2, "y": 10, "z": 0 }, + { "point": "furniture", "id": "f_workbench", "x": 3, "y": 10, "z": 0 } ], "place_loot": [ { "item": "tongs", "x": 3, "y": 10, "chance": 100 }, diff --git a/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_construction.json b/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_construction.json index 6c3d38d440911..b69a938405401 100644 --- a/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_construction.json +++ b/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_construction.json @@ -35,11 +35,51 @@ "palettes": [ { "param": "fbmw_2_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbmw_2_smithy_1_roof_construction", + "object": { + "parameters": { + "fbmw_2_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbmw_2_concrete_palette", + "fbmw_2_log_palette", + "fbmw_2_metal_palette", + "fbmw_2_migo_resin_palette", + "fbmw_2_rammed_earth_palette", + "fbmw_2_rock_palette", + "fbmw_2_wad_palette", + "fbmw_2_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + "rrrrrr", + "rrrrrr", + "rrrrrr", + "rrrrrr", + "rrrrrr", + "rrrrrr" + ], + "palettes": [ { "param": "fbmw_2_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbmw_2_smithy_1_construction", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmw_2_smithy_1_construction" ], "x": 14, "y": 17 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbmw_2_smithy_1_construction" ], "x": 14, "y": 17, "z": 0 }, + { "chunks": [ "fbmw_2_smithy_1_roof_construction" ], "x": 14, "y": 17, "z": 1 } + ] + } }, { "type": "mapgen", @@ -77,11 +117,51 @@ "palettes": [ { "param": "fbmw_2_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbmw_2_smithy_2_roof_construction", + "object": { + "parameters": { + "fbmw_2_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbmw_2_concrete_palette", + "fbmw_2_log_palette", + "fbmw_2_metal_palette", + "fbmw_2_migo_resin_palette", + "fbmw_2_rammed_earth_palette", + "fbmw_2_rock_palette", + "fbmw_2_wad_palette", + "fbmw_2_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + " rrrr", + " rrrr", + "rrrrrr", + " ", + " ", + " " + ], + "palettes": [ { "param": "fbmw_2_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbmw_2_smithy_2_construction", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmw_2_smithy_2_construction" ], "x": 14, "y": 14 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbmw_2_smithy_2_construction" ], "x": 14, "y": 14, "z": 0 }, + { "chunks": [ "fbmw_2_smithy_2_roof_construction" ], "x": 14, "y": 14, "z": 1 } + ] + } }, { "type": "mapgen", @@ -121,11 +201,53 @@ "palettes": [ { "param": "fbmw_2_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbmw_2_pottery_roof_construction", + "object": { + "parameters": { + "fbmw_2_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbmw_2_concrete_palette", + "fbmw_2_log_palette", + "fbmw_2_metal_palette", + "fbmw_2_migo_resin_palette", + "fbmw_2_rammed_earth_palette", + "fbmw_2_rock_palette", + "fbmw_2_wad_palette", + "fbmw_2_wood_palette" + ] + } + } + }, + "mapgensize": [ 8, 8 ], + "rows": [ + "rrrrrrrr", + "rrrrrrrr", + "rrrrrrrr", + "rrrrrrrr", + "rrrrrrrr", + "rrrrrrrr", + "rrrrrrrr", + " " + ], + "palettes": [ { "param": "fbmw_2_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbmw_2_pottery_construction", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmw_2_pottery_construction" ], "x": 0, "y": 16 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbmw_2_pottery_construction" ], "x": 0, "y": 16, "z": 0 }, + { "chunks": [ "fbmw_2_pottery_roof_construction" ], "x": 0, "y": 16, "z": 1 } + ] + } }, { "type": "mapgen", @@ -164,11 +286,52 @@ "palettes": [ { "param": "fbmw_2_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbmw_2_smithy_3_roof_construction", + "object": { + "parameters": { + "fbmw_2_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbmw_2_concrete_palette", + "fbmw_2_log_palette", + "fbmw_2_metal_palette", + "fbmw_2_migo_resin_palette", + "fbmw_2_rammed_earth_palette", + "fbmw_2_rock_palette", + "fbmw_2_wad_palette", + "fbmw_2_wood_palette" + ] + } + } + }, + "mapgensize": [ 7, 7 ], + "rows": [ + "rrrrrr ", + "rrrrrr ", + "rrrrrr ", + "rrrrrr ", + "rrrrrr ", + "rrrrrr ", + "rrrrrr " + ], + "palettes": [ { "param": "fbmw_2_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbmw_2_smithy_3_construction", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmw_2_smithy_3_construction" ], "x": 8, "y": 16 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbmw_2_smithy_3_construction" ], "x": 8, "y": 16, "z": 0 }, + { "chunks": [ "fbmw_2_smithy_3_roof_construction" ], "x": 8, "y": 16, "z": 1 } + ] + } }, { "type": "mapgen", @@ -206,11 +369,51 @@ "palettes": [ { "param": "fbmw_2_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbmw_2_6x5_roof_construction", + "object": { + "parameters": { + "fbmw_2_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbmw_2_concrete_palette", + "fbmw_2_log_palette", + "fbmw_2_metal_palette", + "fbmw_2_migo_resin_palette", + "fbmw_2_rammed_earth_palette", + "fbmw_2_rock_palette", + "fbmw_2_wad_palette", + "fbmw_2_wood_palette" + ] + } + } + }, + "mapgensize": [ 6, 6 ], + "rows": [ + "rrrrrr", + "rrrrrr", + "rrrrrr", + "rrrrrr", + "rrrrrr", + " " + ], + "palettes": [ { "param": "fbmw_2_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbmw_2_glassblower_construction", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmw_2_glassblower_construction" ], "x": 0, "y": 7 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbmw_2_glassblower_construction" ], "x": 0, "y": 7, "z": 0 }, + { "chunks": [ "fbmw_2_6x5_roof_construction" ], "x": 0, "y": 7, "z": 1 } + ] + } }, { "type": "mapgen", @@ -252,6 +455,11 @@ "type": "mapgen", "update_mapgen_id": "fbmw_2_tanner_construction", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmw_2_tanner_construction" ], "x": 14, "y": 0 } ] } + "object": { + "place_nested": [ + { "chunks": [ "fbmw_2_tanner_construction" ], "x": 14, "y": 0, "z": 0 }, + { "chunks": [ "fbmw_2_6x5_roof_construction" ], "x": 14, "y": 0, "z": 1 } + ] + } } ] diff --git a/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_palettes.json b/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_palettes.json index a1269f7eb4e80..593d2ed5fdbf9 100644 --- a/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_palettes.json +++ b/data/json/mapgen/basecamps/expansion/modular_workshop/version_2/modular_workshop_palettes.json @@ -1,26 +1,77 @@ [ + { + "type": "palette", + "id": "fbmw_2_common_palette", + "terrain": { ";": "t_dirt" }, + "furniture": { + ";": "f_clear", + "A": "f_anvil", + "b": "f_bench", + "B": "f_bookcase", + "c": "f_workbench", + "C": "f_chimney", + "f": "f_forge_rock", + "h": "f_stool", + "k": "f_clay_kiln", + "L": "f_dresser", + "M": "f_armchair", + "Q": "f_bellows", + "r": "f_rack_wood", + "t": "f_table", + "x": "f_kiln_empty", + "z": "f_55gal_firebarrel" + } + }, { "type": "palette", "id": "fbmw_2_concrete_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_thconc_floor", "+": "t_door_metal_c", "v": "t_window_no_curtains", "w": "t_sconc_wall" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_thconc_floor", + "+": "t_door_metal_c", + "r": "t_concrete_roof", + "v": "t_window_no_curtains", + "w": "t_sconc_wall" + }, "furniture": { } }, { "type": "palette", "id": "fbmw_2_log_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_wall_log" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_floor", + "+": "t_door_c", + "r": "t_wood_treated_roof", + "v": "t_window_no_curtains", + "w": "t_wall_log" + }, "furniture": { } }, { "type": "palette", "id": "fbmw_2_metal_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_scrap_floor", "+": "t_door_metal_c", "v": "t_window_no_curtains", "w": "t_scrap_wall" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_scrap_floor", + "+": "t_door_metal_c", + "r": "t_metal_flat_roof", + "v": "t_window_no_curtains", + "w": "t_scrap_wall" + }, "furniture": { } }, { "type": "palette", "id": "fbmw_2_migo_resin_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_floor_resin", "+": "t_resin_hole_c", "v": "t_wall_resin_cage", "w": "t_wall_resin" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_floor_resin", + "+": "t_resin_hole_c", + "r": "t_resin_roof", + "v": "t_wall_resin_cage", + "w": "t_wall_resin" + }, "furniture": { } }, { @@ -30,6 +81,7 @@ ",": "t_dirtfloor", ".": "t_floor_primitive", "+": "t_door_makeshift_c", + "r": "t_log_sod_roof", "v": "t_window_empty", "w": "t_wall_rammed_earth" }, @@ -38,7 +90,14 @@ { "type": "palette", "id": "fbmw_2_rock_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_rock_wall" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_floor", + "+": "t_door_c", + "r": "t_wood_treated_roof", + "v": "t_window_no_curtains", + "w": "t_rock_wall" + }, "furniture": { } }, { @@ -48,6 +107,7 @@ ",": "t_dirtfloor", ".": "t_floor_primitive", "+": "t_door_makeshift_c", + "r": "t_log_sod_roof", "v": "t_wall_wattle_half", "w": "t_wall_wattle" }, @@ -56,7 +116,14 @@ { "type": "palette", "id": "fbmw_2_wood_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_wall_wood" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_floor", + "+": "t_door_c", + "r": "t_wood_treated_roof", + "v": "t_window_no_curtains", + "w": "t_wall_wood" + }, "furniture": { } } ] From 23b70a44a120597d6f239971beb663cf3f5c58cf Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Thu, 23 May 2024 21:17:22 +0200 Subject: [PATCH 22/23] added roof to A/C carrier (#74019) --- .../aircraft_carrier/aircraft_carrier_z2.json | 2 +- .../aircraft_carrier/aircraft_carrier_z4.json | 61 +++++++++++++++++++ .../aircraft_carrier_palette.json | 7 ++- .../overmap_special/aircraft_carrier.json | 4 +- .../overmap_terrain_aircraft_carrier.json | 4 +- 5 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 data/json/mapgen/aircraft_carrier/aircraft_carrier_z4.json diff --git a/data/json/mapgen/aircraft_carrier/aircraft_carrier_z2.json b/data/json/mapgen/aircraft_carrier/aircraft_carrier_z2.json index b48b57daac558..e023b59270169 100644 --- a/data/json/mapgen/aircraft_carrier/aircraft_carrier_z2.json +++ b/data/json/mapgen/aircraft_carrier/aircraft_carrier_z2.json @@ -289,7 +289,7 @@ "πππππππππππππππππ-1111111111118111111311111111111111-πππππππππππππππππππ", "πππππππππππππππππ-1111111111113111111311111111111111-πππππππππππππππππππ", "πππππππππππππππππ-1111111111113111111811111111111111-πππππππππππππππππππ", - "πππππππππππππππππ-1111111111118111111811111111111111-πππππππππππππππππππ", + "πππππππππππππππππ-111111111111811111181111111111111--πππππππππππππππππππ", "πππππππππππππππππ-111111111118111111131111111111111-ππππππππππππππππππππ", "πππππππππππππππππ-111111111113111111131111111111111-ππππππππππππππππππππ", "πππππππππππππππππ-111111111113111111181111111111111-ππππππππππππππππππππ", diff --git a/data/json/mapgen/aircraft_carrier/aircraft_carrier_z4.json b/data/json/mapgen/aircraft_carrier/aircraft_carrier_z4.json new file mode 100644 index 0000000000000..86b698d4dc25d --- /dev/null +++ b/data/json/mapgen/aircraft_carrier/aircraft_carrier_z4.json @@ -0,0 +1,61 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "aircraft_carrier_1a_4" ], [ "aircraft_carrier_2a_4" ] ], + "object": { + "fill_ter": "t_metal_roof", + "rows": [ + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππππππππππππππππππ", + "ππππππππööööööööππππππππ", + "πππππππööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööoöööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööÄöööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "ππππππöööööööööööπππππππ", + "πππππöööööööööööööππππππ", + "πππöööööööööööööööööππππ", + "πππöööööööööööööööööππππ", + "πππöööööööööööööööööππππ", + "ππππöööööööoööööööööππππ", + "ππππöööööööööööööööπππππ", + "ππππöööööööööööööööπππππ", + "ππππöööööööööööööööπππππ", + "ππππöööööööööööööööπππππ", + "πππππöööööööööööööππππππ", + "πππππöööööööööööööππππππ", + "πππππöööööööööööööππππππ", + "ππππππööÖÖÖÖÖÖÖööπππππππ", + "πππππππööööööööööπππππππ" + ], + "palettes": [ "aircraft_carrier_palette" ] + } + } +] diff --git a/data/json/mapgen_palettes/aircraft_carrier_palette.json b/data/json/mapgen_palettes/aircraft_carrier_palette.json index f8e03cab42533..f42f99dbe43e8 100644 --- a/data/json/mapgen_palettes/aircraft_carrier_palette.json +++ b/data/json/mapgen_palettes/aircraft_carrier_palette.json @@ -35,7 +35,8 @@ " ": "t_water_dp", "g": "t_switchgear_s", "ω": "t_metal_floor", - "ξ": "t_deck_coating_no_roof" + "ξ": "t_deck_coating_no_roof", + "ö": "t_metal_roof" }, "furniture": { "θ": "f_rack", @@ -114,7 +115,9 @@ "Λ": "f_bed", "μ": "f_rack", "β": "f_counter", - "Δ": "f_counter" + "Δ": "f_counter", + "Ö": "f_small_satellite_dish", + "Ä": "f_cellphone_booster" }, "items": { "M": [ diff --git a/data/json/overmap/overmap_special/aircraft_carrier.json b/data/json/overmap/overmap_special/aircraft_carrier.json index 15e1169a8b994..9e98bf38002b7 100644 --- a/data/json/overmap/overmap_special/aircraft_carrier.json +++ b/data/json/overmap/overmap_special/aircraft_carrier.json @@ -196,7 +196,9 @@ { "point": [ 1, 12, 2 ], "overmap": "aircraft_carrier_13b_2_north" }, { "point": [ 2, 12, 2 ], "overmap": "aircraft_carrier_13c_2_north" }, { "point": [ 2, 5, 3 ], "overmap": "aircraft_carrier_1a_3_north" }, - { "point": [ 2, 6, 3 ], "overmap": "aircraft_carrier_2a_3_north" } + { "point": [ 2, 6, 3 ], "overmap": "aircraft_carrier_2a_3_north" }, + { "point": [ 2, 5, 4 ], "overmap": "aircraft_carrier_1a_4_north" }, + { "point": [ 2, 6, 4 ], "overmap": "aircraft_carrier_2a_4_north" } ], "city_distance": [ -1, 1000 ], "locations": [ "lake_surface" ], diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_aircraft_carrier.json b/data/json/overmap/overmap_terrain/overmap_terrain_aircraft_carrier.json index a7c8b169045bf..fdb1377a37453 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_aircraft_carrier.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_aircraft_carrier.json @@ -120,7 +120,9 @@ "aircraft_carrier_13b_2", "aircraft_carrier_13c_2", "aircraft_carrier_1a_3", - "aircraft_carrier_2a_3" + "aircraft_carrier_2a_3", + "aircraft_carrier_1a_4", + "aircraft_carrier_2a_4" ], "name": "aircraft carrier", "sym": "A", From 9e4e759b5d1f28c14e99ae8fce849007d21d66f6 Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Thu, 23 May 2024 14:53:38 -0500 Subject: [PATCH 23/23] [MoM] Allow people to ask Rubik about the alien flora scattered around (#72581) * Initial commit * Edit word choice * Add more dialogue * Spacing * Finish dialogue * Update data/mods/MindOverMatter/npcs/dialogue/Rubik.json * Update data/mods/MindOverMatter/npcs/dialogue/Rubik.json --------- Co-authored-by: Maleclypse <54345792+Maleclypse@users.noreply.github.com> --- .../MindOverMatter/npcs/dialogue/Rubik.json | 86 ++++++++++++++++++- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/data/mods/MindOverMatter/npcs/dialogue/Rubik.json b/data/mods/MindOverMatter/npcs/dialogue/Rubik.json index efcd21165fa5b..850623df17a61 100644 --- a/data/mods/MindOverMatter/npcs/dialogue/Rubik.json +++ b/data/mods/MindOverMatter/npcs/dialogue/Rubik.json @@ -1,4 +1,82 @@ [ + { + "id": [ "TALK_EXODII_MERCHANT_Talk" ], + "type": "talk_topic", + "insert_before_standard_exits": true, + "responses": [ + { + "text": "What's with those clusters of weird plants I've seen around?", + "topic": "TALK_EXODII_MERCHANT_alien_flora", + "condition": { "math": [ "time_since('cataclysm', 'unit':'days') >= 30" ] } + } + ] + }, + { + "id": [ "TALK_EXODII_MERCHANT_alien_flora" ], + "type": "talk_topic", + "dynamic_line": { + "//~": "Oh, right, the alien plants. The portals bring them. As far as I've seen in the past, it's just going to keep getting worse.", + "str": "Sure, the plants o' otherworlds. Them as comes from the wibbles. Like as this'n's seen, 'tis all down 'n down, an I'm ken." + }, + "responses": [ + { + "text": " 'Down 'n down'? So it's going to keep happening until…what?", + "topic": "TALK_EXODII_MERCHANT_alien_flora2" + }, + { + "text": "From the portals…like you, right? You've seen this before?", + "topic": "TALK_EXODII_MERCHANT_alien_flora_source", + "condition": { "u_has_var": "knowledge_exodii_transdimensional_u_knows_exodiilore", "value": "yes" } + }, + { "text": "Can we talk about something else?", "topic": "TALK_EXODII_MERCHANT_Talk" }, + { "text": "I've gotta go. See you later, Rubik.", "topic": "TALK_DONE" } + ] + }, + { + "id": [ "TALK_EXODII_MERCHANT_alien_flora2" ], + "type": "talk_topic", + "dynamic_line": { + "//~": "Until the normal world is covered in alien biomes and then all falls to dust. That's just how it goes.", + "str": "Til the green and brown be yellowred and blue afore it be to grey and black. 'Tis the course." + }, + "responses": [ + { + "text": "Is there any way to stop it? Can we cut them down or burn them or something?", + "topic": "TALK_EXODII_MERCHANT_alien_flora_burn" + }, + { "text": "The course? What's going to happen?", "topic": "TALK_EXODII_MERCHANT_Talk_CataclysmTimeline" }, + { "text": "Can we talk about something else?", "topic": "TALK_EXODII_MERCHANT_Talk" }, + { "text": "I've gotta go. See you later, Rubik.", "topic": "TALK_DONE" } + ] + }, + { + "id": [ "TALK_EXODII_MERCHANT_alien_flora_burn" ], + "type": "talk_topic", + "dynamic_line": { + "//~": "You could burn it, but the portals will just bring it back. No, there's no stopping it at this point. Even if you burned every single one you found, you're just one person and there's an endless supply of them, so it's futile. There's only one way this goes.", + "str": "Aye, mayhap, but more'll dribble through the wobbles. You can't athwart all o' the bridges. If'n you light each and every, you're only one against many. 'Twould be no point. The road only goes one way." + }, + "responses": [ + { "text": "Well, we'll see about that. Can we talk about something else?", "topic": "TALK_EXODII_MERCHANT_Talk" }, + { "text": "I've gotta go. See you later, Rubik.", "topic": "TALK_DONE" } + ] + }, + { + "id": [ "TALK_EXODII_MERCHANT_alien_flora_source" ], + "type": "talk_topic", + "dynamic_line": { + "//~": "Many times. It doesn't always go the same, and sometimes they only show up right before we leave the world, but they always do.", + "str": "Time an' time.\" Rubik pauses for a moment. \"There be eddies and ripples, aye, an' sometime they come just afore we make to wobble on, but they surely do." + }, + "responses": [ + { + "text": "Is there any way to stop it? Can we cut them down or burn them or something?", + "topic": "TALK_EXODII_MERCHANT_alien_flora_burn" + }, + { "text": "Can we talk about something else?", "topic": "TALK_EXODII_MERCHANT_Talk" }, + { "text": "I've gotta go. See you later, Rubik.", "topic": "TALK_DONE" } + ] + }, { "id": [ "TALK_EXODII_MERCHANT_New", "TALK_EXODII_MERCHANT_Talk" ], "type": "talk_topic", @@ -37,7 +115,7 @@ { "id": [ "TALK_EXODII_MERCHANT_scan" ], "type": "talk_topic", - "dynamic_line": "&You weren't expecting to be able to understand Rubik's thoughts. Whatever language it is he speaks, this \"Anglic\", the resemblance to English is clearly a fortunate coincidence. But you are surprised that your telepathic scan doesn't pick up anything at all. Just a faint static hum, rising and falling in an irregular pattern.", + "dynamic_line": "&You weren't expecting to be able to understand Rubik's thoughts. Whatever language it is, this \"Anglic\", the resemblance to English is clearly a fortunate coincidence. But you are surprised that your telepathic scan doesn't pick up anything at all. Just a faint static hum, rising and falling in an irregular pattern.", "responses": [ { "text": "*Withdraw from 's mind*.", "topic": "TALK_EXODII_MERCHANT_Talk" }, { @@ -50,13 +128,13 @@ { "id": [ "TALK_EXODII_MERCHANT_deep_scan" ], "type": "talk_topic", - "dynamic_line": "&Your awareness of the outside world fades as you fall into Rubik's mind.\n\nYou see a young boy in a thriving metropolis, doing odd jobs for spare coins, playing in the alleys with his friends, coming home at dusk for supper. You see a young man running from a group of zombies. You see this castle, or near enough--some towers are missing, some missing towers are there, but obviously the same--and its denizens fending off an attack from a group of winged things. You see a conversation in a language you've never heard before among a group of Exodii, before everyone files into rooms, secures themselves with restraints, and there's a brief moment of searing pain and then darkness, filled with static and bursts of light half-glimpsed in your peripheral vision.\n\nYou see worlds. World after world, in a procession over…decades? Centuries? You can't tell; you have no sense of time during the vision. Most worlds were less advanced than the Earth, and the few survivors fought the dead with human wave tactics and trench warfare, or lines of musketeers, or archers from behind the trees. Sometimes, doughty warriors clad in iron or bronze hurled themselves at the enemy with sword and shield in hand, until they fell and their corpses rose again. In one world, the survivors fought with powered armor and particle-beam weapons. But on every world, slowly, inexorably, the dead or the fungus or the walking trees ground down the defenders until humanity was on the brink of extinction and, with a few survivors in tow, the Exodii powered up their jump devices and continued the Long Retreat.\n\nIn the end, not once, in a dozen or a hundred or you know not how many worlds, was there anything left to save.", - "responses": [ { "text": "*Withdraw from his mind*.", "topic": "TALK_EXODII_MERCHANT_Post_Scan" } ] + "dynamic_line": "&Your awareness of the outside world fades as you fall into Rubik's mind.\n\nYou see a child in a thriving metropolis, doing odd jobs for spare coins, playing in the alleys with friends, coming home at dusk for supper. You see a young adult running from a group of zombies. You see this castle, or near enough--some towers are missing, some missing towers are there, but obviously the same--and its denizens fending off an attack from a group of winged things. You see a conversation in a language you've never heard before among a group of Exodii, before everyone files into rooms, secures themselves with restraints, and there's a brief moment of searing pain and then darkness, filled with static and bursts of light half-glimpsed in your peripheral vision.\n\nYou see worlds. World after world, in a procession over…decades? Centuries? You can't tell; you have no sense of time during the vision. Most worlds were less advanced than the Earth, and the few survivors fought the dead with human wave tactics and trench warfare, or lines of musketeers, or archers from behind the trees. Sometimes, doughty warriors clad in iron or bronze hurled themselves at the enemy with sword and shield in hand, until they fell and their corpses rose again. In one world, the survivors fought with powered armor and particle-beam weapons. But on every world, slowly, inexorably, the dead or the fungus or the walking trees or things you have no name for ground down the defenders until humanity was on the brink of extinction and, with a few survivors in tow, the Exodii powered up their jump devices and continued the Long Retreat.\n\nIn the end, not once, in a dozen or a hundred or you know not how many worlds, was there anything left to save.", + "responses": [ { "text": "*Withdraw from Rubik's mind*.", "topic": "TALK_EXODII_MERCHANT_Post_Scan" } ] }, { "id": [ "TALK_EXODII_MERCHANT_Post_Scan" ], "type": "talk_topic", - "dynamic_line": "&Rubik is looking at you oddly. Whatever he had been saying before, he's stopped.", + "dynamic_line": "&Rubik is looking at you oddly. The silence is palpable.", "responses": [ { "text": "Sorry, I must have zoned out for a moment there. It's been a long day. You were saying?",