diff --git a/data/changelog.txt b/data/changelog.txt index 31277f9452b0b..34e7852175db3 100644 --- a/data/changelog.txt +++ b/data/changelog.txt @@ -840,7 +840,7 @@ Transformed active mutations (extended claws etc) properly cause instability Only count CONTAINER type pockets in the pickup inventory Allow select-all when highlighted item is non-selectable Eddie can talk about his father. -Fixes issue where ImGui popup doesnt wrap buttons to a new line when the overall length is too long +Fixes issue where ImGui popup doesn't wrap buttons to a new line when the overall length is too long Wet Towels No Longer Prompt to be Turned Off Maybe prevent rare crater generation error AIM: Now moving all items will not move favourite items, if other items are present. @@ -1000,7 +1000,7 @@ Adds VS Code Dev Containers & Workspace Config Allow for cross-compiling from Linux to Windows in Devcontainer Faster local VS builds Fast Windows iteration with llvm-lib and lld-link -Cross compile object creator from linux to Windows using Devcontainer +Cross compile object creator from Linux to Windows using Devcontainer add object creator to releases Add a launch and debug configuration to VS Code Dev Container Enable tests for merge queue @@ -1014,7 +1014,7 @@ Update Flatpak manifest to use clang and include the default soundpack stl_emulation span::count_ is not const anymore No longer build object creator in CI nor include it in releases Add PDCurses to Windows -Fixed linux experimental build automation issues caused by SDL dependencies +Fixed Linux experimental build automation issues caused by SDL dependencies ## I18N and A11Y: @@ -1134,7 +1134,7 @@ Hunted scenario adds a nemesis zombie chasing the PC Practice recipes Player can nickname monsters All items can have cosmetic variants now -Tons of work on zones, such as personal zones, dissasembly zones and automop zones +Tons of work on zones, such as personal zones, disassembly zones and automop zones Allow non-debug change of gender, hair, facial hair, eye and skin color Books can now be copied into a variety of condensing items: ebooks, book binders etc PC can track their adventure in their diary @@ -1258,7 +1258,7 @@ Show properly-fitted clothing in the crafting screen Progress update while heating food Hides the old sidebars and replaces them with fancy json sidebars Jsonified "Unexplored" OMT -Support fuzzy search with accented latin letters +Support fuzzy search with accented Latin letters Many new color themes Possibility to turn distractions on and off Show compatible guns in magazine descriptions @@ -1305,7 +1305,7 @@ Dinomod Apex predators don't appear randomly day one Adds TropiCataclysm to the repository craftable holiday sweaters for dinos Hylian Adventurer Profession for Mythical Martial Arts -Many south american animals added to Tropicataclysm +Many South American animals added to Tropicataclysm Adds an innawood mod for wilderness survival. Aftershock Exoplanet: Glacial tunnels, a new low-risk area and the fauna that inhabits them TropiCataclysm Adds Termites and new content for Triffids diff --git a/data/json/construction/walls.json b/data/json/construction/walls.json index f9ea3fb3f81e4..596dd9fe280ae 100644 --- a/data/json/construction/walls.json +++ b/data/json/construction/walls.json @@ -258,7 +258,7 @@ [ [ "frame_wood", 1 ] ], [ [ "chunk_rubber", 16 ] ], [ [ "glass_sheet", 2 ] ], - [ [ "superglue", 2 ], [ "duct_tape", 10 ] ] + [ [ "super_glue", 2 ], [ "duct_tape", 10 ] ] ], "pre_note": "Must be supported on at least two sides.", "pre_special": "check_support", diff --git a/data/json/effects_on_condition/mapgen_eocs/godco_mapgen_eocs.json b/data/json/effects_on_condition/mapgen_eocs/godco_mapgen_eocs.json index 54838655ab0c3..09d5d3a4e558f 100644 --- a/data/json/effects_on_condition/mapgen_eocs/godco_mapgen_eocs.json +++ b/data/json/effects_on_condition/mapgen_eocs/godco_mapgen_eocs.json @@ -18,7 +18,7 @@ "type": "effect_on_condition", "id": "godco_place_wall_new", "global": false, - "//": "4 hours 20 minutes per wall (from regular ground to full palisade) * 373 walls = ~1,567 hours. Divided into 8-hour work shifts, thats ~196 days, or six and a half months for one person. Presuming we have ~11 people working in a single shift, each building 1 wall, that should be ~18 days to build. Please correct me if I messed up the math.", + "//": "4 hours 20 minutes per wall (from regular ground to full palisade) * 373 walls = ~1,567 hours. Divided into 8-hour work shifts, that's ~196 days, or six and a half months for one person. Presuming we have ~11 people working in a single shift, each building 1 wall, that should be ~18 days to build. Please correct me if I messed up the math.", "effect": [ { "mapgen_update": "place_right_corner_wall", "om_terrain": "godco_1" }, { "mapgen_update": "place_gate_wall", "om_terrain": "godco_2" }, diff --git a/data/json/encounters/randec_independent_travelers.json b/data/json/encounters/randec_independent_travelers.json index daa20b31531cb..b7b5d614a0d0f 100644 --- a/data/json/encounters/randec_independent_travelers.json +++ b/data/json/encounters/randec_independent_travelers.json @@ -94,7 +94,7 @@ "method": "json", "update_mapgen_id": "nest_RandEnc_campervan_traveler_remove", "object": { - "remove_npcs": [ { "class": "FM_caravan_merchant_random", "x": [ 0, 23 ], "y": [ 0, 23 ] } ], + "remove_npcs": [ { "class": "traveler_camper_van", "x": [ 0, 23 ], "y": [ 0, 23 ] } ], "remove_vehicles": [ { "vehicles": [ "traveler_van_motorhome" ], "x": [ 0, 23 ], "y": [ 0, 23 ] } ] } } diff --git a/data/json/itemgroups/Clothing_Gear/clothing.json b/data/json/itemgroups/Clothing_Gear/clothing.json index cd419b6e11189..e44b9771e31c8 100644 --- a/data/json/itemgroups/Clothing_Gear/clothing.json +++ b/data/json/itemgroups/Clothing_Gear/clothing.json @@ -1621,7 +1621,7 @@ [ "10gal_hat", 3 ], [ "glasses_monocle", 2 ], [ "duct_tape", 60 ], - [ "superglue", 20 ], + { "group": "superglue", "prob": 20 }, [ "firecracker_pack", 5 ], [ "firecracker", 5 ], [ "wolfsuit", 3 ], diff --git a/data/json/itemgroups/Clothing_Gear/gear.json b/data/json/itemgroups/Clothing_Gear/gear.json index 20ed33ce6f6d5..36f6dda016066 100644 --- a/data/json/itemgroups/Clothing_Gear/gear.json +++ b/data/json/itemgroups/Clothing_Gear/gear.json @@ -23,7 +23,7 @@ { "id": "gasmask_inserts_in_use", "type": "item_group", - "//": "Accessories grouped together for use as pre-installed spawnes within gas masks.", + "//": "Accessories grouped together for use as pre-installed spawns within gas masks.", "subtype": "distribution", "items": [ { @@ -172,7 +172,7 @@ { "group": "tools_tailor", "prob": 20 }, { "group": "ammo_pocket_batteries_full", "prob": 10 }, [ "duct_tape", 10 ], - [ "superglue", 5 ], + { "group": "superglue", "prob": 5 }, [ "plastichoboreel", 5 ], [ "survivormap", 5 ], { "item": "teargas_sprayer", "prob": 25, "charges": [ 9, 10 ] } diff --git a/data/json/itemgroups/Locations_MapExtras/locations.json b/data/json/itemgroups/Locations_MapExtras/locations.json index decf6a03fb046..c3c840d82eb22 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations.json +++ b/data/json/itemgroups/Locations_MapExtras/locations.json @@ -289,7 +289,7 @@ { "item": "liq_bandage_spray", "prob": 5, "charges": [ 1, -1 ] }, { "group": "adhesive_bandages_box_used", "prob": 15 }, { "item": "duct_tape", "prob": 20, "charges": [ 50, 200 ] }, - { "item": "superglue", "prob": 10 }, + { "group": "superglue", "prob": 10 }, { "item": "sewing_kit", "prob": 10, "charges": [ 0, -1 ] }, { "item": "mouthpiece", "prob": 10 }, { "item": "cigar", "prob": 20, "count": [ 1, 5 ] }, @@ -377,7 +377,7 @@ [ "stereo", 10 ], [ "wrench", 10 ], [ "screwdriver", 15 ], - [ "superglue", 5 ], + { "group": "superglue", "prob": 5 }, [ "boots", 70 ], [ "boots_steel", 50 ], [ "sneakers_steel", 35 ], @@ -2139,7 +2139,7 @@ { "item": "chem_calcium_chloride", "prob": 2 }, { "prob": 3, "group": "yeast_bag_plastic" }, { "prob": 1, "group": "yogurt_starter_culture_bag_plastic_4" }, - { "item": "superglue", "prob": 30 }, + { "group": "superglue", "prob": 30 }, { "item": "bottle_glass", "prob": 10 }, { "item": "syringe", "prob": 1 }, { "item": "adrenaline_injector", "prob": 1 }, @@ -2465,7 +2465,7 @@ [ "screwdriver", 40 ], [ "screwdriver_set", 10 ], { "item": "duct_tape", "prob": 10, "charges": [ 25, 400 ] }, - { "item": "superglue", "prob": 5 }, + { "group": "superglue", "prob": 5 }, [ "boots", 70 ], [ "boots_winter", 60 ], [ "boots_hiking", 30 ], diff --git a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json index 168a11587bc5b..7b563dc59848d 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json +++ b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json @@ -97,11 +97,10 @@ [ "toilet_paper", 10 ], { "item": "handflare", "prob": 15, "charges": 300 }, [ "duct_tape", 25 ], - [ "superglue", 20 ], + { "group": "superglue", "prob": 45 }, { "item": "flashlight", "prob": 25, "charges": [ 0, 300 ] }, [ "thread", 20 ], { "group": "ammo_pocket_batteries_full", "prob": 25 }, - [ "superglue", 25 ], { "item": "candle", "prob": 25, "charges": [ 0, 100 ] }, [ "hammer", 20 ], [ "screwdriver", 20 ], @@ -1202,7 +1201,7 @@ { "item": "screwdriver", "prob": 40 }, { "item": "screwdriver_set", "prob": 20 }, { "item": "socket_screwdriver_set", "prob": 10 }, - { "item": "superglue", "prob": 30 }, + { "group": "superglue", "prob": 55 }, { "item": "hacksaw", "prob": 17 }, { "item": "pliers", "prob": 40 }, { "item": "gloves_leather", "prob": 45 }, @@ -1211,7 +1210,6 @@ { "item": "manual_mechanics", "prob": 35 }, { "item": "manual_fabrication", "prob": 20 }, { "item": "duct_tape", "prob": 70, "charges": [ 50, 200 ] }, - { "item": "superglue", "prob": 25 }, { "item": "misc_repairkit", "prob": 15 }, { "group": "tools_toolbox", "prob": 2 } ] @@ -1272,7 +1270,7 @@ { "item": "screwdriver_set", "prob": 20 }, { "item": "socket_screwdriver_set", "prob": 20 }, { "item": "duct_tape", "prob": 50 }, - { "item": "superglue", "prob": 10 }, + { "group": "superglue", "prob": 10 }, { "item": "misc_repairkit", "prob": 25 }, { "group": "tools_toolbox", "prob": 2 } ] @@ -1450,7 +1448,7 @@ [ "glasses_safety", 10 ], [ "solar_cell", 10 ], [ "screwdriver", 15 ], - [ "superglue", 5 ], + { "group": "superglue", "prob": 5 }, [ "hand_controls", 1 ], { "item": "polisher", "prob": 15, "charges": [ 0, 100 ] }, [ "solar_panel", 15 ] @@ -1510,7 +1508,7 @@ [ "glasses_safety", 10 ], [ "solar_cell", 10 ], [ "screwdriver", 15 ], - [ "superglue", 5 ], + { "group": "superglue", "prob": 5 }, { "item": "polisher", "prob": 15, "charges": [ 0, 100 ] }, [ "solar_panel", 15 ], [ "spare_tire_carrier", 10 ], @@ -1541,7 +1539,7 @@ [ "glasses_safety", 10 ], [ "solar_cell", 10 ], [ "screwdriver", 15 ], - [ "superglue", 5 ], + { "group": "superglue", "prob": 5 }, { "item": "polisher", "prob": 15, "charges": [ 0, 100 ] }, [ "solar_panel", 15 ], [ "spare_tire_carrier", 10 ], @@ -1799,7 +1797,7 @@ { "item": "soldering_iron", "prob": 65 }, { "item": "soldering_iron_portable", "prob": 65, "charges": [ 0, 50 ] }, [ "solder_wire", 50 ], - [ "superglue", 55 ], + { "group": "superglue", "prob": 55 }, [ "screwdriver", 60 ], [ "motor_small", 30 ] ] @@ -2099,7 +2097,7 @@ [ "yarn", 15 ], [ "sinew", 15 ], [ "duct_tape", 15 ], - [ "superglue", 5 ], + { "group": "superglue", "prob": 5 }, [ "feather", 15 ], [ "mag_animecon", 15 ], [ "mag_beauty", 15 ], diff --git a/data/json/itemgroups/SUS/domestic.json b/data/json/itemgroups/SUS/domestic.json index 96eae4d71cdde..833732ded1bde 100644 --- a/data/json/itemgroups/SUS/domestic.json +++ b/data/json/itemgroups/SUS/domestic.json @@ -130,7 +130,7 @@ { "item": "string_36", "count": [ 1, 4 ], "prob": 50 }, { "item": "string_36", "count": [ 1, 4 ], "prob": 20 }, { "item": "duct_tape", "prob": 40, "charges": [ 25, 400 ] }, - { "item": "superglue", "prob": 30 }, + { "group": "superglue", "prob": 30 }, { "item": "plastic_straw", "prob": 70, "count": [ 1, 6 ] }, { "item": "plastic_straw", "prob": 40, "count": [ 1, 6 ] }, { "item": "corkscrew", "prob": 60 }, @@ -286,7 +286,7 @@ { "item": "thread", "prob": 30 }, { "item": "sewing_kit", "prob": 47, "charges": [ 50, 150 ] }, { "item": "solder_wire", "prob": 40 }, - { "item": "superglue", "prob": 40 }, + { "group": "superglue", "prob": 40 }, { "item": "knitting_needles", "prob": 40 }, { "item": "duct_tape", "prob": 40, "charges": [ 5, 160 ] }, { "item": "wax_paraffin", "prob": 10 }, @@ -329,7 +329,7 @@ "subtype": "collection", "entries": [ { "group": "tools_common", "count": 2 }, - { "item": "superglue", "prob": 90 }, + { "group": "superglue", "prob": 90 }, { "item": "boxcutter", "prob": 85 }, { "item": "duct_tape", "prob": 85, "charges": [ 5, 200 ] }, { "item": "flashlight", "prob": 80, "ammo-item": "light_disposable_cell", "charges": [ 100, 300 ] }, @@ -397,7 +397,7 @@ { "item": "corkscrew", "prob": 70 }, { "group": "adhesive_bandages_box_used", "prob": 60 }, { "item": "duct_tape", "prob": 40, "charges": [ 100, 400 ] }, - { "item": "superglue", "prob": 30 }, + { "group": "superglue", "prob": 30 }, { "item": "light_battery_cell", "count": 4, "prob": 50, "charges": 100 }, { "item": "deck_of_cards", "prob": 50 }, { "item": "teleumbrella", "prob": 50 }, diff --git a/data/json/itemgroups/Weapons_Mods_Ammo/guns.json b/data/json/itemgroups/Weapons_Mods_Ammo/guns.json index 8da379ef20ad2..ef101b3c69e53 100644 --- a/data/json/itemgroups/Weapons_Mods_Ammo/guns.json +++ b/data/json/itemgroups/Weapons_Mods_Ammo/guns.json @@ -14,6 +14,7 @@ { "group": "guns_pistol_common_38", "prob": 11 }, { "group": "guns_pistol_common_44", "prob": 1 }, { "group": "guns_pistol_common_10mm", "prob": 1 }, + { "group": "guns_pistol_common_762_39", "prob": 1 }, { "group": "guns_pistol_common_other", "prob": 39 } ] }, @@ -51,6 +52,7 @@ { "group": "guns_pistol_common_display_44", "prob": 1 }, { "group": "guns_pistol_common_display_45colt", "prob": 5 }, { "group": "guns_pistol_common_display_10mm", "prob": 1 }, + { "group": "guns_pistol_common_display_762_39", "prob": 1 }, { "group": "guns_pistol_common_display_other", "prob": 46 } ] }, @@ -64,7 +66,6 @@ { "group": "guns_pistol_rare_223", "prob": 1 }, { "group": "guns_pistol_rare_45", "prob": 15 }, { "group": "guns_pistol_rare_40", "prob": 6 }, - { "group": "guns_pistol_rare_762", "prob": 1 }, { "group": "guns_pistol_rare_357mag", "prob": 8 }, { "group": "guns_pistol_rare_38", "prob": 1 }, { "group": "guns_pistol_rare_44", "prob": 45 }, @@ -151,7 +152,6 @@ "id": "guns_pistol_obscure_display", "//": "Very obscure pistols which are illegal to sell.", "items": [ - { "item": "draco", "prob": 30 }, { "item": "ar_pistol", "prob": 35 }, { "group": "guns_pistol_collectible", "prob": 1 }, { "item": "minidraco556", "prob": 30 } diff --git a/data/json/itemgroups/Weapons_Mods_Ammo/guns_by_calibre.json b/data/json/itemgroups/Weapons_Mods_Ammo/guns_by_calibre.json index 58175f8d1c43c..99ae836e0ea84 100644 --- a/data/json/itemgroups/Weapons_Mods_Ammo/guns_by_calibre.json +++ b/data/json/itemgroups/Weapons_Mods_Ammo/guns_by_calibre.json @@ -86,6 +86,15 @@ "id": "guns_pistol_common_10mm", "items": [ { "group": "nested_sw_610", "prob": 5 } ] }, + { + "type": "item_group", + "id": "guns_pistol_common_762_39", + "items": [ + { "group": "nested_draco", "prob": 10 }, + { "group": "nested_draco_mini", "prob": 5 }, + { "group": "nested_draco_micro", "prob": 8 } + ] + }, { "type": "item_group", "id": "guns_pistol_common_other", @@ -276,6 +285,11 @@ "id": "guns_pistol_common_display_10mm", "items": [ { "item": "sw_610", "prob": 5 } ] }, + { + "type": "item_group", + "id": "guns_pistol_common_display_762_39", + "items": [ { "item": "draco", "prob": 10 }, { "item": "draco_mini", "prob": 5 }, { "item": "draco_micro", "prob": 8 } ] + }, { "type": "item_group", "id": "guns_pistol_common_display_other", @@ -287,7 +301,8 @@ "items": [ { "group": "nested_90two", "prob": 20 }, { "group": "nested_usp_9mm", "prob": 13 }, - { "group": "nested_p08", "prob": 7 } + { "group": "nested_p08", "prob": 7 }, + { "group": "nested_draco_9mm", "prob": 14 } ] }, { @@ -305,11 +320,6 @@ "id": "guns_pistol_rare_40", "items": [ { "group": "nested_90two40", "prob": 2 }, { "group": "nested_sig_40", "prob": 10 } ] }, - { - "type": "item_group", - "id": "guns_pistol_rare_762", - "items": [ { "group": "nested_draco", "prob": 20 } ] - }, { "type": "item_group", "id": "guns_pistol_rare_357mag", @@ -357,7 +367,12 @@ { "type": "item_group", "id": "guns_pistol_rare_display_9mm", - "items": [ { "item": "m9", "variant": "90two", "prob": 5 }, { "item": "usp_9mm", "prob": 48 }, { "item": "p08", "prob": 5 } ] + "items": [ + { "item": "m9", "variant": "90two", "prob": 5 }, + { "item": "usp_9mm", "prob": 48 }, + { "item": "p08", "prob": 5 }, + { "item": "draco_9mm", "prob": 21 } + ] }, { "type": "item_group", @@ -369,11 +384,6 @@ "id": "guns_pistol_rare_display_40", "items": [ { "item": "90two40", "prob": 2 }, { "item": "sig_40", "prob": 5 } ] }, - { - "type": "item_group", - "id": "guns_pistol_rare_display_762", - "items": [ { "item": "draco", "prob": 20 } ] - }, { "type": "item_group", "id": "guns_pistol_rare_display_357mag", diff --git a/data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json b/data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json index 402f2f3650cb4..d3d910d686f11 100644 --- a/data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json +++ b/data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json @@ -866,11 +866,50 @@ "ammo": 100, "entries": [ { "item": "draco", "charges": [ 0, 30 ] }, - { "item": "akmag10" }, - { "item": "akmag10", "prob": 50 }, + { "item": "akmag30" }, + { "item": "akmag30", "prob": 50 }, + { "group": "on_hand_762" } + ] + }, + { + "id": "nested_draco_mini", + "type": "item_group", + "//": "this is a distribution for the gun, reasonable number of backup mags, and some ammo to repack", + "subtype": "collection", + "ammo": 100, + "entries": [ + { "item": "draco_mini", "charges": [ 0, 30 ] }, + { "item": "akmag30" }, + { "item": "akmag30", "prob": 50 }, + { "group": "on_hand_762" } + ] + }, + { + "id": "nested_draco_micro", + "type": "item_group", + "//": "this is a distribution for the gun, reasonable number of backup mags, and some ammo to repack", + "subtype": "collection", + "ammo": 100, + "entries": [ + { "item": "draco_micro", "charges": [ 0, 30 ] }, + { "item": "akmag30" }, + { "item": "akmag30", "prob": 50 }, { "group": "on_hand_762" } ] }, + { + "id": "nested_draco_9mm", + "type": "item_group", + "//": "this is a distribution for the gun, reasonable number of backup mags, and some ammo to repack", + "subtype": "collection", + "ammo": 100, + "entries": [ + { "item": "draco_9mm", "charges": [ 0, 17 ] }, + { "item": "glockbigmag" }, + { "item": "glock17_17", "prob": 50 }, + { "group": "on_hand_9mm" } + ] + }, { "id": "nested_m17", "type": "item_group", diff --git a/data/json/itemgroups/books.json b/data/json/itemgroups/books.json index c216656207ed3..bd84822961d98 100644 --- a/data/json/itemgroups/books.json +++ b/data/json/itemgroups/books.json @@ -483,7 +483,7 @@ "//3": "While a rather high-level fabrication book, this could conceivably be something that a craft shop/design and technology class would use in its current form: Plastics and Polymers: Projects for the Classroom. Should it be expanded with variants to include books that aren’t so school-based, it should be removed.", "//4": "While it has the potential to be a high-level tailoring book, its current form, Friendly, Humane Fashion, can be passed off as an educational library book. Should it be expanded with variants to include books that aren’t so school-based, it should be removed.", "//5": "While a high-level speech book, Principles of Effective Communication, a public speaking book, isn’t unrealistic for a school library to possess. Should it be expanded with variants to include books that aren’t so school-based, it should be removed.", - "//6": "Bit of a stretch, but The Wonderful World of Arthropodology could feasibly exist as a library encyclopaedia.", + "//6": "Bit of a stretch, but The Wonderful World of Arthropodology could feasibly exist as a library encyclopedia.", "subtype": "distribution", "entries": [ { "item": "manual_swimming", "prob": 5 }, diff --git a/data/json/itemgroups/collections_domestic.json b/data/json/itemgroups/collections_domestic.json index b7bef96a6293b..3bffda514bae7 100644 --- a/data/json/itemgroups/collections_domestic.json +++ b/data/json/itemgroups/collections_domestic.json @@ -153,7 +153,7 @@ { "item": "binoculars", "prob": 20 }, { "item": "roller_blades", "prob": 20 }, { "item": "duct_tape", "prob": 100, "charges": [ 50, 200 ] }, - { "item": "superglue", "prob": 60 }, + { "group": "superglue", "prob": 60 }, { "item": "lawnmower", "prob": 25 }, { "item": "lawn_dart", "prob": 10 }, { "item": "dehydrator", "prob": 15 }, @@ -205,7 +205,7 @@ { "prob": 2, "group": "yeast_bag_plastic" }, { "prob": 1, "group": "yogurt_starter_culture_bag_plastic_4" }, { "item": "royal_jelly", "prob": 8 }, - { "item": "superglue", "prob": 20 }, + { "group": "superglue", "prob": 20 }, { "item": "bottle_glass", "prob": 10 }, { "item": "syringe", "prob": 4 }, { "item": "adrenaline_injector", "prob": 2 }, @@ -1438,7 +1438,7 @@ { "item": "xacto", "prob": 10 }, { "item": "screwdriver", "prob": 10 }, { "item": "duct_tape", "prob": 5, "charges": [ 25, 100 ] }, - { "item": "superglue", "prob": 10 }, + { "group": "superglue", "prob": 10 }, { "item": "splinter", "prob": 10, "count": [ 2, 3 ] }, { "item": "toolbox_empty", "prob": 100 } ], diff --git a/data/json/itemgroups/defense_mode.json b/data/json/itemgroups/defense_mode.json index 4046b2623e105..dbc27d06e2531 100644 --- a/data/json/itemgroups/defense_mode.json +++ b/data/json/itemgroups/defense_mode.json @@ -74,7 +74,7 @@ { "item": "cotton_patchwork" }, { "item": "fur" }, { "item": "leather" }, - { "item": "superglue" }, + { "group": "superglue" }, { "item": "string_36" }, { "item": "chain" }, { "item": "processor" }, diff --git a/data/json/itemgroups/electronics.json b/data/json/itemgroups/electronics.json index 37d06c4cd8167..8611d361ac296 100644 --- a/data/json/itemgroups/electronics.json +++ b/data/json/itemgroups/electronics.json @@ -7,7 +7,7 @@ { "item": "voltmeter", "prob": 30, "charges": [ 0, 100 ] }, { "item": "multimeter", "prob": 30, "charges": [ 0, 100 ] }, [ "jumper_cable_heavy", 10 ], - [ "superglue", 30 ], + { "group": "superglue", "prob": 30 }, { "item": "electrohack", "prob": 3, "charges": [ 0, 100 ] }, [ "processor", 15 ], [ "RAM", 22 ], diff --git a/data/json/itemgroups/science_and_tech.json b/data/json/itemgroups/science_and_tech.json index 466fd3361ade9..070cd6c3a2d2f 100644 --- a/data/json/itemgroups/science_and_tech.json +++ b/data/json/itemgroups/science_and_tech.json @@ -165,7 +165,7 @@ { "item": "chem_baking_soda", "prob": 5, "charges": [ 1, -1 ] }, { "item": "chem_calcium_chloride", "prob": 5 }, [ "panacea", 8 ], - [ "superglue", 30 ], + { "group": "superglue", "prob": 30 }, [ "bottle_glass", 10 ], [ "syringe", 8 ], [ "adrenaline_injector", 4 ], diff --git a/data/json/itemgroups/supplies.json b/data/json/itemgroups/supplies.json index 1192223472774..87285c555d719 100644 --- a/data/json/itemgroups/supplies.json +++ b/data/json/itemgroups/supplies.json @@ -235,7 +235,7 @@ { "group": "ammo_pocket_batteries_full", "prob": 50 }, [ "pilot_light", 50 ], { "item": "duct_tape", "prob": 200, "charges": [ 50, 200 ] }, - [ "superglue", 100 ], + { "group": "superglue", "prob": 100 }, [ "string_6", 100 ], [ "string_36", 100 ], [ "rubber_cement", 50 ], @@ -336,7 +336,7 @@ { "type": "item_group", "id": "supplies_woodcrafts", - "items": [ [ "superglue", 40 ], [ "sandpaper", 40 ], [ "screwdriver", 5 ], [ "chisel", 10 ], [ "hammer", 5 ] ] + "items": [ { "group": "superglue", "prob": 40 }, [ "sandpaper", 40 ], [ "screwdriver", 5 ], [ "chisel", 10 ], [ "hammer", 5 ] ] }, { "id": "supplies_hardware", @@ -363,7 +363,7 @@ { "item": "brick", "prob": 20, "count": [ 5, 10 ] }, { "group": "wrapped_gasmask_filter", "count": [ 2, 6 ], "prob": 20 }, [ "solder_wire", 20 ], - [ "superglue", 30 ], + { "group": "superglue", "prob": 30 }, [ "rubber_cement", 25 ], [ "magnet", 10 ], [ "chain", 20 ], @@ -756,7 +756,7 @@ { "item": "cell_phone", "prob": 3, "charges": [ 0, 150 ] }, { "item": "smart_phone", "prob": 18, "charges": [ 0, -1 ] }, { "item": "duct_tape", "prob": 5, "charges": [ 50, 200 ] }, - { "item": "superglue", "prob": 5 }, + { "group": "superglue", "prob": 5 }, { "group": "ammo_pocket_batteries", "prob": 5 }, { "item": "flashlight", "prob": 10, "charges": [ 0, 300 ] }, [ "office_holepunch", 10 ], @@ -795,7 +795,7 @@ { "group": "writing_utensils", "prob": 35 }, [ "file", 15 ], { "item": "duct_tape", "prob": 15, "charges": [ 50, 200 ] }, - { "item": "superglue", "prob": 15 }, + { "group": "superglue", "prob": 15 }, [ "file", 15 ], [ "office_holepunch", 15 ], [ "bubblewrap", 15 ], diff --git a/data/json/itemgroups/tools.json b/data/json/itemgroups/tools.json index 01f14953f8867..5567500a141a5 100644 --- a/data/json/itemgroups/tools.json +++ b/data/json/itemgroups/tools.json @@ -45,7 +45,7 @@ { "item": "tuning_pegs", "prob": 100, "count": [ 5, 15 ] }, { "item": "piano_wire", "prob": 100, "count": [ 1, 3 ] }, [ "hand_drill", 20 ], - { "item": "superglue", "prob": 100, "count": [ 1, 3 ] }, + { "item": "super_glue", "prob": 100, "count": [ 1, 3 ] }, [ "chisel", 10 ], [ "sandpaper", 100 ] ] @@ -101,7 +101,7 @@ [ "screwdriver_set", 50 ], [ "socket_screwdriver_set", 10 ], [ "duct_tape", 10 ], - [ "superglue", 10 ], + { "group": "superglue", "prob": 10 }, [ "tin_snips", 10 ], [ "wrench", 20 ], [ "wrench_small", 20 ], @@ -820,7 +820,7 @@ [ "teleporter", 1 ], { "item": "laptop", "prob": 4, "charges": [ 0, 500 ] }, { "item": "plut_cell", "prob": 4, "charges": [ 1, 5 ] }, - [ "superglue", 30 ], + { "group": "superglue", "prob": 30 }, [ "pliers", 10 ], [ "tin_snips", 10 ], { "item": "matches", "prob": 10, "charges": [ 1, 20 ] }, @@ -1040,5 +1040,20 @@ "subtype": "collection", "id": "dynamite_shipment", "items": [ { "item": "dynamite", "count": [ 2, 3 ] } ] + }, + { + "type": "item_group", + "subtype": "distribution", + "id": "superglue", + "items": [ { "item": "super_glue", "charges-min": 0, "charges-max": 600, "container-group": "superglue_bottles" } ] + }, + { + "type": "item_group", + "subtype": "distribution", + "id": "superglue_bottles", + "items": [ + { "item": "small_squeeze_tube", "variant": "small_squeeze_tube_superglue", "prob": 90 }, + { "item": "bottle_plastic_tiny_glue", "variant": "bottle_plastic_tiny_superglue", "prob": 10 } + ] } ] diff --git a/data/json/itemgroups/vehicles_fuel_related.json b/data/json/itemgroups/vehicles_fuel_related.json index 41a0092ca0f94..dbd61cb3db9e0 100644 --- a/data/json/itemgroups/vehicles_fuel_related.json +++ b/data/json/itemgroups/vehicles_fuel_related.json @@ -85,7 +85,7 @@ "prob": 80 }, { "item": "duct_tape", "charges": [ 20, 200 ], "prob": 30 }, - { "item": "superglue", "prob": 20 }, + { "group": "superglue", "prob": 20 }, { "distribution": [ { "item": "pockknife" }, { "item": "boxcutter" } ], "prob": 60 }, { "item": "glowstick", "count": [ 0, 2 ], "charges": 1400, "prob": 30 }, { diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json index 6a4464e27b54d..659b908289d23 100644 --- a/data/json/items/ammo_types.json +++ b/data/json/items/ammo_types.json @@ -479,6 +479,12 @@ "name": "duct tape", "default": "duct_tape" }, + { + "type": "ammunition_type", + "id": "superglue", + "name": "super glue", + "default": "super_glue" + }, { "type": "ammunition_type", "id": "battery", diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index fafc60172f1b8..0cbc99a7b7f12 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -3370,7 +3370,6 @@ }, { "id": "espadrilles", - "category": "armor", "type": "ARMOR", "name": { "str_sp": "espadrilles" }, "description": "Originating from the Pyrenees and made from a rope sole and cloth, these shoes are perfect for the hot weather, sipping Sangria and dodging tourists.", diff --git a/data/json/items/armor/cloaks.json b/data/json/items/armor/cloaks.json index a6a9f04db585e..88c95761a158b 100644 --- a/data/json/items/armor/cloaks.json +++ b/data/json/items/armor/cloaks.json @@ -233,7 +233,7 @@ }, { "id": "bahamanian_flag", - "name": { "str": "Bahamanain flag" }, + "name": { "str": "Bahamanian flag" }, "description": "It has three stripes of light blue and yellow, with a black triangle on the far-left side.", "weight": 10, "append": true @@ -408,7 +408,7 @@ }, { "id": "columbian_flag", - "name": { "str": "Columbian flag" }, + "name": { "str": "Colombian flag" }, "description": "It has a yellow, navy blue, and red stripe running horizontally.", "weight": 10, "append": true diff --git a/data/json/items/armor/coats.json b/data/json/items/armor/coats.json index 6429c3d8fe849..f649f632b717b 100644 --- a/data/json/items/armor/coats.json +++ b/data/json/items/armor/coats.json @@ -3731,7 +3731,7 @@ { "id": "tacjacket_jungle", "name": { "str": "jungle-camo tactical jacket" }, - "description": "Bright and dark green shades meet within the patterning of this tactical jacket, embellished by tones of earthen brown and other natural hues. The trees of the Amazon will speak your native tongue as you stalk around, waging guerilla warfare against the undead, with this jacket on. It's just a shame that the rainforest is quite a walk away.", + "description": "Bright and dark green shades meet within the patterning of this tactical jacket, embellished by tones of earthen brown and other natural hues. The trees of the Amazon will speak your native tongue as you stalk around, waging guerrilla warfare against the undead, with this jacket on. It's just a shame that the rainforest is quite a walk away.", "color": "green", "weight": 15, "append": true diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index d1b5856a19f71..c6262345be851 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -295,7 +295,7 @@ { "id": "helmet_m1", "name": { "str": "M1 helmet" }, - "description": "A M1 combat helmet, famously worn by American soldiers in the Second World War as well as the Korean and Vietnam wars. Inferior to modern helmets, but it still remains popular among guerilla fighters, collectors and war re-enactors.", + "description": "A M1 combat helmet, famously worn by American soldiers in the Second World War as well as the Korean and Vietnam wars. Inferior to modern helmets, but it still remains popular among guerrilla fighters, collectors and war re-enactors.", "color": "green", "weight": 10 }, @@ -313,7 +313,7 @@ "id": "helmet_soviet_tanker", "type": "ARMOR", "category": "armor", - "name": { "str": "soviet tanker helmet" }, + "name": { "str": "Soviet tanker helmet" }, "description": "A Soviet era tanker helmet. It's distinctive foam pads are meant to protect a tank driver from bumps against the cramped interior.", "price": "100 USD", "price_postapoc": "12 USD", diff --git a/data/json/items/armor/legs_armor.json b/data/json/items/armor/legs_armor.json index b2a542a6e6e41..cfbdda5ce1fe1 100644 --- a/data/json/items/armor/legs_armor.json +++ b/data/json/items/armor/legs_armor.json @@ -348,7 +348,7 @@ "copy-from": "base_chainmail_legs", "type": "ARMOR", "name": { "str_sp": "base chainmail half-leggings" }, - "description": "Customized partial chainmail leggings only covering the front and sides of the legs. The zigzaging lace at the back keeps everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "description": "Customized partial chainmail leggings only covering the front and sides of the legs. The zigzagging lace at the back keeps everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", "weight": "3159 g", "volume": "1125 ml", "longest_side": "10 cm", diff --git a/data/json/items/armor/storage.json b/data/json/items/armor/storage.json index 71fb1242caf87..112a81f6cca7b 100644 --- a/data/json/items/armor/storage.json +++ b/data/json/items/armor/storage.json @@ -1898,7 +1898,7 @@ { "id": "molle_pack", "type": "ARMOR", - "//": "Based upon own service and wikipedia: https://en.wikipedia.org/wiki/MOLLE", + "//": "Based upon own service and Wikipedia: https://en.wikipedia.org/wiki/MOLLE", "name": { "str": "MOLLE assault pack" }, "description": "The Modular Lightweight Load-carrying Equipment is an advanced military backpack. Covered with pockets and straps, it strikes a fine balance between storage space and encumbrance. Can attach accessory pockets to the outside rigging.", "weight": "1450 g", @@ -1989,7 +1989,7 @@ { "id": "molle_medium_rucksack", "type": "ARMOR", - "//": "Based upon own service and wikipedia: https://en.wikipedia.org/wiki/MOLLE", + "//": "Based upon own service and Wikipedia: https://en.wikipedia.org/wiki/MOLLE", "name": { "str": "MOLLE medium rucksack" }, "description": "The Modular Lightweight Load-carrying Equipment is an advanced military medium rucksack. Covered with straps for modularity, it strikes a fine balance between storage space and encumbrance. Can attach accessory pockets to the outside rigging.", "weight": "1600 g", @@ -2080,7 +2080,7 @@ { "id": "molle_large_rucksack", "type": "ARMOR", - "//": "Based upon own service and wikipedia: https://en.wikipedia.org/wiki/MOLLE", + "//": "Based upon own service and Wikipedia: https://en.wikipedia.org/wiki/MOLLE", "name": { "str": "MOLLE large rucksack" }, "description": "The Modular Lightweight Load-carrying Equipment is an advanced military large rucksack. Covered with straps for modularity, it strikes a fine balance between storage space and encumbrance. Can attach accessory pockets to the outside rigging.", "weight": "2200 g", diff --git a/data/json/items/book/maps.json b/data/json/items/book/maps.json index c35c937ea2f57..f2ac8f8c8f0ff 100644 --- a/data/json/items/book/maps.json +++ b/data/json/items/book/maps.json @@ -2,7 +2,7 @@ { "abstract": "abstractmap", "//": "Match type options in iuse_actor.cpp", - "//1": "Add maps/brochures/pamphlets as appopriate to itemgroups/books.json 's groups", + "//1": "Add maps/brochures/pamphlets as appropriate to itemgroups/books.json 's groups", "type": "GENERIC", "category": "maps", "name": { "str": "abstract map" }, diff --git a/data/json/items/book/misc_philosophy.json b/data/json/items/book/misc_philosophy.json index ad1ece7f93788..fa67eef6df239 100644 --- a/data/json/items/book/misc_philosophy.json +++ b/data/json/items/book/misc_philosophy.json @@ -86,7 +86,7 @@ { "id": "philosophy26", "text": "This is a copy of \"Allegory of the Cave\" by Plato." }, { "id": "philosophy27", "text": "This is a copy of \"Leviathan\" by Thomas Hobbes." }, { "id": "philosophy28", "text": "This is a copy of \"Critique Of Pure Reason\" by Immanuel Kant." }, - { "id": "philosophy29", "text": "This is a copy of \"Principles of Philosophy\" by Descartes." }, + { "id": "philosophy29", "text": "This is a copy of \"Principles of Philosophy\" by René Descartes." }, { "id": "philosophy30", "text": "This is a copy of both \"On the Genealogy of Morality\" and \"The Gay Science\" by Friederich Nietzsche." diff --git a/data/json/items/book/misc_sports.json b/data/json/items/book/misc_sports.json index fe225cf061eb6..ee27b8c849579 100644 --- a/data/json/items/book/misc_sports.json +++ b/data/json/items/book/misc_sports.json @@ -131,7 +131,7 @@ "id": "book_nonf_hard_sports_bike", "type": "BOOK", "name": { "str": "Legendary Bike Rides", "str_pl": "copies of Legendary Bike Rides" }, - "description": "This unwieldy coffeetable book is titled \"LEGENDARY Bike Rides Around the WORLD.\" It provides a wealth of detail about paved bike trails in every part of the globe except New England. But if you make it to Patagonia on bike, you're all set.", + "description": "This unwieldy coffee table book is titled \"LEGENDARY Bike Rides Around the WORLD.\" It provides a wealth of detail about paved bike trails in every part of the globe except New England. But if you make it to Patagonia on bike, you're all set.", "//isbn13": 9781760340834, "weight": "1589 g", "volume": "1660 ml", diff --git a/data/json/items/book/spiritual.json b/data/json/items/book/spiritual.json index 45f6c5aea5edf..bf88ed059f883 100644 --- a/data/json/items/book/spiritual.json +++ b/data/json/items/book/spiritual.json @@ -415,7 +415,7 @@ "id": "holybook_mo", "type": "BOOK", "name": { "str": "Buluotuo", "str_pl": "copies of the Buluotuo" }, - "description": "This is very rare English translation of the Buluotuo, a sacred epic in Moism, the religion of most Zhuang people, the largest ethnic minority of China. This book addresses the creation of the Universe and life as well as how to live a religiously meritorious life inside Moism. This book also contains information on entities, deities, gods, godesses, prayers, practices and rituals of Moism.", + "description": "This is very rare English translation of the Buluotuo, a sacred epic in Moism, the religion of most Zhuang people, the largest ethnic minority of China. This book addresses the creation of the Universe and life as well as how to live a religiously meritorious life inside Moism. This book also contains information on entities, deities, gods, goddesses, prayers, practices and rituals of Moism.", "weight": "370 g", "volume": "1 L", "copy-from": "holybook_abstract" diff --git a/data/json/items/comestibles/raw_fruit.json b/data/json/items/comestibles/raw_fruit.json index e7b85601bc942..4d0994ebd08d9 100644 --- a/data/json/items/comestibles/raw_fruit.json +++ b/data/json/items/comestibles/raw_fruit.json @@ -210,7 +210,7 @@ }, { "type": "COMESTIBLE", - "//": "abbreviated latin name because the id would get too long otherwise", + "//": "abbreviated Latin name because the id would get too long otherwise", "id": "m_stellatum_berries", "name": { "str_sp": "starry false Solomon's seal berries" }, "weight": "9 g", diff --git a/data/json/items/containers/containers.json b/data/json/items/containers/containers.json index fc177b9637d68..3901cf2221501 100644 --- a/data/json/items/containers/containers.json +++ b/data/json/items/containers/containers.json @@ -678,6 +678,64 @@ "color": "white", "flags": [ "COLLAPSE_CONTENTS" ] }, + { + "id": "bottle_plastic_tiny_glue", + "type": "GENERIC", + "copy-from": "bottle_plastic_tiny", + "name": { "str": "tiny plastic glue bottle" }, + "description": "A watertight plastic bottle, holds 30 mL of liquid. Due to the design of the tip, it cannot be refilled.", + "longest_side": "120 mm", + "extend": { "flags": [ "NO_RELOAD", "NO_UNLOAD" ] }, + "variant_type": "generic", + "variants": [ + { + "id": "bottle_plastic_tiny_superglue", + "name": { "str": "large superglue bottle" }, + "description": "This one reads \"Super Glue - All Purpose!\", with directions and cautions below.", + "weight": 1, + "append": true + } + ] + }, + { + "id": "small_squeeze_tube", + "type": "GENERIC", + "category": "container", + "name": { "str": "small squeeze tube" }, + "description": "A small squeeze tube, holds 3 mL of liquid. It cannot be refilled after it's empty.", + "ascii_picture": "bottle_plastic_small", + "weight": "2 g", + "volume": "11 ml", + "longest_side": "3 cm", + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "watertight": true, + "rigid": true, + "max_contains_volume": "4 ml", + "max_item_volume": "4 ml", + "max_contains_weight": "50 g", + "moves": 400 + } + ], + "price": "0 cent", + "price_postapoc": "0 cent", + "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" }, + "material": [ "plastic" ], + "symbol": ")", + "color": "white", + "flags": [ "NO_RELOAD", "NO_UNLOAD", "COLLAPSE_CONTENTS" ], + "variant_type": "generic", + "variants": [ + { + "id": "small_squeeze_tube_superglue", + "name": { "str": "superglue tube" }, + "description": "This one reads \"Super Glue - All Purpose!\", with directions and cautions below.", + "weight": 1, + "append": true + } + ] + }, { "id": "bottle_plastic_pill_prescription", "type": "GENERIC", diff --git a/data/json/items/generic.json b/data/json/items/generic.json index fba168a7e5910..f3907cda5e644 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -311,18 +311,22 @@ "flags": [ "TRADER_AVOID", "FIREWOOD", "TINDER" ] }, { - "type": "GENERIC", - "id": "superglue", + "type": "AMMO", + "id": "super_glue", "category": "spare_parts", "symbol": ",", + "phase": "liquid", "color": "white", "name": { "str_sp": "superglue" }, "description": "A tube of strong glue. Used in many crafting recipes.", "price": "18 USD", "price_postapoc": "1 USD", "material": [ "plastic" ], - "weight": "8 g", - "volume": "10 ml", + "weight": "1 g", + "volume": "1 ml", + "ammo_type": "superglue", + "//": "1 charge of superglue should cover an area of 5mm^2", + "count": 40, "flags": [ "UNRECOVERABLE" ] }, { @@ -332,7 +336,7 @@ "symbol": ",", "color": "white", "name": { "str_sp": "rubber cement" }, - "looks_like": "superglue", + "looks_like": "super_glue", "description": "A tin of adhesive typically used to glue rubber together. It forms a less rigid bond than typical superglue, making it ideal for projects requiring flexibility. Typically smelly and toxic.", "price": "18 USD", "price_postapoc": "80 cent", diff --git a/data/json/items/gun/44.json b/data/json/items/gun/44.json index c9357aefa29fb..1e2ddee15da6c 100644 --- a/data/json/items/gun/44.json +++ b/data/json/items/gun/44.json @@ -37,7 +37,6 @@ "flags": [ "ALLOWS_BODY_BLOCK", "NO_TURRET" ], "//2": "NO_TURRET should be removed once vehicle turrets are capable of mounting guns with mods attached. As it stands, trying to mount this style of weapon would require the player to remove the conversion kit, thus rendering it unusable anyhow.", "weapon_category": [ "AUTOMATIC_PISTOLS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "item_restriction": [ "deaglemag" ] } ], "valid_mod_locations": [ [ "bore", 1 ], [ "grip", 1 ], [ "mechanism", 2 ], [ "stock", 1 ], [ "underbarrel mount", 1 ] ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "melee_damage": { "bash": 12 } diff --git a/data/json/items/gun/545x39.json b/data/json/items/gun/545x39.json index 6575ca141715e..797300db84099 100644 --- a/data/json/items/gun/545x39.json +++ b/data/json/items/gun/545x39.json @@ -16,7 +16,7 @@ { "id": "ak74_folding", "name": { "str": "Kalashnikov AKS-74", "str_pl": "Kalashnikov AKS-74 rifles" }, - "description": "An American copy of a Soviet assault rifle, a strange piece of ordinance using some weird proprietary Russian ammunition—all these terms and more can describe this rifle: a semi-automatic clone of the Kalashnikov AKS-74, the descendent of the iconic AKM. Either a locally-built replica or produced from an imported, foreign parts kit, the firearm possesses a triangular, folding buttstock, a side-mounted optics rail, and a threaded barrel for attaching muzzle devices. The weapon fires the Soviet 5.45x39mm cartridge—a unicorn even in the American gun wilderness—and feeds said unicorn ammunition from AK-74 magazines." + "description": "An American copy of a Soviet assault rifle, a strange piece of ordinance using some weird proprietary Russian ammunition—all these terms and more can describe this rifle: a semi-automatic clone of the Kalashnikov AKS-74, the descendant of the iconic AKM. Either a locally-built replica or produced from an imported, foreign parts kit, the firearm possesses a triangular, folding buttstock, a side-mounted optics rail, and a threaded barrel for attaching muzzle devices. The weapon fires the Soviet 5.45x39mm cartridge—a unicorn even in the American gun wilderness—and feeds said unicorn ammunition from AK-74 magazines." } ], "weight": "3400 g", diff --git a/data/json/items/gun/762.json b/data/json/items/gun/762.json index 5d5bc7634b5cc..ed24ea686d7ca 100644 --- a/data/json/items/gun/762.json +++ b/data/json/items/gun/762.json @@ -174,26 +174,28 @@ }, { "id": "draco", + "//": "Based off of https://www.centuryarms.com/draco-pistol.html", "copy-from": "pistol_base", "looks_like": "modular_ar15", "type": "GUN", - "name": { "str": "AK \"pistol\"", "str_pl": "AK \"pistols\"" }, - "description": "Essentially a semi-auto AK with a short barrel and no stock, this unwieldy \"pistol\" has seen some popularity with civilian shooters and gangbangers alike.", + "name": { "str": "AK pistol" }, + "description": "The Draco series of guns are guns imported by Century Arms. They're essentially semi-auto AKs, but with shorter barrels and no stock. While advertised as compact guns, they're more often than not range toys. This one is a Draco, the largest, with a 12.5\" barrel.", "variant_type": "gun", "variants": [ { "id": "draco", - "name": { "str": "Mini Draco \"pistol\"", "str_pl": "Mini Draco \"pistols\"" }, - "description": "Essentially a semi-auto AK with a short barrel and no stock, this unwieldy \"pistol\" has seen some popularity with civilian shooters and gangbangers alike." + "name": { "str": "Draco" }, + "description": "The Draco series of guns are guns imported by Century Arms. They're essentially semi-auto AKs, but with shorter barrels and no stock. While advertised as compact guns, they're more often than not range toys. This one is a Draco, the largest, with a 12.5\" barrel." } ], - "weight": "2563 g", - "volume": "1286 ml", - "longest_side": "46 cm", + "weight": "2495 g", + "volume": "1716 ml", + "longest_side": "562 mm", "barrel_length": "311 mm", - "price": "725 USD", - "price_postapoc": "25 USD", - "to_hit": -5, + "price": "1045 USD 99 cent", + "price_postapoc": "15 USD", + "to_hit": { "grip": "none", "length": "hand", "surface": "line", "balance": "clumsy" }, + "//1": "Surface as line, as there's only 1 face to hit something with, and requires a really weird grip angle", "material": [ "steel", "wood" ], "color": "brown", "ammo": [ "762" ], @@ -213,7 +215,97 @@ [ "underbarrel mount", 1 ] ], "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "item_restriction": [ "akmag30", "akmag10", "akmag20", "akmag40", "akdrum75" ] } ], - "melee_damage": { "bash": 8 } + "melee_damage": { "bash": 6 } + }, + { + "id": "draco_mini", + "//": "Based off of https://www.centuryarms.com/mini-draco-pistol.html", + "copy-from": "pistol_base", + "looks_like": "draco", + "type": "GUN", + "name": { "str": "Small AK pistol" }, + "description": "The Draco series of guns are guns imported by Century Arms. They're essentially semi-auto AKs, but with shorter barrels and no stock. While advertised as compact guns, they're more often than not range toys. This one is a Mini Draco, with a 7.75\" barrel, short enough that the handguard had to be modified.", + "variant_type": "gun", + "variants": [ + { + "id": "draco_mini", + "name": { "str": "Mini Draco" }, + "description": "The Draco series of guns are guns imported by Century Arms. They're essentially semi-auto AKs, but with shorter barrels and no stock. While advertised as compact guns, they're more often than not range toys. This one is a Mini Draco, with a 7.75\" barrel, short enough that the handguard had to be modified." + } + ], + "weight": "2563 g", + "volume": "1332 ml", + "longest_side": "460 mm", + "barrel_length": "197 mm", + "price": "1045 USD 99 cent", + "price_postapoc": "15 USD", + "to_hit": { "grip": "none", "length": "hand", "surface": "line", "balance": "clumsy" }, + "//1": "Surface as line, as there's only 1 face to hit something with, and requires a really weird grip angle", + "material": [ "steel", "wood" ], + "color": "brown", + "ammo": [ "762" ], + "dispersion": 280, + "durability": 7, + "min_cycle_recoil": 1832, + "valid_mod_locations": [ + [ "barrel", 1 ], + [ "brass catcher", 1 ], + [ "grip", 1 ], + [ "mechanism", 2 ], + [ "muzzle", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "sling", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], + "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "item_restriction": [ "akmag30", "akmag10", "akmag20", "akmag40", "akdrum75" ] } ], + "melee_damage": { "bash": 6 } + }, + { + "id": "draco_micro", + "//": "Based off of https://www.centuryarms.com/micro-draco-pistol.html", + "copy-from": "pistol_base", + "looks_like": "draco", + "type": "GUN", + "name": { "str": "Tiny AK pistol" }, + "description": "The Draco series of guns are guns imported by Century Arms. They're essentially semi-auto AKs, but with shorter barrels and no stock. While advertised as compact guns, they're more often than not range toys. This one is a Micro Draco, the smallest, with a 6.25\" barrel. It has a distinctive, oddly curvy handguard.", + "variant_type": "gun", + "variants": [ + { + "id": "draco_mini", + "name": { "str": "Micro Draco" }, + "description": "The Draco series of guns are guns imported by Century Arms. They're essentially semi-auto AKs, but with shorter barrels and no stock. While advertised as compact guns, they're more often than not range toys. This one is a Micro Draco, the smallest, with a 6.25\" barrel. It has a distinctive, oddly curvy handguard." + } + ], + "weight": "2200 g", + "volume": "1072 ml", + "longest_side": "388 mm", + "barrel_length": "159 mm", + "price": "1055 USD 99 cent", + "price_postapoc": "15 USD", + "to_hit": { "grip": "none", "length": "hand", "surface": "line", "balance": "clumsy" }, + "//1": "Surface as line, as there's only 1 face to hit something with, and requires a really weird grip angle", + "material": [ "steel", "wood" ], + "color": "brown", + "ammo": [ "762" ], + "dispersion": 340, + "durability": 7, + "min_cycle_recoil": 1832, + "valid_mod_locations": [ + [ "barrel", 1 ], + [ "brass catcher", 1 ], + [ "grip", 1 ], + [ "mechanism", 2 ], + [ "muzzle", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "sling", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], + "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "item_restriction": [ "akmag30", "akmag10", "akmag20", "akmag40", "akdrum75" ] } ], + "melee_damage": { "bash": 6 } }, { "id": "mk47", diff --git a/data/json/items/gun/9mm.json b/data/json/items/gun/9mm.json index b7e81c91398a5..fb7bfc29ca7ec 100644 --- a/data/json/items/gun/9mm.json +++ b/data/json/items/gun/9mm.json @@ -566,7 +566,7 @@ "looks_like": "glock_17", "type": "GUN", "name": { "str": "M9 combat pistol" }, - "description": "A rugged, iconic, and long-serving 9mm handgun, the M9 is a sleek pistol that has enjoyed fame in military, law enforcement, and civilian circles ever since its inception. Adopted as the primary service sidearm across all United States armed branches from the early eighties until the late two thousand and tens, the weapon has seen a great deal of popular media coverage in both videogames and television alike.", + "description": "A rugged, iconic, and long-serving 9mm handgun, the M9 is a sleek pistol that has enjoyed fame in military, law enforcement, and civilian circles ever since its inception. Adopted as the primary service sidearm across all United States armed branches from the early eighties until the late two thousand and tens, the weapon has seen a great deal of popular media coverage in both video games and television alike.", "weight": "961 g", "volume": "570 ml", "longest_side": "249 mm", @@ -1313,5 +1313,58 @@ } ], "melee_damage": { "bash": 9 } + }, + { + "id": "draco_9mm", + "//": "Based off of https://www.centuryarms.com/draco-nak9.html", + "copy-from": "pistol_base", + "looks_like": "draco", + "type": "GUN", + "name": { "str": "Glock AK pistol" }, + "description": "A 9mm AK pistol that accepts Glock magazines. Has an 11.14\" barrel.", + "variant_type": "gun", + "variants": [ + { + "id": "draco_9mm", + "name": { "str": "NAK 9" }, + "description": "The NAK 9 is a Century Arms imported gun. It is essentially a shortened AK with no stock, chambered in 9mm and accepting Glock magazines, with an 11.14\" barrel." + } + ], + "weight": "2894 g", + "volume": "1617 ml", + "longest_side": "495 mm", + "barrel_length": "283 mm", + "price": "699 USD 99 cent", + "price_postapoc": "15 USD", + "to_hit": { "grip": "none", "length": "hand", "surface": "line", "balance": "clumsy" }, + "//1": "Surface as line, as there's only 1 face to hit something with, and requires a really weird grip angle", + "material": [ "steel", "wood" ], + "color": "brown", + "ammo": [ "9mm" ], + "ranged_damage": { "damage_type": "bullet", "amount": 3 }, + "range": 5, + "dispersion": 250, + "durability": 7, + "min_cycle_recoil": 380, + "valid_mod_locations": [ + [ "barrel", 1 ], + [ "brass catcher", 1 ], + [ "grip", 1 ], + [ "mechanism", 2 ], + [ "muzzle", 1 ], + [ "rail mount", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], + "pocket_data": [ + { + "magazine_well": "250 ml", + "pocket_type": "MAGAZINE_WELL", + "item_restriction": [ "glockmag", "glockbigmag", "glock17_17", "glock17_22", "glock_drum_50rd", "glock_drum_100rd" ] + } + ], + "melee_damage": { "bash": 6 } } ] diff --git a/data/json/items/gun/shot.json b/data/json/items/gun/shot.json index 132e24802008f..f4072c9c3e4bc 100644 --- a/data/json/items/gun/shot.json +++ b/data/json/items/gun/shot.json @@ -33,8 +33,8 @@ "copy-from": "shotgun_base", "looks_like": "remington_870", "type": "GUN", - "name": { "str": "12-gauge gatling gun" }, - "description": "An electrically driven six barrel gatling shotgun, fed from handmade cloth belts. Even properly mounted, this seems like an unwieldy beast, and the six separate barrels make for difficult zeroing. The externally driven action means this is much less likely to jam.", + "name": { "str": "12-gauge Gatling gun" }, + "description": "An electrically driven six barrel Gatling shotgun, fed from handmade cloth belts. Even properly mounted, this seems like an unwieldy beast, and the six separate barrels make for difficult zeroing. The externally driven action means this is much less likely to jam.", "weight": "4980 g", "volume": "4500 ml", "longest_side": "110 cm", diff --git a/data/json/items/gun/ups.json b/data/json/items/gun/ups.json index e7711d7c63b1a..da8e20ef4a057 100644 --- a/data/json/items/gun/ups.json +++ b/data/json/items/gun/ups.json @@ -219,7 +219,7 @@ "looks_like": "m134", "type": "GUN", "name": { "str": "salvaged CMES laser cannon" }, - "description": "This gatling-laser has been stripped from its CMES mech-suit and is far too heavy to use on its own. You will need to deploy it or mount it to a vehicle, but it could be devastating if you have deep battery reserves.", + "description": "This Gatling-laser has been stripped from its CMES mech-suit and is far too heavy to use on its own. You will need to deploy it or mount it to a vehicle, but it could be devastating if you have deep battery reserves.", "valid_mod_locations": [ [ "emitter", 1 ], [ "lens", 1 ], [ "sling", 1 ] ], "extend": { "flags": [ "MOUNTED_GUN" ] }, "delete": { "flags": [ "UNBREAKABLE_MELEE", "NO_REPAIR", "NO_SALVAGE", "NO_UNWIELD" ] } diff --git a/data/json/items/gunmod/conversions.json b/data/json/items/gunmod/conversions.json index 1237975228db5..3dd8c984fc833 100644 --- a/data/json/items/gunmod/conversions.json +++ b/data/json/items/gunmod/conversions.json @@ -862,7 +862,7 @@ "symbol": ":", "color": "yellow", "location": "bore", - "mod_targets": [ "modular_deagle", "modular_deagle_357", "modular_deagle_44", "modular_deagle_50" ], + "mod_targets": [ "modular_deagle" ], "install_time": "2 m", "ammo_modifier": [ "357mag" ], "magazine_adaptor": [ [ "357mag", [ "deaglemag_357" ] ] ], @@ -889,7 +889,7 @@ "symbol": ":", "color": "yellow", "location": "bore", - "mod_targets": [ "modular_deagle", "modular_deagle_357", "modular_deagle_44", "modular_deagle_50" ], + "mod_targets": [ "modular_deagle" ], "install_time": "2 m", "ammo_modifier": [ "44" ], "magazine_adaptor": [ [ "44", [ "deaglemag" ] ] ], @@ -919,7 +919,7 @@ "symbol": ":", "color": "yellow", "location": "bore", - "mod_targets": [ "modular_deagle", "modular_deagle_357", "modular_deagle_44", "modular_deagle_50" ], + "mod_targets": [ "modular_deagle" ], "install_time": "2 m", "ammo_modifier": [ "50ae" ], "magazine_adaptor": [ [ "50ae", [ "deaglemag_50" ] ] ], diff --git a/data/json/items/melee/bludgeons.json b/data/json/items/melee/bludgeons.json index cf8b3750e1717..d3694967bab1d 100644 --- a/data/json/items/melee/bludgeons.json +++ b/data/json/items/melee/bludgeons.json @@ -1513,7 +1513,7 @@ "symbol": "/", "material": [ "wood", "steel" ], "techniques": [ "WBLOCK_1", "BRUTAL", "WIDE", "SWEEP" ], - "flags": [ "NONCONDUCTIVE" ], + "flags": [ "NONCONDUCTIVE", "UNBREAKABLE_MELEE" ], "volume": "2500 ml", "longest_side": "60 cm", "to_hit": { "grip": "solid", "length": "short", "surface": "any", "balance": "neutral" }, diff --git a/data/json/items/ranged/archery.json b/data/json/items/ranged/archery.json index 5d176f092a9d1..d1bc7ec3d9c15 100644 --- a/data/json/items/ranged/archery.json +++ b/data/json/items/ranged/archery.json @@ -23,6 +23,7 @@ "looks_like": "arrow_fire_hardened_fletched", "description": "A fletched wooden arrow shaft with a pointed tip.", "material": [ { "type": "wood", "portion": 81 }, { "type": "steel", "portion": 19 } ], + "flags": [ "NONCONDUCTIVE" ], "volume": "90 ml", "price": "10 USD", "price_postapoc": "30 cent", @@ -146,6 +147,7 @@ "color": "green", "description": "A fletched aluminum arrow shaft with a bladed tip. Useful for maximizing damage to the target.", "material": [ { "type": "aluminum", "portion": 81 }, { "type": "steel", "portion": 19 } ], + "delete": { "flags": [ "NONCONDUCTIVE" ] }, "copy-from": "arrow_field_point_fletched", "relative": { "dispersion": -75 }, "price_postapoc": "40 cent", @@ -162,6 +164,7 @@ "color": "green", "description": "A fletched aluminum arrow shaft with a pointed tip. Useful for piercing armor.", "material": [ { "type": "aluminum", "portion": 81 }, { "type": "steel", "portion": 19 } ], + "delete": { "flags": [ "NONCONDUCTIVE" ] }, "copy-from": "arrow_field_point_fletched", "relative": { "dispersion": -75 }, "price_postapoc": "40 cent", @@ -180,6 +183,7 @@ "looks_like": "arrow_fire_hardened_fletched", "description": "A fletched aluminum arrow shaft with a blunt tip. Useful for hunting small woodland creatures without splattering them all over the ground.", "material": [ { "type": "aluminum", "portion": 81 }, { "type": "steel", "portion": 19 } ], + "delete": { "flags": [ "NONCONDUCTIVE" ] }, "copy-from": "arrow_field_point_fletched", "relative": { "dispersion": -75 }, "damage": { "damage_type": "stab", "constant_damage_multiplier": 0.5 }, @@ -195,6 +199,7 @@ "color": "green", "description": "A fletched carbon fiber arrow shaft with an expanding broadhead tip.", "material": [ { "type": "kevlar_rigid", "portion": 81 }, { "type": "steel", "portion": 19 } ], + "delete": { "flags": [ "NONCONDUCTIVE" ] }, "copy-from": "arrow_field_point_fletched", "relative": { "dispersion": -100 }, "price": "16 USD", @@ -240,6 +245,7 @@ "price": "35 USD", "price_postapoc": "10 cent", "material": [ { "type": "wood", "portion": 77 }, { "type": "steel", "portion": 19 }, { "type": "cotton", "portion": 4 } ], + "flags": [ "NONCONDUCTIVE" ], "symbol": "=", "color": "brown", "ammo_type": "arrow", @@ -272,7 +278,7 @@ "revert_to": "arrow_field_point_fletched", "recovery_chance": 97, "effects": [ "IGNITE" ], - "flags": [ "TRADER_AVOID" ] + "extend": { "flags": [ "TRADER_AVOID" ] } }, { "id": "selfbow", diff --git a/data/json/items/ranged/ballista.json b/data/json/items/ranged/ballista.json index bb3859bc2c502..178d02d65b50d 100644 --- a/data/json/items/ranged/ballista.json +++ b/data/json/items/ranged/ballista.json @@ -43,6 +43,7 @@ "symbol": "=", "color": "green", "material": [ { "type": "wood", "portion": 85 }, { "type": "steel", "portion": 15 } ], + "flags": [ "NONCONDUCTIVE" ], "ammo_type": "bolt_ballista", "damage": { "damage_type": "stab", "constant_damage_multiplier": 2, "armor_penetration": 20 }, "dispersion": 35, diff --git a/data/json/items/ranged/crossbows.json b/data/json/items/ranged/crossbows.json index 4e29c1d1c5e08..e783a794a4e18 100644 --- a/data/json/items/ranged/crossbows.json +++ b/data/json/items/ranged/crossbows.json @@ -80,6 +80,7 @@ "color": "green", "description": "A fletched wooden crossbow bolt with a pointed tip. Useful for piercing armor.", "material": [ { "type": "wood", "portion": 81 }, { "type": "steel", "portion": 19 } ], + "flags": [ "NONCONDUCTIVE" ], "volume": "85 ml", "longest_side": "300 mm", "price": "11 USD 20 cent", @@ -127,6 +128,7 @@ "color": "green", "description": "A fletched aluminum crossbow bolt with a bladed tip. Useful for maximizing damage to the target.", "replace_materials": { "steel": "aluminum" }, + "delete": { "flags": [ "NONCONDUCTIVE" ] }, "copy-from": "bolt_wood_bodkin", "relative": { "dispersion": -30 }, "price": "4 USD 50 cent", @@ -143,6 +145,7 @@ "color": "green", "description": "A fletched aluminum crossbow bolt with a pointed tip. Useful for piercing armor.", "replace_materials": { "steel": "aluminum" }, + "delete": { "flags": [ "NONCONDUCTIVE" ] }, "copy-from": "bolt_wood_bodkin", "relative": { "dispersion": -35 }, "price": "4 USD 50 cent", @@ -159,6 +162,7 @@ "color": "green", "description": "A fletched aluminum crossbow bolt with a blunt tip. Useful for hunting small woodland creatures without splattering them all over the ground.", "replace_materials": { "steel": "aluminum" }, + "delete": { "flags": [ "NONCONDUCTIVE" ] }, "copy-from": "bolt_wood_bodkin", "relative": { "dispersion": -30 }, "damage": { "damage_type": "stab", "constant_damage_multiplier": 0.5 }, @@ -173,7 +177,8 @@ "symbol": "=", "color": "green", "description": "A fletched carbon fiber crossbow bolt shaft with an expanding broadhead tip. Deals impressive damage to targets.", - "replace_materials": { "steel": "kevlar_rigid", "wood": "kevlar_rigid" }, + "replace_materials": { "wood": "kevlar_rigid" }, + "delete": { "flags": [ "NONCONDUCTIVE" ] }, "copy-from": "bolt_wood_bodkin", "relative": { "dispersion": -40 }, "price": "23 USD 80 cent", diff --git a/data/json/items/tool/electronics.json b/data/json/items/tool/electronics.json index ada34d8eb8710..89d032b58bd1f 100644 --- a/data/json/items/tool/electronics.json +++ b/data/json/items/tool/electronics.json @@ -296,7 +296,7 @@ "color": "green", "ammo": [ "battery" ], "flags": [ "WATER_BREAK" ], - "charges_per_use": 5000, + "charges_per_use": 2400, "use_action": [ "MEASURE_RESONANCE" ], "//": "Battery only, intentionally. Meant for field expeditions to other dimensions where grid power is unavailable. Too advanced for the player to make grid-useable.", "pocket_data": [ diff --git a/data/json/items/tool/explosives.json b/data/json/items/tool/explosives.json index c0ef8517ce456..d057d76a8a2cd 100644 --- a/data/json/items/tool/explosives.json +++ b/data/json/items/tool/explosives.json @@ -31,7 +31,8 @@ "color": "light_gray", "use_action": { "type": "message", "message": "You've already set the %s's timer, you might want to get away from it." }, "countdown_action": { "type": "explosion", "explosion": { "power": 2000 } }, - "flags": [ "TRADER_AVOID" ] + "countdown_interval": "6 seconds", + "flags": [ "NPC_THROW_NOW" ] }, { "id": "dynamite", @@ -408,6 +409,7 @@ "color": "green", "use_action": { "type": "message", "message": "You've already pulled the %s's pin, try throwing it instead.", "name": "Pull pin" }, "countdown_action": { "type": "explosion", "explosion": { "power": 240, "shrapnel": { "casing_mass": 217, "fragment_mass": 0.02 } } }, + "countdown_interval": "5 seconds", "flags": [ "BOMB", "TRADER_AVOID", "DANGEROUS" ], "melee_damage": { "bash": 6 } }, diff --git a/data/json/items/tool/science.json b/data/json/items/tool/science.json index 1059beea37b4a..fc6e822b1a22f 100644 --- a/data/json/items/tool/science.json +++ b/data/json/items/tool/science.json @@ -1423,7 +1423,7 @@ "category": "TOOL", "name": { "str_sp": "weather glass" }, "description": "Also called storm glass or 'Goethe barometer', The weather glass barometer consists of a glass container with a sealed body, half filled with water. A narrow spout connects to the body below the water level and rises above the water level. The difference between the sealed water level in the body and the narrow open spout determines the atmospheric pressure. Activate to get current atmospheric pressure.", - "//": "this is based on wikipedia's page on barometers, in section 'water barometers'", + "//": "this is based on Wikipedia's page on barometers, in section 'water barometers'", "material": [ "glass" ], "weight": "6000 g", "volume": "4 L", diff --git a/data/json/items/toy.json b/data/json/items/toy.json index d2775ab7aea79..2ff4d7dbddd6a 100644 --- a/data/json/items/toy.json +++ b/data/json/items/toy.json @@ -773,7 +773,7 @@ "id": "toy_figure_caiman", "name": { "str": "lizardman figurine" }, "description": "An expensive figurine of a buff man in streetwear with a lizard head, holding a pair of knives in his hands.", - "//": "yes this is a dorohedoro reference" + "//": "yes this is a Dorohedoro reference" }, { "id": "toy_figure_anime", @@ -783,7 +783,7 @@ { "id": "toy_figure_heavyweapons", "name": { "str": "video game figurine" }, - "description": "A large figurine of a videogame character, holding a massive gatling gun in his giant arms." + "description": "A large figurine of a video game character, holding a massive Gatling gun in his giant arms." }, { "id": "toy_figurine_smoker", diff --git a/data/json/mapgen/house/bungalow04.json b/data/json/mapgen/house/bungalow04.json index b0ccde41655cc..94f6a42bdffe2 100644 --- a/data/json/mapgen/house/bungalow04.json +++ b/data/json/mapgen/house/bungalow04.json @@ -23,7 +23,7 @@ ".%..&#R~~l!!$~T!!#......", ".&&&&#s~~H~~~~~~~#...%..", ".##o##x~~H~~RRR~~#......", - ".#@@C|s~~H~~|||++#......", + ".#@@d|s~~H~~|||++#......", ".#@@ |R~~l~~+L|zz#///...", ".o +~~~~~~|||||#///...", ".o |b~~~~~+----o///...", diff --git a/data/json/mapgen/lab/lab_modular/lab_2x2x2_RES_8_commons.json b/data/json/mapgen/lab/lab_modular/lab_2x2x2_RES_8_commons.json index 278f284cad84c..ce599cec244c5 100644 --- a/data/json/mapgen/lab/lab_modular/lab_2x2x2_RES_8_commons.json +++ b/data/json/mapgen/lab/lab_modular/lab_2x2x2_RES_8_commons.json @@ -111,7 +111,7 @@ { "type": "mapgen", "method": "json", - "//": "combines 2 5x5 mexican restaurant areas and a 6x6 kitchen.", + "//": "combines 2 5x5 Mexican restaurant areas and a 6x6 kitchen.", "nested_mapgen_id": "lab_17x17_shop", "object": { "mapgensize": [ 17, 17 ], @@ -125,7 +125,7 @@ { "type": "mapgen", "method": "json", - "//": "combines 2 5x5 mexican restaurant areas and a 6x6 kitchen.", + "//": "combines 2 5x5 Mexican restaurant areas and a 6x6 kitchen.", "nested_mapgen_id": "lab_17x17_shop_2", "object": { "mapgensize": [ 17, 17 ], diff --git a/data/json/mapgen/nested/road_nested.json b/data/json/mapgen/nested/road_nested.json index 24795094e46cd..86732c8ceeaa6 100644 --- a/data/json/mapgen/nested/road_nested.json +++ b/data/json/mapgen/nested/road_nested.json @@ -105,7 +105,7 @@ "nested_mapgen_id": "24x24_marked_crosswalks", "object": { "mapgensize": [ 24, 24 ], - "//": "Could merge with traffic lights so they're not independant.", + "//": "Could merge with traffic lights so they're not independent.", "place_nested": [ { "chunks": [ "16x16_marked_crosswalk_h", "null" ], @@ -144,7 +144,7 @@ "nested_mapgen_id": "24x24_traffic_lights", "object": { "mapgensize": [ 24, 24 ], - "//": "Could merge with crosswalks so they're not independant, places traffic light on right of joining roads", + "//": "Could merge with crosswalks so they're not independent, places traffic light on right of joining roads", "place_nested": [ { "chunks": [ "1x1_traffic_light" ], diff --git a/data/json/mapgen/road.json b/data/json/mapgen/road.json index 0085ffa4d9808..c033f6619d4ac 100644 --- a/data/json/mapgen/road.json +++ b/data/json/mapgen/road.json @@ -742,7 +742,7 @@ "weight": { "global_val": "vanilla_road_weight", "default": 1000 }, "object": { "fallback_predecessor_mapgen": "field", - "//": "Only have a chance for a rotary when no orthoganally adjacent curved", + "//": "Only have a chance for a rotary when no orthogonally adjacent curved", "place_nested": [ { "chunks": [ [ "24x24_road_four_way_crossroad", 39 ], [ "24x24_road_four_way_rotary", 1 ] ], diff --git a/data/json/monsters/feral_humans.json b/data/json/monsters/feral_humans.json index e11beac7646c0..11d4aca3d2e3a 100644 --- a/data/json/monsters/feral_humans.json +++ b/data/json/monsters/feral_humans.json @@ -174,6 +174,7 @@ "id": "mon_feral_human_pipe_fungal_infected", "type": "MONSTER", "copy-from": "mon_feral_human_pipe", + "speed": 90, "upgrades": { "age_grow": 4, "into": "mon_feral_human_pipe_fungal_corpse" }, "burn_into": "mon_starer_pipe", "extend": { "flags": [ "NO_FUNG_DMG" ], "species": [ "FUNGUS" ] } @@ -182,6 +183,7 @@ "id": "mon_feral_human_crowbar_fungal_infected", "type": "MONSTER", "copy-from": "mon_feral_human_crowbar", + "speed": 90, "upgrades": { "age_grow": 4, "into": "mon_feral_human_crowbar_fungal_corpse" }, "burn_into": "mon_starer_crowbar", "extend": { "flags": [ "NO_FUNG_DMG" ], "species": [ "FUNGUS" ] } @@ -190,6 +192,7 @@ "id": "mon_feral_human_axe_fungal_infected", "type": "MONSTER", "copy-from": "mon_feral_human_axe", + "speed": 90, "upgrades": { "age_grow": 4, "into": "mon_feral_human_axe_fungal_corpse" }, "burn_into": "mon_starer_axe", "extend": { "flags": [ "NO_FUNG_DMG" ], "species": [ "FUNGUS" ] } @@ -563,6 +566,7 @@ "id": "mon_feral_cop_fungal_infected", "type": "MONSTER", "copy-from": "mon_feral_cop", + "speed": 85, "description": "A maddened and crazed police officer infected by the fungus. Their body armor is overgrown with fungal matter. Though obviously in pain they don't seem any less keen to batter you to death with their baton.", "extend": { "flags": [ "NO_FUNG_DMG" ], "species": [ "FUNGUS" ] } }, @@ -570,7 +574,7 @@ "id": "mon_feral_human_archaeologist", "type": "MONSTER", "name": "feral archaeologist", - "description": "Judging by looks, this poor individual was probably an archeologist in their former life. Rabid and bloodshot, they now seem intent to make you a part of their collection as they come at you with a shovel in hand.", + "description": "Judging by looks, this poor individual was probably an archaeologist in their former life. Rabid and bloodshot, they now seem intent to make you a part of their collection as they come at you with a shovel in hand.", "copy-from": "mon_feral_human_pipe", "special_attacks": [ { diff --git a/data/json/monsters/mechsuits.json b/data/json/monsters/mechsuits.json index 8fb87dee625cc..69a2049381471 100644 --- a/data/json/monsters/mechsuits.json +++ b/data/json/monsters/mechsuits.json @@ -49,7 +49,7 @@ "id": "mon_mech_combat", "type": "MONSTER", "name": { "str": "X-02: 'Grunt' Combat Mech" }, - "description": "The Boeing-Daewoo CMES (Combat Mechanical Exoskeleton Suit), a recent acquisition by the U.S. military, it was designed to be used in a fire support role, due to its fearsome integrated gatling laser. It was not deployed before the Cataclysm hit, though there were a few prototypes in the field. You may be able to hack it to accept you as its pilot. Like all mech-suits, it can act as a UPS from its large battery.", + "description": "The Boeing-Daewoo CMES (Combat Mechanical Exoskeleton Suit), a recent acquisition by the U.S. military, it was designed to be used in a fire support role, due to its fearsome integrated Gatling laser. It was not deployed before the Cataclysm hit, though there were a few prototypes in the field. You may be able to hack it to accept you as its pilot. Like all mech-suits, it can act as a UPS from its large battery.", "default_faction": "mech_bot", "species": [ "ROBOT" ], "diff": 5, diff --git a/data/json/monsters/reptile_amphibian.json b/data/json/monsters/reptile_amphibian.json index e9417768d40ab..a533d1285c8f0 100644 --- a/data/json/monsters/reptile_amphibian.json +++ b/data/json/monsters/reptile_amphibian.json @@ -575,7 +575,7 @@ "id": "mon_bullfrog_frog", "type": "MONSTER", "copy-from": "mon_proxy_frog", - "description": "The American bullfrog, in its natural habitat. It feeds on insects, mice, lizards and any other living thing it can stuff down its gullet.", + "description": "The American bullfrog, in its natural habitat. It feeds on insects, mice, lizards, and any other living thing it can stuff down its gullet.", "name": { "str": "bullfrog" }, "volume": "1000 ml", "weight": "750 g", @@ -616,7 +616,7 @@ "harvest": "mutant_tiny", "upgrades": { "age_grow": 15, "into": "mon_foul_bigfrog" }, "extend": { "flags": [ "POISON", "NO_BREATHE" ] }, - "//": "NO_BREATHE flag is to prevent gassing by other 'foul' toads. When possible, add effect for aoe morale debuff around toad. Possibly stack up until triggering nausea/vomitting." + "//": "NO_BREATHE flag is to prevent gassing by other 'foul' toads. When possible, add effect for aoe morale debuff around toad. Possibly stack up until triggering nausea/vomiting." }, { "id": "mon_freedom_toad", diff --git a/data/json/monsters/rodentkin.json b/data/json/monsters/rodentkin.json index 0e18520fb26ec..454fe9bde88f5 100644 --- a/data/json/monsters/rodentkin.json +++ b/data/json/monsters/rodentkin.json @@ -61,7 +61,7 @@ "id": "mon_big_rat", "type": "MONSTER", "name": { "str": "big rat" }, - "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occured is nonsensical and should be reported as a bug.", + "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occurred is nonsensical and should be reported as a bug.", "description": "This cat-sized rat snuffles along the ground looking for things to eat. It hisses at anything that comes near it, baring sizable teeth.", "default_faction": "ratkin", "bodytype": "pig", @@ -109,7 +109,7 @@ "type": "MONSTER", "name": { "str": "zap rattigan" }, "description": "This cat sized albino mouse sparks randomly, whenever anything approaches it.", - "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occured is nonsensical and should be reported as a bug.", + "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occurred is nonsensical and should be reported as a bug.", "default_faction": "ratkin", "copy-from": "mon_big_rat", "symbol": "R", @@ -129,7 +129,7 @@ "type": "MONSTER", "name": { "str": "tunnel runner" }, "description": "Prior to the Cataclysm someone might have referred to this dog-sized rat as a 'mass of claws and teeth,' but that could describe nearly everything you meet these days. In any case, this particular mass of claws and teeth is eyeing its surroundings hungrily.", - "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occured is nonsensical and should be reported as a bug.", + "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occurred is nonsensical and should be reported as a bug.", "default_faction": "ratkin", "copy-from": "mon_big_rat", "volume": "20 L", @@ -172,7 +172,7 @@ "name": { "str": "pack rat" }, "description": "This humanoid rodent stands over five feet tall, it pokes and bites at anything shiny, hastily shoving anything of interest into its mouth.", "default_faction": "ratkin", - "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occured is nonsensical and should be reported as a bug.", + "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occurred is nonsensical and should be reported as a bug.", "copy-from": "mon_big_rat", "volume": "20 L", "weight": "30 kg", @@ -213,7 +213,7 @@ "name": { "str": "Mouse of NEMA", "str_pl": "Mice of NEMA" }, "description": "This albino, humanoid mouse walks on its hind legs. You can see eddies of wind swirl unnaturally around it as it moves, debris caught in its wake.", "default_faction": "ratkin", - "//2": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occured is nonsensical and should be reported as a bug.", + "//2": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occurred is nonsensical and should be reported as a bug.", "//": "High winds surrounding it make bash and bullets less effective. Cut and stab are almost unaffected.", "copy-from": "mon_big_rat", "volume": "20 L", @@ -245,7 +245,7 @@ "name": { "str": "mausketeer" }, "description": "This humanoid rat seems to be inexplicably dressed for a renfaire in an imitation of Ancien Régime light cavalry, complete with a sword.", "default_faction": "ratkin", - "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occured is nonsensical and should be reported as a bug.", + "//": "All monsters with faction ratkin should only appear in places that make sense for them to appear. They are specific to a unique lab and any appearances by them outside of that lab prior to at minimum two seasons after the Cataclysm occurred is nonsensical and should be reported as a bug.", "copy-from": "mon_big_rat", "volume": "20 L", "weight": "30 kg", diff --git a/data/json/monsters/zed_lab.json b/data/json/monsters/zed_lab.json index 3f2f4deb3e0db..d4f32bd2b16f9 100644 --- a/data/json/monsters/zed_lab.json +++ b/data/json/monsters/zed_lab.json @@ -40,7 +40,7 @@ "id": "mon_zombie_phase_skulker", "type": "MONSTER", "name": { "str": "phase skulker" }, - "description": "What remains of a researcher lost to the portal storms, twisted and enervated by the presences that lurk beneath natural perception. It walks and stumbles in a stuttered manner, and is granted tenuous corporality only by grace of the experimental gear it wore when it died.", + "description": "What remains of a researcher lost to the portal storms, twisted and enervated by the presences that lurk beneath natural perception. It walks and stumbles in a stuttered manner, and is granted tenuous corporeality only by grace of the experimental gear it wore when it died.", "default_faction": "zombie", "bodytype": "human", "species": [ "ABERRATION" ], diff --git a/data/json/monsters/zed_misc.json b/data/json/monsters/zed_misc.json index 5a06353cdc93e..09028a25518c1 100644 --- a/data/json/monsters/zed_misc.json +++ b/data/json/monsters/zed_misc.json @@ -364,7 +364,7 @@ "burn_into": "mon_frog_husk", "upgrades": { "half_life": 30, "into_group": "GROUP_ZOMBTREEFROG_UPGRADE" }, "extend": { "flags": [ "HARDTOSHOOT", "HIT_AND_RUN" ] }, - "//": "Translation note - 'Croaked' is a euphimistic way of saying 'died' in American English, while 'croak' is an onomatopoeic word for the sound frogs make. A simple, literal translation of 'zombie treefrog' would also be fitting." + "//": "Translation note - 'Croaked' is a euphemistic way of saying 'died' in American English, while 'croak' is an onomatopoeic word for the sound frogs make. A simple, literal translation of 'zombie treefrog' would also be fitting." }, { "id": "mon_frog_shadow", diff --git a/data/json/mutations/mutations.json b/data/json/mutations/mutations.json index 13ac7d30accc1..b5fc8b59ad6d7 100644 --- a/data/json/mutations/mutations.json +++ b/data/json/mutations/mutations.json @@ -2636,7 +2636,7 @@ "id": "FROG_EYES", "//": "Currently without the NV from URSINE_EYE", "name": { "str": "Frog Eyes" }, - "points": 1, + "points": 0, "vitamin_cost": 60, "visibility": 8, "ugliness": 4, @@ -6651,6 +6651,7 @@ "vitamin_cost": 60, "visibility": 8, "ugliness": 4, + "mixed_effect": true, "types": [ "EYES" ], "description": "Your eyes bulge out several inches from your skull. This does not affect your vision in any way.", "leads_to": [ "MEMBRANE" ], diff --git a/data/json/npcs/Backgrounds/codger.json b/data/json/npcs/Backgrounds/codger.json index 76a254607019f..94a2e6a6f51bc 100644 --- a/data/json/npcs/Backgrounds/codger.json +++ b/data/json/npcs/Backgrounds/codger.json @@ -75,7 +75,7 @@ "id": "BGSS_CODGER_STORY6", "type": "talk_topic", "dynamic_line": { - "gendered_line": "Anyway, long story short, I were headin' back up to Mount Greenwood to check on th'old ranger station again when I heard them bombs fallin and choppers flyin. Decided to camp out there to see it all through, but it didn't ever end, now, did it? So here I am.", + "gendered_line": "Anyway, long story short, I were headin' back up to Mount Greenwood to check on th' old ranger station again when I heard them bombs fallin' and choppers flyin'. Decided to camp out there to see it all through, but it didn't ever end, now, did it? So here I am.", "relevant_genders": [ "npc" ] }, "responses": [ diff --git a/data/json/npcs/Backgrounds/evacuee_1.json b/data/json/npcs/Backgrounds/evacuee_1.json index 72e42d7357019..1a2c4886cebef 100644 --- a/data/json/npcs/Backgrounds/evacuee_1.json +++ b/data/json/npcs/Backgrounds/evacuee_1.json @@ -62,7 +62,7 @@ "id": "BGSS_EVACUEE_1_STORY4", "type": "talk_topic", "dynamic_line": { - "gendered_line": "I thought I had those damned figured out. I got braver, started heading out by day more and more. One of those screamer zombies spotted me and called in a horde, with a giant beastie at the head of it, the size of a volkswagen and all covered in bone plates. I know when I'm outclassed. The big guy was held back by his own horde of buddies, and I managed to book it back to my place. I closed the windows, locked it down, but it was too late. The giant followed me and just started hammering right through the walls. I grabbed what I could and made for the horizon. Last I saw of my squat, it was collapsing on the bastard. For all I know, it died in the crash, but I am not going back to find out.", + "gendered_line": "I thought I had those damned figured out. I got braver, started heading out by day more and more. One of those screamer zombies spotted me and called in a horde, with a giant beastie at the head of it, the size of a Volkswagen and all covered in bone plates. I know when I'm outclassed. The big guy was held back by his own horde of buddies, and I managed to book it back to my place. I closed the windows, locked it down, but it was too late. The giant followed me and just started hammering right through the walls. I grabbed what I could and made for the horizon. Last I saw of my squat, it was collapsing on the bastard. For all I know, it died in the crash, but I am not going back to find out.", "relevant_genders": [ "npc" ] }, "responses": [ diff --git a/data/json/npcs/Backgrounds/left_for_dead_3.json b/data/json/npcs/Backgrounds/left_for_dead_3.json index 66116d19583b0..50c986066964e 100644 --- a/data/json/npcs/Backgrounds/left_for_dead_3.json +++ b/data/json/npcs/Backgrounds/left_for_dead_3.json @@ -70,7 +70,7 @@ "id": "CWH_LEFT_FOR_DEAD_3_IDEAS1", "type": "talk_topic", "dynamic_line": { - "gendered_line": "So, I remember the time leading up to the riots, same as anyone. Things were bad, there were some really awful crimes being reported in the news, and there was a lot of racial tension as usual from the way the cops were handling it. Then people started rioting, which isn't unusual, but it was weird the kind of places that the riots were starting in. Like, upper middle class neighborhoods, midwestern small towns, things like that. Anyway, I joined the riots and I don't remember a lot of clear stuff after that.", + "gendered_line": "So, I remember the time leading up to the riots, same as anyone. Things were bad, there were some really awful crimes being reported in the news, and there was a lot of racial tension as usual from the way the cops were handling it. Then people started rioting, which isn't unusual, but it was weird the kind of places that the riots were starting in. Like, upper middle class neighborhoods, Midwestern small towns, things like that. Anyway, I joined the riots and I don't remember a lot of clear stuff after that.", "relevant_genders": [ "npc" ] }, "responses": [ diff --git a/data/json/npcs/NC_JUNK_SHOPKEEP.json b/data/json/npcs/NC_JUNK_SHOPKEEP.json index 5a63c07332150..7b04a5746323c 100644 --- a/data/json/npcs/NC_JUNK_SHOPKEEP.json +++ b/data/json/npcs/NC_JUNK_SHOPKEEP.json @@ -122,7 +122,7 @@ { "item": "pistol_scope", "prob": 10 }, { "item": "improve_sights", "prob": 20 }, { "item": "ashot", "prob": 5 }, - { "item": "superglue", "prob": 30 }, + { "group": "superglue", "prob": 30 }, { "item": "string_6", "prob": 2 }, { "item": "string_36", "prob": 40 }, { "item": "wrench", "prob": 30 }, diff --git a/data/json/npcs/campus/great_library_librarian_goods.json b/data/json/npcs/campus/great_library_librarian_goods.json index 5756ab5edfbce..c9d0910ec1d26 100644 --- a/data/json/npcs/campus/great_library_librarian_goods.json +++ b/data/json/npcs/campus/great_library_librarian_goods.json @@ -22,7 +22,7 @@ "subtype": "distribution", "items": [ { "item": "duct_tape", "charges": [ 35, 50 ] }, - { "item": "superglue", "count": [ 0, 1 ] }, + { "group": "superglue", "count": [ 0, 1 ] }, { "item": "paper", "count": [ 150, 200 ] }, { "item": "cardboard", "count": [ 10, 20 ] } ] diff --git a/data/json/npcs/classes.json b/data/json/npcs/classes.json index 8148ad7712e9f..88874f5d4bec7 100644 --- a/data/json/npcs/classes.json +++ b/data/json/npcs/classes.json @@ -127,7 +127,7 @@ "type": "npc_class", "id": "NC_VETERINARIAN", "name": { "str": "Veterinarian" }, - "//": "Reasonably, this class should recieve animal-specific medical proficiencies if they're ever added.", + "//": "Reasonably, this class should receive animal-specific medical proficiencies if they're ever added.", "job_description": "I'm looking for wounded to help.", "traits": [ { "group": "BG_survival_story_STUCK_IN_TOWN" }, diff --git a/data/json/npcs/exodii/exodii_merchant_itemlist.json b/data/json/npcs/exodii/exodii_merchant_itemlist.json index dff5086ec308c..4ab3d17b5e9e8 100644 --- a/data/json/npcs/exodii/exodii_merchant_itemlist.json +++ b/data/json/npcs/exodii/exodii_merchant_itemlist.json @@ -109,7 +109,7 @@ { "item": "zipper_long_plastic", "prob": 10, "count": [ 1, 2 ] }, { "item": "snapfastener_steel", "prob": 40, "count": [ 5, 10 ] }, { "item": "chunk_rubber", "prob": 50, "count": [ 1, 2 ] }, - { "item": "superglue", "prob": 30, "count": [ 1, 2 ] }, + { "group": "superglue", "prob": 30, "count": [ 1, 2 ] }, { "item": "rubber_cement", "prob": 40, "count": [ 1, 2 ] } ], "prob": 50 @@ -126,7 +126,7 @@ { "item": "ragpouch", "prob": 40, "count": [ 1, 2 ] }, { "item": "tool_belt", "prob": 40 }, { "item": "leather_pouch", "prob": 10 }, - { "item": "superglue", "prob": 30, "count": [ 1, 2 ] } + { "group": "superglue", "prob": 30, "count": [ 1, 2 ] } ], "prob": 50 } diff --git a/data/json/npcs/items_generic.json b/data/json/npcs/items_generic.json index 3055e771b58a0..c73037c828ba9 100644 --- a/data/json/npcs/items_generic.json +++ b/data/json/npcs/items_generic.json @@ -1037,7 +1037,7 @@ [ "string_6", 4 ], [ "sugar", 7 ], [ "sugar_beet", 2 ], - [ "superglue", 8 ], + { "group": "superglue", "prob": 8 }, [ "suppressor", 1 ], [ "survival_book", 3 ], [ "survnote", 3 ], diff --git a/data/json/npcs/random_encounters/camper_van_traveler.json b/data/json/npcs/random_encounters/camper_van_traveler.json index d9ab397ad7693..7362df35d1552 100644 --- a/data/json/npcs/random_encounters/camper_van_traveler.json +++ b/data/json/npcs/random_encounters/camper_van_traveler.json @@ -2,7 +2,7 @@ { "type": "npc", "id": "traveler_camper_van", - "class": "NC_SCAVENGER", + "class": "NC_CAMPER_VAN_TRAVELER", "attitude": 0, "mission": 3, "chat": "TALK_NPC_CAMPER_VAN_TRAVELER", @@ -14,6 +14,7 @@ "name": { "str": "Scavenger" }, "job_description": "I'm just trying to survive.", "traits": [ { "group": "BG_survival_story_EVACUEE" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], + "common": false, "shopkeeper_price_rules": [ { "category": "food", "premium": 2.5 }, { "item": "gasoline", "premium": 2.5 }, diff --git a/data/json/npcs/random_encounters/free_merchant_caravans.json b/data/json/npcs/random_encounters/free_merchant_caravans.json index 58b21a610bce4..de57f78098b6f 100644 --- a/data/json/npcs/random_encounters/free_merchant_caravans.json +++ b/data/json/npcs/random_encounters/free_merchant_caravans.json @@ -37,6 +37,7 @@ "id": "NC_CARAVAN_MERCHANT", "name": { "str": "Trader" }, "job_description": "I'm collecting gear and selling it.", + "common": false, "traits": [ { "group": "BG_survival_story_EVACUEE" }, { "group": "NPC_starting_traits" }, @@ -53,6 +54,7 @@ "id": "NC_CARAVAN_GUARD", "name": { "str": "Bounty Hunter" }, "job_description": "I'm a killer for hire.", + "common": false, "traits": [ { "group": "BG_survival_story_POLICE" }, { "group": "NPC_starting_traits" }, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Garry_Villeneuve.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Garry_Villeneuve.json index b59671cbe20bd..e66a26465a088 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Garry_Villeneuve.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Garry_Villeneuve.json @@ -57,7 +57,7 @@ "type": "item_group", "id": "REFUGEE_Garry_carried", "subtype": "collection", - "entries": [ { "item": "duct_tape" }, { "item": "superglue" } ] + "entries": [ { "item": "duct_tape" }, { "group": "superglue" } ] }, { "type": "item_group", diff --git a/data/json/npcs/refugee_center/surface_staff/Smokes/free_merchant_shopkeep_goods.json b/data/json/npcs/refugee_center/surface_staff/Smokes/free_merchant_shopkeep_goods.json index f9b06cbbff74a..4e236db179240 100644 --- a/data/json/npcs/refugee_center/surface_staff/Smokes/free_merchant_shopkeep_goods.json +++ b/data/json/npcs/refugee_center/surface_staff/Smokes/free_merchant_shopkeep_goods.json @@ -40,7 +40,7 @@ { "item": "thread", "charges": [ 100, 240 ] }, { "item": "nail", "charges": [ 80, 100 ] }, { "item": "duct_tape", "charges": [ 35, 50 ] }, - { "item": "superglue", "count": [ 0, 1 ] }, + { "group": "superglue", "count": [ 0, 1 ] }, { "item": "glass_shard", "count": [ 150, 200 ] }, { "item": "clay_lump", "count": [ 2, 3 ] }, { "item": "splinter", "count": [ 5, 7 ] }, diff --git a/data/json/obsoletion_and_migration_0.I/migration_items.json b/data/json/obsoletion_and_migration_0.I/migration_items.json index f70d0f5344012..1cf8670de999d 100644 --- a/data/json/obsoletion_and_migration_0.I/migration_items.json +++ b/data/json/obsoletion_and_migration_0.I/migration_items.json @@ -1819,5 +1819,11 @@ "id": "g36mag_100rd", "type": "MIGRATION", "replace": "stanag100drum" + }, + { + "id": "superglue", + "type": "MIGRATION", + "replace": "small_squeeze_tube", + "contents": [ { "id": "super_glue", "count": 40 } ] } ] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_military.json b/data/json/overmap/overmap_terrain/overmap_terrain_military.json index 0db47d600a575..69747a09f002c 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_military.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_military.json @@ -24,7 +24,7 @@ "fema_roof", "fema_1_3_roof" ], - "vision_levels": "isolated_building", + "vision_levels": "isolated_camp", "name": "FEMA camp", "sym": "F", "color": "i_blue", @@ -36,7 +36,7 @@ "type": "overmap_terrain", "id": [ "FEMA_tlc", "FEMA_te", "FEMA_trc", "FEMA_le", "FEMA_mid", "FEMA_re", "FEMA_blc", "FEMA_brc" ], "name": "FEMA refugee camp", - "vision_levels": "isolated_building", + "vision_levels": "isolated_camp", "sym": "F", "color": "i_blue", "extras": "build", diff --git a/data/json/overmap/vision_levels.json b/data/json/overmap/vision_levels.json index e65ecf50b38e6..5c9815bd09e47 100644 --- a/data/json/overmap/vision_levels.json +++ b/data/json/overmap/vision_levels.json @@ -36,6 +36,16 @@ "type": "oter_vision", "levels": [ { "name": "tower", "sym": "0", "color": "light_gray" }, { "name": "tower", "sym": "0", "color": "light_gray" } ] }, + { + "id": "isolated_camp", + "//": "If there's a tent, it's a camp", + "type": "oter_vision", + "levels": [ + { "name": "tent", "sym": ";", "color": "light_gray", "looks_like": "campsite" }, + { "name": "camp", "sym": "+", "color": "light_gray", "looks_like": "campsite" }, + { "name": "camp", "sym": "+", "color": "light_gray", "looks_like": "campsite" } + ] + }, { "id": "island", "//": "any island", diff --git a/data/json/recipes/ammo/weldgas.json b/data/json/recipes/ammo/weldgas.json index b55c29a44c03b..d84e0faf1d3ba 100644 --- a/data/json/recipes/ammo/weldgas.json +++ b/data/json/recipes/ammo/weldgas.json @@ -84,7 +84,6 @@ [ [ "material_limestone", 1 ], [ "chem_manganese_dioxide", 1 ], [ "light_disposable_cell", 1 ] ], [ [ "rosin", 5 ], - [ "superglue", 1 ], [ "bone_glue", 1 ], [ "sugar", 1 ], [ "plastic_chunk", 1 ], diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index f9fb7c4e5be27..27ada589827a0 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -317,7 +317,7 @@ "components": [ [ [ "goggles_ski", 1 ], [ "goggles_welding", 1 ], [ "glasses_safety", 1 ] ], [ [ "duct_tape", 120 ], [ "medical_tape", 120 ] ], - [ [ "superglue", 1 ] ] + [ [ "super_glue", 1 ] ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ] }, diff --git a/data/json/recipes/armor/other.json b/data/json/recipes/armor/other.json index 47cbca04188cd..b670e20f1db9b 100644 --- a/data/json/recipes/armor/other.json +++ b/data/json/recipes/armor/other.json @@ -442,12 +442,11 @@ [ "manual_swimming", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures_waterproofing" } ], - "using": [ [ "soldering_standard", 40 ] ], + "using": [ [ "soldering_standard", 40 ], [ "glue_waterproof", 10 ] ], "qualities": [ { "id": "PRESSURIZATION", "level": 1 }, { "id": "FABRIC_CUT", "level": 1 } ], "components": [ [ [ "hose", 2 ] ], [ [ "rebreather_filler_soda_lime", 90 ] ], - [ [ "superglue", 1 ] ], [ [ "wire_mesh", 1 ] ], [ [ "scrap", 8 ], [ "can_food", 4 ], [ "can_drink", 4 ], [ "canister_empty", 4 ] ], [ [ "small_scuba_tank", 1 ], [ "oxygen_tank", 1 ] ] @@ -472,13 +471,12 @@ [ "manual_swimming", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures_waterproofing" } ], - "using": [ [ "soldering_standard", 40 ] ], + "using": [ [ "soldering_standard", 40 ], [ "glue_waterproof", 10 ] ], "tools": [ [ [ "pseudo_app_oxygen_concentrator", 1620 ] ], [ [ "pseudo_app_hd_compressor_unit", 1350 ] ] ], "qualities": [ { "id": "FABRIC_CUT", "level": 1 } ], "components": [ [ [ "hose", 2 ] ], [ [ "rebreather_filler_soda_lime", 180 ] ], - [ [ "superglue", 1 ] ], [ [ "wire_mesh", 1 ] ], [ [ "scrap", 8 ], [ "can_food", 4 ], [ "can_drink", 4 ], [ "canister_empty", 4 ] ], [ [ "small_scuba_tank", 1 ], [ "oxygen_tank", 1 ] ] @@ -533,12 +531,11 @@ [ "manual_swimming", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures_waterproofing" } ], - "using": [ [ "soldering_standard", 40 ] ], + "using": [ [ "soldering_standard", 40 ], [ "glue_waterproof", 10 ] ], "qualities": [ { "id": "FABRIC_CUT", "level": 1 } ], "components": [ [ [ "hose", 2 ] ], [ [ "rebreather_filler_ko2", 360 ] ], - [ [ "superglue", 1 ] ], [ [ "wire_mesh", 1 ] ], [ [ "scrap", 10 ], [ "can_food", 5 ], [ "can_drink", 5 ], [ "canister_empty", 5 ] ] ] diff --git a/data/json/recipes/armor/suit.json b/data/json/recipes/armor/suit.json index 174798d632453..38c890f51ce01 100644 --- a/data/json/recipes/armor/suit.json +++ b/data/json/recipes/armor/suit.json @@ -1730,7 +1730,7 @@ "skills_required": [ "tailor", 6 ], "time": "6 h", "book_learn": [ [ "textbook_fireman", 8 ], [ "tailor_portfolio", 8 ] ], - "using": [ [ "sewing_standard", 200 ], [ "tailoring_nomex_patchwork", 40 ] ], + "using": [ [ "sewing_standard", 200 ], [ "tailoring_nomex_patchwork", 40 ], [ "glue_strong", 1000 ] ], "qualities": [ { "id": "FABRIC_CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_closures" }, @@ -1739,7 +1739,6 @@ ], "components": [ [ [ "sheet_kevlar_layered", 8 ] ], - [ [ "duct_tape", 200 ], [ "superglue", 5 ] ], [ [ "kevlar", 1 ], [ "ballistic_vest_light", 1 ], @@ -1753,11 +1752,10 @@ "type": "recipe", "copy-from": "entry_suit", "time": "6 h", - "using": [ [ "sewing_standard", 150 ], [ "tailoring_nomex_patchwork", 30 ] ], + "using": [ [ "sewing_standard", 150 ], [ "tailoring_nomex_patchwork", 30 ], [ "glue_strong", 750 ] ], "qualities": [ { "id": "FABRIC_CUT", "level": 2 } ], "components": [ [ [ "sheet_kevlar_layered", 6 ] ], - [ [ "duct_tape", 150 ], [ "superglue", 3 ] ], [ [ "kevlar", 1 ], [ "ballistic_vest_light", 1 ], @@ -1771,11 +1769,10 @@ "type": "recipe", "copy-from": "entry_suit", "time": "6 h 45 m", - "using": [ [ "sewing_standard", 300 ], [ "tailoring_nomex_patchwork", 50 ] ], + "using": [ [ "sewing_standard", 300 ], [ "tailoring_nomex_patchwork", 50 ], [ "glue_strong", 1500 ] ], "qualities": [ { "id": "FABRIC_CUT", "level": 2 } ], "components": [ [ [ "sheet_kevlar_layered", 12 ] ], - [ [ "duct_tape", 300 ], [ "superglue", 7 ] ], [ [ "kevlar", 2 ], [ "ballistic_vest_light", 2 ], diff --git a/data/json/recipes/other/materials.json b/data/json/recipes/other/materials.json index 20c5b730acea7..c055cf36745cb 100644 --- a/data/json/recipes/other/materials.json +++ b/data/json/recipes/other/materials.json @@ -971,7 +971,8 @@ "time": "45 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_polymerworking" } ], - "components": [ [ [ "sheet_kevlar", 16 ], [ "sheet_kevlar_layered", 1 ] ], [ [ "superglue", 1 ] ] ] + "using": [ [ "glue_strong", 450 ] ], + "components": [ [ [ "sheet_kevlar", 16 ], [ "sheet_kevlar_layered", 1 ] ] ] }, { "result": "sheet_cotton", diff --git a/data/json/recipes/other/parts.json b/data/json/recipes/other/parts.json index d63814ca728ff..adbe157a5e212 100644 --- a/data/json/recipes/other/parts.json +++ b/data/json/recipes/other/parts.json @@ -658,11 +658,11 @@ "difficulty": 3, "time": "60 m", "book_learn": [ [ "textbook_fabrication", 3 ], [ "textbook_mechanics", 3 ], [ "welding_book", 5 ] ], - "using": [ [ "welding_standard", 20 ] ], + "using": [ [ "welding_standard", 20 ], [ "glue_strong", 4 ] ], "//": "20cm weld", "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_welding_basic" }, { "proficiency": "prof_welding" } ], "qualities": [ { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "omnicamera", 1 ] ], [ [ "wire", 4 ] ], [ [ "superglue", 1 ] ] ] + "components": [ [ [ "omnicamera", 1 ] ], [ [ "wire", 4 ] ] ] }, { "type": "recipe", @@ -950,9 +950,9 @@ "time": "2 h 30 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_plasticworking", "time_multiplier": 1.25, "skill_penalty": 0.125 } ], - "using": [ [ "surface_heat", 10 ] ], + "using": [ [ "surface_heat", 10 ], [ "glue_any", 1 ] ], "qualities": [ { "id": "FILE", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "chunk_rubber", 8 ] ], [ [ "superglue", 4 ], [ "bone_glue", 4 ] ], [ [ "wheel_caster", 1 ] ] ] + "components": [ [ [ "chunk_rubber", 8 ] ], [ [ "wheel_caster", 1 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/other/parts_construction.json b/data/json/recipes/other/parts_construction.json index 2ceb33d23f97d..426a8b9361e15 100644 --- a/data/json/recipes/other/parts_construction.json +++ b/data/json/recipes/other/parts_construction.json @@ -532,14 +532,14 @@ "difficulty": 2, "time": "40 m", "book_learn": [ [ "textbook_fabrication", 3 ], [ "textbook_mechanics", 3 ], [ "welding_book", 5 ] ], - "using": [ [ "welding_standard", 80 ] ], + "using": [ [ "welding_standard", 80 ], [ "glue_strong", 250 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_welding_basic", "skill_penalty": 0.5 }, { "proficiency": "prof_welding" } ], "qualities": [ { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "glass_sheet", 1 ] ], [ [ "wire", 8 ] ], [ [ "superglue", 1 ] ] ] + "components": [ [ [ "glass_sheet", 1 ] ], [ [ "wire", 8 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/other/power_supplies.json b/data/json/recipes/other/power_supplies.json index 262b5e942c2b0..80122923cdf29 100644 --- a/data/json/recipes/other/power_supplies.json +++ b/data/json/recipes/other/power_supplies.json @@ -568,7 +568,7 @@ [ "textbook_fabrication", 3 ], [ "manual_fabrication", 4 ] ], - "using": [ [ "soldering_standard", 10 ], [ "surface_heat", 10 ] ], + "using": [ [ "soldering_standard", 10 ], [ "surface_heat", 10 ], [ "glue_strong", 5 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_plasticworking" }, @@ -577,7 +577,6 @@ ], "components": [ [ [ "plastic_chunk", 5 ] ], - [ [ "superglue", 1 ] ], [ [ "power_supply", 1 ] ], [ [ "e_scrap", 3 ] ], [ [ "scrap", 3 ] ], diff --git a/data/json/recipes/practice/computers.json b/data/json/recipes/practice/computers.json index 06112a45b74b5..e3785ba978e0c 100644 --- a/data/json/recipes/practice/computers.json +++ b/data/json/recipes/practice/computers.json @@ -12,7 +12,7 @@ "practice_data": { "min_difficulty": 0, "max_difficulty": 1, "skill_limit": 2 }, "autolearn": [ [ "computer", 1 ] ], "book_learn": [ [ "mag_computer", 0 ], [ "howto_computer", 0 ] ], - "tools": [ [ [ "laptop", 50 ], [ "eink_tablet_pc", 20 ], [ "smart_phone", 20 ] ] ], + "tools": [ [ [ "laptop", 10 ], [ "eink_tablet_pc", 1 ], [ "smart_phone", 5 ] ] ], "flags": [ "BLIND_EASY" ] }, { diff --git a/data/json/recipes/practice/devices.json b/data/json/recipes/practice/devices.json index 101c45f23007b..9d9e2c5e7287b 100644 --- a/data/json/recipes/practice/devices.json +++ b/data/json/recipes/practice/devices.json @@ -74,7 +74,7 @@ "time": "1 h", "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ - [ [ "superglue", 1 ], [ "duct_tape", 25 ] ], + [ [ "super_glue", 1 ], [ "duct_tape", 25 ] ], [ [ "scrap", 3 ], [ "steel_chunk", 1 ], [ "canister_empty", 1 ], [ "clay_canister", 1 ], [ "can_food", 1 ] ], [ [ "bb", 60 ], [ "nails", 30, "LIST" ] ] ], diff --git a/data/json/recipes/practice/melee.json b/data/json/recipes/practice/melee.json index df027a827951a..f842c21816caf 100644 --- a/data/json/recipes/practice/melee.json +++ b/data/json/recipes/practice/melee.json @@ -618,7 +618,7 @@ "category": "CC_*", "subcategory": "CSC_*_NESTED", "name": "spears (intermediate)", - "description": "Practice advanced spear moves and accurate thrusts against a training dummy. It's not glamorous, but spears were the workhorses of armed combat for millenia with good reason.", + "description": "Practice advanced spear moves and accurate thrusts against a training dummy. It's not glamorous, but spears were the workhorses of armed combat for millennia with good reason.", "skill_used": "stabbing", "skills_required": [ [ "melee", 1 ] ], "time": "1 h", diff --git a/data/json/recipes/recipe_ammo.json b/data/json/recipes/recipe_ammo.json index b196cb24249aa..3df2fe564e5e8 100644 --- a/data/json/recipes/recipe_ammo.json +++ b/data/json/recipes/recipe_ammo.json @@ -71,7 +71,7 @@ "autolearn": true, "using": [ [ "tailoring_leather_small", 2 ] ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic" } ], - "components": [ [ [ "string_36", 3 ], [ "cordage_36", 3 ] ], [ [ "superglue", 1 ], [ "bone_glue", 1 ] ] ], + "components": [ [ [ "string_36", 3 ], [ "cordage_36", 3 ] ], [ [ "super_glue", 5 ], [ "bone_glue", 1 ] ] ], "//": "Essentially a ball of glued-together string with some leather around it" }, { diff --git a/data/json/recipes/recipe_medsandchemicals.json b/data/json/recipes/recipe_medsandchemicals.json index bc81ac68ef3b3..b58ca4d62e5a9 100644 --- a/data/json/recipes/recipe_medsandchemicals.json +++ b/data/json/recipes/recipe_medsandchemicals.json @@ -1780,7 +1780,7 @@ "book_learn": [ [ "textbook_anarch", 5 ], [ "recipe_labchem", 4 ], [ "textbook_chemistry", 5 ] ], "proficiencies": [ { "proficiency": "prof_intro_chemistry" }, { "proficiency": "prof_inorganic_chemistry" } ], "qualities": [ { "id": "BOIL", "level": 2 } ], - "components": [ [ [ "chem_zinc_powder", 645 ] ], [ [ "chem_sulphur", 750 ] ], [ [ "superglue", 2 ] ] ] + "components": [ [ [ "chem_zinc_powder", 645 ] ], [ [ "chem_sulphur", 750 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/recipe_music_instruments.json b/data/json/recipes/recipe_music_instruments.json index 77ab11b41ccc9..751400eef0b14 100644 --- a/data/json/recipes/recipe_music_instruments.json +++ b/data/json/recipes/recipe_music_instruments.json @@ -14,7 +14,7 @@ "byproducts": [ [ "splinter", 68 ] ], "components": [ [ [ "tonewood", 2 ] ], - [ [ "superglue", 2 ] ], + [ [ "super_glue", 2 ] ], [ [ "wood_panel", 1 ] ], [ [ "piano_wire", 5 ] ], [ [ "tuning_pegs", 5 ] ] @@ -35,7 +35,7 @@ "byproducts": [ [ "splinter", 68 ] ], "components": [ [ [ "tonewood", 3 ] ], - [ [ "superglue", 2 ] ], + [ [ "super_glue", 2 ] ], [ [ "wood_panel", 1 ] ], [ [ "piano_wire", 5 ] ], [ [ "tuning_pegs", 5 ] ] @@ -56,7 +56,7 @@ "byproducts": [ [ "splinter", 89 ] ], "components": [ [ [ "tonewood", 2 ] ], - [ [ "superglue", 2 ] ], + [ [ "super_glue", 2 ] ], [ [ "wood_panel", 1 ] ], [ [ "piano_wire", 6 ] ], [ [ "tuning_pegs", 6 ] ] @@ -75,7 +75,7 @@ "qualities": [ { "id": "LUTHIER", "level": 1 }, { "id": "SAW_W", "level": 2 }, { "id": "CHISEL_WOOD", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carpentry_basic" } ], "byproducts": [ [ "splinter", 89 ] ], - "components": [ [ [ "tonewood", 6 ] ], [ [ "superglue", 2 ] ], [ [ "drum_skin", 2 ] ], [ [ "tuning_pegs", 12 ] ] ] + "components": [ [ [ "tonewood", 6 ] ], [ [ "super_glue", 2 ] ], [ [ "drum_skin", 2 ] ], [ [ "tuning_pegs", 12 ] ] ] }, { "result": "drum_percussion_primitive", @@ -90,6 +90,6 @@ "qualities": [ { "id": "LUTHIER", "level": 1 }, { "id": "SAW_W", "level": 2 }, { "id": "CHISEL_WOOD", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carpentry_basic" } ], "byproducts": [ [ "splinter", 89 ] ], - "components": [ [ [ "tonewood", 6 ] ], [ [ "superglue", 2 ] ], [ [ "tanned_hide", 2 ] ], [ [ "tuning_pegs", 12 ] ] ] + "components": [ [ [ "tonewood", 6 ] ], [ [ "super_glue", 2 ] ], [ [ "tanned_hide", 2 ] ], [ [ "tuning_pegs", 12 ] ] ] } ] diff --git a/data/json/recipes/recipe_traps.json b/data/json/recipes/recipe_traps.json index 49dee9dcce68e..86b65b1d86f71 100644 --- a/data/json/recipes/recipe_traps.json +++ b/data/json/recipes/recipe_traps.json @@ -26,7 +26,8 @@ "time": "25 m", "autolearn": true, "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "glass_shard", 4 ] ], [ [ "superglue", 1 ], [ "bone_glue", 1 ] ] ] + "using": [ [ "glue_any", 4 ] ], + "components": [ [ [ "glass_shard", 4 ] ] ] }, { "type": "recipe", @@ -56,7 +57,8 @@ "difficulty": 1, "time": "5 m", "autolearn": true, - "components": [ [ [ "nm_teeth", 4 ] ], [ [ "superglue", 1 ], [ "bone_glue", 1 ] ] ] + "using": [ [ "glue_any", 4 ] ], + "components": [ [ [ "nm_teeth", 4 ] ] ] }, { "type": "recipe", @@ -88,7 +90,7 @@ "autolearn": true, "using": [ [ "cordage", 1 ] ], "proficiencies": [ { "proficiency": "prof_traps" } ], - "components": [ [ [ "superglue", 1 ] ] ] + "components": [ [ [ "super_glue", 1 ] ] ] }, { "type": "recipe", @@ -226,7 +228,7 @@ "qualities": [ { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_traps" }, { "proficiency": "prof_trapsetting" } ], "components": [ - [ [ "superglue", 1 ], [ "duct_tape", 75 ] ], + [ [ "super_glue", 150 ], [ "duct_tape", 75 ] ], [ [ "scrap", 3 ], [ "steel_chunk", 1 ], [ "canister_empty", 1 ], [ "clay_canister", 1 ], [ "can_food", 1 ] ], [ [ "bb", 200 ], [ "nails", 100, "LIST" ] ], [ diff --git a/data/json/recipes/tools/lights.json b/data/json/recipes/tools/lights.json index c7f9fc4444f65..11fc63cdafd43 100644 --- a/data/json/recipes/tools/lights.json +++ b/data/json/recipes/tools/lights.json @@ -29,13 +29,8 @@ "decomp_learn": 2, "book_learn": [ [ "manual_electronics", 3 ], [ "advanced_electronics", 3 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ - [ [ "plastic_chunk", 1 ] ], - [ [ "superglue", 1 ] ], - [ [ "power_supply", 1 ] ], - [ [ "cable", 1 ] ], - [ [ "light_bulb", 1 ], [ "e_scrap", 1 ] ] - ] + "using": [ [ "glue_any", 1 ] ], + "components": [ [ [ "plastic_chunk", 1 ] ], [ [ "power_supply", 1 ] ], [ [ "cable", 1 ] ], [ [ "light_bulb", 1 ], [ "e_scrap", 1 ] ] ] }, { "type": "recipe", @@ -199,9 +194,9 @@ "book_learn": [ [ "textbook_electronics", 3 ], [ "advanced_electronics", 3 ], [ "recipe_caseless", 2 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "qualities": [ { "id": "SCREW", "level": 1 } ], + "using": [ [ "glue_any", 1 ] ], "components": [ [ [ "plastic_chunk", 1 ] ], - [ [ "superglue", 1 ] ], [ [ "power_supply", 1 ] ], [ [ "cable", 1 ] ], [ [ "light_bulb", 1 ], [ "e_scrap", 1 ] ], @@ -368,10 +363,10 @@ "time": "45 m", "//": "25cm weld", "book_learn": [ [ "textbook_fabrication", 3 ], [ "textbook_mechanics", 3 ], [ "welding_book", 5 ] ], - "using": [ [ "welding_standard", 25 ] ], + "using": [ [ "welding_standard", 25 ], [ "glue_strong", 10 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_welding_basic" }, { "proficiency": "prof_welding" } ], "qualities": [ { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "car_headlight", 1 ] ], [ [ "wire", 2 ] ], [ [ "superglue", 1 ] ] ] + "components": [ [ [ "car_headlight", 1 ] ], [ [ "wire", 2 ] ] ] }, { "type": "recipe", @@ -384,10 +379,10 @@ "time": "45 m", "//": "25cm weld", "book_learn": [ [ "textbook_fabrication", 3 ], [ "textbook_mechanics", 3 ], [ "welding_book", 5 ] ], - "using": [ [ "welding_standard", 25 ] ], + "using": [ [ "welding_standard", 25 ], [ "glue_strong", 15 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_welding_basic" }, { "proficiency": "prof_welding" } ], "qualities": [ { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "car_wide_headlight", 1 ] ], [ [ "wire", 3 ] ], [ [ "superglue", 1 ] ] ] + "components": [ [ [ "car_wide_headlight", 1 ] ], [ [ "wire", 3 ] ] ] }, { "type": "recipe", @@ -402,12 +397,7 @@ "book_learn": [ [ "textbook_electronics", 4 ], [ "advanced_electronics", 4 ], [ "recipe_caseless", 3 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ - [ [ "plastic_chunk", 2 ] ], - [ [ "superglue", 1 ] ], - [ [ "power_supply", 1 ] ], - [ [ "cable", 2 ] ], - [ [ "betavoltaic", 4 ] ] - ] + "using": [ [ "glue_any", 1 ] ], + "components": [ [ [ "plastic_chunk", 2 ] ], [ [ "power_supply", 1 ] ], [ [ "cable", 2 ] ], [ [ "betavoltaic", 4 ] ] ] } ] diff --git a/data/json/recipes/tools/tool.json b/data/json/recipes/tools/tool.json index b4159c43cd577..8170e7337b16d 100644 --- a/data/json/recipes/tools/tool.json +++ b/data/json/recipes/tools/tool.json @@ -626,12 +626,8 @@ "proficiencies": [ { "proficiency": "prof_metalworking" } ], "tools": [ [ [ "material_sand", -1 ] ] ], "qualities": [ { "id": "DRILL", "level": 2 }, { "id": "HAMMER", "level": 2 } ], - "components": [ - [ [ "pot", 1 ], [ "pot_copper", 1 ] ], - [ [ "cu_pipe", 1 ] ], - [ [ "bone_glue", 1 ], [ "superglue", 1 ] ], - [ [ "duct_tape", 10 ] ] - ] + "using": [ [ "glue_waterproof", 15 ] ], + "components": [ [ [ "pot", 1 ], [ "pot_copper", 1 ] ], [ [ "cu_pipe", 1 ] ], [ [ "duct_tape", 10 ] ] ] }, { "result": "electrolyzer_makeshift", @@ -1378,7 +1374,8 @@ "autolearn": true, "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SEW", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic" } ], - "components": [ [ [ "leather", 2 ] ], [ [ "superglue", 1 ] ], [ [ "filament", 40, "LIST" ] ] ] + "using": [ [ "glue_waterproof", 12 ] ], + "components": [ [ [ "leather", 2 ] ], [ [ "filament", 40, "LIST" ] ] ] }, { "result": "masonrysaw_off", diff --git a/data/json/recipes/tools/tools_electronic.json b/data/json/recipes/tools/tools_electronic.json index f3d70cf19cd1a..371c5f5649be9 100644 --- a/data/json/recipes/tools/tools_electronic.json +++ b/data/json/recipes/tools/tools_electronic.json @@ -218,7 +218,7 @@ "difficulty": 8, "time": "1 h", "book_learn": [ [ "textbook_electronics", 7 ], [ "textbook_robots", 6 ] ], - "using": [ [ "soldering_standard", 10 ] ], + "using": [ [ "soldering_standard", 10 ], [ "glue_any", 1 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_plasticworking", "time_multiplier": 1.5 }, @@ -227,7 +227,6 @@ { "proficiency": "prof_elec_integrated_circuits" } ], "components": [ - [ [ "superglue", 1 ] ], [ [ "processor", 1 ] ], [ [ "RAM", 2 ] ], [ [ "amplifier", 1 ] ], @@ -549,9 +548,9 @@ "book_learn": [ [ "recipe_caseless", 8 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_plasticworking" }, { "proficiency": "prof_elec_semiconductors" } ], + "using": [ [ "glue_any", 1 ] ], "components": [ [ [ "plastic_chunk", 5 ] ], - [ [ "superglue", 1 ] ], [ [ "power_supply", 2 ] ], [ [ "wire_mesh", 1 ], [ "cotton_patchwork", 1 ] ], [ [ "thermos", 2 ] ], @@ -601,14 +600,14 @@ "difficulty": 3, "time": "30 m", "autolearn": true, - "using": [ [ "soldering_standard", 5 ], [ "plastic_molding", 2 ] ], + "using": [ [ "soldering_standard", 5 ], [ "plastic_molding", 2 ], [ "glue_waterproof", 4 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_plasticworking" }, { "proficiency": "prof_elec_soldering" }, { "proficiency": "prof_elec_circuits" } ], - "components": [ [ [ "superglue", 1 ] ], [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 3 ] ], [ [ "cable", 5 ] ], [ [ "motor_micro", 1 ] ] ] + "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 3 ] ], [ [ "cable", 5 ] ], [ [ "motor_micro", 1 ] ] ] }, { "type": "recipe", @@ -679,7 +678,7 @@ "time": "1 h", "reversible": true, "book_learn": [ [ "advanced_electronics", 4 ], [ "mag_electronics", 6 ], [ "manual_electronics", 5 ] ], - "using": [ [ "soldering_standard", 10 ] ], + "using": [ [ "soldering_standard", 10 ], [ "glue_any", 2 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_plasticworking" }, @@ -690,7 +689,6 @@ [ [ "scrap_aluminum", 4 ] ], [ [ "plastic_chunk", 2 ] ], [ [ "motor_micro", 1 ] ], - [ [ "superglue", 2 ] ], [ [ "element", 2 ], [ "crude_heating_element", 2 ] ], [ [ "hose", 1 ] ], [ [ "power_supply", 1 ] ] @@ -767,7 +765,7 @@ "components": [ [ [ "plastic_chunk", 10 ] ], [ [ "scrap", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ] ], + [ [ "super_glue", 5 ], [ "duct_tape", 10 ] ], [ [ "string_36", 4 ] ], [ [ "motor_micro", 1 ] ], [ [ "e_scrap", 1 ] ] @@ -801,7 +799,7 @@ "time": "8 h 45 m", "decomp_learn": 5, "book_learn": [ [ "textbook_electronics", 7 ], [ "textbook_robots", 6 ] ], - "using": [ [ "soldering_standard", 10 ], [ "plastic_molding", 8 ] ], + "using": [ [ "soldering_standard", 10 ], [ "plastic_molding", 8 ], [ "glue_any", 1 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_plasticworking", "time_multiplier": 1.5 }, @@ -809,7 +807,6 @@ { "proficiency": "prof_elec_semiconductors" } ], "components": [ - [ [ "superglue", 4 ], [ "bone_glue", 4 ] ], [ [ "antenna", 1 ] ], [ [ "motor_micro", 2 ] ], [ [ "amplifier", 2 ] ], diff --git a/data/json/recipes/tools/tools_hand.json b/data/json/recipes/tools/tools_hand.json index cc421690bdcfa..3cafa85828451 100644 --- a/data/json/recipes/tools/tools_hand.json +++ b/data/json/recipes/tools/tools_hand.json @@ -1683,7 +1683,7 @@ [ [ "clay_lump", 1 ] ], [ [ "material_sand", 113 ] ], [ [ "2x4", 2 ], [ "stick", 2 ] ], - [ [ "nail", 8 ], [ "bronze_nail", 8 ], [ "superglue", 4 ] ] + [ [ "nail", 8 ], [ "bronze_nail", 8 ], [ "super_glue", 4 ] ] ] }, { @@ -1702,7 +1702,7 @@ [ [ "clay_lump", 32 ] ], [ [ "material_sand", 9000 ] ], [ [ "2x4", 8 ] ], - [ [ "nail", 16 ], [ "bronze_nail", 16 ], [ "superglue", 8 ] ] + [ [ "nail", 16 ], [ "bronze_nail", 16 ], [ "super_glue", 8 ] ] ] }, { @@ -1721,7 +1721,7 @@ [ [ "clay_lump", 9 ] ], [ [ "material_sand", 2532 ] ], [ [ "2x4", 8 ] ], - [ [ "nail", 16 ], [ "bronze_nail", 16 ], [ "superglue", 8 ] ] + [ [ "nail", 16 ], [ "bronze_nail", 16 ], [ "super_glue", 8 ] ] ] }, { @@ -1740,7 +1740,7 @@ [ [ "clay_lump", 5 ] ], [ [ "material_sand", 1350 ] ], [ [ "2x4", 4 ], [ "stick", 4 ] ], - [ [ "nails", 8, "LIST" ], [ "superglue", 4 ] ] + [ [ "nails", 8, "LIST" ], [ "super_glue", 4 ] ] ] }, { diff --git a/data/json/recipes/weapon/bashing.json b/data/json/recipes/weapon/bashing.json index fc361c920d64b..135a0b63305ed 100644 --- a/data/json/recipes/weapon/bashing.json +++ b/data/json/recipes/weapon/bashing.json @@ -214,7 +214,7 @@ "autolearn": true, "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 1.5, "skill_penalty": 0.15 } ], - "components": [ [ [ "stick_long", 1 ], [ "long_pole", 1 ] ], [ [ "hammer", 1 ] ], [ [ "superglue", 1 ] ] ] + "components": [ [ [ "stick_long", 1 ], [ "long_pole", 1 ] ], [ [ "hammer", 1 ] ], [ [ "super_glue", 1 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/weapon/cutting.json b/data/json/recipes/weapon/cutting.json index 11b6b91037de8..6fa0c7acef30c 100644 --- a/data/json/recipes/weapon/cutting.json +++ b/data/json/recipes/weapon/cutting.json @@ -2308,16 +2308,10 @@ "skills_required": [ "melee", 5 ], "time": "25 m", "autolearn": true, - "using": [ [ "soldering_standard", 20 ] ], + "using": [ [ "soldering_standard", 20 ], [ "glue_strong", 5 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" } ], "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "SAW_M", "level": 1 }, { "id": "GRIND", "level": 2 } ], - "components": [ - [ [ "machete", 1 ] ], - [ [ "duct_tape", 150 ] ], - [ [ "filament_durable", 20, "LIST" ] ], - [ [ "leather", 2 ], [ "chunk_rubber", 1 ] ], - [ [ "rubber_cement", 1 ], [ "superglue", 1 ] ] - ] + "components": [ [ [ "machete", 1 ] ], [ [ "filament_durable", 20, "LIST" ] ], [ [ "leather", 2 ], [ "chunk_rubber", 1 ] ] ] }, { "result": "survivor_machete_qt", @@ -2330,17 +2324,11 @@ "skills_required": [ "melee", 5 ], "time": "4 h 48 m", "book_learn": [ [ "textbook_weapwest", 5 ], [ "welding_book", 6 ] ], - "using": [ [ "soldering_standard", 20 ], [ "blacksmithing_standard", 10 ] ], + "using": [ [ "soldering_standard", 20 ], [ "blacksmithing_standard", 10 ], [ "glue_strong", 5 ] ], "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "GRIND", "level": 2 } ], "tools": [ [ [ "swage", -1 ] ], [ [ "metal_tank", -1 ] ], [ [ "water", -80 ], [ "water_clean", -80 ] ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_quenching", "skill_penalty": 1 } ], - "components": [ - [ [ "machete", 1 ] ], - [ [ "duct_tape", 150 ] ], - [ [ "filament_durable", 20, "LIST" ] ], - [ [ "leather", 2 ], [ "chunk_rubber", 1 ] ], - [ [ "rubber_cement", 1 ], [ "superglue", 1 ] ] - ] + "components": [ [ [ "machete", 1 ] ], [ [ "filament_durable", 20, "LIST" ] ], [ [ "leather", 2 ], [ "chunk_rubber", 1 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/weapon/explosive.json b/data/json/recipes/weapon/explosive.json index 99979d268c9d1..3f6f1cfa826f5 100644 --- a/data/json/recipes/weapon/explosive.json +++ b/data/json/recipes/weapon/explosive.json @@ -100,7 +100,7 @@ "using": [ [ "small_grenade_case", 1 ] ], "components": [ [ [ "pilot_light", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "oxy_powder", 75 ] ], [ [ "incendiary", 50 ] ] ] @@ -124,7 +124,7 @@ "components": [ [ [ "bleach", 2 ], [ "oxy_powder", 200 ] ], [ [ "ammonia_liquid", 2 ], [ "lye_powder", 200 ] ], - [ [ "superglue", 1 ] ] + [ [ "super_glue", 5 ] ] ] }, { @@ -146,7 +146,7 @@ [ [ "triffid_fungicide", 1 ], [ "fungicide", 50 ] ], [ [ "chem_sulphur", 150 ] ], [ [ "small_gas_canister_case", 1, "LIST" ] ], - [ [ "superglue", 1 ] ] + [ [ "super_glue", 5 ] ] ] }, { @@ -168,7 +168,7 @@ [ [ "insecticide", 1 ] ], [ [ "water", 2 ], [ "water_clean", 2 ] ], [ [ "small_gas_canister_case", 1, "LIST" ] ], - [ [ "superglue", 1 ] ] + [ [ "super_glue", 5 ] ] ] }, { @@ -239,7 +239,7 @@ [ [ "water", 1 ], [ "water_clean", 1 ], [ "salt_water", 1 ], [ "saline", 5 ] ], [ [ "sugar", 16 ] ], [ [ "chem_saltpetre", 24 ] ], - [ [ "superglue", 1 ] ] + [ [ "super_glue", 5 ] ] ] }, { @@ -260,7 +260,7 @@ "components": [ [ [ "water", 1 ], [ "water_clean", 1 ], [ "salt_water", 1 ], [ "saline", 5 ] ], [ [ "white_phosphorous", 20 ] ], - [ [ "superglue", 1 ] ] + [ [ "super_glue", 5 ] ] ] }, { @@ -280,7 +280,7 @@ "using": [ [ "military_explosive", 46 ], [ "explosives_casting_standard", 1 ], [ "small_grenade_case", 1 ] ], "components": [ [ [ "delay_fuze", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "nails", 50, "LIST" ], [ "scrap", 2 ] ] ] }, @@ -301,7 +301,7 @@ "using": [ [ "military_explosive", 92 ], [ "explosives_casting_standard", 1 ] ], "components": [ [ [ "delay_fuze", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "can_medium", 1 ] ], [ [ "nails", 100, "LIST" ], [ "scrap", 4 ] ] ] @@ -339,7 +339,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 } ], "components": [ [ [ "delay_fuze", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "jug_plastic", 1 ] ], [ [ "nails", 750, "LIST" ], [ "scrap", 30 ] ] ] @@ -359,7 +359,7 @@ "using": [ [ "explosives_casting_standard", 5 ], [ "military_explosive", 10000 ] ], "components": [ [ [ "delay_fuze", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "keg_steel", 1 ] ] ] }, @@ -378,7 +378,7 @@ "using": [ [ "explosives_casting_standard", 10 ], [ "military_explosive", 20000 ] ], "components": [ [ [ "delay_fuze", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "30gal_drum", 1 ] ] ] }, @@ -400,7 +400,7 @@ [ [ "small_grenade_case", 1, "LIST" ] ], [ [ "stable_explosive", 15, "LIST" ], [ "volatile_explosive", 15, "LIST" ] ], [ [ "fuse", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "nails", 50, "LIST" ], [ "scrap", 2 ] ] ] }, @@ -422,7 +422,7 @@ [ [ "can_medium", 1 ] ], [ [ "stable_explosive", 30, "LIST" ], [ "volatile_explosive", 30, "LIST" ] ], [ [ "fuse", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "nails", 100, "LIST" ], [ "scrap", 4 ] ] ] }, @@ -487,7 +487,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 } ], "components": [ [ [ "fuse", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "jug_plastic", 1 ] ], [ [ "nails", 750, "LIST" ], [ "scrap", 30 ] ] ] @@ -507,7 +507,7 @@ "proficiencies": [ { "proficiency": "prof_handloading" } ], "using": [ [ "stable_explosive", 253 ], [ "volatile_explosive", 6 ] ], "qualities": [ { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "fuse", 1 ] ], [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], [ [ "jug_plastic", 1 ] ] ] + "components": [ [ [ "fuse", 1 ] ], [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "jug_plastic", 1 ] ] ] }, { "result": "half_barrel_bomb", @@ -522,7 +522,7 @@ "book_learn": [ [ "manual_launcher", 7 ], [ "textbook_anarch", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "using": [ [ "volatile_explosive", 86 ], [ "stable_explosive", 3354 ] ], - "components": [ [ [ "fuse", 1 ] ], [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], [ [ "keg_steel", 1 ] ] ] + "components": [ [ [ "fuse", 1 ] ], [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "keg_steel", 1 ] ] ] }, { "result": "full_barrel_bomb", @@ -537,6 +537,6 @@ "book_learn": [ [ "manual_launcher", 7 ], [ "textbook_anarch", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "using": [ [ "volatile_explosive", 173 ], [ "stable_explosive", 6747 ] ], - "components": [ [ [ "fuse", 1 ] ], [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], [ [ "30gal_drum", 1 ] ] ] + "components": [ [ [ "fuse", 1 ] ], [ [ "super_glue", 4 ], [ "duct_tape", 10 ], [ "cordage", 1, "LIST" ] ], [ [ "30gal_drum", 1 ] ] ] } ] diff --git a/data/json/recipes/weapon/mods.json b/data/json/recipes/weapon/mods.json index 34e203122bd3a..cbfabee3b8b17 100644 --- a/data/json/recipes/weapon/mods.json +++ b/data/json/recipes/weapon/mods.json @@ -777,7 +777,7 @@ "time": "10 m", "book_learn": [ [ "mag_archery", 1 ], [ "manual_archery", 1 ] ], "qualities": [ { "id": "CUT", "level": 2 } ], - "components": [ [ [ "chunk_rubber", 1 ] ], [ [ "superglue", 1 ] ] ] + "components": [ [ [ "chunk_rubber", 1 ] ], [ [ "super_glue", 5 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/weapon/piercing.json b/data/json/recipes/weapon/piercing.json index ae2c85c80a25a..18a5a580785cb 100644 --- a/data/json/recipes/weapon/piercing.json +++ b/data/json/recipes/weapon/piercing.json @@ -1427,16 +1427,10 @@ "time": "2 h", "reversible": true, "book_learn": [ [ "textbook_electronics", 3 ], [ "advanced_electronics", 3 ], [ "recipe_melee", 4 ] ], - "using": [ [ "soldering_standard", 10 ] ], + "using": [ [ "soldering_standard", 10 ], [ "adhesive", 1 ] ], "proficiencies": [ { "proficiency": "prof_elec_soldering" }, { "proficiency": "prof_shock_weapons" } ], "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ - [ [ "fencing_foil_sharpened", 1 ] ], - [ [ "fur", 1 ], [ "leather", 1 ] ], - [ [ "duct_tape", 100 ], [ "superglue", 1 ] ], - [ [ "tazer", 1 ] ], - [ [ "cable", 10 ] ] - ] + "components": [ [ [ "fencing_foil_sharpened", 1 ] ], [ [ "fur", 1 ], [ "leather", 1 ] ], [ [ "tazer", 1 ] ], [ [ "cable", 10 ] ] ] }, { "type": "recipe", @@ -1450,16 +1444,10 @@ "time": "2 h", "reversible": true, "book_learn": [ [ "textbook_electronics", 3 ], [ "advanced_electronics", 3 ], [ "recipe_melee", 4 ] ], - "using": [ [ "soldering_standard", 10 ] ], + "using": [ [ "soldering_standard", 10 ], [ "adhesive", 1 ] ], "proficiencies": [ { "proficiency": "prof_elec_soldering" }, { "proficiency": "prof_shock_weapons" } ], "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ - [ [ "fencing_epee_sharpened", 1 ] ], - [ [ "fur", 1 ], [ "leather", 1 ] ], - [ [ "duct_tape", 100 ], [ "superglue", 1 ] ], - [ [ "tazer", 1 ] ], - [ [ "cable", 10 ] ] - ] + "components": [ [ [ "fencing_epee_sharpened", 1 ] ], [ [ "fur", 1 ], [ "leather", 1 ] ], [ [ "tazer", 1 ] ], [ [ "cable", 10 ] ] ] }, { "type": "recipe", @@ -1473,16 +1461,10 @@ "time": "2 h", "reversible": true, "book_learn": [ [ "textbook_electronics", 3 ], [ "advanced_electronics", 3 ], [ "recipe_melee", 4 ] ], - "using": [ [ "soldering_standard", 10 ] ], + "using": [ [ "soldering_standard", 10 ], [ "adhesive", 1 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_elec_soldering" }, { "proficiency": "prof_shock_weapons" } ], - "components": [ - [ [ "fencing_sabre_sharpened", 1 ] ], - [ [ "fur", 1 ], [ "leather", 1 ] ], - [ [ "duct_tape", 100 ], [ "superglue", 1 ] ], - [ [ "tazer", 1 ] ], - [ [ "cable", 10 ] ] - ] + "components": [ [ [ "fencing_sabre_sharpened", 1 ] ], [ [ "fur", 1 ], [ "leather", 1 ] ], [ [ "tazer", 1 ] ], [ [ "cable", 10 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/weapon/ranged.json b/data/json/recipes/weapon/ranged.json index 8fbd4dfab1582..9b4dc08d54bba 100644 --- a/data/json/recipes/weapon/ranged.json +++ b/data/json/recipes/weapon/ranged.json @@ -712,7 +712,6 @@ [ [ "steel_standard", 2, "LIST" ] ], [ [ "plastic_chunk", 10 ] ], [ [ "sheet_metal_small", 8 ] ], - [ [ "duct_tape", 200 ], [ "superglue", 8 ] ], [ [ "cordage_superior", 18, "LIST" ] ] ] }, @@ -1215,7 +1214,7 @@ "difficulty": 5, "time": "8 h", "book_learn": [ [ "advanced_electronics", 5 ], [ "textbook_electronics", 5 ], [ "textbook_anarch", 6 ] ], - "using": [ [ "soldering_standard", 20 ], [ "plastic_molding", 7 ] ], + "using": [ [ "soldering_standard", 20 ], [ "plastic_molding", 7 ], [ "glue_any", 1 ] ], "qualities": [ { "id": "SAW_M_FINE", "level": 1 }, { "id": "SCREW", "level": 1 }, { "id": "SCREW_FINE", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_elec_soldering" }, @@ -1226,7 +1225,6 @@ "tools": [ [ [ "laptop", -1 ] ] ], "components": [ [ [ "plastic_chunk", 10 ] ], - [ [ "superglue", 1 ] ], [ [ "processor", 1 ] ], [ [ "circuit", 2 ] ], [ [ "power_supply", 2 ] ], @@ -1377,7 +1375,7 @@ [ [ "ruger_1022", 1 ] ], [ [ "qt_wire", 1 ], [ "piano_wire", 1 ] ], [ [ "sheet_metal_small", 2 ] ], - [ [ "superglue", 1 ] ] + [ [ "super_glue", 5 ] ] ] }, { @@ -1405,7 +1403,7 @@ [ [ "ruger_charger", 1 ] ], [ [ "qt_wire", 1 ], [ "piano_wire", 1 ] ], [ [ "sheet_metal_small", 2 ] ], - [ [ "superglue", 1 ] ] + [ [ "super_glue", 5 ] ] ] } ] diff --git a/data/json/requirements/materials.json b/data/json/requirements/materials.json index 7d4e33f1b5971..256fd8a714dcd 100644 --- a/data/json/requirements/materials.json +++ b/data/json/requirements/materials.json @@ -3,7 +3,25 @@ "id": "adhesive", "type": "requirement", "//": "Materials used for joining (typically non-metallic) parts", - "components": [ [ [ "duct_tape", 25 ], [ "superglue", 1 ], [ "bone_glue", 1 ] ] ] + "components": [ [ [ "duct_tape", 25 ], [ "super_glue", 10 ], [ "bone_glue", 1 ] ] ] + }, + { + "id": "glue_any", + "type": "requirement", + "//": "Any type of all-surface glue. Each unit is 1cm^2 of coverage", + "components": [ [ [ "super_glue", 4 ], [ "bone_glue", 1 ] ] ] + }, + { + "id": "glue_waterproof", + "type": "requirement", + "//": "Any type of waterproof glue, which is just about everything except bone/hide glue. Each unit is 1cm^2 of coverage", + "components": [ [ [ "super_glue", 4 ] ] ] + }, + { + "id": "glue_strong", + "type": "requirement", + "//": "Strong glue, such as superglues, epoxy resin. Each unit is 0.5cm^2 of coverage", + "components": [ [ [ "super_glue", 1 ] ] ] }, { "id": "adhesive_cordage", diff --git a/data/json/requirements/tailoring.json b/data/json/requirements/tailoring.json index 786c47befa509..32af678cbbd9f 100644 --- a/data/json/requirements/tailoring.json +++ b/data/json/requirements/tailoring.json @@ -66,7 +66,7 @@ "type": "requirement", "//": "Shaping and attaching a rigid Kevlar plate to something, per 430 g of rigid Kevlar. Time needed is 45 minutes per unit.", "qualities": [ { "id": "CUT", "level": 2 } ], - "components": [ [ [ "rigid_kevlar_plate", 1 ] ], [ [ "superglue", 1 ] ] ] + "components": [ [ [ "rigid_kevlar_plate", 1 ] ], [ [ "super_glue", 1 ] ] ] }, { "id": "armor_kevlar_layered", @@ -93,7 +93,7 @@ "type": "requirement", "//": "Layering paper sheets, cutting holes in them, laminating them with glue, and connecting multiple of resulting plates with cordage, per 162 g of paper. Time needed is 50 minutes per unit.", "qualities": [ { "id": "CUT", "level": 2 } ], - "components": [ [ [ "paper", 50 ] ], [ [ "superglue", 1 ], [ "bone_glue", 1 ] ], [ [ "cordage_short", 2, "LIST" ] ] ] + "components": [ [ [ "paper", 50 ] ], [ [ "super_glue", 4 ], [ "bone_glue", 1 ] ], [ [ "cordage_short", 2, "LIST" ] ] ] }, { "id": "armor_wood", diff --git a/data/json/snippets/home_pictures.json b/data/json/snippets/home_pictures.json index bea3b4f12a708..0a0f667f6e79b 100644 --- a/data/json/snippets/home_pictures.json +++ b/data/json/snippets/home_pictures.json @@ -58,7 +58,7 @@ }, { "id": "home_picture_14", - "text": "A framed clipping of a newspaper article. 'Annual Chilli Cook-off Winner'. Enclosed is a small article about the winner and the secret recipe." + "text": "A framed clipping of a newspaper article. 'Annual Chili Cook-off Winner'. Enclosed is a small article about the winner and the secret recipe." }, { "id": "home_picture_15", @@ -74,7 +74,7 @@ }, { "id": "home_picture_18", - "text": "A picture of a Renaissance Fair. A petite woman in ornate mediaeval clothing is holding a gigantic turkey leg and dramatically biting into it with exaggerated force." + "text": "A picture of a Renaissance Fair. A petite woman in ornate medieval clothing is holding a gigantic turkey leg and dramatically biting into it with exaggerated force." }, { "id": "home_picture_19", diff --git a/data/json/snippets/schizophrenia.json b/data/json/snippets/schizophrenia.json index 4bf59f30cb2c9..1941f5bbe0172 100644 --- a/data/json/snippets/schizophrenia.json +++ b/data/json/snippets/schizophrenia.json @@ -207,7 +207,7 @@ "text": [ "Your weapon starts burning your hands!", "Your weapon feels freezing cold!", - "An electric shock shoots into your hand from Your weapon!", + "An electric shock shoots into your hand from your weapon!", "Your weapon was working for… THEM", "Your weapon is running away!", "Your weapon is a dirty traitor!" diff --git a/data/mods/Aftershock/itemgroups/tool_groups.json b/data/mods/Aftershock/itemgroups/tool_groups.json index 59c2e1a5e33e9..519e1f6e26a81 100644 --- a/data/mods/Aftershock/itemgroups/tool_groups.json +++ b/data/mods/Aftershock/itemgroups/tool_groups.json @@ -58,7 +58,7 @@ "//": "Keeps your solar panels, lights and well everything going.", "items": [ [ "screwdriver_set", 20 ], - [ "superglue", 30 ], + { "group": "superglue", "prob": 30 }, [ "pliers", 10 ], [ "multitool", 20 ], [ "voltmeter", 20 ], @@ -210,14 +210,14 @@ { "item": "multitool", "prob": 5 }, { "item": "screwdriver_set", "prob": 15 }, { "item": "pliers", "prob": 5 }, - { "item": "superglue", "prob": 5 }, + { "group": "superglue", "prob": 5 }, { "item": "duct_tape", "prob": 10, "count": [ 1, 2 ] } ] }, { "type": "item_group", "id": "afs_tools_scavenging", - "//": "lightweight tools used for finding and getting into places where you dont belong.", + "//": "lightweight tools used for finding and getting into places where you don't belong.", "items": [ { "item": "electrohack", "prob": 100 }, { diff --git a/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json b/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json index dc04717c2b085..c0ab2c38fe9a4 100644 --- a/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json +++ b/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json @@ -104,7 +104,7 @@ "id": "afs_civilian_energy_gun", "type": "item_group", "subtype": "distribution", - "//": "Plasma isnt sold to civilians", + "//": "Plasma isn't sold to civilians", "items": [ { "group": "afs_civilian_laser_gun", "prob": 12 }, { "group": "afs_civilian_voltaic_gun", "prob": 2 } ] }, { diff --git a/data/mods/Aftershock/items/tools.json b/data/mods/Aftershock/items/tools.json index 575b2ef46d8f9..82f9710209d07 100644 --- a/data/mods/Aftershock/items/tools.json +++ b/data/mods/Aftershock/items/tools.json @@ -523,7 +523,7 @@ "type": "TOOL", "id": "afs_shuttle_radiobeacon", "name": { "str": "drone shuttle beacon" }, - "description": "A portable high-power radiobeacon. Signals a drone shuttle from Port Augustmoon, which will make landfall in about 30 minutes and leave 4 hours later, wether you board it or not. Single use, all expenses paid in advance, and non refundable.", + "description": "A portable high-power radiobeacon. Signals a drone shuttle from Port Augustmoon, which will make landfall in about 30 minutes and leave 4 hours later, whether you board it or not. Single use, all expenses paid in advance, and non refundable.", "weight": "340 g", "volume": "1 L", "category": "tools", @@ -674,7 +674,7 @@ "id": "multi_cooker", "copy-from": "multi_cooker", "type": "TOOL", - "//": "Makes it look more sci-fi so it isnt out of place, not many actual changes otherwise.", + "//": "Makes it look more sci-fi so it isn't out of place, not many actual changes otherwise.", "name": { "str": "micro-cooker" }, "description": "A rugged kitchen in one tool, made for use within small spaceships or in the wilderness. It can automatically prepare a variety of dishes while its owner focuses on other tasks.", "weight": "5 kg", diff --git a/data/mods/Aftershock/lore/cyberpunk_future.md b/data/mods/Aftershock/lore/cyberpunk_future.md index 91cb18f2adae9..3c5ab25cd755f 100644 --- a/data/mods/Aftershock/lore/cyberpunk_future.md +++ b/data/mods/Aftershock/lore/cyberpunk_future.md @@ -10,4 +10,4 @@ The Solar Corporations currently mentioned in the mod are: # Technology -Much was lost during the discontinuity. Colonies that survived relied on technology not much more advanced than the early space age of Earth. While artifacts from before the discontinuity can be found, the secrets of their functionality and construction are often lost. These artifacts can range from exotic weapons to seemingly miraculous medicines, from superefficient power cells to teleportation. Salus IV, as a pre-discontinuity colony is a known source of some of these artifacts, drawing archeologists and treasure hunters alike. \ No newline at end of file +Much was lost during the discontinuity. Colonies that survived relied on technology not much more advanced than the early space age of Earth. While artifacts from before the discontinuity can be found, the secrets of their functionality and construction are often lost. These artifacts can range from exotic weapons to seemingly miraculous medicines, from superefficient power cells to teleportation. Salus IV, as a pre-discontinuity colony is a known source of some of these artifacts, drawing archaeologists and treasure hunters alike. \ No newline at end of file diff --git a/data/mods/Aftershock/lore/factions.md b/data/mods/Aftershock/lore/factions.md index 4908e789ba6be..ff23caf80854c 100644 --- a/data/mods/Aftershock/lore/factions.md +++ b/data/mods/Aftershock/lore/factions.md @@ -1,6 +1,6 @@ ## United Interstellar Coordination Agency [UICA] -Formed relatively recently, after the discovery of the new FTL method, the United Interstellar Coordination Agency is a loose confederation of Solar Corporations, Governments, and NGOs dedicated to reclaiming and bringing most extra-solar colonies back under Earth's control. Since most colonies never possessed the technological and industrial base to support themselves on the long term, this goal is usually achieved through relatively peaceful means, even then, UICA fields the largest military in human history for when peaceful reintegration isnt possible. +Formed relatively recently, after the discovery of the new FTL method, the United Interstellar Coordination Agency is a loose confederation of Solar Corporations, Governments, and NGOs dedicated to reclaiming and bringing most extra-solar colonies back under Earth's control. Since most colonies never possessed the technological and industrial base to support themselves on the long term, this goal is usually achieved through relatively peaceful means, even then, UICA fields the largest military in human history for when peaceful reintegration isn't possible. While this all nice and noble (as long as you ask an Earthling) this far out in the frontier UICA personnel is either irremediably corrupt and/or incompetent. They will willingly part with valuable military equipment or classified information in exchange for appropriate sums of money or personal favors. diff --git a/data/mods/Aftershock/npcs/factions.json b/data/mods/Aftershock/npcs/factions.json index 1138ac98d4982..8b5cdbd44e9ee 100644 --- a/data/mods/Aftershock/npcs/factions.json +++ b/data/mods/Aftershock/npcs/factions.json @@ -243,7 +243,7 @@ "Prepnet_Phyle": { "kill on sight": true }, "marloss": { "kill on sight": true } }, - "description": "A massive, multi-system corporation with major investments across artificial intelligence, shipbuilding, military cybernetics and applied robotics. Among the oldest of the Solar Corporations, it is a major player in the Orion Arm, and a key military supplier of UICA's military hardware. It is best known for its normally secretive and highly advanced research and archeology division." + "description": "A massive, multi-system corporation with major investments across artificial intelligence, shipbuilding, military cybernetics and applied robotics. Among the oldest of the Solar Corporations, it is a major player in the Orion Arm, and a key military supplier of UICA's military hardware. It is best known for its normally secretive and highly advanced research and archaeology division." }, { "type": "faction", diff --git a/data/mods/Aftershock/recipes/recipe_overrides.json b/data/mods/Aftershock/recipes/recipe_overrides.json index b379d0eb6c42f..842f6c2d8ed5f 100644 --- a/data/mods/Aftershock/recipes/recipe_overrides.json +++ b/data/mods/Aftershock/recipes/recipe_overrides.json @@ -13,7 +13,7 @@ "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ [ [ "plastic_chunk", 5 ] ], - [ [ "superglue", 1 ] ], + [ [ "super_glue", 5 ] ], [ [ "power_supply", 1 ] ], [ [ "element", 1 ] ], [ [ "scrap", 2 ] ], @@ -34,7 +34,7 @@ "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ [ [ "plastic_chunk", 1 ] ], - [ [ "superglue", 1 ] ], + [ [ "super_glue", 1 ] ], [ [ "power_supply", 1 ] ], [ [ "cable", 1 ] ], [ [ "plut_cell", 1 ] ] @@ -54,7 +54,7 @@ "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ [ [ "plastic_chunk", 2 ] ], - [ [ "superglue", 1 ] ], + [ [ "super_glue", 1 ] ], [ [ "power_supply", 1 ] ], [ [ "cable", 2 ] ], [ [ "plut_cell", 2 ] ] diff --git a/data/mods/CrazyCataclysm/crazy_monstergroups.json b/data/mods/CrazyCataclysm/crazy_monstergroups.json index cba4788eee700..15be7f6b7e79b 100644 --- a/data/mods/CrazyCataclysm/crazy_monstergroups.json +++ b/data/mods/CrazyCataclysm/crazy_monstergroups.json @@ -6,7 +6,7 @@ { "monster": "mon_zombie_skeltal", "weight": 1, "cost_multiplier": 60 }, { "monster": "mon_zombie_skeltal", "weight": 1, "cost_multiplier": 30, "conditions": [ "AUTUMN" ] } ], - "//": "Autumn is halloween" + "//": "Autumn is Halloween" }, { "type": "monstergroup", diff --git a/data/mods/Defense_Mode/mod_interactions/BombasticPerks/perks.json b/data/mods/Defense_Mode/mod_interactions/BombasticPerks/perks.json index b6ea46f95eff5..1f2c02ad71883 100644 --- a/data/mods/Defense_Mode/mod_interactions/BombasticPerks/perks.json +++ b/data/mods/Defense_Mode/mod_interactions/BombasticPerks/perks.json @@ -4,7 +4,7 @@ "id": "perk_money_maker_merc", "name": { "str": "Money Makin' Mercenary" }, "points": 0, - "description": "You've always had a knack for finding the value in life, wether it's $200 or $50 for a life. You get more money from completing hordes.", + "description": "You've always had a knack for finding the value in life, whether it's $200 or $50 for a life. You get more money from completing hordes.", "category": [ "perk" ], "processed_eocs": [ "money_maker_setup" ] }, diff --git a/data/mods/Generic_Guns/firearms/gg_firearms_migration.json b/data/mods/Generic_Guns/firearms/gg_firearms_migration.json index 8c5f3ccd4e230..271ae960a25e3 100644 --- a/data/mods/Generic_Guns/firearms/gg_firearms_migration.json +++ b/data/mods/Generic_Guns/firearms/gg_firearms_migration.json @@ -56,7 +56,17 @@ "replace": "pistol_machine" }, { - "id": [ "deagle_44", "modular_deagle", "modular_deagle_357", "modular_deagle_44", "modular_deagle_50", "m1911-460", "draco" ], + "id": [ + "deagle_44", + "modular_deagle", + "modular_deagle_357", + "modular_deagle_44", + "modular_deagle_50", + "m1911-460", + "draco", + "draco_mini", + "draco_micro" + ], "type": "MIGRATION", "replace": "pistol_magnum_automag" }, @@ -153,7 +163,7 @@ "replace": "pistol_medium" }, { - "id": [ "cx4", "hk_mp5_semi_pistol", "ksub2000", "calico", "hk_mp5_10_semi", "TDI_10", "mp40semi", "hpt3895" ], + "id": [ "cx4", "hk_mp5_semi_pistol", "ksub2000", "calico", "hk_mp5_10_semi", "TDI_10", "mp40semi", "hpt3895", "draco_9mm" ], "type": "MIGRATION", "replace": "pistol_pcc" }, diff --git a/data/mods/Magiclysm/items/herbs_and_flowers.json b/data/mods/Magiclysm/items/herbs_and_flowers.json index e2c0a741ce9ff..379a27c26baca 100644 --- a/data/mods/Magiclysm/items/herbs_and_flowers.json +++ b/data/mods/Magiclysm/items/herbs_and_flowers.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "platonic_flower", "name": { "str": "philosopher's flower" }, - "//2": "there will be some thoughts about how this alchemy stuff works. the relation are pretty stretchy, because i dont want to make bazillion of plants for each purpose, so dont mind if 'light' related plant will occur in 'darkness' flask effect", + "//2": "there will be some thoughts about how this alchemy stuff works. the relation are pretty stretchy, because I don't want to make bazillion of plants for each purpose, so don't mind if 'light' related plant will occur in 'darkness' flask effect", "//": "same as barnacle weed, 'duration' and 'sustaining', but not so long and more powerful, for effective and non standard effects like night vision", "color": "pink", "comestible_type": "FOOD", diff --git a/data/mods/Magiclysm/items/metals.json b/data/mods/Magiclysm/items/metals.json index bf8b94781e1a5..9ad913aef2e47 100644 --- a/data/mods/Magiclysm/items/metals.json +++ b/data/mods/Magiclysm/items/metals.json @@ -28,7 +28,7 @@ "volume": "250 ml", "price": "10 USD", "stack_size": 4, - "//": "Density 7.60g/cm³ ~ 1.9kg/250ml @ 250g/unit ~ stack 8 but mishapen so only 50% of this", + "//": "Density 7.60g/cm³ ~ 1.9kg/250ml @ 250g/unit ~ stack 8 but misshapen so only 50% of this", "material": [ "orichalcum_metal" ], "symbol": ",", "color": "light_green", diff --git a/data/mods/MindOverMatter/PowerDescriptionSpoilers.md b/data/mods/MindOverMatter/PowerDescriptionSpoilers.md index a6de45aae5b1a..43026798e365f 100644 --- a/data/mods/MindOverMatter/PowerDescriptionSpoilers.md +++ b/data/mods/MindOverMatter/PowerDescriptionSpoilers.md @@ -584,7 +584,7 @@ Powers causing photokinetic damage have a 40% chance to blind the target for 3 s *Effects*: Unleash a high-powered laser blast, doing 20 to 54 photokinetic damage plus 2.5 to 6 photokinetic damage per level to everything within the targeted line.
*Prerequisites*: Photon Beam 8, Lucent Barrier 6 *or* Refracted Arms 6
-## Blinding Radiance +## Blinding Radiance (C) *Difficulty*: 7
*Target*: Self
*Duration*: 59 seconds to 2 minutes and 58 seconds, plus 11 seconds to 47 seconds per power level
diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_misc.json b/data/mods/MindOverMatter/effectoncondition/eoc_misc.json index e2e0763874171..61164935d5517 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_misc.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_misc.json @@ -65,7 +65,12 @@ "id": "EOC_PSIONICS_PSI_NEUTRALIZED_ENDS_ALL_POWERS", "eoc_type": "EVENT", "required_event": "character_gains_effect", - "condition": { "compare_string": [ "effect_psi_neutralized", { "context_val": "effect" } ] }, + "condition": { + "or": [ + { "compare_string": [ "effect_psi_neutralized", { "context_val": "effect" } ] }, + { "compare_string": [ "effect_psi_turn_off_powers", { "context_val": "effect" } ] } + ] + }, "effect": [ { "run_eocs": [ "EOC_END_PSI_POWERS" ] } ] }, { diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json b/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json index fdd87d6757cf0..ad9a267b506e9 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json @@ -269,6 +269,7 @@ "EOC_PHOTOKIN_REMOVE_HIDE_UGLY", "EOC_PHOTOKIN_REMOVE_RADIO", "EOC_PHOTOKIN_REMOVE_INVISIBILITY", + "EOC_PHOTOKIN_REMOVE_BLINDING_GLARE", "EOC_PYRO_REMOVE_FIRE_TOOL", "EOC_PYRO_REMOVE_WARMTH_CLOAK", "EOC_PYROKIN_REMOVE_BLAZING_AURA", @@ -348,6 +349,7 @@ "EOC_PHOTOKIN_REMOVE_HIDE_UGLY", "EOC_PHOTOKIN_REMOVE_RADIO", "EOC_PHOTOKIN_REMOVE_INVISIBILITY", + "EOC_PHOTOKIN_REMOVE_BLINDING_GLARE", "EOC_PYRO_REMOVE_FIRE_TOOL", "EOC_PYRO_REMOVE_WARMTH_CLOAK", "EOC_PYROKIN_REMOVE_BLAZING_AURA", diff --git a/data/mods/MindOverMatter/effects/effects_monster.json b/data/mods/MindOverMatter/effects/effects_monster.json index f71bf97fa6489..5b68d4285dcdb 100644 --- a/data/mods/MindOverMatter/effects/effects_monster.json +++ b/data/mods/MindOverMatter/effects/effects_monster.json @@ -301,5 +301,12 @@ "id": "effect_feral_regeneration", "name": [ "Feral Regeneration" ], "desc": [ "Your wounds are rapidly closing." ] + }, + { + "type": "effect_type", + "id": "effect_telepath_network_monster_effect", + "name": [ "Telepathic Network Monster" ], + "desc": [ "You are in constant communication with your allies, looking out for each other in combat." ], + "base_mods": { "bash_mod": [ 1.5 ], "cut_mod": [ 1.5 ], "dodge_mod": [ 1.5 ], "hit_mod": [ 1.5 ] } } ] diff --git a/data/mods/MindOverMatter/effects/effects_penalty.json b/data/mods/MindOverMatter/effects/effects_penalty.json index 824168fd8b5a6..c4052bc8b41df 100644 --- a/data/mods/MindOverMatter/effects/effects_penalty.json +++ b/data/mods/MindOverMatter/effects/effects_penalty.json @@ -126,6 +126,14 @@ "rating": "bad", "flags": [ "NO_PSIONICS" ] }, + { + "type": "effect_type", + "id": "effect_psi_turn_off_powers", + "//": "This exists to trigger EoCs or as a rider on other psi effects", + "name": [ "" ], + "desc": [ "" ], + "flags": [ "NO_PSIONICS" ] + }, { "type": "effect_type", "id": "effect_psi_neutralized", diff --git a/data/mods/MindOverMatter/effects/effects_psionic.json b/data/mods/MindOverMatter/effects/effects_psionic.json index 1cd13196d7ec3..dae7237b460a2 100644 --- a/data/mods/MindOverMatter/effects/effects_psionic.json +++ b/data/mods/MindOverMatter/effects/effects_psionic.json @@ -1250,12 +1250,9 @@ "desc": [ "You are glowing like the sun." ], "apply_message": "", "remove_message": "The last light finally dies.", - "decay_messages": [ [ "The light you are emitting is dimming rapidly.", "bad" ], [ "The intense glow has started to flicker.", "bad" ] ], "rating": "good", - "max_duration": "15 minutes", + "max_duration": "7 days", "max_intensity": 46, - "dur_add_perc": 10, - "int_dur_factor": "20 s", "base_mods": { "dodge_mod": [ 4 ] }, "enchantments": [ "enchant_photokin_blinding_glare" ] }, @@ -1298,15 +1295,9 @@ "desc": [ "The air around you has its temperature controlled." ], "apply_message": "", "remove_message": "A cool breeze hits your skin.", - "decay_messages": [ - [ "The warm air you've surrounded yourself with is nearly spent.", "bad" ], - [ "The air around you is slowing beginning to cool.", "bad" ] - ], "rating": "good", - "max_duration": "60 minutes", + "max_duration": "7 days", "max_intensity": 77, - "dur_add_perc": 10, - "int_dur_factor": "46 s", "enchantments": [ "enchant_pyrokin_cloak" ], "flags": [ "BARKY" ] }, diff --git a/data/mods/MindOverMatter/emits.json b/data/mods/MindOverMatter/emits.json index ac66aaf255388..f4f6d7bc0eba8 100644 --- a/data/mods/MindOverMatter/emits.json +++ b/data/mods/MindOverMatter/emits.json @@ -71,6 +71,13 @@ "intensity": 3, "qty": 120 }, + { + "id": "emit_anti_psi_void", + "type": "emit", + "field": "fd_neutralizing_field", + "intensity": 3, + "qty": 120 + }, { "id": "emit_shock_burst_electrokin_overload", "type": "emit", diff --git a/data/mods/MindOverMatter/fields.json b/data/mods/MindOverMatter/fields.json index 801f9da8a189b..bcd9272fd71fe 100644 --- a/data/mods/MindOverMatter/fields.json +++ b/data/mods/MindOverMatter/fields.json @@ -151,6 +151,39 @@ "half_life": "1 minutes", "phase": "gas" }, + { + "id": "fd_neutralizing_field", + "type": "field_type", + "intensity_levels": [ + { + "name": "droning hum", + "effects": [ + { + "effect_id": "effect_psi_null", + "intensity": 10, + "min_duration": "100 seconds", + "max_duration": "350 seconds", + "immune_inside_vehicle": false + }, + { + "effect_id": "effect_psi_turn_off_powers", + "intensity": 1, + "min_duration": "1 seconds", + "max_duration": "1 seconds", + "immune_inside_vehicle": false + } + ] + }, + { "//": "repeat last entry" }, + { "//": "repeat last entry" } + ], + "decay_amount_factor": 5, + "gas_absorption_factor": 15, + "percent_spread": 5, + "priority": 8, + "half_life": "1 minutes", + "phase": "gas" + }, { "id": "fd_photokin_light_1", "type": "field_type", diff --git a/data/mods/MindOverMatter/monstergroups/monstergroups_edited.json b/data/mods/MindOverMatter/monstergroups/monstergroups_edited.json index fc898df630a0e..3813a1919137c 100644 --- a/data/mods/MindOverMatter/monstergroups/monstergroups_edited.json +++ b/data/mods/MindOverMatter/monstergroups/monstergroups_edited.json @@ -248,6 +248,18 @@ { "monster": "mon_psi_gremlin", "weight": 2, "starts": "21 days" } ] }, + { + "name": "GROUP_STRAY_DOGS", + "type": "monstergroup", + "default": "mon_dog", + "monsters": [ { "monster": "mon_dire_hound", "weight": 1, "starts": "14 days", "cost_multiplier": 0 } ] + }, + { + "name": "GROUP_MUTANT_PET_DOGS", + "type": "monstergroup", + "default": "mon_dog_mutant_mongrel", + "monsters": [ { "monster": "mon_dire_hound", "weight": 1, "starts": "14 days", "cost_multiplier": 0 } ] + }, { "type": "monstergroup", "name": "GROUP_MI-GO_CAMP_OM", diff --git a/data/mods/MindOverMatter/monsters/animal_psychics.json b/data/mods/MindOverMatter/monsters/animal_psychics.json index 6e0d69a4d519d..208062964c6bf 100644 --- a/data/mods/MindOverMatter/monsters/animal_psychics.json +++ b/data/mods/MindOverMatter/monsters/animal_psychics.json @@ -26,10 +26,10 @@ "regenerates": 1, "special_attacks": [ [ "EAT_FOOD", 20 ], - { "type": "bite", "cooldown": { "math": [ "7 + rand(19)" ] }, "infection_chance": 44 }, + { "type": "bite", "cooldown": { "math": [ "7 + rand(14)" ] }, "infection_chance": 44 }, { "id": "ranged_pull", - "cooldown": { "math": [ "10 + rand(15)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "hit_dmg_u": "%1$s growls and a powerful forces seizes your %2$s and drags you in!", "hit_dmg_npc": "%1$s growls and is dragged towards it!", @@ -85,7 +85,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "psychic_shriek", - "cooldown": { "math": [ "2 + rand(7)" ] }, + "cooldown": { "math": [ "3 + rand(6)" ] }, "move_cost": 100, "range": 3, "dodgeable": false, @@ -134,18 +134,18 @@ { "id": "scratch", "move_cost": 140, - "cooldown": { "math": [ "1 + rand(4)" ] }, + "cooldown": { "math": [ "1 + rand(3)" ] }, "damage_max_instance": [ { "damage_type": "cut", "amount": 12, "armor_multiplier": 0.75 } ], "min_mul": 1.5, "max_mul": 3.5 }, - { "id": "stag_smash", "cooldown": { "math": [ "10 + rand(15)" ] }, "min_mul": 0.8, "throw_strength": 70 }, + { "id": "stag_smash", "cooldown": { "math": [ "7 + rand(15)" ] }, "min_mul": 0.8, "throw_strength": 70 }, { "id": "psi_hodag_speed_boost", "type": "spell", "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "spell_data": { "id": "biokinetic_speed_boost_monster_01", "min_level": 5 }, - "cooldown": { "math": [ "9 + rand(22)" ] }, + "cooldown": { "math": [ "9 + rand(18)" ] }, "monster_message": "%1$s moves too quickly for the eye to follow!" }, { @@ -205,7 +205,7 @@ "id": "psi_cockatrice_telepathic_blast", "type": "spell", "spell_data": { "id": "telepathic_fear_blast_monster", "min_level": 6 }, - "cooldown": { "math": [ "9 + rand(22)" ] }, + "cooldown": { "math": [ "9 + rand(18)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares and lets out a silent cry!" } @@ -268,7 +268,7 @@ "id": "psi_pigeon_telepathic_blast", "type": "spell", "spell_data": { "id": "telepathic_fear_blast_monster", "min_level": 2 }, - "cooldown": { "math": [ "9 + rand(22)" ] }, + "cooldown": { "math": [ "9 + rand(18)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$'s third eye opens and it coos!" }, @@ -308,7 +308,7 @@ "id": "psi_gremlin_power_draining_spell", "type": "spell", "spell_data": { "id": "electrokinetic_power_draining" }, - "cooldown": { "math": [ "rand(45) + 5" ] }, + "cooldown": { "math": [ "5 + rand(45)" ] }, "allow_no_target": true, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "Sparks flicker over %1$s's fur." @@ -316,5 +316,83 @@ ], "armor": { "electric": 40 }, "special_when_hit": [ "ZAPBACK", 75 ] + }, + { + "id": "mon_dire_hound", + "type": "MONSTER", + "name": { "str": "direhound" }, + "description": "This large canid has grown to terrifying proportions, roughly three times the size of some of its brethren. Its teeth give steak knives a run for their money, and it looks to be the social center of any surrounding dogs.", + "//": "I've considered having this be an evolution point for several canid species outside of dogs, such as wolves or coyotes.", + "default_faction": "dog", + "bodytype": "dog", + "categories": [ "WILDLIFE" ], + "species": [ "MAMMAL" ], + "volume": "90000 ml", + "weight": "90 kg", + "hp": 100, + "speed": 150, + "material": [ "flesh" ], + "symbol": "W", + "color": "light_gray", + "looks_like": "mon_dog", + "aggression": 0, + "morale": 70, + "melee_skill": 8, + "melee_dice": 3, + "melee_dice_sides": 12, + "melee_damage": [ { "damage_type": "cut", "amount": 12 } ], + "dodge": 3, + "bleed_rate": 60, + "vision_day": 50, + "vision_night": 5, + "stomach_size": 1000, + "harvest": "mutant_mammal_large_fur", + "dissect": "dissect_lupine_sample_large", + "reproduction": { "baby_monster": "mon_dog_pup", "baby_count": 4, "baby_timer": 270 }, + "baby_flags": [ "SPRING", "SUMMER", "AUTUMN", "WINTER" ], + "biosignature": { "biosig_item": "feces_dog", "biosig_timer": 6 }, + "families": [ "prof_intro_biology", "prof_physiology" ], + "path_settings": { "max_dist": 10 }, + "special_attacks": [ + { + "id": "psi_direhound_telepathic_network", + "type": "spell", + "spell_data": { "id": "telepathic_network_monster", "min_level": 5 }, + "cooldown": 50, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, + "monster_message": "The direhound gazes upon its allies, and lets out a howl!" + }, + { + "type": "bite", + "cooldown": 5, + "damage_max_instance": [ { "damage_type": "stab", "amount": 15, "armor_penetration": 10 } ] + }, + [ "EAT_FOOD", 100 ] + ], + "petfood": { + "food": [ "DOGFOOD" ], + "feed": "The %s seems to like you! It lets you pat its head and seems friendly.", + "pet": "The %s happily wags its tail while you pat its head." + }, + "anger_triggers": [ "HURT", "FRIEND_ATTACKED", "FRIEND_DIED" ], + "zombify_into": "mon_dog_zombie_brute", + "flags": [ + "ANIMAL", + "DOGFOOD", + "CANPLAY", + "CAN_BE_CULLED", + "GROUP_MORALE", + "HEARS", + "PET_MOUNTABLE", + "HIT_AND_RUN", + "KEENNOSE", + "PATH_AVOID_DANGER", + "SEES", + "SMELLS", + "SWARMS", + "WARM", + "EATS" + ], + "armor": { "bash": 8, "cut": 10, "electric": 1 } } ] diff --git a/data/mods/MindOverMatter/monsters/civilian_psychics.json b/data/mods/MindOverMatter/monsters/civilian_psychics.json index 7330204ce458a..941a9af6dfdc4 100644 --- a/data/mods/MindOverMatter/monsters/civilian_psychics.json +++ b/data/mods/MindOverMatter/monsters/civilian_psychics.json @@ -27,7 +27,7 @@ "id": "smash", "attack_upper": true, "throw_strength": 40, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } } }, { "id": "bio_op_takedown", "cooldown": 20, "condition": { "not": { "u_has_effect": "effect_psi_null" } } } @@ -96,7 +96,7 @@ "id": "psi_civilian_electrokinetic_zap", "type": "spell", "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 0 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s unleashes a burst of sparks!" } @@ -131,7 +131,7 @@ "id": "psi_civilian_photokinetic_lightbeam", "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 0 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s fires a photon beam!" } @@ -164,7 +164,7 @@ "id": "psi_civilian_pyrokinetic_flameblast", "type": "spell", "spell_data": { "id": "pyrokinetic_eruption_monster", "min_level": 0 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s summons a blast of flame!" } @@ -195,7 +195,7 @@ { "id": "smash", "move_cost": 100, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "damage_max_instance": [ { "damage_type": "bash", "amount": 10, "armor_penetration": 10 } ], "hitsize_min": 12, "range": 4, @@ -246,7 +246,7 @@ "id": "psi_civilian_teleport_blink", "type": "spell", "spell_data": { "id": "teleport_blink_monster", "min_level": 0 }, - "cooldown": { "math": [ "2 + rand(7)" ] }, + "cooldown": { "math": [ "2 + rand(4)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s suddenly vanishes!" } diff --git a/data/mods/MindOverMatter/monsters/feral_lab_psychics.json b/data/mods/MindOverMatter/monsters/feral_lab_psychics.json index 978d2731f11ae..4c5438fca9fb9 100644 --- a/data/mods/MindOverMatter/monsters/feral_lab_psychics.json +++ b/data/mods/MindOverMatter/monsters/feral_lab_psychics.json @@ -39,7 +39,7 @@ "id": "psi_drbrain_flashbang", "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 5 }, - "cooldown": { "math": [ "6 + rand(15)" ] }, + "cooldown": { "math": [ "6 + rand(12)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" }, @@ -47,7 +47,7 @@ "id": "psi_drbrain_blast", "type": "spell", "spell_data": { "id": "telepathic_blast_monster", "min_level": 4 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" }, @@ -55,7 +55,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "mon_telekinetic_mindhammer", - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "move_cost": 80, "range": 6, "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 25 } ], @@ -73,7 +73,7 @@ { "id": "smash", "move_cost": 80, - "cooldown": { "math": [ "4 + rand(10)" ] }, + "cooldown": { "math": [ "4 + rand(8)" ] }, "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 20, "armor_penetration": 10 } ], "hitsize_min": 12, "range": 8, @@ -166,13 +166,13 @@ "id": "smash", "attack_upper": true, "throw_strength": 50, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } } }, [ "BIO_OP_DISARM", 15 ], { "id": "bio_op_takedown", - "cooldown": { "math": [ "10 + rand(15)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } } }, { diff --git a/data/mods/MindOverMatter/monsters/feral_psychics.json b/data/mods/MindOverMatter/monsters/feral_psychics.json index ea3110ac1e9e5..1917fc2d47be0 100644 --- a/data/mods/MindOverMatter/monsters/feral_psychics.json +++ b/data/mods/MindOverMatter/monsters/feral_psychics.json @@ -39,7 +39,7 @@ "id": "smash", "attack_upper": true, "throw_strength": 30, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } } }, [ "BIO_OP_DISARM", 10 ] @@ -98,13 +98,13 @@ "id": "smash", "attack_upper": true, "throw_strength": 50, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } } }, [ "BIO_OP_DISARM", 10 ], { "id": "bio_op_takedown", - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } } }, { @@ -174,12 +174,12 @@ "id": "smash", "attack_upper": true, "throw_strength": 50, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } } }, { "type": "leap", - "cooldown": { "math": [ "2 + rand(7)" ] }, + "cooldown": { "math": [ "2 + rand(5)" ] }, "move_cost": 50, "allow_no_target": true, "max_range": 5, @@ -189,7 +189,7 @@ [ "BIO_OP_DISARM", 10 ], { "id": "bio_op_takedown", - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } } }, { @@ -306,7 +306,7 @@ "special_attacks": [ { "type": "gun", - "cooldown": { "math": [ "2 + rand(7)" ] }, + "cooldown": { "math": [ "2 + rand(4)" ] }, "move_cost": 150, "gun_type": "feral_clair_thrown_rock", "ammo_type": "rock", @@ -377,7 +377,7 @@ "special_attacks": [ { "type": "gun", - "cooldown": { "math": [ "2 + rand(7)" ] }, + "cooldown": { "math": [ "2 + rand(4)" ] }, "move_cost": 150, "gun_type": "pattern_screamer_thrown_rock", "ammo_type": "rock", @@ -394,7 +394,7 @@ "id": "psi_pattern_scream", "type": "spell", "spell_data": { "id": "telepathic_shrieking_monster", "min_level": 3 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "Static fills your hearing for a moment, blotting out all other sounds!" } @@ -458,7 +458,7 @@ "id": "psi_electrokin_dazehit", "type": "spell", "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 3 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's touches %3$s with a jolt!" } @@ -518,7 +518,7 @@ "id": "psi_electrokin2_dazehit", "type": "spell", "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 3 }, - "cooldown": { "math": [ "2 + rand(13)" ] }, + "cooldown": { "math": [ "4 + rand(8)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's touches %3$s with a jolt!" }, @@ -526,7 +526,7 @@ "id": "psi_electrokin2_lightning_bolt", "type": "spell", "spell_data": { "id": "electrokinetic_lightning_bolt_monster", "min_level": 4 }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's unleashes a bolt of lightning!" }, @@ -534,7 +534,7 @@ "id": "psi_electrokin2_paralyze", "type": "spell", "spell_data": { "id": "electrokinetic_paralysis_monster", "min_level": 5 }, - "cooldown": { "math": [ "15 + rand(38)" ] }, + "cooldown": { "math": [ "15 + rand(30)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's waves a hand at %3$s and sparks crackle over their skin!" } @@ -595,7 +595,7 @@ "id": "psi_electrokin3_dazehit", "type": "spell", "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 5 }, - "cooldown": { "math": [ "4 + rand(10)" ] }, + "cooldown": { "math": [ "4 + rand(8)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's touches %3$s with a jolt!" }, @@ -603,7 +603,7 @@ "id": "psi_electrokin3_lightning_bolt", "type": "spell", "spell_data": { "id": "electrokinetic_lightning_blast_monster", "min_level": 8 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's unleashes a bolt of lightning!" }, @@ -611,7 +611,7 @@ "id": "psi_electrokin3_paralyze", "type": "spell", "spell_data": { "id": "electrokinetic_paralysis_monster", "min_level": 8 }, - "cooldown": { "math": [ "12 + rand(32)" ] }, + "cooldown": { "math": [ "12 + rand(24)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's waves a hand at %3$s and sparks crackle over their skin!" }, @@ -619,7 +619,7 @@ "id": "psi_electrokin3_revive", "type": "spell", "spell_data": { "id": "electrokinetic_revive_monster", "min_level": 5 }, - "cooldown": { "math": [ "25 + rand(63)" ] }, + "cooldown": { "math": [ "25 + rand(50)" ] }, "allow_no_target": true, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's gestures and lighting crackles around them!" @@ -680,7 +680,7 @@ "id": "psi_photokin1_lightdodge", "type": "spell", "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 3 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's form is shifting with illusions!" }, @@ -688,7 +688,7 @@ "id": "psi_photokin1_lightbeam", "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 2 }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s fires a photon beam!" } @@ -748,7 +748,7 @@ "id": "psi_photokin2_lightdodge", "type": "spell", "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 6 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's form is shifting with illusions!" }, @@ -756,7 +756,7 @@ "id": "psi_photokin2_lightbeam", "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 5 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s fires a photon beam!" }, @@ -764,7 +764,7 @@ "id": "psi_photokin2_lightflash", "type": "spell", "spell_data": { "id": "photokinetic_light_flash_monster", "min_level": 4 }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s concentrates and unleashes a super-luminous flash!" }, @@ -772,7 +772,7 @@ "id": "psi_photokin2_radiation_blast", "type": "spell", "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 7 }, - "cooldown": { "math": [ "12 + rand(32)" ] }, + "cooldown": { "math": [ "12 + rand(24)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s and %3$s is enveloped in an eerie glow!" } @@ -838,7 +838,7 @@ "id": "psi_photokin3_lightdodge", "type": "spell", "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 7 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's form is shifting with illusions!" }, @@ -846,7 +846,7 @@ "id": "psi_photokin3_lightbeam", "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 6 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s fires a photon beam!" }, @@ -854,7 +854,7 @@ "id": "psi_photokin3_lightflash", "type": "spell", "spell_data": { "id": "photokinetic_light_flash_monster", "min_level": 6 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s concentrates and unleashes a super-luminous flash!" }, @@ -862,7 +862,7 @@ "id": "psi_photokin3_radiation_blast", "type": "spell", "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 10 }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at you and you are enveloped in an eerie glow!" } @@ -922,7 +922,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "mon_fountain_of_flames", - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "move_cost": 80, "damage_max_instance": [ { "damage_type": "heat", "amount": 20 } ], "dodgeable": true, @@ -940,7 +940,7 @@ "id": "psi_pyrokin1_flashbang", "type": "spell", "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 1 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The air erupts into an eye-searing flash!" } @@ -1004,7 +1004,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "mon_fountain_of_flames", - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "move_cost": 80, "range": 2, "damage_max_instance": [ { "damage_type": "heat", "amount": 25 } ], @@ -1023,7 +1023,7 @@ "id": "psi_pyrokin2_flashbang", "type": "spell", "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 4 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The air erupts into an eye-searing flash!" }, @@ -1031,7 +1031,7 @@ "id": "psi_pyrokin2_flamebomb", "type": "spell", "spell_data": { "id": "pyrokinetic_blast_monster", "min_level": 4 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s gestures and summons a conflagration!" } @@ -1100,7 +1100,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "mon_fountain_of_flames", - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "move_cost": 80, "range": 3, "damage_max_instance": [ { "damage_type": "heat", "amount": 35 } ], @@ -1119,7 +1119,7 @@ "id": "psi_pyrokin3_flashbang", "type": "spell", "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 5 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The air erupts into an eye-searing flash!" }, @@ -1127,7 +1127,7 @@ "id": "psi_pyrokin3_flamebomb", "type": "spell", "spell_data": { "id": "pyrokinetic_blast_monster", "min_level": 6 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s gestures and summons a conflagration!" } @@ -1191,13 +1191,13 @@ "id": "psi_telekin1_telegrab", "type": "spell", "spell_data": { "id": "telekinetic_pull_monster", "min_level": 2 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "and": [ { "not": { "u_has_effect": "effect_psi_null" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" }, { "type": "gun", - "cooldown": { "math": [ "2 + rand(7)" ] }, + "cooldown": { "math": [ "2 + rand(4)" ] }, "move_cost": 50, "gun_type": "feral_human_thrown_rock", "ammo_type": "rock", @@ -1212,7 +1212,7 @@ { "id": "smash", "move_cost": 80, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 15, "armor_penetration": 10 } ], "hitsize_min": 12, "range": 6, @@ -1231,7 +1231,7 @@ "id": "psi_telekin1_momentum_alteration", "type": "spell", "spell_data": { "id": "telekinetic_momentum_monster" }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "and": [ { "not": { "u_has_effect": "effect_psi_null" } }, @@ -1300,7 +1300,7 @@ "id": "psi_telekin2_telegrab", "type": "spell", "spell_data": { "id": "telekinetic_pull_monster", "min_level": 3 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "and": [ { "not": { "u_has_effect": "effect_psi_null" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" }, @@ -1308,7 +1308,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "mon_telekinetic_mindhammer", - "cooldown": { "math": [ "6 + rand(15)" ] }, + "cooldown": { "math": [ "6 + rand(12)" ] }, "move_cost": 80, "range": 8, "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 20 } ], @@ -1326,7 +1326,7 @@ { "id": "smash", "move_cost": 80, - "cooldown": { "math": [ "4 + rand(10)" ] }, + "cooldown": { "math": [ "4 + rand(8)" ] }, "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 25, "armor_penetration": 10 } ], "hitsize_min": 12, "range": 8, @@ -1427,7 +1427,7 @@ "id": "psi_telepath1_scream", "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" }, @@ -1435,7 +1435,7 @@ "id": "psi_telepath1_blast", "type": "spell", "spell_data": { "id": "telepathic_blast_monster", "min_level": 1 }, - "cooldown": { "math": [ "9 + rand(23)" ] }, + "cooldown": { "math": [ "9 + rand(18)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" } @@ -1496,7 +1496,7 @@ "id": "psi_telepath2_scream", "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, - "cooldown": { "math": [ "8 + rand(20)" ] }, + "cooldown": { "math": [ "8 + rand(16)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" }, @@ -1504,7 +1504,7 @@ "id": "psi_telepath2_blast", "type": "spell", "spell_data": { "id": "telepathic_blast_monster", "min_level": 2 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" }, @@ -1512,7 +1512,7 @@ "id": "psi_telepath2_horror", "type": "spell", "spell_data": { "id": "telepathic_horror_monster", "min_level": 4 }, - "cooldown": { "math": [ "12 + rand(32)" ] }, + "cooldown": { "math": [ "12 + rand(24)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" } @@ -1574,7 +1574,7 @@ "id": "psi_telepath3_scream", "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 5 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" }, @@ -1582,7 +1582,7 @@ "id": "psi_telepath3_blast", "type": "spell", "spell_data": { "id": "telepathic_blast_monster", "min_level": 5 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" }, @@ -1591,7 +1591,7 @@ "type": "spell", "spell_data": { "id": "telepathic_horror_aoe_monster", "min_level": 15 }, "allow_no_target": true, - "cooldown": { "math": [ "12 + rand(32)" ] }, + "cooldown": { "math": [ "12 + rand(24)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s eyes suddenly go wide!" }, @@ -1599,7 +1599,7 @@ "id": "psi_telepath3_freeze", "type": "spell", "spell_data": { "id": "telepathic_primal_fear_monster", "min_level": 5 }, - "cooldown": { "math": [ "17 + rand(44)" ] }, + "cooldown": { "math": [ "17 + rand(34)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s and they freeze like a frightened rabbit!" } @@ -1656,13 +1656,13 @@ "id": "psi_teleport1_slow", "type": "spell", "spell_data": { "id": "teleport_slow_monster", "min_level": 2 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s looks at %3$s and the world lurches." }, { "type": "leap", - "cooldown": { "math": [ "4 + rand(10)" ] }, + "cooldown": { "math": [ "4 + rand(8)" ] }, "allow_no_target": true, "max_range": 8, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, @@ -1723,7 +1723,7 @@ "id": "psi_teleport2_slow", "type": "spell", "spell_data": { "id": "teleport_slow_monster", "min_level": 4 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s glances at %3$s and the world lurches." }, @@ -1732,7 +1732,7 @@ "attack_type": "melee", "id": "teleport_touch", "move_cost": 80, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "accuracy": 5, "damage_max_instance": [ { "damage_type": "psi_teleporter_teleporting_damage", "amount": 2, "armor_penetration": 10 } ], "blockable": false, @@ -1813,7 +1813,7 @@ "attack_type": "melee", "id": "teleport_touch", "move_cost": 65, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "accuracy": 6, "damage_max_instance": [ { "damage_type": "psi_teleporter_teleporting_damage", "amount": 2, "armor_penetration": 10 } ], "blockable": false, @@ -1827,7 +1827,7 @@ "id": "psi_teleport3_slow", "type": "spell", "spell_data": { "id": "teleport_slow_monster", "min_level": 6 }, - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s glances at %3$s and the world lurches." }, @@ -1835,7 +1835,7 @@ "id": "psi_teleport3_instability", "type": "spell", "spell_data": { "id": "teleport_blink_attack_monster", "min_level": 4 }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s touches %3$s and the world around %3$s wavers." }, @@ -1910,7 +1910,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "mon_vitakinetic_weakness", - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "move_cost": 60, "damage_max_instance": [ { "damage_type": "biological", "amount": 0 } ], "dodgeable": true, @@ -1983,7 +1983,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "mon_vitakinetic_laceration", - "cooldown": { "math": [ "6 + rand(15)" ] }, + "cooldown": { "math": [ "6 + rand(12)" ] }, "move_cost": 60, "damage_max_instance": [ { "damage_type": "biological", "amount": 15 } ], "effects": [ @@ -2004,7 +2004,7 @@ "type": "monster_attack", "attack_type": "melee", "id": "mon_vitakinetic_weakness_2", - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "move_cost": 60, "damage_max_instance": [ { "damage_type": "biological", "amount": 0 } ], "dodgeable": true, @@ -2022,7 +2022,7 @@ "id": "psi_vitakin2_regeneration", "type": "spell", "spell_data": { "id": "vitakinetic_regeneration_monster" }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "allow_no_target": true, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s closes their eyes and their wounds begin healing at a rapid pace!" diff --git a/data/mods/MindOverMatter/monsters/mi_go.json b/data/mods/MindOverMatter/monsters/mi_go.json index faf9cd419e805..9937f8d132c40 100644 --- a/data/mods/MindOverMatter/monsters/mi_go.json +++ b/data/mods/MindOverMatter/monsters/mi_go.json @@ -32,17 +32,21 @@ "scents_ignored": [ "sc_fetid" ], "special_attacks": [ [ "PARROT", 100 ], - { "id": "stretch_attack" }, + { "id": "stretch_attack", "cooldown": { "math": [ "10 + rand(20)" ] } }, { "id": "longswipe", - "cooldown": 12, + "cooldown": { "math": [ "12 + rand(24)" ] }, "damage_max_instance": [ { "damage_type": "cut", "amount": 7, "armor_multiplier": 0.6 } ] }, - { "id": "cut_throat", "cooldown": 12 }, - { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 30, "armor_multiplier": 0.4 } ] }, + { "id": "cut_throat", "cooldown": { "math": [ "6 + rand(12)" ] } }, + { + "id": "scratch", + "damage_max_instance": [ { "damage_type": "cut", "amount": 30, "armor_multiplier": 0.4 } ], + "cooldown": { "math": [ "10 + rand(20)" ] } + }, { "type": "leap", - "cooldown": { "math": [ "2 + rand(7)" ] }, + "cooldown": { "math": [ "2 + rand(4)" ] }, "move_cost": 50, "allow_no_target": true, "max_range": 7, @@ -53,7 +57,7 @@ "id": "psi_juggernaut_speed_boost", "type": "spell", "spell_data": { "id": "biokinetic_speed_boost_monster_01", "min_level": 5 }, - "cooldown": { "math": [ "9 + rand(23)" ] }, + "cooldown": { "math": [ "9 + rand(18)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s moves so quickly it's nothing but a blur!" } @@ -109,12 +113,16 @@ "scents_ignored": [ "sc_fetid" ], "special_attacks": [ [ "PARROT", 100 ], - { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 23, "armor_multiplier": 0.8 } ] }, + { + "id": "scratch", + "damage_max_instance": [ { "damage_type": "cut", "amount": 23, "armor_multiplier": 0.8 } ], + "cooldown": { "math": [ "10 + rand(20)" ] } + }, { "id": "psi_mi-go_illumination", "type": "spell", "spell_data": { "id": "photokinetic_illumination_monster", "min_level": 5 }, - "cooldown": { "math": [ "15 + rand(38)" ] }, + "cooldown": { "math": [ "15 + rand(30)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The mi-go's numerous antennae sync their movements for a brief moment." }, @@ -122,7 +130,7 @@ "id": "psi_mi-go_laser", "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 7 }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The mi-go's numerous antennae sync their movements for a brief moment." }, @@ -130,7 +138,7 @@ "id": "psi_mi-go_radiation", "type": "spell", "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 10 }, - "cooldown": { "math": [ "12 + rand(32)" ] }, + "cooldown": { "math": [ "12 + rand(24)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The mi-go's numerous antennae sync their movements for a brief moment." } @@ -185,13 +193,17 @@ "scents_ignored": [ "sc_fetid" ], "special_attacks": [ [ "PARROT", 100 ], - { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 23, "armor_multiplier": 0.8 } ] }, + { + "id": "scratch", + "damage_max_instance": [ { "damage_type": "cut", "amount": 23, "armor_multiplier": 0.8 } ], + "cooldown": { "math": [ "10 + rand(20)" ] } + }, { "type": "monster_attack", "attack_type": "melee", "id": "mind_blast_monster", "move_cost": 80, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "accuracy": 5, "range": 10, "damage_max_instance": [ { "damage_type": "psi_telepathic_damage", "amount": 15, "armor_penetration": 0 } ], @@ -207,7 +219,7 @@ "id": "psi_mi-go_hallucinations", "type": "spell", "spell_data": { "id": "telepathic_hallucinations_monster", "min_level": 10 }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The mi-go's numerous antennae sync their movements for a brief moment." }, @@ -215,7 +227,7 @@ "id": "psi_mi-go_blinding", "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, - "cooldown": { "math": [ "15 + rand(38)" ] }, + "cooldown": { "math": [ "15 + rand(30)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" } diff --git a/data/mods/MindOverMatter/monsters/monsters_spells.json b/data/mods/MindOverMatter/monsters/monsters_spells.json index 687473d3e387a..808fc98a8abfb 100644 --- a/data/mods/MindOverMatter/monsters/monsters_spells.json +++ b/data/mods/MindOverMatter/monsters/monsters_spells.json @@ -840,6 +840,39 @@ "sound_type": "activity", "sound_description": "static" }, + { + "type": "SPELL", + "id": "telepathic_network_monster", + "name": "[Ψ]Network Effect Monster", + "description": "AI trigger for only casting when hostiles are present.", + "valid_targets": [ "hostile", "ground" ], + "effect": "none", + "shape": "blast", + "base_casting_time": 0, + "flags": [ "WONDER", "NO_PROJECTILE", "SILENT", "NO_EXPLOSION_SFX" ], + "min_damage": 1, + "max_damage": 1, + "min_range": 60, + "max_range": 60, + "extra_effects": [ { "id": "telepathic_network_monster_real", "hit_self": true } ] + }, + { + "id": "telepathic_network_monster_real", + "type": "SPELL", + "name": "[Ψ]Network Effect Monster Real", + "description": "Adds the telepathic network effect to the monster's ally.", + "valid_targets": [ "self", "ally" ], + "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], + "difficulty": 9, + "max_level": 20, + "effect": "attack", + "effect_str": "effect_telepath_network_monster_effect", + "shape": "blast", + "min_aoe": 60, + "max_aoe": 60, + "min_duration": 10000, + "max_duration": 30000 + }, { "id": "teleport_slow_monster", "type": "SPELL", diff --git a/data/mods/MindOverMatter/monsters/nether.json b/data/mods/MindOverMatter/monsters/nether.json index bf78d07c72e0d..cf5c3c79b8420 100644 --- a/data/mods/MindOverMatter/monsters/nether.json +++ b/data/mods/MindOverMatter/monsters/nether.json @@ -30,7 +30,7 @@ { "type": "spell", "spell_data": { "id": "eater_drain_monster", "min_level": 5 }, - "cooldown": { "math": [ "2 + rand(3)" ] }, + "cooldown": { "math": [ "2 + rand(2)" ] }, "monster_message": "The eater's fronds lazily drift to and fro." } ], diff --git a/data/mods/MindOverMatter/monsters/triffids.json b/data/mods/MindOverMatter/monsters/triffids.json index 2b2fdfeab4ed5..23529b5f25a53 100644 --- a/data/mods/MindOverMatter/monsters/triffids.json +++ b/data/mods/MindOverMatter/monsters/triffids.json @@ -90,13 +90,13 @@ "id": "psi_triffid_teleporter_slow", "type": "spell", "spell_data": { "id": "teleport_slow_monster", "min_level": 8 }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s waves its fronds at %3$s." }, { "type": "leap", - "cooldown": { "math": [ "4 + rand(10)" ] }, + "cooldown": { "math": [ "4 + rand(8)" ] }, "move_cost": 50, "allow_no_target": true, "max_range": 10, @@ -107,7 +107,7 @@ "id": "psi_triffid_teleporter_ally_teleport", "type": "spell", "spell_data": { "id": "teleporter_triffid_summon_allies", "min_level": 10 }, - "cooldown": { "math": [ "17 + rand(44)" ] }, + "cooldown": { "math": [ "17 + rand(32)" ] }, "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s waves its fronds at %3$s and the air around %3$s solidifies into shapes." } diff --git a/data/mods/MindOverMatter/monsters/zombies.json b/data/mods/MindOverMatter/monsters/zombies.json index d04be4d89df43..71fe71c8cacd7 100644 --- a/data/mods/MindOverMatter/monsters/zombies.json +++ b/data/mods/MindOverMatter/monsters/zombies.json @@ -59,13 +59,14 @@ "emit_fields": [ { "emit_id": "emit_anti_psi", "delay": "1 s" } ], "grab_strength": 40, "special_attacks": [ - { "id": "grab" }, + { "id": "grab", "cooldown": { "math": [ "5 + rand(10)" ] } }, { "id": "bite_humanoid", "cooldown": { "math": [ "2 + rand(4)" ] } }, { "id": "scratch", - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "damage_max_instance": [ { "damage_type": "bash", "amount": 6, "armor_multiplier": 0.8 } ], "effects": [ { "id": "effect_psi_neutralized", "duration": 15 } ], + "effects_require_dmg": false, "hit_dmg_u": "%1$s strikes at your %2$s!", "hit_dmg_npc": "%1$s strikes at !", "miss_msg_u": "%1$s strikes at you, but you dodge!", @@ -75,7 +76,7 @@ }, { "type": "leap", - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "max_range": 3, "min_consider_range": 2, "max_consider_range": 4, @@ -85,7 +86,8 @@ "id": "zombie_null_nether_banish_monster", "type": "spell", "spell_data": { "id": "nether_banish_monster" }, - "cooldown": { "math": [ "10 + rand(25)" ] }, + "condition": { "npc_has_species": "NETHER" }, + "cooldown": { "math": [ "10 + rand(20)" ] }, "monster_message": "%1$s looks at %3$s and the static on the edge of your vision flickers." } ], @@ -123,11 +125,11 @@ "emit_fields": [ { "emit_id": "emit_anti_psi", "delay": "1 s" } ], "grab_strength": 30, "special_attacks": [ - { "id": "grab" }, - { "id": "bite_humanoid", "cooldown": 5 }, + { "id": "grab", "cooldown": { "math": [ "5 + rand(10)" ] } }, + { "id": "bite_humanoid", "cooldown": { "math": [ "2 + rand(4)" ] } }, { "id": "scratch", - "cooldown": { "math": [ "5 + rand(13)" ] }, + "cooldown": { "math": [ "5 + rand(10)" ] }, "damage_max_instance": [ { "damage_type": "bash", "amount": 6, "armor_multiplier": 0.8 } ], "hit_dmg_u": "%1$s strikes at your %2$s!", "hit_dmg_npc": "%1$s strikes at !", @@ -140,7 +142,8 @@ "id": "zombie_anti_concentration_spell", "type": "spell", "spell_data": { "id": "null_break_concentration_spell" }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "condition": "npc_is_character", + "cooldown": { "math": [ "5 + rand(13)" ] }, "monster_message": "%1$s looks at %3$s and the static on the edge of your vision flickers." } ], @@ -162,7 +165,7 @@ "copy-from": "mon_zombie_base", "type": "MONSTER", "name": { "str": "nether-void" }, - "description": "Thoughts of old creepy Internet memes arise unbidden as you see this zombie. It's almost ten feet fall but incredibly thin, with spindly legs and with arms that hang down almost all the way to the ground. Occasionally, it drops on all fours to clamber with uncanny speed over some bit of rubble. When you look directly at it, gray static flickers on the edge of your vision and you hear a very low droning hum.", + "description": "Thoughts of old creepy Internet memes arise unbidden as you see this zombie. It's almost ten feet tall but incredibly thin, with spindly legs and with arms that hang down almost all the way to the ground. Occasionally, it drops on all fours to clamber with uncanny speed over some bit of rubble. When you look directly at it, gray static flickers on the edge of your vision and you hear a very low droning hum.", "species": [ "ZOMBIE", "HUMAN", "PSI_NULL" ], "proportional": { "hp": 1.3, "speed": 2 }, "symbol": "Z", @@ -173,21 +176,23 @@ "melee_dice_sides": 5, "melee_damage": [ { "damage_type": "bash", "amount": 2 } ], "dodge": 5, + "attack_effs": [ { "id": "effect_psi_neutralized", "duration": 5 } ], "bleed_rate": 50, "vision_day": 35, "vision_night": 5, - "emit_fields": [ { "emit_id": "emit_anti_psi", "delay": "1 s" } ], + "emit_fields": [ { "emit_id": "emit_anti_psi_void", "delay": "1 s" } ], "grab_strength": 50, "special_attacks": [ - { "id": "ranged_pull", "range": 3 }, - { "id": "grab_drag", "cooldown": { "math": [ "2 + rand(3)" ] } }, + { "id": "ranged_pull", "range": 3, "cooldown": { "math": [ "2 + rand(4)" ] }, "no_adjacent": true }, + { "id": "grab_drag", "cooldown": { "math": [ "2 + rand(4)" ] } }, { "id": "drag_followup" }, - { "id": "bite_humanoid", "cooldown": { "math": [ "2 + rand(5)" ] } }, + { "id": "bite_humanoid", "cooldown": { "math": [ "2 + rand(4)" ] } }, { "id": "scratch", - "cooldown": { "math": [ "6 + rand(15)" ] }, + "cooldown": { "math": [ "6 + rand(12)" ] }, "damage_max_instance": [ { "damage_type": "bash", "amount": 6, "armor_multiplier": 0.8 } ], "effects": [ { "id": "effect_psi_neutralized", "duration": 30 } ], + "effects_require_dmg": false, "hit_dmg_u": "%1$s strikes at your %2$s!", "hit_dmg_npc": "%1$s strikes at !", "miss_msg_u": "%1$s strikes at you, but you dodge!", @@ -197,7 +202,7 @@ }, { "type": "leap", - "cooldown": { "math": [ "7 + rand(19)" ] }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "max_range": 4, "min_consider_range": 2, "max_consider_range": 6, @@ -207,7 +212,8 @@ "id": "zombie_void_nether_banish_monster", "type": "spell", "spell_data": { "id": "nether_banish_monster_greater" }, - "cooldown": { "math": [ "7 + rand(19)" ] }, + "condition": { "npc_has_species": "NETHER" }, + "cooldown": { "math": [ "7 + rand(14)" ] }, "monster_message": "%1$s looks at %3$s and the static on the edge of your vision creeps inward for a moment." } ], diff --git a/data/mods/MindOverMatter/powers/biokinesis.json b/data/mods/MindOverMatter/powers/biokinesis.json index 239d63ef8a8ee..c4e76be9df9e1 100644 --- a/data/mods/MindOverMatter/powers/biokinesis.json +++ b/data/mods/MindOverMatter/powers/biokinesis.json @@ -43,6 +43,7 @@ "name": "[Ψ]Overcome Pain (C)", "description": "You can lessen the impact of pain on your performance, though this has no effect on the underlying injuries.\n\nThis power is maintained by concentration and may fail if concentration is interrupted.", "message": "", + "teachable": false, "valid_targets": [ "self" ], "spell_class": "BIOKINETIC", "skill": "metaphysics", @@ -80,6 +81,7 @@ "name": "[Ψ]Oxygen Absorption (C)", "description": "You can make the entire surface of your skin selectively permeable, allowing you to 'breathe' through it. You can breathe in low-oxygen environments or underwater, but are more vulnerable to toxic gas.\n\nThis power is maintained by concentration and may fail if concentration is interrupted. Oxygen Absorption cannot be active with Sealed System.", "message": "", + "teachable": false, "valid_targets": [ "self" ], "spell_class": "BIOKINETIC", "skill": "metaphysics", diff --git a/data/mods/MindOverMatter/powers/photokinesis.json b/data/mods/MindOverMatter/powers/photokinesis.json index 7589345ffe202..17fcf7b3b97db 100644 --- a/data/mods/MindOverMatter/powers/photokinesis.json +++ b/data/mods/MindOverMatter/powers/photokinesis.json @@ -432,6 +432,7 @@ "name": "[Ψ]Lucid Shadows", "description": "Form images of yourself to confuse and distract enemies.", "message": "Identical copies of you suddenly appear!", + "teachable": false, "valid_targets": [ "ground", "hostile", "self", "ally" ], "spell_class": "PHOTOKINETIC", "skill": "metaphysics", @@ -645,9 +646,9 @@ { "id": "photokinetic_blinding_glare", "type": "SPELL", - "name": "[Ψ]Blinding Radiance", - "description": "You can emit so much light that anyone trying to attack you risks being blinded.", - "message": "You begin glowing as brightly as the sun!", + "name": "[Ψ]Blinding Radiance (C)", + "description": "You can emit so much light that anyone trying to attack you risks being blinded.\n\nThis power is maintained by concentration and may fail if concentration is interrupted.", + "message": "", "teachable": false, "valid_targets": [ "self" ], "spell_class": "PHOTOKINETIC", @@ -655,8 +656,8 @@ "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], "difficulty": 7, "max_level": { "math": [ "int_to_level(1)" ] }, - "effect": "attack", - "effect_str": "effect_photokin_blinding_glare", + "effect": "effect_on_condition", + "effect_str": "EOC_PHOTOKIN_BLINDING_GLARE_INITIATE", "shape": "blast", "min_duration": { "math": [ @@ -669,12 +670,16 @@ ] }, "energy_source": "STAMINA", - "base_energy_cost": 6500, - "final_energy_cost": 3250, - "energy_increment": -95, - "base_casting_time": 125, - "final_casting_time": 25, - "casting_time_increment": -7.5 + "base_energy_cost": { + "math": [ + "u_effect_intensity('effect_photokin_blinding_glare') > -1 ? 0 : max((6500 - (u_spell_level('photokinetic_blinding_glare') * 95)), 3250)" + ] + }, + "base_casting_time": { + "math": [ + "u_effect_intensity('effect_photokin_blinding_glare') > -1 ? 10 : max((125 -(u_spell_level('photokinetic_blinding_glare') * 7.5)), 25)" + ] + } }, { "id": "photokinetic_light_disintegrate", diff --git a/data/mods/MindOverMatter/powers/photokinesis_concentration_eoc.json b/data/mods/MindOverMatter/powers/photokinesis_concentration_eoc.json index 72c36a8fbfb64..4c40a6da8a15c 100644 --- a/data/mods/MindOverMatter/powers/photokinesis_concentration_eoc.json +++ b/data/mods/MindOverMatter/powers/photokinesis_concentration_eoc.json @@ -444,7 +444,7 @@ { "math": [ "u_latest_channeled_power_difficulty", "=", "6" ] }, { "run_eocs": "EOC_PSIONICS_GAIN_NETHER_ATTUNEMENT_2" }, { "math": [ "u_calories()", "-=", "psionics_kcal_cost(6)" ] }, - { "math": [ "u_spell_exp('photokinetic_light_dodge')", "+=", "(maintenance_exp_factor(u_val('focus')))" ] }, + { "math": [ "u_spell_exp('photokinetic_invisibility')", "+=", "(maintenance_exp_factor(u_val('focus')))" ] }, { "run_eocs": "EOC_POWER_MAINTENANCE_CONCENTRATION_CHECK" }, { "queue_eocs": "EOC_PHOTOKIN_INVISIBILITY_DRAIN", @@ -463,5 +463,65 @@ } ], "false_effect": [ ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_BLINDING_GLARE_INITIATE", + "condition": { "not": { "u_has_effect": "effect_photokin_blinding_glare" } }, + "effect": [ + { "u_message": "You begin glowing as brightly as the sun!", "type": "good" }, + { "u_add_effect": "effect_photokin_blinding_glare", "duration": "PERMANENT" }, + { "run_eocs": "EOC_POWER_MAINTENANCE_PLUS_ONE" }, + { + "queue_eocs": "EOC_PHOTOKIN_BLINDING_GLARE_DRAIN", + "time_in_future": [ + { + "math": [ + "( (u_spell_level('photokinetic_blinding_glare') * 11) + 59) * (scaling_factor(u_val('intelligence') ) ) * u_nether_attunement_power_scaling" + ] + }, + { + "math": [ + "( (u_spell_level('photokinetic_blinding_glare') * 47) + 178) * (scaling_factor(u_val('intelligence') ) ) * u_nether_attunement_power_scaling" + ] + } + ] + } + ], + "false_effect": [ { "run_eocs": "EOC_PHOTOKIN_REMOVE_BLINDING_GLARE" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_REMOVE_BLINDING_GLARE", + "condition": { "u_has_effect": "effect_photokin_blinding_glare" }, + "effect": [ { "run_eocs": "EOC_POWER_MAINTENANCE_MINUS_ONE" }, { "u_lose_effect": "effect_photokin_blinding_glare" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_BLINDING_GLARE_DRAIN", + "condition": { "u_has_effect": "effect_photokin_blinding_glare" }, + "effect": [ + { "math": [ "u_latest_channeled_power_difficulty", "=", "7" ] }, + { "run_eocs": "EOC_PSIONICS_GAIN_NETHER_ATTUNEMENT_2" }, + { "math": [ "u_calories()", "-=", "psionics_kcal_cost(7)" ] }, + { "math": [ "u_spell_exp('photokinetic_blinding_glare')", "+=", "(maintenance_exp_factor(u_val('focus')))" ] }, + { "run_eocs": "EOC_POWER_MAINTENANCE_CONCENTRATION_CHECK" }, + { + "queue_eocs": "EOC_PHOTOKIN_BLINDING_GLARE_DRAIN", + "time_in_future": [ + { + "math": [ + "( (u_spell_level('photokinetic_blinding_glare') * 11) + 59) * (scaling_factor(u_val('intelligence') ) ) * u_nether_attunement_power_scaling" + ] + }, + { + "math": [ + "( (u_spell_level('photokinetic_blinding_glare') * 47) + 178) * (scaling_factor(u_val('intelligence') ) ) * u_nether_attunement_power_scaling" + ] + } + ] + } + ], + "false_effect": [ ] } ] diff --git a/data/mods/MindOverMatter/powers/pyrokinesis.json b/data/mods/MindOverMatter/powers/pyrokinesis.json index 790c24ec7d139..b71e670e8d0ff 100644 --- a/data/mods/MindOverMatter/powers/pyrokinesis.json +++ b/data/mods/MindOverMatter/powers/pyrokinesis.json @@ -390,6 +390,7 @@ "name": "[Ψ]Thermogenesis #1", "description": "The spell to summon a thermogenesis node. It's a bug if you have it directly.", "valid_targets": [ "ground" ], + "teachable": false, "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], "effect": "summon", "effect_str": "mon_pyrokin_hotair_1", @@ -414,6 +415,7 @@ "name": "[Ψ]Thermogenesis #2", "description": "The spell to summon a thermogenesis node. It's a bug if you have it directly.", "valid_targets": [ "ground" ], + "teachable": false, "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], "effect": "summon", "effect_str": "mon_pyrokin_hotair_2", @@ -438,6 +440,7 @@ "name": "[Ψ]Thermogenesis #1", "description": "The spell to summon a thermogenesis node. It's a bug if you have it directly.", "valid_targets": [ "ground" ], + "teachable": false, "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], "effect": "summon", "effect_str": "mon_pyrokin_hotair_3", @@ -462,6 +465,7 @@ "name": "[Ψ]Thermogenesis #1", "description": "The spell to summon a thermogenesis node. It's a bug if you have it directly.", "valid_targets": [ "ground" ], + "teachable": false, "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], "effect": "summon", "effect_str": "mon_pyrokin_hotair_4", @@ -485,6 +489,7 @@ "type": "SPELL", "name": "[Ψ]Banish Thermogenesis", "description": "The spell to banish existing thermogenesis nodes. It's a bug if you have it directly.", + "teachable": false, "valid_targets": [ "ally" ], "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "NO_PROJECTILE", "IGNORE_WALLS" ], "effect": "attack", diff --git a/data/mods/MindOverMatter/powers/telekinesis.json b/data/mods/MindOverMatter/powers/telekinesis.json index 3cecf354d0796..a8ad7797b0433 100644 --- a/data/mods/MindOverMatter/powers/telekinesis.json +++ b/data/mods/MindOverMatter/powers/telekinesis.json @@ -530,6 +530,7 @@ "type": "SPELL", "name": "Mindhammer Ground damage", "description": "Damages ground when you use Mindhammer. If you have this you debugged it in.", + "teachable": false, "valid_targets": [ "ground" ], "spell_class": "TELEKINETIC", "flags": [ "PSIONIC", "RANDOM_DAMAGE", "IGNORE_WALLS", "NO_PROJECTILE" ], @@ -696,6 +697,7 @@ "name": "Wrecking Ball Enemy damage", "description": "Damages enemies when you use Wrecking Ball on the ground. If you have this you debugged it in.", "valid_targets": [ "ally", "hostile", "item", "ground" ], + "teachable": false, "spell_class": "TELEKINETIC", "flags": [ "PSIONIC", "LOUD", "RANDOM_DAMAGE", "IGNORE_WALLS" ], "effect": "attack", @@ -909,6 +911,7 @@ "name": "[Ψ]Earthshaker Bash Terrain", "description": "Destroy furniture and terrain nearby.", "valid_targets": [ "hostile", "ground" ], + "teachable": false, "flags": [ "SILENT", "NO_EXPLOSION_SFX", "IGNORE_WALLS", "RANDOM_DAMAGE" ], "effect": "bash", "shape": "blast", diff --git a/data/mods/MindOverMatter/powers/telepathy.json b/data/mods/MindOverMatter/powers/telepathy.json index 0f7885b28f76f..1b13895330c80 100644 --- a/data/mods/MindOverMatter/powers/telepathy.json +++ b/data/mods/MindOverMatter/powers/telepathy.json @@ -327,6 +327,7 @@ "name": "[Ψ]Sensory Deprivation blind Effect", "description": "The is the part of the Sensory Deprivation that blinds the target. It's a bug if you have it.", "valid_targets": [ "hostile" ], + "teachable": false, "skill": "metaphysics", "flags": [ "PSIONIC", "NO_PROJECTILE", "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION" ], "max_level": { "math": [ "int_to_level(1)" ] }, @@ -524,6 +525,7 @@ "name": "[Ψ]Psychic Scream Additional Damage", "description": "This exists to allow Psychic Scream to do minimal damage and kill small animals whose extremely low HP would otherwise be below the percentage threshold, as well as making it more likely to stun or daze. It's a bug if you have it directly.", "message": "", + "teachable": false, "valid_targets": [ "hostile", "ally" ], "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_EXPLOSION_SFX", "IGNORE_WALLS" ], "max_level": { "math": [ "int_to_level(1)" ] }, diff --git a/data/mods/MindOverMatter/powers/vitakinesis.json b/data/mods/MindOverMatter/powers/vitakinesis.json index 14e82c309ef5f..34a923d06c542 100644 --- a/data/mods/MindOverMatter/powers/vitakinesis.json +++ b/data/mods/MindOverMatter/powers/vitakinesis.json @@ -107,6 +107,7 @@ "valid_targets": [ "self" ], "spell_class": "VITAKINETIC", "skill": "metaphysics", + "teachable": false, "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX" ], "effect": "spawn_item", "effect_str": "vita_bandage_01", @@ -124,6 +125,7 @@ "valid_targets": [ "self" ], "spell_class": "VITAKINETIC", "skill": "metaphysics", + "teachable": false, "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX" ], "effect": "spawn_item", "effect_str": "vita_bandages_02", @@ -141,6 +143,7 @@ "valid_targets": [ "self" ], "spell_class": "VITAKINETIC", "skill": "metaphysics", + "teachable": false, "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX" ], "effect": "spawn_item", "effect_str": "vita_bandages_03", @@ -370,6 +373,7 @@ "name": "[Ψ]SAllay Infection #1", "description": "The first of the Allay Infection spells. This summons a low-power disinfectant/antibiotic--it's a bug if you have it.", "valid_targets": [ "self" ], + "teachable": false, "spell_class": "VITAKINETIC", "skill": "metaphysics", "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX" ], @@ -387,6 +391,7 @@ "name": "[Ψ]SAllay Infection #2", "description": "The second of the Allay Infection spells. This summons a medium-power disinfectant/antibiotic--it's a bug if you have it.", "valid_targets": [ "self" ], + "teachable": false, "spell_class": "VITAKINETIC", "skill": "metaphysics", "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX" ], @@ -404,6 +409,7 @@ "name": "[Ψ]SAllay Infection #3", "description": "The third of the Allay Infection spells. This summons a high-power disinfectant/antibiotic--it's a bug if you have it.", "valid_targets": [ "self" ], + "teachable": false, "spell_class": "VITAKINETIC", "skill": "metaphysics", "flags": [ "PSIONIC", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX" ], @@ -601,6 +607,7 @@ "name": "Anabolic Rejuvenation Heal", "description": "The healing part of Anabolic Rejuvenation.", "valid_targets": [ "self" ], + "teachable": false, "min_damage": { "math": [ "min((-1 * u_nether_attunement_power_scaling), -1)" ] }, "max_damage": { "math": [ "min((-1 * u_nether_attunement_power_scaling), -1)" ] }, "effect": "attack", @@ -613,6 +620,7 @@ "name": "Anabolic Rejuvenation draining", "description": "The draining part of Anabolic Rejuvenation.", "valid_targets": [ "self" ], + "teachable": false, "effect": "effect_on_condition", "effect_str": "EOC_VITA_SUPER_HEAL_DRAIN", "shape": "blast", diff --git a/data/mods/MindOverMatter/recipes/tools.json b/data/mods/MindOverMatter/recipes/tools.json index 0ba3a82416dbc..e4fda7fd32d43 100644 --- a/data/mods/MindOverMatter/recipes/tools.json +++ b/data/mods/MindOverMatter/recipes/tools.json @@ -94,7 +94,7 @@ "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "MATRIX_CHANNEL", "level": 1 } ], "components": [ [ [ "plastic_chunk", 2 ] ], - [ [ "superglue", 1 ] ], + [ [ "super_glue", 1 ] ], [ [ "lightstrip_inactive", 1 ], [ "light_bulb", 1 ] ], [ [ "matrix_crystal_pyrokin_dust_refined", 2 ] ], [ [ "psionic_serum_base", 2 ] ], diff --git a/data/mods/MindOverMatter/recipes/travel.json b/data/mods/MindOverMatter/recipes/travel.json index 08af9458e0fea..4abe434bb1ca9 100644 --- a/data/mods/MindOverMatter/recipes/travel.json +++ b/data/mods/MindOverMatter/recipes/travel.json @@ -31,7 +31,7 @@ [ [ "matrix_crystal_clair_dust_refined", 8 ] ], [ [ "memory_card", 2 ] ], [ [ "plastic_chunk", 4 ] ], - [ [ "superglue", 1 ] ], + [ [ "super_glue", 1 ] ], [ [ "RAM", 4 ] ], [ [ "amplifier", 2 ] ], [ [ "power_supply", 1 ] ], diff --git a/data/mods/MindOverMatter/recipes/weapons.json b/data/mods/MindOverMatter/recipes/weapons.json index a5c5d4c069d6b..e0f5232a0ed7b 100644 --- a/data/mods/MindOverMatter/recipes/weapons.json +++ b/data/mods/MindOverMatter/recipes/weapons.json @@ -20,7 +20,7 @@ "using": [ [ "volatile_explosive", 20, "LIST" ], [ "explosives_casting_standard", 1 ] ], "components": [ [ [ "fuse", 1 ] ], - [ [ "superglue", 1 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], + [ [ "super_glue", 4 ], [ "duct_tape", 75 ], [ "cordage", 1, "LIST" ] ], [ [ "small_grenade_case", 1, "LIST" ] ], [ [ "matrix_crystal_pyrokin_dust", 5 ], [ "matrix_crystal_pyrokin_dust_refined", 1 ] ] ] diff --git a/data/mods/MindOverMatter/ter_transform/ter_transform.json b/data/mods/MindOverMatter/ter_transform/ter_transform.json index f27c2db15979b..b8a40abf95dd6 100644 --- a/data/mods/MindOverMatter/ter_transform/ter_transform.json +++ b/data/mods/MindOverMatter/ter_transform/ter_transform.json @@ -7,7 +7,7 @@ { "type": "ter_furn_transform", "id": "ter_null_zombie_delete_fields", - "field": [ { "result": "fd_null", "valid_field": [ "fd_nullifying_field" ] } ] + "field": [ { "result": "fd_null", "valid_field": [ "fd_nullifying_field", "fd_neutralizing_field" ] } ] }, { "type": "ter_furn_transform", diff --git a/data/mods/Sky_Island/EOCs.json b/data/mods/Sky_Island/EOCs.json index 071988661aeb5..006c809a68180 100644 --- a/data/mods/Sky_Island/EOCs.json +++ b/data/mods/Sky_Island/EOCs.json @@ -806,6 +806,15 @@ { "u_message": "Your save should be up to date now.", "popup": true } ] }, + { + "type": "effect_on_condition", + "id": "EOC_SKY_ISLAND_GAME_LOAD_WARPED_POND_GRANTER", + "eoc_type": "EVENT", + "//": "Delete after 0.I", + "required_event": "game_load", + "condition": { "math": [ "islandrank", ">=", "2" ] }, + "effect": [ { "u_learn_recipe": "sky_island_warped_pond" } ] + }, { "id": "warp_home", "type": "SPELL", @@ -915,5 +924,94 @@ { "u_message": "You feel somehow lighter.", "type": "good" }, { "u_add_effect": "effect_warped_waterwalking", "duration": 180 } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_WARPED_POND_CREATION", + "effect": [ + { + "if": { + "u_query_tile": "around", + "target_var": { "context_val": "warped_pond_location" }, + "message": "Select nearby water source" + }, + "then": { + "if": { "map_terrain_with_flag": "LIQUID", "loc": { "context_val": "warped_pond_location" } }, + "then": { + "run_eoc_selector": [ + "EOC_WARPED_POND_CREATION_NW", + "EOC_WARPED_POND_CREATION_NE", + "EOC_WARPED_POND_CREATION_SW", + "EOC_WARPED_POND_CREATION_SE" + ], + "names": [ "Northwest", "Northeast", "Southwest", "Southeast" ], + "title": "Choose the location for a pond", + "descriptions": [ + "Place a pond in the northwest.", + "Place a pond in the northeast.", + "Place a pond in the southwest.", + "Place a pond in the southeast." + ] + }, + "else": [ + { "u_spawn_item": "warptoken", "count": 30, "suppress_message": true }, + { "u_message": "You must be near a water source to created a warped pond.", "type": "neutral" } + ] + }, + "else": { "u_message": "Canceled" } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_WARPED_POND_CREATION_NW", + "effect": [ + { + "mapgen_update": "mx_skyisland_pond", + "om_terrain": "sky_island_core", + "search_range": 4, + "offset_x": -1, + "offset_y": -1 + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_WARPED_POND_CREATION_NE", + "effect": [ + { + "mapgen_update": "mx_skyisland_pond", + "om_terrain": "sky_island_core", + "search_range": 4, + "offset_x": 1, + "offset_y": -1 + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_WARPED_POND_CREATION_SW", + "effect": [ + { + "mapgen_update": "mx_skyisland_pond", + "om_terrain": "sky_island_core", + "search_range": 4, + "offset_x": -1, + "offset_y": 1 + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_WARPED_POND_CREATION_SE", + "effect": [ + { + "mapgen_update": "mx_skyisland_pond", + "om_terrain": "sky_island_core", + "search_range": 4, + "offset_x": 1, + "offset_y": 1 + } + ] } ] diff --git a/data/mods/Sky_Island/island_upgrades.json b/data/mods/Sky_Island/island_upgrades.json index 3cae08a4b87aa..96e884f29bf3f 100644 --- a/data/mods/Sky_Island/island_upgrades.json +++ b/data/mods/Sky_Island/island_upgrades.json @@ -1009,5 +1009,53 @@ "flags": [ "NO_UNDERLYING_ROTATE", "ALLOW_TERRAIN_UNDER_OTHER_DATA" ], "palettes": [ "skyisland_bunker" ] } + }, + { + "type": "mapgen", + "method": "json", + "update_mapgen_id": "mx_skyisland_pond", + "object": { + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ]]]**]]]]? ", + " ?]]*****]]]? ", + " ]***[******] ", + " ]]***[[[[****] ", + " ]]***[[[[*****] ", + " ?**[[~~~~[****] ", + " ?]**[[~~~~[****] ", + " ]]***[~~~~[***]] ", + " ]]***[~~~~[[]]] ", + " ]]****[[[[**]??? ", + " ?]]***[[***]]??? ", + " ]]]]*****]]? ? ", + " ??]]****] ", + " ** ", + " ", + " ", + " ", + " ", + " " + ], + "flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN" ], + "nested": { + "*": { "chunks": [ [ "pond_water_furniture", 8 ], [ "null", 92 ] ] }, + "[": { "chunks": [ [ "pond_water_furniture", 8 ], [ "null", 92 ] ] }, + "]": { "chunks": [ [ "pond_water_furniture", 8 ], [ "null", 92 ] ] }, + "~": { "chunks": [ [ "pond_water_furniture", 8 ], [ "null", 92 ] ] } + }, + "furniture": { "~": "f_clear", "*": "f_clear", "[": "f_clear", "]": "f_clear" }, + "terrain": { + "*": "t_water_sh", + "?": [ [ "t_water_sh", 3 ], [ "t_dirt", 5 ], [ "t_grass", 6 ], [ "t_shrub", 2 ], [ "t_tree", 2 ] ], + "[": [ [ "t_water_dp", 2 ], [ "t_water_sh", 3 ] ], + "]": [ [ "t_water_sh", 8 ], "t_dirt", "t_grass" ], + "~": "t_water_dp" + } + } } ] diff --git a/data/mods/Sky_Island/recipes.json b/data/mods/Sky_Island/recipes.json index dc4c343e36d3f..cbef68557116c 100644 --- a/data/mods/Sky_Island/recipes.json +++ b/data/mods/Sky_Island/recipes.json @@ -242,5 +242,22 @@ [ [ "nuts_bolts", 4 ], [ "pipe_fittings", 4 ], [ "sheet_metal_small", 10 ] ], [ [ "nail", 40 ] ] ] + }, + { + "id": "sky_island_warped_pond", + "name": "Warped Pond", + "description": "Create a pond on your island. You must be standing next to a water source to successfully create the pond.", + "type": "recipe", + "activity_level": "NO_EXERCISE", + "category": "CC_WARP", + "subcategory": "CSC_WARP_UPGRADES", + "skill_used": "survival", + "time": "0 m", + "autolearn": false, + "reversible": false, + "tools": [ [ [ "fakeitem_statue", -1 ] ] ], + "components": [ [ [ "warptoken", 30 ] ] ], + "flags": [ "BLIND_EASY" ], + "result_eocs": [ "EOC_WARPED_POND_CREATION" ] } ] diff --git a/data/mods/Sky_Island/upgrade_missions.json b/data/mods/Sky_Island/upgrade_missions.json index 2ad74cf48312f..f3fd30189a28a 100644 --- a/data/mods/Sky_Island/upgrade_missions.json +++ b/data/mods/Sky_Island/upgrade_missions.json @@ -195,7 +195,7 @@ [ [ "camera", 1 ], [ "camera_pro", 1 ], [ "wearable_camera", 1 ], [ "wearable_camera_pro", 1 ], [ "omnicamera", 1 ] ], [ [ "warptoken", 5 ] ], [ [ "scrap_aluminum", 12 ] ], - [ [ "superglue", 1 ], [ "bone_glue", 1 ] ], + [ [ "super_glue", 10 ], [ "bone_glue", 1 ] ], [ [ "medium_battery_cell", 2 ], [ "medium_plus_battery_cell", 4 ], [ "medium_disposable_cell", 6 ] ], [ [ "extension_cable", 1 ], [ "long_extension_cable", 1 ], [ "jumper_cable", 1 ] ] ] @@ -1507,6 +1507,7 @@ { "u_learn_recipe": "recipe_craft_random_artifact" }, { "u_learn_recipe": "warp_vortex_token" }, { "u_learn_recipe": "warphaulbag" }, + { "u_learn_recipe": "sky_island_warped_pond" }, { "u_message": "You have proved your ability to survive to the island, to the warpstream, and to yourself.\nMore unlockable upgrades will be available as you progress, and you may experience exits and targets in new locations.", "type": "mixed" @@ -2354,7 +2355,7 @@ [ [ "2x4", 4 ] ], [ [ "glass_shard", 150 ] ], [ [ "chunk_rubber", 5 ] ], - [ [ "superglue", 2 ] ], + [ [ "super_glue", 20 ] ], [ [ "cordage", 5, "LIST" ] ] ] }, @@ -2417,7 +2418,7 @@ [ [ "aquamarine", 4 ], [ "citrine", 4 ], [ "garnet", 4 ], [ "peridot", 4 ], [ "tourmaline", 4 ], [ "blue_topaz", 4 ] ], [ [ "glass_sheet", 3 ] ], [ [ "mirror", 1 ] ], - [ [ "superglue", 5 ] ], + [ [ "super_glue", 40 ] ], [ [ "frame_wood", 2 ] ], [ [ "cordage", 1, "LIST" ] ] ] diff --git a/data/mods/TEST_DATA/item_demographics.json b/data/mods/TEST_DATA/item_demographics.json index 54abfa513c0fb..5423a89bbaac4 100644 --- a/data/mods/TEST_DATA/item_demographics.json +++ b/data/mods/TEST_DATA/item_demographics.json @@ -655,6 +655,7 @@ "glock_19": 1, "hk_mp5": 1, "p08": 1, + "draco_9mm": 1, "mauser_c96": 1, "mp40": 1, "ksub2000": 1, @@ -782,7 +783,18 @@ { "type": "762", "weight": 34, - "items": { "ak47": 1, "arx160": 1, "sks": 1, "aksemi": 1, "draco": 1, "mk47": 1, "vz58_p": 1, "bren2_762": 1 } + "items": { + "ak47": 1, + "arx160": 1, + "sks": 1, + "aksemi": 1, + "draco": 1, + "draco_mini": 1, + "draco_micro": 1, + "mk47": 1, + "vz58_p": 1, + "bren2_762": 1 + } }, { "type": "357mag", "weight": 34, "items": { "sw_619": 1, "rp63": 1, "chiappa_rhino": 1 } }, { @@ -968,6 +980,9 @@ "cz75": 1, "deagle_44": 1, "draco": 1, + "draco_9mm": 1, + "draco_micro": 1, + "draco_mini": 1, "emp_frond": 1, "feral_m9": 1, "fn1910": 1, diff --git a/data/mods/TEST_DATA/legacy_to_hit.json b/data/mods/TEST_DATA/legacy_to_hit.json index d340e9ba30101..1afc3ca136441 100644 --- a/data/mods/TEST_DATA/legacy_to_hit.json +++ b/data/mods/TEST_DATA/legacy_to_hit.json @@ -389,7 +389,6 @@ "dogfood", "dogfood_dry", "down_blanket", - "draco", "dragonsuit", "draw_plate", "dress", diff --git a/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_mutation_spells.json b/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_mutation_spells.json index 6480488fe55e6..15cb4b2a92ec7 100644 --- a/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_mutation_spells.json +++ b/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_mutation_spells.json @@ -481,6 +481,32 @@ "final_casting_time": 10, "casting_time_increment": -4 }, + { + "id": "sylph_clear_the_air", + "type": "SPELL", + "name": "Purifying the Air", + "description": "Reassert the purity of the air around yourself, removing contaminants such as smoke or pollen.", + "message": "The air begins to smell sweet.", + "valid_targets": [ "ground", "self", "ally", "hostile" ], + "skill": "deduction", + "teachable": false, + "spell_class": "SYLPH", + "difficulty": 5, + "max_level": { "math": [ "per_to_level(1)" ] }, + "flags": [ "VERBAL", "SOMATIC", "NO_EXPLOSION_SFX" ], + "effect": "ter_transform", + "effect_str": "ter_sylph_clear_the_air", + "shape": "blast", + "min_aoe": { "math": [ "( (u_spell_level('sylph_clear_the_air') * 0.9) + 3) * (scaling_factor(u_val('perception') ) )" ] }, + "max_aoe": { "math": [ "( (u_spell_level('sylph_clear_the_air') * 0.9) + 3) * (scaling_factor(u_val('perception') ) )" ] }, + "energy_source": "MANA", + "base_energy_cost": 250, + "final_energy_cost": 125, + "energy_increment": -5, + "base_casting_time": 75, + "final_casting_time": 35, + "casting_time_increment": -4 + }, { "id": "sylph_hindering_wind_spell", "type": "SPELL", diff --git a/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_mutations.json b/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_mutations.json index 576ed78ceae16..c8cab89e2ea97 100644 --- a/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_mutations.json +++ b/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_mutations.json @@ -347,11 +347,24 @@ "points": 3, "visibility": 0, "ugliness": 0, - "description": "The Sylph learns how to use surround a single target with buffeting winds, slowing their movements and knocking them off-balance.", + "description": "The Sylph learns how to surround a single target with buffeting winds, slowing their movements and knocking them off-balance.", "prereqs": [ "PUSHING_WIND" ], "category": [ "SYLPH" ], "spells_learned": [ [ "sylph_hindering_wind_spell", 1 ] ] }, + { + "type": "mutation", + "id": "SYLPH_CLEAR_THE_AIR", + "name": { "str": "Purifying the Air" }, + "points": 3, + "visibility": 0, + "ugliness": 0, + "description": "The Sylph can remove contaminants from the air such as smoke or pollen and leave only pure air behind.", + "prereqs": [ "SYLPH_PER_BONUS_1" ], + "prereqs2": [ "PUSHING_WIND" ], + "category": [ "SYLPH" ], + "spells_learned": [ [ "sylph_clear_the_air", 1 ] ] + }, { "type": "mutation", "id": "ELECTRICAL_EMISSIONS", diff --git a/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_spell_learning_eocs.json b/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_spell_learning_eocs.json index 079f68dd656ce..8e6eee6d7c77e 100644 --- a/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_spell_learning_eocs.json +++ b/data/mods/Xedra_Evolved/mutations/paraclesians/sylph_spell_learning_eocs.json @@ -12,6 +12,7 @@ "CLAP_OF_THUNDER", "OMINOUS_WIND", "PUSHING_WIND", + "SYLPH_CLEAR_THE_AIR", "ELECTRICAL_EMISSIONS", "ELECTRICAL_FIELD", "air_sprite", @@ -65,6 +66,7 @@ { "math": [ "u_spell_level('clap_of_thunder')", "<", "dex_to_level(1)" ] }, { "math": [ "u_spell_level('ominous_wind')", "<", "20" ] }, { "math": [ "u_spell_level('pushing_wind')", "<", "int_to_level(1)" ] }, + { "math": [ "u_spell_level('sylph_clear_the_air')", "<", "per_to_level(1)" ] }, { "math": [ "u_spell_level('zap_electrical_emission')", "<", "dex_to_level(1)" ] }, { "math": [ "u_spell_level('summon_air_sprite')", "<", "35" ] }, { "math": [ "u_spell_level('sylph_charge_dash_spell')", "<", "dex_to_level(1)" ] }, @@ -86,6 +88,7 @@ [ "EOC_LEVELER_SYLPH_CLAP_OF_THUNDER", 8 ], [ "EOC_LEVELER_SYLPH_OMINOUS_WIND", 11 ], [ "EOC_LEVELER_SYLPH_PUSHING_WIND", 9 ], + [ "EOC_LEVELER_SYLPH_CLEAR_THE_AIR", 6 ], [ "EOC_LEVELER_SYLPH_ELECTRICAL_EMISSIONS", 10 ], [ "EOC_LEVELER_SYLPH_SUMMON_AIR_SPRITE", 8 ], [ "EOC_LEVELER_SYLPH_CHARGE_DASH", 9 ], @@ -157,6 +160,24 @@ ], "false_effect": [ { "run_eocs": "EOC_SYLPH_SPELL_EXPERIENCE_INCREASER_SELECTOR" } ] }, + { + "type": "effect_on_condition", + "id": "EOC_LEVELER_SYLPH_CLEAR_THE_AIR", + "condition": { + "and": [ + { "math": [ "u_spell_level('sylph_clear_the_air')", ">=", "0" ] }, + { "math": [ "u_spell_level('sylph_clear_the_air')", "<", "per_to_level(1)" ] } + ] + }, + "effect": [ + { + "u_message": "Your time spent among the blowing winds has increased your facility with your fae magicks.", + "type": "good" + }, + { "math": [ "u_spell_exp('sylph_clear_the_air')", "+=", "paraclesian_passive_spell_exp(1)" ] } + ], + "false_effect": [ { "run_eocs": "EOC_SYLPH_SPELL_EXPERIENCE_INCREASER_SELECTOR" } ] + }, { "type": "effect_on_condition", "id": "EOC_LEVELER_SYLPH_ELECTRICAL_EMISSIONS", diff --git a/data/mods/Xedra_Evolved/recipes/meds.json b/data/mods/Xedra_Evolved/recipes/meds.json index 4c9570ea84847..be8ff46a40a7f 100644 --- a/data/mods/Xedra_Evolved/recipes/meds.json +++ b/data/mods/Xedra_Evolved/recipes/meds.json @@ -73,7 +73,7 @@ "qualities": [ { "id": "COOK", "level": 2 } ], "tools": [ [ [ "paint_brush", -1 ] ], [ [ "surface_heat", 10, "LIST" ] ] ], "using": [ [ "paint", 2 ] ], - "components": [ [ [ "superglue", 1 ] ], [ [ "scrap_dreamdross", 1 ] ] ] + "components": [ [ [ "super_glue", 5 ] ], [ [ "scrap_dreamdross", 1 ] ] ] }, { "type": "recipe", diff --git a/data/mods/Xedra_Evolved/ter_transforms/sylph_ter_transforms.json b/data/mods/Xedra_Evolved/ter_transforms/sylph_ter_transforms.json index 4a800f074a284..e667c63225218 100644 --- a/data/mods/Xedra_Evolved/ter_transforms/sylph_ter_transforms.json +++ b/data/mods/Xedra_Evolved/ter_transforms/sylph_ter_transforms.json @@ -26,5 +26,36 @@ "message_good": true } ] + }, + { + "type": "ter_furn_transform", + "id": "ter_sylph_clear_the_air", + "field": [ + { + "result": "fd_null", + "valid_field": [ + "fd_extinguisher", + "fd_smoke", + "fd_toxic_gas", + "fd_pollen_triffid", + "fd_tear_gas", + "fd_nuke_gas", + "fd_gas_vent", + "fd_weedsmoke", + "fd_cracksmoke", + "fd_methsmoke", + "fd_relax_gas", + "fd_swamp_gas", + "fd_fungal_haze", + "fd_hallucinogenic_spores", + "fd_fungicidal_gas", + "fd_migo_atmosphere", + "fd_smoke_vent", + "fd_nm_monster_gas_2" + ], + "message": "The air clears.", + "message_good": true + } + ] } ] diff --git a/data/mods/innawood/items/misc.json b/data/mods/innawood/items/misc.json index f68c031b2645d..6262179a50bbf 100644 --- a/data/mods/innawood/items/misc.json +++ b/data/mods/innawood/items/misc.json @@ -51,5 +51,12 @@ "symbol": "=", "color": "light_gray", "looks_like": "battery" + }, + { + "id": "super_glue", + "type": "AMMO", + "copy-from": "super_glue", + "name": { "str": "glue" }, + "description": "A thick, goopy glue that cures fast." } ] diff --git a/data/mods/innawood/migration_items.json b/data/mods/innawood/migration_items.json index 98dbc2a0a6fc2..d4eda38aa9a76 100644 --- a/data/mods/innawood/migration_items.json +++ b/data/mods/innawood/migration_items.json @@ -1,7 +1,7 @@ [ { - "id": "superglue", + "id": "small_squeeze_tube", "type": "MIGRATION", - "replace": "bone_glue" + "replace": "clay_canister" } ] diff --git a/data/mods/innawood/recipes/armor/head.json b/data/mods/innawood/recipes/armor/head.json index 050929eb1c62a..f1cf7fd2c61ce 100644 --- a/data/mods/innawood/recipes/armor/head.json +++ b/data/mods/innawood/recipes/armor/head.json @@ -14,7 +14,7 @@ "components": [ [ [ "goggles_ski", 1 ], [ "goggles_swim", 1 ], [ "glasses_safety", 1 ], [ "glass_goggles", 1 ] ], [ [ "eclipse_glasses", 1 ], [ "glass_tinted", 3 ] ], - [ [ "duct_tape", 40 ], [ "medical_tape", 40 ], [ "superglue", 2 ] ] + [ [ "duct_tape", 40 ], [ "medical_tape", 40 ], [ "super_glue", 2 ] ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ] } diff --git a/data/mods/innawood/recipes/chem_other.json b/data/mods/innawood/recipes/chem_other.json index 17ddb20412916..14f32d6d2bf8d 100644 --- a/data/mods/innawood/recipes/chem_other.json +++ b/data/mods/innawood/recipes/chem_other.json @@ -54,5 +54,31 @@ [ "neoprene", 1 ] ] ] + }, + { + "result": "super_glue", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_CHEM", + "subcategory": "CSC_CHEM_OTHER", + "skill_used": "chemistry", + "difficulty": 3, + "time": "12 m", + "autolearn": true, + "qualities": [ { "id": "CHEM", "level": 1 } ], + "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], + "components": [ + [ [ "water", 1 ], [ "water_clean", 1 ] ], + [ + [ "bone_any", 20, "LIST" ], + [ "skewer_bone", 1000 ], + [ "cured_hide", 2 ], + [ "pine_bough", 10 ], + [ "raw_dandelion", 20 ], + [ "biollante_bud", 1 ], + [ "ant_egg", 1 ], + [ "slime_scrap", 1 ] + ] + ] } ] diff --git a/data/mods/innawood/recipes/recipe_others.json b/data/mods/innawood/recipes/recipe_others.json index c170be294e9bb..b0e2dff61658f 100644 --- a/data/mods/innawood/recipes/recipe_others.json +++ b/data/mods/innawood/recipes/recipe_others.json @@ -48,7 +48,7 @@ "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ - [ [ "superglue", 1 ] ], + [ [ "super_glue", 1 ] ], [ [ "cotton_patchwork", 8 ], [ "fibercloth_patchwork", 8 ], [ "sheet_cotton", 1 ], [ "sheet_fibercloth", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] diff --git a/data/mods/innawood/recipes/tool.json b/data/mods/innawood/recipes/tool.json index aa454579a2f26..3cb36f5b9771a 100644 --- a/data/mods/innawood/recipes/tool.json +++ b/data/mods/innawood/recipes/tool.json @@ -17,7 +17,7 @@ "components": [ [ [ "pot", 1 ], [ "pot_copper", 1 ], [ "pot_makeshift_copper", 1 ] ], [ [ "cu_pipe", 1 ] ], - [ [ "bone_glue", 1 ], [ "superglue", 1 ] ], + [ [ "bone_glue", 1 ], [ "super_glue", 1 ] ], [ [ "duct_tape", 10 ] ] ] }, diff --git a/data/mods/innawood/recipes/tools_electronic.json b/data/mods/innawood/recipes/tools_electronic.json index 42ef12b49f1a1..a934bbd3b5703 100644 --- a/data/mods/innawood/recipes/tools_electronic.json +++ b/data/mods/innawood/recipes/tools_electronic.json @@ -185,7 +185,7 @@ [ [ "scrap", 4 ] ], [ [ "plastic_chunk", 2 ] ], [ [ "motor_micro", 1 ] ], - [ [ "superglue", 2 ] ], + [ [ "super_glue", 2 ] ], [ [ "element", 2 ], [ "crude_heating_element", 2 ] ], [ [ "hose", 1 ], [ "makeshift_hose", 1 ] ], [ [ "power_supply", 1 ] ] diff --git a/data/mods/innawood/recipes/tools_lights.json b/data/mods/innawood/recipes/tools_lights.json index 959c19b6a9be7..71e522be07da6 100644 --- a/data/mods/innawood/recipes/tools_lights.json +++ b/data/mods/innawood/recipes/tools_lights.json @@ -14,7 +14,7 @@ "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ [ [ "plastic_chunk", 1 ] ], - [ [ "superglue", 1 ] ], + [ [ "super_glue", 1 ] ], [ [ "power_supply", 1 ] ], [ [ "cable", 1 ] ], [ [ "light_bulb", 1 ], [ "e_scrap", 1 ] ] diff --git a/doc/MARTIALART_JSON.md b/doc/MARTIALART_JSON.md index 5fede45d49bde..d5416564212be 100644 --- a/doc/MARTIALART_JSON.md +++ b/doc/MARTIALART_JSON.md @@ -121,7 +121,7 @@ ### Attack vectors -Attack vectors define which (sub)bodypart is used for the attack in question, allow filtering of eligable bodyparts and apply the relevant worn armor's unarmed damage to the attack. Note for the (sub)part to apply its unarmed damage it needs unrestricted natural attacks. +Attack vectors define which (sub)bodypart is used for the attack in question, allow filtering of eligible bodyparts and apply the relevant worn armor's unarmed damage to the attack. Note for the (sub)part to apply its unarmed damage it needs unrestricted natural attacks. ```JSON [ @@ -132,7 +132,7 @@ Attack vectors define which (sub)bodypart is used for the attack in question, al "contact_area": [ "hand_fingers_l", "hand_fingers_r" ], // List of subbodyparts that can be used as a strike surface in the attack using the sbp's armor or intrinsic unarmed damage "strict_limb_definition": false, // Bool, default false. When true *only* the bodyparts defined above are used for the vector, otherwise similar bodyparts can be used as long as both the contact area and the defined limb are similar, see JSON_INFO.md/Bodyparts for bodypart similarity "armor_bonus": true, // Bool, default true, defines if the vector takes the unarmed damage bonus of the armor worn on the contact area into account - "required_limb_flags": [ "foo", "bar" ], // List of character flags required for the bodypart to be eligable for this vector + "required_limb_flags": [ "foo", "bar" ], // List of character flags required for the bodypart to be eligible for this vector "forbidden_limb_flags": [ "foo", "bar" ], // List of character flags that disqualify a limb from being usable by this vector "encumbrance_limit": 15, // Int, default 100, encumbrance of the limb above this will disqualify it from this vector "bp_hp_limit": 75 , // Int, default 10, percent of bodypart limb HP necessary for the limbs to qualify for this vector. For minor (non-main) bodyparts the corresponding main part HP is taken into account. diff --git a/doc/MUTATIONS.md b/doc/MUTATIONS.md index 47ba81a088e0d..22fc7a1754a02 100644 --- a/doc/MUTATIONS.md +++ b/doc/MUTATIONS.md @@ -10,7 +10,7 @@ Traits and mutations are the same thing in DDA's code. The terms are used interc There are two substances required to mutate: mutagen and primer. All mutagen and primers are handled as vitamins in the code. -Mutagen is the core nutrient, and it's what is required to initate and maintain mutation. Thematically, this is the stuff that stimulates the character's infection and gets them mutating. It comes in a ingestable liquid form (which is toxic and generally a bad idea to drink without further refinement) and an injectable catalyst form (which is much safer and much more powerful). +Mutagen is the core nutrient, and it's what is required to initiate and maintain mutation. Thematically, this is the stuff that stimulates the character's infection and gets them mutating. It comes in a ingestable liquid form (which is toxic and generally a bad idea to drink without further refinement) and an injectable catalyst form (which is much safer and much more powerful). Primers do not cause mutations to happen on their own, but instead influence what mutations the player gains. Think of mutagen as a car that can only drive on roads, and each type of primer as a possible road for the car to drive on. Every type of mutation category has an associated primer vitamin, and when mutating, the game will mutate down the category that has the most respective primer present. The car can't drive without any roads, but at the same time, the roads will do nothing without the car. Both nutrients are needed to cause mutation. @@ -44,7 +44,7 @@ The mutation system works in several steps. All time references are in game time * Otherwise, the game chooses a random mutation in that category. This is the target mutation. * If the character has an existing trait that conflicts with the target mutation, the conflicting trait will be removed or downgraded, and nothing else will happen. Otherwise, the player will gain that mutation. * Each mutation attempt can take only one "step". For instance, if the game attempts to mutate towards the Beautiful trait while the character has no beauty-related traits, it would simply give them the Pretty trait, because Pretty is a prerequisite of Beautiful. However, if the character had the Ugly trait, then that trait would be removed and nothing else would happen. - * On a successful mutation, primer of that mutation's category is removed from the character's body. This defaults to 100, but can be overriden on a by-trait basis. + * On a successful mutation, primer of that mutation's category is removed from the character's body. This defaults to 100, but can be overridden on a by-trait basis. * Finally, Instability equal to the primer cost is added to the player. Instability is explained in the next section. 5. When the player mutates towards a trait, if they have at least 2200 of the primer tied to that trait's category, attempt to cross the threshold. The game rolls a chance to pass the threshold, which is heavily influenced by how mutated into that category the player is. If the check succeeds, the player gains the threshold mutation and receives a unique message - they have "crossed the threshold". 6. Repeat from step 3 until the character no longer has enough mutagen in their body to continue mutating. The `Changing` trait will be then removed, and the game will begin repeating step 1 once more until the character takes enough mutagen to begin mutating again. diff --git a/doc/NPCs.md b/doc/NPCs.md index 5ffdf4fc63d96..5300a3454f3e7 100644 --- a/doc/NPCs.md +++ b/doc/NPCs.md @@ -73,7 +73,7 @@ Format: ], "shopkeeper_blacklist": "test_blacklist", "restock_interval": "6 days", - "proficiencies": [ "prof_gunsmithing_basic", "prof_spotting" ], // Optional. Note that prereqs do not need to be defined. NPCs of this class will learn this proficiency *and all pre-requesite proficiencies*. + "proficiencies": [ "prof_gunsmithing_basic", "prof_spotting" ], // Optional. Note that prereqs do not need to be defined. NPCs of this class will learn this proficiency *and all pre-requisite proficiencies*. "traits": [ { "group": "BG_survival_story_EVACUEE" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ] // Optional } ``` @@ -1276,7 +1276,7 @@ Examples: { "math": [ "result", "=", "x + y" ] }, "//2": "u_z is the variable z on the alpha talker (avatar)", { "math": [ "result", "=", "( x + y ) * u_z" ] }, - "//3": "n_crazyness is the variable crazyness on the beta talker (npc)", + "//3": "n_crazyness is the variable craziness on the beta talker (npc)", { "math": [ "n_crazyness * 2", ">=", "( x + y ) * u_z" ] }, ``` @@ -1339,11 +1339,11 @@ _some functions support array arguments or kwargs, denoted with square brackets | effect_duration(`s`/`v`) | ✅ | ✅ | u, n | Return the characters duration of effect.
Argument is effect ID.

Optional kwargs:
`bodypart`: `s`/`v` - Specify the bodypart to get/set duration of effect.
`unit`: `s`/`v` - Specify the unit of the duration. Omitting will use seconds.

Example:
`"condition": { "math": [ "u_effect_duration('bite', 'bodypart': 'torso')", ">", "1"] }`
`{ "math": [ "_thing", "=", "u_effect_duration('yrax_overcharged', 'bodypart': 'torso', 'unit': 'hours')" ] }`| | encumbrance(`s`/`v`) | ✅ | ❌ | u, n | Return the characters total encumbrance of a body part.
Argument is bodypart ID.
For items, returns typical encumbrance of the item.

Example:
`"condition": { "math": [ "u_encumbrance('torso')", ">", "0"] }`| | energy(`s`/`v`) | ✅ | ❌ | u, n | Return a numeric value (in millijoules) for an energy string (see [Units](JSON_INFO.md#units)).

Example:
`{ "math": [ "u_val('power')", "-=", "energy('25 kJ')" ] }`| -| faction_like(`s`/`v`)
faction_respect(`s`/`v`)
faction_trust(`s`/`v`) | ✅ | ❌ | N/A
(global) | Return the like/respect/trust value a faction has for the avatar.
Argument is faction ID.

Example:
`"condition": { "math": [ "faction_like('hells_raiders') < -60" ] }`| +| faction_like(`s`/`v`)
faction_respect(`s`/`v`)
faction_trust(`s`/`v`)
faction_food_supply(`s`/`v`)
faction_wealth(`s`/`v`)
faction_power(`s`/`v`)
faction_size(`s`/`v`) | ✅ | ✅ | N/A
(global) | Return the like/respect/trust/fac_food_supply/wealth/power/size value a faction has for the avatar.
Argument is faction ID.

Example:
`"condition": { "math": [ "faction_like('hells_raiders') < -60" ] }`| | field_strength(`s`/`v`) | ✅ | ❌ | u, n, global | Return the strength of a field on the tile.
Argument is field ID.

Optional kwargs:
`location`: `v` - center search on this location

The `location` kwarg is mandatory in the global scope.

Examples:
`"condition": { "math": [ "u_field_strength('fd_blood')", ">", "5" ] }`

`"condition": { "math": [ "field_strength('fd_blood_insect', 'location': u_search_loc)", ">", "5" ] }`| -| has_flag(`s`/`v`) | ✅ | ❌ | u, n | Check whether the actor has a flag. Meant to be used as condition for ternaries. Arguemnt is trait ID.

Example:
`"condition": { "math": [ "u_blorg", "=", "u_has_flag('MUTATION_TRESHOLD') ? 100 : 15" ] }`| -| has_trait(`s`/`v`) | ✅ | ❌ | u, n | Check whether the actor has a trait. Meant to be used as condition for ternaries. Arguemnt is trait ID.

Example:
`"condition": { "math": [ "u_blorg", "=", "u_has_trait('FEEBLE') ? 100 : 15" ] }`| -| has_proficiency(`s`/`v`) | ✅ | ❌ | u, n | Check whether the actor has a proficiency. Meant to be used as condition for ternaries. Arguemnt is proficiency ID.

Example:
`"condition": { "math": [ "u_blorg", "=", "u_has_proficiency('prof_intro_biology') ? 100 : 15" ] }`| +| has_flag(`s`/`v`) | ✅ | ❌ | u, n | Check whether the actor has a flag. Meant to be used as condition for ternaries. Argument is trait ID.

Example:
`"condition": { "math": [ "u_blorg", "=", "u_has_flag('MUTATION_TRESHOLD') ? 100 : 15" ] }`| +| has_trait(`s`/`v`) | ✅ | ❌ | u, n | Check whether the actor has a trait. Meant to be used as condition for ternaries. Argument is trait ID.

Example:
`"condition": { "math": [ "u_blorg", "=", "u_has_trait('FEEBLE') ? 100 : 15" ] }`| +| has_proficiency(`s`/`v`) | ✅ | ❌ | u, n | Check whether the actor has a proficiency. Meant to be used as condition for ternaries. Argument is proficiency ID.

Example:
`"condition": { "math": [ "u_blorg", "=", "u_has_proficiency('prof_intro_biology') ? 100 : 15" ] }`| | has_var(`v`) | ✅ | ❌ | g | Check whether the variable is defined. Meant to be used as condition for ternaries.

Example:
`"condition": { "math": [ "u_blorg", "=", "has_var(fancy_var) ? fancy_var : 15" ] }`| | hp(`s`/`v`) | ✅ | ✅ | u, n | Return or set the characters hp. Argument is bodypart ID. For special values `ALL`, `ALL_MAJOR`, `ALL_MINOR`, get hp sum of all/major/minor bodyparts or set hp of all/major/minor bodyparts.

For items, returns current amount of damage required to destroy item.

Example:
`"condition": { "math": [ "hp('torso')", ">", "100"] }`| | hp_max(`s`/`v`) | ✅ | ❌ | u, n | Return the characters max amount of hp on a body part.
Argument is bodypart ID.
For items, returns max amount of damage required to destroy item.

Example:
`"condition": { "math": [ "u_hp_max('torso')", ">=", "100"] }`| @@ -1431,7 +1431,7 @@ These can be read or written to with `val()`. | `sold` | ✅ | Amount of money the avatar has sold the Character | | `stamina` | ✅ | Current stamina level. | | `stim` | ✅ | Current stim level. | -| `strength`
`dexterity`
`intelligence`
`pereception` | ✅ | Current attributes | +| `strength`
`dexterity`
`intelligence`
`perception` | ✅ | Current attributes | | `strength_base`
`dexterity_base`
`intelligence_base`
`perception_base` | ✅ | Base attributes | | `strength_bonus`
`dexterity_bonus`
`intelligence_bonus`
`pereception_bonus` | ✅ | Bonus attributes | | `thirst` | ✅ | Current thirst. | diff --git a/doc/PORTAL_STORM_BALANCE_AND_DESIGN.md b/doc/PORTAL_STORM_BALANCE_AND_DESIGN.md index aaba263400165..6b82d4312b24b 100644 --- a/doc/PORTAL_STORM_BALANCE_AND_DESIGN.md +++ b/doc/PORTAL_STORM_BALANCE_AND_DESIGN.md @@ -43,7 +43,7 @@ Passive examples include stuff like: * Giant appendages, similarly creatures with no senses, however these ones are much more dangerous if you do get into melee with them. ### `Active` -These events represent goal 2 in the entry above. This is where the designs can get more awful. These entities should be actively trying to sabotage, disrupt, and destroy the player. This doesn't mean they should be strong combatants but it does mean they should be able to percieve, track and follow the player. These effects should *only* happen if you have built up `ire` and should cost `ire` to generate. +These events represent goal 2 in the entry above. This is where the designs can get more awful. These entities should be actively trying to sabotage, disrupt, and destroy the player. This doesn't mean they should be strong combatants but it does mean they should be able to perceive, track and follow the player. These effects should *only* happen if you have built up `ire` and should cost `ire` to generate. Active examples include stuff like: * The Person, a clairvoyant entity that attempts to follow you into buildings and on touching you causes nightmares and hallucinations diff --git a/doc/USER_INTERFACE_AND_ACCESSIBILITY.md b/doc/USER_INTERFACE_AND_ACCESSIBILITY.md index 683491de84ae6..b621e717ec17c 100644 --- a/doc/USER_INTERFACE_AND_ACCESSIBILITY.md +++ b/doc/USER_INTERFACE_AND_ACCESSIBILITY.md @@ -23,7 +23,7 @@ creating the ImGui window itself, but any widgets (i.e. text boxes, tables, inpu fields) must be created using the correct function under the `ImGui` namespace. Examples of creating any ImGui widget can be found in `src/third-party/imgui_demo.cpp` -Good examples of implementating an ImGui-based UI in cataclysm: +Good examples of implementing an ImGui-based UI in cataclysm: - `demo_ui` a minimal example (about 80 lines) in `main_menu.cpp` added in [PR#72171](https://github.com/CleverRaven/Cataclysm-DDA/pull/72171) diff --git a/doc/VITAMIN.md b/doc/VITAMIN.md index 1e2ea08d85cb3..bd3030b61792a 100644 --- a/doc/VITAMIN.md +++ b/doc/VITAMIN.md @@ -31,7 +31,7 @@ Mandatory. The type of the vitamin. Valid values are: #### `vitamin` When simplified nutrition is enabled, this vitamin will not be added to any items and any time the game attempts to retrieve it from the player it will give 0. -Only nutritional vitamins should have this type. **Vitamins are inputed in JSON as RDA everything else is a constant value** +Only nutritional vitamins should have this type. **Vitamins are inputted in JSON as RDA everything else is a constant value** #### `toxin` This is some toxic chemical or component. This currently has no effect. diff --git a/doc/WIDGETS.md b/doc/WIDGETS.md index 3048ef6e6f7b0..29d65b701737e 100644 --- a/doc/WIDGETS.md +++ b/doc/WIDGETS.md @@ -601,9 +601,9 @@ If you have a `text` style widget that has no other options for what to display, ## fill -For "graph" widgets with more than two sybols, different ways of filling up the graph become +For "graph" widgets with more than two symbols, different ways of filling up the graph become possible. The method is specified with the "fill" field. By default the "bucket" fill method is -used, but there is also a "pool" method described helow. +used, but there is also a "pool" method described below. With "bucket" fill, positions are filled like a row of buckets, using all symbols in the first position before beginning to fill the next position. This is like the classic 5-bar HP meter. @@ -969,7 +969,7 @@ In the example above, the widget would print out the following text: # Variable ranges Widgets using a numeric "var" (those without a `_text` suffix) have a predetermined absolute range -(minimum and maximum), as well as a predermined normal value or range. These limits are not +(minimum and maximum), as well as a predetermined normal value or range. These limits are not customizable in widget JSON, but knowing about them will make it easier to understand how "graph" widgets are drawn, and how the "colors" list is mapped to the variable's numeric range. diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 2ed5086514203..0a1e8904d7680 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -2482,6 +2482,11 @@ void repair_item_finish( player_activity *act, Character *you, bool no_menu ) const int old_level = you->get_skill_level( actor->used_skill ); const repair_item_actor::attempt_hint attempt = actor->repair( *you, *used_tool, fix_location, repeat == repeat_type::REFIT_ONCE || repeat == repeat_type::REFIT_FULL ); + // Warning: The above call to `repair_item_actor::repair` might + // invalidate the item and the item_location, for example when + // spilling items from spillable containers. It is therefore + // important that we don't use `fix_location` in code below + // here without first checking whether it is still valid. // If the item being repaired has been destroyed stop further // processing in case the items being used for the repair was @@ -2512,6 +2517,7 @@ void repair_item_finish( player_activity *act, Character *you, bool no_menu ) // But only if we didn't destroy the item (because then it's obvious) const bool destroyed = attempt == repair_item_actor::AS_DESTROYED; const bool cannot_continue_repair = attempt == repair_item_actor::AS_CANT || destroyed || + !fix_location || !actor->can_repair_target( *you, *fix_location, !destroyed, true ); if( cannot_continue_repair ) { // Cannot continue to repair target, select another target. diff --git a/src/game.cpp b/src/game.cpp index 9952e4b823919..31e00f2f05ede 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -9139,6 +9139,11 @@ static void add_disassemblables( uilist &menu, } } +static std::string wrap60( const std::string &text ) +{ + return string_join( foldstring( text, 60 ), "\n" ); +} + // Butchery sub-menu and time calculation static void butcher_submenu( const std::vector &corpses, int index = -1 ) { @@ -9283,100 +9288,100 @@ static void butcher_submenu( const std::vector &corpses, in uilist smenu; smenu.desc_enabled = true; - smenu.text = _( "Choose type of butchery:" ); + smenu.title = _( "Choose type of butchery:" ); smenu.addentry_col( static_cast( butcher_type::QUICK ), is_enabled( butcher_type::QUICK ), 'B', _( "Quick butchery" ) + progress_str( butcher_type::QUICK ), time_or_disabledreason( butcher_type::QUICK ), - string_format( "%s %s", - _( "This technique is used when you are in a hurry, " - "but still want to harvest something from the corpse. " - " Yields are lower as you don't try to be precise, " - "but it's useful if you don't want to set up a workshop. " - "Prevents zombies from raising." ), - msgFactor ) ); + wrap60( string_format( "%s %s", + _( "This technique is used when you are in a hurry, " + "but still want to harvest something from the corpse. " + " Yields are lower as you don't try to be precise, " + "but it's useful if you don't want to set up a workshop. " + "Prevents zombies from raising." ), + msgFactor ) ) ); smenu.addentry_col( static_cast( butcher_type::FULL ), is_enabled( butcher_type::FULL ), 'b', _( "Full butchery" ) + progress_str( butcher_type::FULL ), time_or_disabledreason( butcher_type::FULL ), - string_format( "%s %s", - _( "This technique is used to properly butcher a corpse, " - "and requires a rope & a tree or a butchering rack, " - "a flat surface (for ex. a table, a leather tarp, etc.) " - "and good tools. Yields are plentiful and varied, " - "but it is time consuming." ), - msgFactor ) ); + wrap60( string_format( "%s %s", + _( "This technique is used to properly butcher a corpse, " + "and requires a rope & a tree or a butchering rack, " + "a flat surface (for ex. a table, a leather tarp, etc.) " + "and good tools. Yields are plentiful and varied, " + "but it is time consuming." ), + msgFactor ) ) ); smenu.addentry_col( static_cast( butcher_type::FIELD_DRESS ), is_enabled( butcher_type::FIELD_DRESS ), 'f', _( "Field dress corpse" ) + progress_str( butcher_type::FIELD_DRESS ), time_or_disabledreason( butcher_type::FIELD_DRESS ), - string_format( "%s %s", - _( "Technique that involves removing internal organs and " - "viscera to protect the corpse from rotting from inside. " - "Yields internal organs. Carcass will be lighter and will " - "stay fresh longer. Can be combined with other methods for " - "better effects." ), - msgFactor ) ); + wrap60( string_format( "%s %s", + _( "Technique that involves removing internal organs and " + "viscera to protect the corpse from rotting from inside. " + "Yields internal organs. Carcass will be lighter and will " + "stay fresh longer. Can be combined with other methods for " + "better effects." ), + msgFactor ) ) ); smenu.addentry_col( static_cast( butcher_type::SKIN ), is_enabled( butcher_type::SKIN ), 's', _( "Skin corpse" ) + progress_str( butcher_type::SKIN ), time_or_disabledreason( butcher_type::SKIN ), - string_format( "%s %s", - _( "Skinning a corpse is an involved and careful process that " - "usually takes some time. You need skill and an appropriately " - "sharp and precise knife to do a good job. Some corpses are " - "too small to yield a full-sized hide and will instead produce " - "scraps that can be used in other ways." ), - msgFactor ) ); + wrap60( string_format( "%s %s", + _( "Skinning a corpse is an involved and careful process that " + "usually takes some time. You need skill and an appropriately " + "sharp and precise knife to do a good job. Some corpses are " + "too small to yield a full-sized hide and will instead produce " + "scraps that can be used in other ways." ), + msgFactor ) ) ); smenu.addentry_col( static_cast( butcher_type::BLEED ), is_enabled( butcher_type::BLEED ), 'l', _( "Bleed corpse" ) + progress_str( butcher_type::BLEED ), time_or_disabledreason( butcher_type::BLEED ), - string_format( "%s %s", - _( "Bleeding involves severing the carotid arteries and jugular " - "veins, or the blood vessels from which they arise. " - "You need skill and an appropriately sharp and precise knife " - "to do a good job." ), - msgFactor ) ); + wrap60( string_format( "%s %s", + _( "Bleeding involves severing the carotid arteries and jugular " + "veins, or the blood vessels from which they arise. " + "You need skill and an appropriately sharp and precise knife " + "to do a good job." ), + msgFactor ) ) ); smenu.addentry_col( static_cast( butcher_type::QUARTER ), is_enabled( butcher_type::QUARTER ), 'k', _( "Quarter corpse" ) + progress_str( butcher_type::QUARTER ), time_or_disabledreason( butcher_type::QUARTER ), - string_format( "%s %s", - _( "By quartering a previously field dressed corpse you will " - "acquire four parts with reduced weight and volume. It " - "may help in transporting large game. This action destroys " - "skin, hide, pelt, etc., so don't use it if you want to " - "harvest them later." ), - msgFactor ) ); + wrap60( string_format( "%s %s", + _( "By quartering a previously field dressed corpse you will " + "acquire four parts with reduced weight and volume. It " + "may help in transporting large game. This action destroys " + "skin, hide, pelt, etc., so don't use it if you want to " + "harvest them later." ), + msgFactor ) ) ); smenu.addentry_col( static_cast( butcher_type::DISMEMBER ), is_enabled( butcher_type::DISMEMBER ), 'm', _( "Dismember corpse" ) + progress_str( butcher_type::DISMEMBER ), time_or_disabledreason( butcher_type::DISMEMBER ), - string_format( "%s %s", - _( "If you're aiming to just destroy a body outright and don't " - "care about harvesting it, dismembering it will hack it apart " - "in a very short amount of time but yields little to no usable flesh." ), - msgFactor ) ); + wrap60( string_format( "%s %s", + _( "If you're aiming to just destroy a body outright and don't " + "care about harvesting it, dismembering it will hack it apart " + "in a very short amount of time but yields little to no usable flesh." ), + msgFactor ) ) ); smenu.addentry_col( static_cast( butcher_type::DISSECT ), is_enabled( butcher_type::DISSECT ), 'd', _( "Dissect corpse" ) + progress_str( butcher_type::DISSECT ), time_or_disabledreason( butcher_type::DISSECT ), - string_format( "%s %s%s", - _( "By careful dissection of the corpse, you will examine it for " - "possible bionic implants, or discrete organs and harvest them " - "if possible. Requires scalpel-grade cutting tools, ruins " - "corpse, and consumes a lot of time. Your medical knowledge " - "is most useful here." ), - msgFactorD, dissect_wp_hint ) ); + wrap60( string_format( "%s %s%s", + _( "By careful dissection of the corpse, you will examine it for " + "possible bionic implants, or discrete organs and harvest them " + "if possible. Requires scalpel-grade cutting tools, ruins " + "corpse, and consumes a lot of time. Your medical knowledge " + "is most useful here." ), + msgFactorD, dissect_wp_hint ) ) ); smenu.query(); switch( smenu.ret ) { case static_cast( butcher_type::QUICK ): diff --git a/src/game_inventory.cpp b/src/game_inventory.cpp index 3955d7e848527..a7d3c42e5d054 100644 --- a/src/game_inventory.cpp +++ b/src/game_inventory.cpp @@ -131,7 +131,8 @@ static item_location inv_internal( Character &u, const inventory_selector_preset const std::string &title, int radius, const std::string &none_message, const std::string &hint = std::string(), - item_location container = item_location() ) + item_location container = item_location(), + bool add_ebooks = false ) { inventory_pick_selector inv_s( u, preset ); @@ -156,6 +157,9 @@ static item_location inv_internal( Character &u, const inventory_selector_preset // Default behavior. inv_s.add_character_items( u ); inv_s.add_nearby_items( radius ); + if( add_ebooks ) { + inv_s.add_character_ebooks( u ); + } } if( u.has_activity( consuming ) ) { @@ -1560,7 +1564,8 @@ item_location game_menus::inv::read( Character &you ) { const std::string msg = you.is_avatar() ? _( "You have nothing to read." ) : string_format( _( "%s has nothing to read." ), you.disp_name() ); - return inv_internal( you, read_inventory_preset( you ), _( "Read" ), 1, msg ); + return inv_internal( you, read_inventory_preset( you ), _( "Read" ), 1, msg, "", item_location(), + true ); } item_location game_menus::inv::ebookread( Character &you, item_location &ereader ) diff --git a/src/inventory_ui.cpp b/src/inventory_ui.cpp index 00a5e398ee0f0..d803d8b512fa7 100644 --- a/src/inventory_ui.cpp +++ b/src/inventory_ui.cpp @@ -2097,6 +2097,13 @@ void inventory_selector::add_character_items( Character &character ) } } +void inventory_selector::add_character_ebooks( Character &character ) +{ + for( item_location &ereader : character.all_items_loc() ) { + add_contained_ebooks( ereader ); + } +} + void inventory_selector::add_map_items( const tripoint &target ) { map &here = get_map(); diff --git a/src/inventory_ui.h b/src/inventory_ui.h index 87dd084d6e4d7..6cc75efb011ce 100644 --- a/src/inventory_ui.h +++ b/src/inventory_ui.h @@ -615,6 +615,7 @@ class inventory_selector void add_contained_gunmods( Character &you, item &gun ); void add_contained_ebooks( item_location &container ); void add_character_items( Character &character ); + void add_character_ebooks( Character &character ); void add_map_items( const tripoint &target ); void add_vehicle_items( const tripoint &target ); void add_nearby_items( int radius = 1 ); diff --git a/src/iuse.cpp b/src/iuse.cpp index 6e7f00c235fd6..d256bbd610483 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -3405,16 +3405,24 @@ std::optional iuse::granade_act( Character *, item *it, const tripoint &pos std::optional iuse::c4( Character *p, item *it, const tripoint & ) { - int time; - bool got_value = query_int( time, _( "Set the timer to how many seconds (0 to cancel)?" ) ); - if( !got_value || time <= 0 ) { - p->add_msg_if_player( _( "Never mind." ) ); - return std::nullopt; + int time = 0; + bool got_value = false; + if( p->is_avatar() ) { + got_value = query_int( time, _( "Set the timer to how many seconds (0 to cancel)?" ) ); + if( !got_value || time <= 0 ) { + p->add_msg_if_player( _( "Never mind." ) ); + return std::nullopt; + } } p->add_msg_if_player( n_gettext( "You set the timer to %d second.", "You set the timer to %d seconds.", time ), time ); it->convert( itype_c4armed ); - it->countdown_point = calendar::turn + time_duration::from_seconds( time ); + if( got_value ) { + it->countdown_point = calendar::turn + time_duration::from_seconds( time ); + } else { + // Uses value from the converted type (e.g. currently hardcoded c4armed) + it->countdown_point = calendar::turn + it->type->countdown_interval; + } it->active = true; return 1; } diff --git a/src/magic.cpp b/src/magic.cpp index 51afe5c1b9ee4..ae3846deae82f 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -2621,9 +2621,10 @@ void spellcasting_callback::display_spell_info( size_t index ) } else if( sp.effect() == "spawn_item" ) { if( sp.has_flag( spell_flag::SPAWN_GROUP ) ) { // todo: more user-friendly presentation - ImGui::Text( _( "Spawn item group %1$s %2$d times" ), - sp.effect_data().c_str(), - sp.damage( pc ) ); + const std::string s = string_format( _( "Spawn item group %1$s %2$d times" ), + sp.effect_data(), + sp.damage( pc ) ); + ImGui::Text( "%s", s.c_str() ); } else { ImGui::Text( "%s %d %s", _( "Spawn" ), sp.damage( pc ), item::nname( itype_id( sp.effect_data() ), sp.damage( pc ) ).c_str() ); diff --git a/src/math_parser_diag.cpp b/src/math_parser_diag.cpp index 98f111dd9fb56..bbf429c58058c 100644 --- a/src/math_parser_diag.cpp +++ b/src/math_parser_diag.cpp @@ -270,6 +270,78 @@ std::function faction_trust_ass( char /* scope */, }; } +std::function faction_food_supply_eval( char /* scope */, + std::vector const ¶ms, diag_kwargs const &/* kwargs */ ) +{ + return [fac_val = params[0]]( dialogue & d ) { + faction *fac = g->faction_manager_ptr->get( faction_id( fac_val.str( d ) ) ); + return fac->food_supply.calories; + }; +} + +std::function faction_food_supply_ass( char /* scope */, + std::vector const ¶ms, diag_kwargs const &/* kwargs */ ) +{ + return [fac_val = params[0]]( dialogue const & d, double val ) { + faction *fac = g->faction_manager_ptr->get( faction_id( fac_val.str( d ) ) ); + fac->food_supply.calories = val; + }; +} + +std::function faction_wealth_eval( char /* scope */, + std::vector const ¶ms, diag_kwargs const &/* kwargs */ ) +{ + return [fac_val = params[0]]( dialogue & d ) { + faction *fac = g->faction_manager_ptr->get( faction_id( fac_val.str( d ) ) ); + return fac->wealth; + }; +} + +std::function faction_wealth_ass( char /* scope */, + std::vector const ¶ms, diag_kwargs const &/* kwargs */ ) +{ + return [fac_val = params[0]]( dialogue const & d, double val ) { + faction *fac = g->faction_manager_ptr->get( faction_id( fac_val.str( d ) ) ); + fac->wealth = val; + }; +} + +std::function faction_power_eval( char /* scope */, + std::vector const ¶ms, diag_kwargs const &/* kwargs */ ) +{ + return [fac_val = params[0]]( dialogue & d ) { + faction *fac = g->faction_manager_ptr->get( faction_id( fac_val.str( d ) ) ); + return fac->power; + }; +} + +std::function faction_power_ass( char /* scope */, + std::vector const ¶ms, diag_kwargs const &/* kwargs */ ) +{ + return [fac_val = params[0]]( dialogue const & d, double val ) { + faction *fac = g->faction_manager_ptr->get( faction_id( fac_val.str( d ) ) ); + fac->power = val; + }; +} + +std::function faction_size_eval( char /* scope */, + std::vector const ¶ms, diag_kwargs const &/* kwargs */ ) +{ + return [fac_val = params[0]]( dialogue & d ) { + faction *fac = g->faction_manager_ptr->get( faction_id( fac_val.str( d ) ) ); + return fac->size; + }; +} + +std::function faction_size_ass( char /* scope */, + std::vector const ¶ms, diag_kwargs const &/* kwargs */ ) +{ + return [fac_val = params[0]]( dialogue const & d, double val ) { + faction *fac = g->faction_manager_ptr->get( faction_id( fac_val.str( d ) ) ); + fac->size = val; + }; +} + std::function field_strength_eval( char scope, std::vector const ¶ms, diag_kwargs const &kwargs ) { @@ -1678,6 +1750,10 @@ std::map const dialogue_eval_f{ { "faction_like", { "g", 1, faction_like_eval } }, { "faction_respect", { "g", 1, faction_respect_eval } }, { "faction_trust", { "g", 1, faction_trust_eval } }, + { "faction_food_supply", { "g", 1, faction_food_supply_eval } }, + { "faction_wealth", { "g", 1, faction_wealth_eval } }, + { "faction_power", { "g", 1, faction_power_eval } }, + { "faction_size", { "g", 1, faction_size_eval } }, { "field_strength", { "ung", 1, field_strength_eval } }, { "gun_damage", { "un", 1, gun_damage_eval } }, { "game_option", { "g", 1, option_eval } }, @@ -1733,6 +1809,10 @@ std::map const dialogue_assign_f{ { "faction_like", { "g", 1, faction_like_ass } }, { "faction_respect", { "g", 1, faction_respect_ass } }, { "faction_trust", { "g", 1, faction_trust_ass } }, + { "faction_food_supply", { "g", 1, faction_food_supply_ass } }, + { "faction_wealth", { "g", 1, faction_wealth_ass } }, + { "faction_power", { "g", 1, faction_power_ass } }, + { "faction_size", { "g", 1, faction_size_ass } }, { "hp", { "un", 1, hp_ass } }, { "pain", { "un", 0, pain_ass } }, { "school_level_adjustment", { "un", 1, school_level_adjustment_ass } }, diff --git a/src/npc.cpp b/src/npc.cpp index b56bfe85ed909..56c82daccf2cc 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -1585,6 +1585,7 @@ void npc::mutiny() my_fac->trusts_u -= 5; g->remove_npc_follower( getID() ); set_fac( faction_amf ); + rules = npc_follower_rules(); // Mutinous NPCs no longer follower your rules job.clear_all_priorities(); if( assigned_camp ) { assigned_camp = std::nullopt; diff --git a/src/npc_attack.cpp b/src/npc_attack.cpp index 0034e41a68bf2..c4f8b310e0f41 100644 --- a/src/npc_attack.cpp +++ b/src/npc_attack.cpp @@ -585,8 +585,10 @@ void npc_attack_activate_item::use( npc &source, const tripoint &/*location*/ ) if( !source.wield( activatable_item ) ) { debugmsg( "%s can't wield %s it tried to activate", source.disp_name(), activatable_item.display_name() ); + return; } - source.activate_item( activatable_item ); + // npc::wield may invalidate activatable_item's reference + source.activate_item( *source.get_wielded_item() ); } bool npc_attack_activate_item::can_use( const npc &source ) const diff --git a/src/ui.cpp b/src/ui.cpp index a90fcaf7a1462..a0b77fa07f881 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -61,6 +61,9 @@ void uilist_impl::on_resized() void uilist_impl::draw_controls() { + float hotkey_width = + ImGui::CalcTextSize( "[X]" ).x + ImGui::GetStyle().ItemSpacing.x; + if( !parent.text.empty() ) { cataimgui::draw_colored_text( parent.text ); ImGui::Separator(); @@ -108,6 +111,8 @@ void uilist_impl::draw_controls() ImGui::SameLine( 0, 0 ); ImGui::Text( "%c", ']' ); ImGui::SameLine(); + } else { + ImGui::SetCursorPosX( hotkey_width ); } nc_color color = ( is_selected ? parent.hilight_color : @@ -129,8 +134,9 @@ void uilist_impl::draw_controls() if( parent.desc_enabled ) { ImGui::Separator(); - ImGui::TextWrapped( "%s", parent.footer_text.empty() ? parent.entries[parent.selected].desc.c_str() - : parent.footer_text.c_str() ); + cataimgui::draw_colored_text( parent.footer_text.empty() ? + parent.entries[parent.selected].desc.c_str() + : parent.footer_text.c_str() ); } } diff --git a/src/veh_appliance.cpp b/src/veh_appliance.cpp index fa43ddb3c5c4f..77d43359b8d1f 100644 --- a/src/veh_appliance.cpp +++ b/src/veh_appliance.cpp @@ -1,5 +1,6 @@ #include "game.h" #include "handle_liquid.h" +#include "imgui/imgui.h" #include "inventory.h" #include "itype.h" #include "map_iterator.h" @@ -173,14 +174,24 @@ void veh_app_interact::init_ui_windows() } const int width_info = win_width - 2; const int height_input = app_actions.size(); - const int height = height_info + height_input + 2; + const int win_height = height_info + 2; + const int full_height = win_height + height_input; // Center the UI - point topleft( TERMX / 2 - win_width / 2, TERMY / 2 - height / 2 ); - w_border = catacurses::newwin( height, win_width, topleft ); + point topleft( TERMX / 2 - win_width / 2, TERMY / 2 - full_height / 2 ); + w_border = catacurses::newwin( win_height, win_width, topleft ); //NOLINTNEXTLINE(cata-use-named-point-constants) w_info = catacurses::newwin( height_info, width_info, topleft + point( 1, 1 ) ); + ImVec2 text_metrics = { ImGui::CalcTextSize( "X" ).x, ImGui::GetTextLineHeight() }; + ImVec2 origin = text_metrics * ImVec2{ static_cast( topleft.x ), static_cast( topleft.y + win_height ) }; + ImVec2 size = text_metrics * ImVec2{ static_cast( win_width ), static_cast( height_input ) }; + imenu.desired_bounds = { origin.x, + origin.y, + size.x, + size.y + 4.0f * ( ImGui::GetStyle().FramePadding.y + ImGui::GetStyle().WindowBorderSize ) + }; + imenu.allow_cancel = true; imenu.border_color = c_white; imenu.setup(); diff --git a/tests/degradation_test.cpp b/tests/degradation_test.cpp index 8d03920bcb665..5d806a574153c 100644 --- a/tests/degradation_test.cpp +++ b/tests/degradation_test.cpp @@ -2,6 +2,7 @@ #include "activity_handlers.h" #include "cata_catch.h" +#include "flag.h" #include "item.h" #include "itype.h" #include "iuse_actor.h" @@ -17,8 +18,12 @@ static const activity_id ACT_REPAIR_ITEM( "ACT_REPAIR_ITEM" ); +static const itype_id itype_backpack( "backpack" ); +static const itype_id itype_can_drink( "can_drink" ); +static const itype_id itype_canvas_patch( "canvas_patch" ); static const itype_id itype_leather( "leather" ); static const itype_id itype_tailors_kit( "tailors_kit" ); +static const itype_id itype_technician_shirt_gray( "technician_shirt_gray" ); static const itype_id itype_test_baseball( "test_baseball" ); static const itype_id itype_test_baseball_half_degradation( "test_baseball_half_degradation" ); static const itype_id itype_test_baseball_x2_degradation( "test_baseball_x2_degradation" ); @@ -221,10 +226,20 @@ TEST_CASE( "Items_that_get_damaged_gain_degradation", "[item][degradation]" ) } } -static void setup_repair( item &fix, player_activity &act, Character &u ) +static item_location setup_tailorkit( Character &u ) { map &m = get_map(); + const tripoint_bub_ms pos = spawn_pos; + item &thread = m.add_item_or_charges( pos, item( itype_thread ) ); + item &tailor = m.add_item_or_charges( pos, item( itype_tailors_kit ) ); + thread.charges = 400; + tailor.reload( u, { map_cursor( pos ), &thread }, 400 ); + REQUIRE( m.i_at( spawn_pos ).begin()->typeId() == tailor.typeId() ); + return item_location( map_cursor( pos ), &tailor ); +} +static void setup_repair( item &fix, player_activity &act, Character &u ) +{ // Setup character clear_character( u, true ); u.set_skill_level( skill_tailor, 10 ); @@ -232,11 +247,7 @@ static void setup_repair( item &fix, player_activity &act, Character &u ) REQUIRE( u.get_wielded_item()->typeId() == fix.typeId() ); // Setup tool - item &thread = m.add_item_or_charges( spawn_pos, item( itype_thread ) ); - item &tailor = m.add_item_or_charges( spawn_pos, item( itype_tailors_kit ) ); - thread.charges = 400; - tailor.reload( u, { map_cursor( tripoint_bub_ms( spawn_pos ) ), &thread }, 400 ); - REQUIRE( m.i_at( spawn_pos ).begin()->typeId() == tailor.typeId() ); + item_location tailorloc = setup_tailorkit( u ); // Setup materials item leather( itype_leather ); @@ -245,7 +256,6 @@ static void setup_repair( item &fix, player_activity &act, Character &u ) // Setup activity item_location fixloc( u, &fix ); - item_location tailorloc( map_cursor( tripoint_bub_ms( spawn_pos ) ), &tailor ); act.values.emplace_back( /* repeat_type::FULL */ 3 ); act.str_values.emplace_back( "repair_fabric" ); act.targets.emplace_back( tailorloc ); @@ -628,3 +638,67 @@ TEST_CASE( "Gun_repair_with_degradation", "[item][degradation]" ) } } } + +static player_activity setup_repair_activity( item_location &tailorloc, item_location &fixloc ) +{ + player_activity act( ACT_REPAIR_ITEM ); + act.values.emplace_back( /* repeat_type::FULL */ 3 ); + act.str_values.emplace_back( "repair_fabric" ); + act.targets.emplace_back( tailorloc ); + act.targets.emplace_back( fixloc ); + return act; +} + +static item_location put_in_container( item_location &container, const itype_id &type ) +{ + ret_val inserted = container->get_contents().insert_item( item( type ), + pocket_type::CONTAINER ); + REQUIRE( inserted.success() ); + return item_location( container, inserted.value() ); +} + +// Reproduce previous segfault from https://github.com/CleverRaven/Cataclysm-DDA/issues/74254 +TEST_CASE( "refit_item_inside_spillable_container", "[item][repair][container]" ) +{ + clear_avatar(); + clear_map(); + set_time_to_day(); + REQUIRE( static_cast( get_map().light_at( spawn_pos.raw() ) ) > 2 ); + + Character &u = get_player_character(); + u.set_skill_level( skill_tailor, 10 ); + + // Setup starting equipment + item_location tailorkit = setup_tailorkit( u ); + REQUIRE( u.wear_item( item( itype_backpack ) ) ); + item_location backpack = u.top_items_loc().front(); + item canvas_patch( itype_canvas_patch ); + u.i_add_or_drop( canvas_patch, 100 ); + + // Starting inventory looks like: + // backpack > + // 100 canvas patch + // aluminum can > + // work t-shirt (poor fit) + // It's a bit odd that we can put the shirt into the aluminum can, since it + // would normally reject that with a message stating that it would spill. + GIVEN( "backpack > aluminum can > work t-shirt (poor fit)" ) { + item_location aluminum_can = put_in_container( backpack, itype_can_drink ); + item_location fix_tshirt = put_in_container( aluminum_can, itype_technician_shirt_gray ); + WHEN( "Refitting tshirt inside spillable container" ) { + REQUIRE_FALSE( fix_tshirt->has_flag( flag_FIT ) ); + player_activity act = setup_repair_activity( tailorkit, fix_tshirt ); + while( !act.is_null() ) { + ::repair_item_finish( &act, &u, true ); + } + THEN( "tshirt should be refitted successfully" ) { + const item *refitted_tshirt = backpack->get_item_with( [&]( const item & i ) { + return i.typeId() == itype_technician_shirt_gray; + } ); + REQUIRE( refitted_tshirt != nullptr ); + CHECK( refitted_tshirt->has_flag( flag_FIT ) ); + } + } + + } +} diff --git a/tools/spell_checker/dictionary.txt b/tools/spell_checker/dictionary.txt index 6d24de5b40d5f..3c3dc04aad7d5 100644 --- a/tools/spell_checker/dictionary.txt +++ b/tools/spell_checker/dictionary.txt @@ -455,7 +455,8 @@ Bahá Baha'i Bahá'í Baha'is -Bahamanain +Bahamanian +Bahamian Baha'u'llah Bahá'u'lláh Bahman @@ -1178,6 +1179,7 @@ coipo coipos Col colada +Colombian Colrain Columbia Columbian @@ -1494,6 +1496,8 @@ Didascalia Diego Diemaco dieselpunk +direhound +direhounds diggable Dighton DigiMart @@ -3861,7 +3865,7 @@ Milinda milkfat Milkor Millbury -millenia +millennia Millie Millis Millville @@ -5030,6 +5034,7 @@ Remington remodulator Remy rended +René renfaire renfaires renfield