diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 3d00a0b20ca78..1944a9ecfe3e8 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -56,7 +56,7 @@ jobs:
matrix:
include:
- name: Windows Tiles x64 MSVC
- artifact: windows-tiles-x64-msvc
+ artifact: windows-with-graphics-x64
arch: x64
os: windows-2019
mxe: none
@@ -64,29 +64,13 @@ jobs:
content: application/zip
sound: 0
- name: Windows Tiles Sounds x64 MSVC
- artifact: windows-tiles-sounds-x64-msvc
+ artifact: windows-with-graphics-and-sounds-x64
arch: x64
os: windows-2019
mxe: none
ext: zip
content: application/zip
sound: 1
- - name: Windows Tiles x64
- mxe: x86_64
- libbacktrace: 1
- artifact: windows-tiles-x64
- os: ubuntu-latest
- ext: zip
- content: application/zip
- sound: 0
- - name: Windows Tiles Sounds x64
- mxe: x86_64
- libbacktrace: 1
- artifact: windows-tiles-sounds-x64
- os: ubuntu-latest
- ext: zip
- content: application/zip
- sound: 1
- name: Linux Tiles x64
os: ubuntu-20.04
mxe: none
@@ -94,7 +78,7 @@ jobs:
libbacktrace: 1
tiles: 1
sound: 0
- artifact: linux-tiles-x64
+ artifact: linux-with-graphics-x64
ext: tar.gz
content: application/gzip
- name: Linux Tiles Sounds x64
@@ -104,7 +88,7 @@ jobs:
libbacktrace: 1
tiles: 1
sound: 1
- artifact: linux-tiles-sounds-x64
+ artifact: linux-with-graphics-and-sounds-x64
ext: tar.gz
content: application/gzip
- name: Linux Curses x64
@@ -114,7 +98,7 @@ jobs:
libbacktrace: 1
tiles: 0
sound: 0
- artifact: linux-curses-x64
+ artifact: linux-terminal-only-x64
ext: tar.gz
content: application/gzip
- name: macOS Curses Universal Binary (x64 and arm64)
@@ -122,7 +106,7 @@ jobs:
mxe: none
tiles: 0
sound: 0
- artifact: osx-curses-universal
+ artifact: osx-terminal-only-universal
ext: dmg
content: application/x-apple-diskimage
- name: macOS Tiles Universal Binary (x64 and arm64)
@@ -130,7 +114,7 @@ jobs:
mxe: none
tiles: 1
sound: 0
- artifact: osx-tiles-universal
+ artifact: osx-with-graphics-universal
ext: dmg
content: application/x-apple-diskimage
- name: Android x64
diff --git a/data/changelog.txt b/data/changelog.txt
index 3f509182eeb4f..b06f5637dd488 100644
--- a/data/changelog.txt
+++ b/data/changelog.txt
@@ -152,11 +152,32 @@ Grazing animals actually eat grass, and it regrows every season
New characters get random natural hair color during character generation
Binoculars now also increase 'detailed' vision range, not only max vision range
Morphic Sizing flag for summoned/magickal items
+Pet feeding tweaks
+Adds a baseball bat recipe
+Flagify animal empathy/discord traits
+Dialogue debug: toggle display of conditionals/effects
+Character randomization sometimes produces 'crossdressing' characters
+Dialogue: JSON fields for displaying hidden responses
+Added check for stealing prior to inserting items into container
+Make garlic smokable
+Grazing animals actually eat grass, and it regrows every season
Added check for stealing prior to wearing
Plastic tub audit
Adds throwing practice tools
Debug spawn NPC by class id
EOCs modifying calories track spent calories
+Mutations can have a custom activation message
+modify random NPC starting equipment based on time passed
+Throwing items while piloting mechs (with the mech's assist)
+Faction relationships can be modified through dialogue
+Adds whispering fungi to fungi zombie mongroup.
+Added check for stealing prior to obtaining book to read
+Added check for stealing prior to reloading items
+Added check for stealing prior to activating items
+Deconstruct simple furniture in the dark
+Mission deadlines supports dialogue variables
+Add a new appliance, the glassblower's crucible
+Add a new widget to display weight as "##.#/##.#[unit]"
NPC factions get mad if you mess with their property by smashing or deconstructing it etc
obsolete generic NPC common classes; use the avatar character generator instead
Allow PCs/NPCs to move diagonally during overmap pathfinding
@@ -341,8 +362,25 @@ Professions & hobbies know gross anatomy & new butchering profs
Slightly Expands Hub-01 and Yrax factions
Adds a new stationary fungal variant.
adds a new fungus infested mapgen
+Adds new end screen for thresh types, and a unique one.
+Overhaul gun spawning
+Fungal brute and hulk
+Massive expansion of dialogues and messages for various categories
+Make more zombies wear wedding rings
Add a random NPC class that knows how to fly. Yes you CAN recruit them, switch to them, and then fly a helicopter with their skills.
fungalize stages for zombies
+Adds in new .357, .44, and .22 LR lever-action rifles
+Carpets won't always be the same color
+Beds are draggable
+Large clay pots can now be crafted without a lid and used in the slow sand water filter
+Fence posts and bollards are more similar
+Melee weapon item groups for random NPCs
+Remove secret science and military stuff from bank/industry/mall vaults
+No free wiring in log walls
+Military locations can spawn EOD suits
+Added a welding store
+Titanium Density Fix
+Add Vitamin C Supplements
## Interface:
@@ -441,6 +479,13 @@ Map UI: hint custom keybind for `CHOOSE_DESTINATION`
Toggle between the map and look around
Only list non-zero damage types on melee weapons
Misc. improvements to NPC goto-location options
+Repeat survey missions without leaving the interface
+Unify name suffix and profession
+Add daily health widget
+Add labels to structured sidebar tiny bodygraphs
+use Freetype to render fonts for ImGui, and use multiple fonts in the ImGui interface
+Debug reveal map moved to overmap editor, can reveal any overmap
+Wrap the text in the menu for choosing your new faction camp type
Missions track when they were completed/failed
Add activity to continually bash something until it's destroyed
Option to set all of a companion's job priorities at once
@@ -698,6 +743,14 @@ Create the Martial Mastery mod, which allows you to develop your own martial art
[DinoMod] Astrodon
[MoM] Add Alien Meadow mutable map special
[Magiclysm] Fantasy species zombies
+[DinoMod] longer tail attacks
+[DinoMod] sauropods out of the water
+[Magiclysm] Condense Attunement UI and simplify json code
+[MoM] Add the unstoppable force (final rank feral telekinetic)
+[MoM] Give the human whirlwind (and feral security captain, Ψ Division) the Hurricane Blows power
+[Magiclysm] Add feral stormshapers
+[MoM] Allow Intuitive Artisan to craft in complete darkness (because you close your eyes and let the visions take over)
+[DinoMod] DinoZoo update
[Magiclysm] Add `UNRESTRICTED` flag to several Magiclysm summoned items
[Magiclysm] Rapid Regeneration's effect only triggers if you need healing
[Xedra Evolved] Werewolves only regenerate when they need to
@@ -717,6 +770,32 @@ Prevent Paraclesians from being born with a drivers license
[MoM/CrazyCata Interaction] Rename Metaphysics to "woo woo"
[Bombastic Perks/MoM] Add MoM-specific perks
[Xedra Evolved] Dreamsmithing procgen expansion (enchants)
+[MoM/Magiclysm interaction] Synchronize anti-Stare powers, Thought Shield spell protects from telepathy
+[Xedra Evolve] Add Ruach counter to sidebars
+[Sky Island/MoM/XE interactions] Allow starting with XE/MoM scenario-limited professions in Sky Island
+Apply copy-from to mod scenarios
+[MoM] Move Mirror-mask bonus to effect, obsolete mutations
+[Xedra Evolved] Require Traverse the Wilds to target a tree as the endpoint
+[Xedra Evolved] More Lilin powers
+[DinoMod] mountable and harnessable audit
+Magus spell Slow description change
+[DinoMod] Eggs process directly into hatchlings
+[MoM] Update mutated animals to match vanilla changes
+[XE] Add cryptid hunting and a few cryptids
+[Magiclysm] Zombie versions of lizardfolk and ravenfolk drop tainted flesh like all other zombies
+[MoM] Update everglow matrix lighting recipes
+[Magiclysm] Feral dabblers: add a small chance for ferals to know a single spell
+[MoM] Remove monster inherent speed boosts, replace with actual powers that have to be used
+[XE] Fix two bugs about learning new blood gifts
+[Magiclysm] Add a trait that prevents magical spellcasting
+Martial Mastery: Fix duration of several technique effects
+Create an external option for disabling zombify_into. Apply it to both Aftershock:Exoplanet and DDtD
+[Xedra Evolved] Moon's tears weapons
+[Xedra Evolved] Add playable Lilin with appropriate scenario
+[MoM] Torrential Channeling power maintenance also raises Nether Attunement
+Aftershock: Remove swims flag from terrestrial creatures.
+[MoM] Feral psion updates with copy-from
+Aftershock: Add suit batteries for the winter suits.
[DinoMod] eolambia
[Xedra Evolved/Innawood] Remove modern items from XE spawns Innawood, allow starting with XE-specific scenarios
[Xedra Evolved] Only humans can learn dream magick
@@ -819,7 +898,19 @@ Wielded items behave the same as ranged weapons when driving
Small changes to Quenching and tempering proficiency
Battery tools sanification
Obsolete and migrate legacy wire in favor of mild steel wire
+Remove itch from conjunctivitis and make it even shorter when irrigated
+Electronic devices spawn rate rework
+Crashed planes have no ferals
+Replace land mines with bear traps in the bandit cabin
+Human lard less dense
+Ballista is no longer pure magic
Make lab access shafts normally visible once spotted
+Factions don't mind the player smashing zombie corpses
+Remove calcium from Rare Drugs itemgroup
+Ranged weapon selection for random NPCs
+Some factions claim only one OMT
+Added some reaction to furniture when falling down
+Auditing portable charcoal kiln cleanup
NPCs can funk out to music, too.
@@ -1069,6 +1160,24 @@ NPC flee from being run over by vehicles
fix the crash in select_language by building the font atlas first
Monsters won't be sending immobile targets into flight anymore.
[XE/Magiclysm] No wizard cats
+Fixed hair growth and balding issue in appearance_eocs.json
+HUB01 templates' spawn is more predictable
+[MoM] Fix Missing mind shield (0.H Backport)
+Fixes AIM layout #76606
+[Isolation Protocol] Fix trailing spaces
+Cameras can now be charged and they all consume one battery charge per usage
+Change X95 to 556
+Avoid JSON errors on Windows with no sound devices
+Move Zombio Bio Operators to No Hope
+Adjust spawns of .22
+Allow tiny continuous power draw in electronic devices.
+Don't take integrated and no-takeoff items when mugging
+Remove Military Professions mod
+GUI Loading screen shows progress again
+Prevent sidebar crash when trying to divide by zero
+[Xedra Evolved] No werealfs
+Fixed crash on trying to unwield heavy items when trying to drive
+Fixes species of feral wizards and feral butchering
Cabin in Safe Place scenario is now actually safe
[MoM] NPCs can awaken in portal storms
Start of cataclysm day and start of game day now respect season length
@@ -1078,6 +1187,51 @@ Faulty guns don't lock your view
Don't apply additional move cost for moving barefoot in deep water
Fixed a crash when using the 'set of clothes' item
Fix non-battery charge consumption of active items
+Heating elements no longer drop from smashing the fume hood
+Cotton patch can be used to stop bleeding
+No salvage for ballistic plates
+Forbid drinking liquids underwater for characters with `Aqueous Repose` and `Embrace of the Waters` mutations, as it stated in mutations' descriptions
+New appliances have correct owner
+Minor gun fixes
+Fix flatlander not using special attack
+Battery charger appliances now work when outside the reality bubble
+Dropped lit cigarette won't start fires if there's no flammable terrain, furniture, or items on that tile
+Use correct symbols for vehicle front corners
+Invalid recharge type and instant book reading
+Fix scenario spawns
+Stop 20x melatonin spawns
+Debug log no longer one entry behind
+'Burst-fire wielded weapon' now actually sets wielded weapon to burst or auto firing modes
+[Xedra Evolved] Fix homullus trait regressions
+Fix shelter and burning building starts
+Camp food can be distributed from vehicle cargo zones
+Bleeding can be stopped with bandages without waiting an extra turn
+Don't apply parkour bonus when moving prone
+[MoM] Purifiable updates
+Calculate correct height when a uilist has desired_bounds not including a height
+Fix: weariness makes hauling faster instead of slower
+Make floors under furniture correct
+Unload zone properly clears auto whitelists
+Stop spawning too many monsters in a cave
+Removes a few handguns, rifles, and a shotgun that didn't meet inclusion criteria
+Fix raw butter calories, add salt to raw butter recipes, Add raw butter as option to recipes that use butter
+Flamethrowers count as firestarters for lighting up bombs
+Forbid starting fires (using firestarters) on water tiles
+[Xedra Evolved] Fix Eater's sixth sense trait
+Fragile and Sturdy flags cannot be inherited
+[Xedra Evolved] Lo Ra'ab
+Faction camp storage zone effective after editing
+Fix: weariness makes hauling faster instead of slower
+Construction blueprints don't require deconstruction tools or decoration materials
+Removes the pockets flag from the cropped hoodies
+[MoM] Fix """""missing""""" EoC id
+Deployed furniture won't be floating anymore if deployed on open air
+Fix minor typos in keybinding descriptions
+NPCs stealing player default name
+Fix zoo scenario spawn
+Fix regression of calculation of the height of a uilist that has a desired_bounds not including a height
+Lowers electronic skill requirement of clay car batteries from 3 to 2
+Cotton patch can be used to stop bleeding
## Performance:
@@ -1111,6 +1265,7 @@ Optimize typed coordinate conversion functions for widespread savings
NPCs take less time to check for enemies.
Improve point hash functions to eliminate map overhead in nps los checks and elsewhere
Fix lag examining large stacks of crafted items
+Backport Don't unnecessarily copy items in a tight loop in get_uncraft_components
Reduce unnecessary/duplicate checks for dangerous tiles
Cache the absolute map square position of the first submap
Cache mutation trait flags
@@ -1190,7 +1345,13 @@ Migrate ACT_PULP to the new activity actor system.
Migrate ACT_WAIT_STAMINA to an activity_actor
Migrate extended description (`x`->`e`) to imgui
[DEBUG] Modify hordes through overmap editor
+Added palettes to use parameters more generally
+debug dialogue + talk_topic menus
Mod Compatibility: Only load files within "mod_interactions" if requisite mod is loaded
+Refactoring armor order from Cody
+Allow construction pre_terrain to be a list of alternatives
+Refactoring Hub01 dialogues
+Remove furniture/terrain legacy alias code and JSON
Adds bash_scaling fields to use with spells
Replace some player responses with snippets
Make mutation able to use mana as resourse without EoC
@@ -1225,6 +1386,9 @@ 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
+Fix CMake build after adding freetype
+Fixes broken Windows build due to missing ImGui Freetype-related files and map::get_field function deletion
+Fixed broken Android build due to missing FreeType library
Allow the game to build on OSX
@@ -1234,6 +1398,8 @@ Make furniture->lockpick_message translatable
Add check to ensure translator comments are correctly located and extracted
Add more English names and their translations to Simplified Chinese and Japanese
Expand the Russian name list with translated English names
+Do not extract pseudoitems/some UI labels/debug strings for translations
+Audit/NO_I18N effects.json
Allow new KEYBDINGS window title to be translated
Omit unnecessary lines from translations
Dont extract monster guns and spells for translation
diff --git a/data/json/flags.json b/data/json/flags.json
index 8e7963d784057..eee22730383d9 100644
--- a/data/json/flags.json
+++ b/data/json/flags.json
@@ -662,7 +662,7 @@
{
"id": "PRESERVE_SPAWN_OMT",
"type": "json_flag",
- "//": "This item will store the OMT it spawned in in the 'spawn_location_omt' var"
+ "//": "This item will store the OMT it spawned in the 'spawn_location_omt' var"
},
{
"id": "PROVIDES_TECHNIQUES",
diff --git a/data/json/itemgroups/Weapons_Mods_Ammo/ammo.json b/data/json/itemgroups/Weapons_Mods_Ammo/ammo.json
index 65971fb5207b0..34e1635e90c5b 100644
--- a/data/json/itemgroups/Weapons_Mods_Ammo/ammo.json
+++ b/data/json/itemgroups/Weapons_Mods_Ammo/ammo.json
@@ -566,7 +566,7 @@
{
"type": "item_group",
"id": "ammo_launcher_grenade_adapter",
- "//": "Adapters for for firing multiples of civilian legal ammo from a greneade launcher",
+ "//": "Adapters for firing multiples of civilian legal ammo from a greneade launcher",
"subtype": "distribution",
"entries": [ { "item": "40x46mm_hornets_nest_22lr", "prob": 50 }, { "item": "40x46mm_hornets_nest_410", "prob": 50 } ]
},
diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json
index 754e5b3159b70..2d4ed2521f14d 100644
--- a/data/json/items/armor/boots.json
+++ b/data/json/items/armor/boots.json
@@ -423,6 +423,7 @@
"weight": "907 g",
"volume": "1 L",
"price": "25 USD",
+ "price_postapoc": "6 USD 50 cent",
"to_hit": { "grip": "none", "length": "hand", "surface": "any", "balance": "clumsy" },
"material": [ "plastic", "steel" ],
"symbol": "[",
diff --git a/data/json/items/armor/jewelry.json b/data/json/items/armor/jewelry.json
index ff4b7e0512cf2..03728c845587f 100644
--- a/data/json/items/armor/jewelry.json
+++ b/data/json/items/armor/jewelry.json
@@ -132,7 +132,6 @@
"weight": "10 g",
"volume": "1 ml",
"price": "500 USD",
- "price_postapoc": "2 USD 50 cent",
"material": [ "gold" ],
"symbol": "[",
"looks_like": "gold_dental_grill",
@@ -149,7 +148,7 @@
"weight": "10 g",
"volume": "1 ml",
"price": "300 USD",
- "price_postapoc": "1 USD",
+ "price_postapoc": "25 cent",
"material": [ { "type": "gold", "portion": 9 }, { "type": "gemstone" } ],
"symbol": "[",
"looks_like": "gold_dental_grill",
@@ -590,7 +589,7 @@
"weight": "9 g",
"volume": "1 ml",
"price": "35 USD",
- "price_postapoc": "1 USD",
+ "price_postapoc": "45 cent",
"material": [ { "type": "silver", "portion": 9 }, { "type": "gemstone" } ],
"looks_like": "cufflinks",
"symbol": "[",
@@ -745,7 +744,7 @@
"weight": "15 g",
"volume": "1 ml",
"price": "35 USD",
- "price_postapoc": "1 USD",
+ "price_postapoc": "75 cent",
"material": [ { "type": "platinum", "portion": 9 }, { "type": "gemstone" } ],
"looks_like": "cufflinks",
"symbol": "[",
@@ -1142,7 +1141,7 @@
"weight": "60 g",
"volume": "15 ml",
"price": "10 USD",
- "price_postapoc": "10 USD",
+ "price_postapoc": "75 cent",
"material": [ { "type": "bone", "portion": 8 }, { "type": "silver", "portion": 2 } ],
"symbol": "[",
"color": "white",
@@ -1635,7 +1634,7 @@
"weight": "15 g",
"volume": "1 ml",
"price": "150 USD",
- "price_postapoc": "1 USD",
+ "price_postapoc": "25 cent",
"material": [ "platinum", "silver" ],
"symbol": "[",
"color": "white",
@@ -1965,7 +1964,7 @@
"weight": "60 g",
"volume": "8 ml",
"price": "50 USD",
- "price_postapoc": "7 USD",
+ "price_postapoc": "1 USD",
"material": [ "brass" ],
"symbol": "[",
"color": "yellow",
@@ -1986,8 +1985,7 @@
"copy-from": "badge_abstract",
"type": "ARMOR",
"name": { "str": "detective badge" },
- "description": "A tarnished golden shield gives an air of authority to the wearer.",
- "price_postapoc": "5 USD"
+ "description": "A tarnished golden shield gives an air of authority to the wearer."
},
{
"id": "badge_marshal",
@@ -2166,7 +2164,7 @@
"weight": "18 mg",
"volume": "1 ml",
"price": "100 USD",
- "price_postapoc": "25 cent",
+ "price_postapoc": "75 cent",
"material": [ { "type": "gold", "portion": 9 }, { "type": "gemstone" } ],
"looks_like": "gold_ear",
"symbol": "[",
@@ -2283,7 +2281,6 @@
"name": { "str": "pair of diamond and silver earrings", "str_pl": "pairs of diamond and silver earrings" },
"description": "A pair of shiny diamond and silver earrings.",
"price": "80 USD",
- "price_postapoc": "20 USD",
"material": [ { "type": "silver", "portion": 9 }, { "type": "diamond" } ],
"color": "white"
},
@@ -2295,7 +2292,7 @@
"weight": "10 mg",
"volume": "1 ml",
"price": "60 USD",
- "price_postapoc": "10 USD",
+ "price_postapoc": "45 cent",
"material": [ { "type": "silver", "portion": 9 }, { "type": "gemstone" } ],
"looks_like": "silver_ear",
"symbol": "[",
@@ -2570,7 +2567,7 @@
"weight": "18 mg",
"volume": "1 ml",
"price": "100 USD",
- "price_postapoc": "18 USD",
+ "price_postapoc": "75 cent",
"material": [ { "type": "gold", "portion": 9 }, { "type": "gemstone" } ],
"looks_like": "gold_ring",
"symbol": "[",
@@ -4846,7 +4843,7 @@
"symbol": "u",
"color": "white",
"price": "10 USD",
- "price_postapoc": "10 USD",
+ "price_postapoc": "10 cent",
"weight": "42 g",
"volume": "30 ml",
"material": "bone",
@@ -4911,7 +4908,7 @@
"volume": "2 L",
"longest_side": "106 cm",
"price": "39 USD",
- "price_postapoc": "5 USD",
+ "price_postapoc": "25 cent",
"material": [ "nylon" ],
"symbol": "[",
"looks_like": "ragpouch",
diff --git a/data/json/items/armor/suits_clothes.json b/data/json/items/armor/suits_clothes.json
index a9a18d6e9caba..4379a460b4d28 100644
--- a/data/json/items/armor/suits_clothes.json
+++ b/data/json/items/armor/suits_clothes.json
@@ -8,7 +8,6 @@
"volume": "3250 ml",
"price": "2 kUSD 110 USD",
"price_postapoc": "50 cent",
- "to_hit": -3,
"material": [ "leather" ],
"symbol": "[",
"looks_like": "armor_larmor",
@@ -166,7 +165,6 @@
"volume": "5750 ml",
"price": "25 USD",
"price_postapoc": "10 cent",
- "to_hit": -3,
"material": [ "cotton", "plastic" ],
"symbol": "[",
"looks_like": "touring_suit",
@@ -194,7 +192,6 @@
"volume": "3300 ml",
"price": "65 USD 50 cent",
"price_postapoc": "8 USD",
- "to_hit": -3,
"material": [ "denim" ],
"symbol": "[",
"color": "light_blue",
@@ -259,7 +256,6 @@
"volume": "12 L",
"price": "2 kUSD 500 USD",
"price_postapoc": "10 USD",
- "to_hit": -3,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "wolfsuit",
@@ -284,7 +280,6 @@
"volume": "12 L",
"price": "2 kUSD 500 USD",
"price_postapoc": "10 USD",
- "to_hit": -3,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "wolfsuit",
@@ -308,7 +303,6 @@
"volume": "12 L",
"price": "2 kUSD 500 USD",
"price_postapoc": "10 USD",
- "to_hit": -3,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "dinosuit",
@@ -334,7 +328,6 @@
"volume": "12 L",
"price": "2 kUSD 500 USD",
"price_postapoc": "10 USD",
- "to_hit": -3,
"material": [ "cotton", "faux_fur" ],
"symbol": "[",
"looks_like": "wolfsuit",
@@ -410,7 +403,6 @@
"volume": "3500 ml",
"price": "89 USD",
"price_postapoc": "50 cent",
- "to_hit": -3,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "touring_suit",
@@ -463,7 +455,6 @@
"volume": "5 L",
"price": "200 USD",
"price_postapoc": "50 cent",
- "to_hit": -3,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "jumpsuit",
@@ -618,7 +609,6 @@
"volume": "1000 ml",
"price": "100 USD",
"price_postapoc": "10 USD",
- "to_hit": -3,
"material": [ "canvas" ],
"symbol": "[",
"looks_like": "jumpsuit",
@@ -707,7 +697,6 @@
"volume": "2000 ml",
"price": "120 USD",
"price_postapoc": "12 USD 50 cent",
- "to_hit": -3,
"material": [ "cotton", "canvas" ],
"symbol": "[",
"looks_like": "technician_coveralls",
@@ -805,7 +794,6 @@
"volume": "5 L",
"price": "110 USD",
"price_postapoc": "50 cent",
- "to_hit": -3,
"material": [ "cotton", "plastic" ],
"symbol": "[",
"looks_like": "jumpsuit",
@@ -853,7 +841,6 @@
"volume": "12 L",
"price": "2 kUSD 500 USD",
"price_postapoc": "10 USD",
- "to_hit": -3,
"material": [ "cotton", "faux_fur" ],
"symbol": "[",
"color": "light_gray",
@@ -880,7 +867,6 @@
"volume": "3 L",
"price": "80 USD",
"price_postapoc": "3 USD 50 cent",
- "to_hit": -1,
"material": [ "wool" ],
"symbol": "[",
"looks_like": "touring_suit",
diff --git a/data/json/items/armor/swimming.json b/data/json/items/armor/swimming.json
index fe4991e91fc79..32c84ab8d74f6 100644
--- a/data/json/items/armor/swimming.json
+++ b/data/json/items/armor/swimming.json
@@ -565,7 +565,6 @@
"volume": "750 ml",
"price": "18 USD",
"price_postapoc": "50 cent",
- "to_hit": 1,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "shorts",
@@ -767,7 +766,6 @@
"volume": "5 L",
"price": "120 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
"material": [ "neoprene", "nylon" ],
"symbol": "[",
"color": "dark_gray",
@@ -832,7 +830,6 @@
"volume": "6 L",
"price": "100 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
"material": [ "neoprene", "nylon" ],
"symbol": "[",
"color": "dark_gray",
@@ -1236,7 +1233,6 @@
"volume": "4 L",
"price": "65 USD",
"price_postapoc": "2 USD 50 cent",
- "to_hit": -3,
"material": [ "neoprene", "nylon" ],
"symbol": "[",
"color": "dark_gray",
@@ -1516,7 +1512,6 @@
"volume": "4 L",
"price": "100 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
"material": [ "neoprene" ],
"symbol": "[",
"looks_like": "wetsuit",
@@ -1656,7 +1651,6 @@
"volume": "3500 ml",
"price": "350 USD",
"price_postapoc": "60 USD",
- "to_hit": -1,
"material": [ "lc_steel_chain" ],
"symbol": "[",
"looks_like": "chainmail_hauberk",
@@ -1705,7 +1699,6 @@
"volume": "3500 ml",
"price": "350 USD",
"price_postapoc": "50 USD",
- "to_hit": -1,
"material": [ "lc_steel_chain" ],
"symbol": "[",
"looks_like": "chainmail_suit",
@@ -1782,7 +1775,6 @@
"volume": "500 ml",
"price": "30 USD",
"price_postapoc": "1 USD",
- "to_hit": 1,
"material": [ "neoprene", "nylon" ],
"symbol": "[",
"looks_like": "gloves_tactical",
diff --git a/data/json/items/armor/torso_armor.json b/data/json/items/armor/torso_armor.json
index 718e420e9a984..f3f48e934dec5 100644
--- a/data/json/items/armor/torso_armor.json
+++ b/data/json/items/armor/torso_armor.json
@@ -9,7 +9,7 @@
"volume": "6 L",
"price": "500 USD",
"price_postapoc": "30 USD",
- "to_hit": -5,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "bronze" ],
"symbol": "[",
"looks_like": "cuirass_lightplate",
@@ -47,7 +47,7 @@
"volume": "6 L",
"price": "400 USD",
"price_postapoc": "20 USD",
- "to_hit": -5,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "bronze" ],
"symbol": "[",
"looks_like": "armor_cuirass",
@@ -290,7 +290,6 @@
"price": "200 USD",
"price_postapoc": "25 USD",
"material": [ "cotton" ],
- "to_hit": -1,
"warmth": 80,
"environmental_protection": 4,
"flags": [ "VARSIZE", "STURDY", "NORMAL", "RAINPROOF", "NO_REPAIR", "ONLY_ONE", "BLOCK_WHILE_WORN" ],
@@ -305,8 +304,7 @@
"coverage": 100,
"encumbrance": 40
}
- ],
- "melee_damage": { "bash": 4 }
+ ]
},
{
"id": "armor_lorica",
@@ -317,7 +315,6 @@
"volume": "6 L",
"price": "500 USD",
"price_postapoc": "35 USD",
- "to_hit": -5,
"material": [ "iron", "leather" ],
"symbol": "[",
"longest_side": "60 cm",
@@ -335,8 +332,7 @@
"covers": [ "arm_l", "arm_r" ],
"specifically_covers": [ "arm_shoulder_r", "arm_shoulder_l" ]
}
- ],
- "melee_damage": { "bash": 6 }
+ ]
},
{
"id": "xl_armor_lorica",
@@ -364,7 +360,7 @@
"volume": "6 L",
"price": "500 USD",
"price_postapoc": "70 USD",
- "to_hit": -5,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "fancy_bronze", "leather" ],
"symbol": "[",
"longest_side": "60 cm",
@@ -437,7 +433,7 @@
"volume": "4 L",
"price": "10 USD",
"price_postapoc": "4 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "lc_steel" ],
"repairs_with": [ "steel" ],
"symbol": "H",
@@ -510,7 +506,6 @@
"volume": "9500 ml",
"price": "42 USD",
"price_postapoc": "1 USD",
- "to_hit": -1,
"material": [ "paper" ],
"symbol": "O",
"looks_like": "armor_scrapsuit",
@@ -531,7 +526,6 @@
"volume": "9500 ml",
"price": "42 USD",
"price_postapoc": "1 USD",
- "to_hit": -1,
"material": [ "rubber" ],
"symbol": "O",
"looks_like": "armor_scrapsuit",
@@ -553,7 +547,6 @@
"longest_side": "10 cm",
"price": "100 USD",
"price_postapoc": "20 USD",
- "to_hit": -1,
"material": [ "steel" ],
"symbol": "[",
"looks_like": "vest_leather",
@@ -852,7 +845,7 @@
"volume": "6 L",
"price": "200 USD",
"price_postapoc": "40 USD",
- "to_hit": -1,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "steel", "leather" ],
"symbol": "[",
"looks_like": "chestguard_hard",
@@ -903,7 +896,7 @@
"volume": "5750 ml",
"price": "200 USD",
"price_postapoc": "50 cent",
- "to_hit": -1,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "budget_steel", "cotton" ],
"repairs_with": [ "budget_steel" ],
"symbol": "[",
@@ -951,7 +944,6 @@
"volume": "5750 ml",
"price": "200 USD",
"price_postapoc": "50 cent",
- "to_hit": -1,
"material": [ "rubber" ],
"symbol": "[",
"looks_like": "cuirass_lightplate",
@@ -1006,7 +998,6 @@
"volume": "4500 ml",
"price": "179 USD",
"price_postapoc": "25 USD",
- "to_hit": -3,
"material": [ "leather", "lc_steel" ],
"symbol": "[",
"looks_like": "jacket_leather",
@@ -1380,7 +1371,6 @@
"volume": "4 L",
"price": "350 USD",
"price_postapoc": "12 USD 50 cent",
- "to_hit": -3,
"material": [ "kevlar_layered", "nylon" ],
"symbol": "[",
"looks_like": "vest_leather",
@@ -1412,8 +1402,7 @@
"covers": [ "torso" ],
"specifically_covers": [ "torso_lower" ]
}
- ],
- "melee_damage": { "bash": 6 }
+ ]
},
{
"id": "motorbike_armor",
@@ -1497,7 +1486,6 @@
"volume": "3 L",
"price": "179 USD",
"price_postapoc": "12 USD",
- "to_hit": -3,
"material": [ "leather", "lc_steel" ],
"symbol": "[",
"looks_like": "vest_leather",
@@ -1552,7 +1540,7 @@
"volume": "8750 ml",
"price": "600 USD",
"price_postapoc": "120 USD",
- "to_hit": -5,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "leather", "lc_steel" ],
"symbol": "[",
"looks_like": "cuirass_lightplate",
@@ -1668,7 +1656,7 @@
"volume": "17500 ml",
"price": "600 USD",
"price_postapoc": "120 USD",
- "to_hit": -5,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "leather", "lc_steel" ],
"symbol": "[",
"looks_like": "armor_larmor",
@@ -1784,7 +1772,7 @@
"volume": "17500 ml",
"price": "600 USD",
"price_postapoc": "120 USD",
- "to_hit": -5,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "leather", "lc_steel" ],
"symbol": "[",
"looks_like": "armor_larmor",
@@ -1972,10 +1960,9 @@
"name": { "str": "riot chest guard" },
"description": "A hard chest protector, attached to thigh and upper arm guards. Used by riot police officers. MOLLE webbing is attached to the torso and the word POLICE is emblazoned across the front.",
"weight": "2 kg",
- "volume": "10000 ml",
+ "volume": "10 L",
"price": "400 USD",
"price_postapoc": "25 USD",
- "to_hit": -3,
"material": [ "thermo_resin", "plastic_pad" ],
"symbol": "[",
"looks_like": "chestguard_hard",
@@ -2025,7 +2012,6 @@
"volume": "3500 ml",
"price": "60 USD",
"price_postapoc": "12 USD 50 cent",
- "to_hit": -5,
"material": [ "leather" ],
"symbol": "[",
"longest_side": "60 cm",
@@ -2048,8 +2034,7 @@
"warmth": 25,
"material_thickness": 4,
"valid_mods": [ "steel_padded" ],
- "flags": [ "VARSIZE", "STURDY", "OUTER" ],
- "melee_damage": { "bash": 2 }
+ "flags": [ "VARSIZE", "STURDY", "OUTER" ]
},
{
"id": "xl_armor_larmor_chest",
@@ -2077,7 +2062,6 @@
"volume": "2 L",
"price": "200 USD",
"price_postapoc": "40 USD",
- "to_hit": -1,
"material": [ "lc_steel", "leather" ],
"symbol": "[",
"looks_like": "chestguard_hard",
diff --git a/data/json/items/book/abstract.json b/data/json/items/book/abstract.json
index 52a513ae0b8f2..9ed7e4cad9d41 100644
--- a/data/json/items/book/abstract.json
+++ b/data/json/items/book/abstract.json
@@ -428,7 +428,6 @@
"volume": "250 ml",
"price": "1 kUSD",
"price_postapoc": "7 USD 50 cent",
- "to_hit": -1,
"material": [ "paper" ],
"skill": "electronics",
"required_level": 7,
@@ -451,7 +450,6 @@
"flags": [ "PAPER_SHAPED" ],
"price": "10 USD",
"price_postapoc": "10 USD",
- "to_hit": -1,
"material": [ "paper" ],
"symbol": ";",
"color": "light_gray"
diff --git a/data/json/items/book/misc.json b/data/json/items/book/misc.json
index 1a577c6664bdf..b6b90bda3a941 100644
--- a/data/json/items/book/misc.json
+++ b/data/json/items/book/misc.json
@@ -1304,8 +1304,8 @@
{
"id": "book_judaica_softcover_1",
"name": {
- "str": "A Short History of the Jewish People: From Legendary Times to to Modern Statehood",
- "str_pl": "copies of A Short History of the Jewish People: From Legendary Times to to Modern Statehood"
+ "str": "A Short History of the Jewish People: From Legendary Times to Modern Statehood",
+ "str_pl": "copies of A Short History of the Jewish People: From Legendary Times to Modern Statehood"
},
"description": "A survey-level study of Jewish history, from Biblical times through to the 1990s. At only 250 pages long, it is by necessity very brief on any individual topic."
},
diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json
index f96de8abcee37..66a25700775bf 100644
--- a/data/json/items/chemicals_and_resources.json
+++ b/data/json/items/chemicals_and_resources.json
@@ -75,7 +75,7 @@
"id": "material_cement",
"category": "spare_parts",
"price": "2 USD",
- "price_postapoc": "10 cent",
+ "price_postapoc": "1 cent",
"name": { "str_sp": "cement powder" },
"symbol": "=",
"color": "dark_gray",
diff --git a/data/json/items/comestibles/med.json b/data/json/items/comestibles/med.json
index 9827ce3ce2a2c..7075c11ed4d2f 100644
--- a/data/json/items/comestibles/med.json
+++ b/data/json/items/comestibles/med.json
@@ -1106,7 +1106,7 @@
"volume": "1 ml",
"weight": "3 g",
"price": "7 USD 50 cent",
- "price_postapoc": "15 USD",
+ "price_postapoc": "65 cent",
"symbol": "!",
"color": "light_blue",
"use_action": {
@@ -1570,7 +1570,7 @@
"weight": "40 g",
"volume": "75 ml",
"price": "10 USD",
- "price_postapoc": "50 USD",
+ "price_postapoc": "25 USD",
"symbol": "!",
"color": "brown",
"healthy": -1,
diff --git a/data/json/items/comestibles/raw_veggy.json b/data/json/items/comestibles/raw_veggy.json
index 98be9ddecb6d5..09632834c85ab 100644
--- a/data/json/items/comestibles/raw_veggy.json
+++ b/data/json/items/comestibles/raw_veggy.json
@@ -4,8 +4,9 @@
"id": "bee_balm",
"name": { "str_sp": "bee balm" },
"description": "A snow-white flower also known as wild bergamot. Smells faintly of mint.",
+ "//": "red variety as theres no data on Monarda fistulosa, but this is similar enough - ",
"comestible_type": "FOOD",
- "calories": 2,
+ "calories": 1,
"fun": -5,
"weight": "10 g",
"color": "white",
@@ -14,7 +15,7 @@
"volume": "20 ml",
"price": "0 cent",
"price_postapoc": "0 cent",
- "vitamins": [ [ "veggy_allergen", 1 ] ]
+ "vitamins": [ [ "veggy_allergen", 1 ], [ "vitC", "136 μg" ] ]
},
{
"type": "COMESTIBLE",
diff --git a/data/json/items/containers/generic.json b/data/json/items/containers/generic.json
index cb69f15766ad5..9af8c0a4128a5 100644
--- a/data/json/items/containers/generic.json
+++ b/data/json/items/containers/generic.json
@@ -172,7 +172,6 @@
"longest_side": "150 cm",
"price": 0,
"price_postapoc": 0,
- "to_hit": -3,
"use_action": [ "CHANGE_OUTFIT" ],
"material": [ "plastic" ],
"pocket_data": [
diff --git a/data/json/items/corpses/dead_exodii.json b/data/json/items/corpses/dead_exodii.json
index 1dcaaa688a5e8..205e3614e29c3 100644
--- a/data/json/items/corpses/dead_exodii.json
+++ b/data/json/items/corpses/dead_exodii.json
@@ -11,9 +11,7 @@
"material": [ "steel" ],
"volume": "119 L",
"weight": "221 kg",
- "to_hit": -3,
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 20, "cut": 15 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -27,9 +25,7 @@
"material": [ "steel" ],
"volume": "410 L",
"weight": "498 kg",
- "to_hit": -3,
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 20, "cut": 15 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -43,9 +39,7 @@
"material": [ "steel" ],
"weight": "206 kg",
"volume": "105 L",
- "to_hit": -3,
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 20, "cut": 15 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -59,8 +53,6 @@
"material": [ "steel" ],
"volume": "70 L",
"weight": "150 kg",
- "to_hit": -3,
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 20, "cut": 15 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
}
]
diff --git a/data/json/items/corpses/dead_yrax.json b/data/json/items/corpses/dead_yrax.json
index e036a52e70785..79aaf8d824c0a 100644
--- a/data/json/items/corpses/dead_yrax.json
+++ b/data/json/items/corpses/dead_yrax.json
@@ -11,9 +11,7 @@
"material": [ "steel", "yrax_quartz" ],
"volume": "119 L",
"weight": "221 kg",
- "to_hit": -3,
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 20, "cut": 15 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -27,9 +25,7 @@
"material": [ "steel", "yrax_quartz" ],
"volume": "119 L",
"weight": "221 kg",
- "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 20, "cut": 15 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"id": "broken_golden_monolith",
@@ -42,7 +38,6 @@
"weight": "8282 kg",
"price": "50 USD",
"price_postapoc": "50 USD",
- "melee_damage": { "bash": 1000 },
"material": [ "yrax_quartz", "gold" ],
"color": "yellow",
"flags": [ "TRADER_AVOID", "NO_REPAIR" ]
@@ -79,7 +74,6 @@
"longest_side": "400 cm",
"price": "50 USD",
"price_postapoc": "50 USD",
- "melee_damage": { "bash": 100 },
"material": [ "yrax_quartz", "gold" ],
"color": "yellow",
"flags": [ "TRADER_AVOID", "NO_REPAIR" ]
@@ -96,7 +90,6 @@
"longest_side": "400 cm",
"price": "50 USD",
"price_postapoc": "50 USD",
- "melee_damage": { "bash": 100 },
"material": [ "yrax_quartz", "gold" ],
"color": "yellow",
"flags": [ "TRADER_AVOID", "NO_REPAIR" ]
diff --git a/data/json/items/corpses/inactive_bots.json b/data/json/items/corpses/inactive_bots.json
index 035e622b19e6d..f7e7894e4bef5 100644
--- a/data/json/items/corpses/inactive_bots.json
+++ b/data/json/items/corpses/inactive_bots.json
@@ -4,11 +4,11 @@
"type": "TOOL",
"name": { "str": "inactive EMP hack" },
"description": "An inactive EMP hack. Manhacks are fist-sized robots that fly through the air. This one contains an EMP grenade and attacks by flying at its target and detonating. Use this item to reprogram and release the EMP hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
- "weight": "2000 g",
+ "weight": "2 kg",
"volume": "750 ml",
"price": "645 USD",
"price_postapoc": "30 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "cyan",
@@ -34,7 +34,7 @@
"volume": "250 ml",
"price": "675 USD",
"price_postapoc": "30 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "light_gray",
@@ -60,7 +60,7 @@
"volume": "750 ml",
"price": "595 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "dark_gray",
@@ -82,11 +82,11 @@
"type": "TOOL",
"name": { "str": "inactive tear gas hack" },
"description": "An inactive tear gas hack. Manhacks are fist-sized robots that fly through the air. This one contains a tear gas canister and attacks by flying at its target and releasing the gas. Use this item to reprogram and activate the tear gas hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
- "weight": "3000 g",
+ "weight": "3 kg",
"volume": "750 ml",
"price": "605 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "dark_gray",
@@ -108,11 +108,11 @@
"type": "TOOL",
"name": { "str": "inactive grenade hack" },
"description": "An inactive grenade hack. Manhacks are fist-sized robots that fly through the air. This one contains a grenade and attacks by flying at its target and detonating. Use this item to reprogram and activate the grenade hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
- "weight": "2000 g",
+ "weight": "2 kg",
"volume": "250 ml",
"price": "600 USD",
"price_postapoc": "10 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "green",
@@ -138,7 +138,6 @@
"volume": "30 L",
"price": "5 kUSD 5 USD",
"price_postapoc": "80 USD",
- "to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
"color": "red",
@@ -149,8 +148,7 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE", "NO_SALVAGE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE", "NO_SALVAGE" ]
},
{
"id": "bot_manhack",
@@ -161,7 +159,7 @@
"volume": "750 ml",
"price": "600 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "light_green",
@@ -186,7 +184,6 @@
"weight": "172 kg",
"volume": "30 L",
"price": "5 kUSD",
- "to_hit": -3,
"price_postapoc": "50 USD",
"material": [ "steel", "plastic" ],
"symbol": ";",
@@ -198,8 +195,7 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE", "NO_SALVAGE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE", "NO_SALVAGE" ]
},
{
"id": "bot_crows_m240",
@@ -210,7 +206,6 @@
"volume": "30 L",
"price": "5 kUSD",
"price_postapoc": "60 USD",
- "to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
"color": "green",
@@ -221,19 +216,17 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE", "NO_SALVAGE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE", "NO_SALVAGE" ]
},
{
"id": "bot_turret_riot",
"type": "TOOL",
"name": { "str": "inactive riot control turret" },
"description": "An inactive riot control turret. Using this item involves loading the unit with the 40x46mm M1006 sponge rounds in your inventory (if you wish to divide your ammunition, set aside whatever beanbag rounds you do NOT want to give the turret), turning it on, and placing it on the ground, where it will attach itself. If programmed successfully, the turret will then identify you as a friendly, and attack all enemies with its riot control gun.",
- "weight": "125000 g",
+ "weight": "125 kg",
"volume": "60 L",
"price": "2 kUSD 5 USD",
"price_postapoc": "20 USD",
- "to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
"color": "red",
@@ -244,8 +237,7 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE", "NO_SALVAGE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE", "NO_SALVAGE" ]
},
{
"id": "bot_turret",
@@ -256,7 +248,6 @@
"volume": "30 L",
"price": "4 kUSD",
"price_postapoc": "30 USD",
- "to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
"color": "light_green",
@@ -267,8 +258,7 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_secubot",
@@ -279,7 +269,6 @@
"volume": "30 L",
"price": "7 kUSD 500 USD",
"price_postapoc": "40 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "light_green",
@@ -292,8 +281,7 @@
"moves": 150,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_talon_m202a1",
@@ -304,7 +292,6 @@
"volume": "30 L",
"price": "7 kUSD 500 USD",
"price_postapoc": "30 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "light_green",
@@ -317,8 +304,7 @@
"moves": 150,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_secubot_liberty",
@@ -329,7 +315,6 @@
"volume": "30 L",
"price": "7 kUSD 500 USD",
"price_postapoc": "25 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": "F",
"color": "light_gray",
@@ -342,8 +327,7 @@
"moves": 150,
"skills": [ "electronics", "computer", "fabrication" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_nursebot",
@@ -354,7 +338,6 @@
"weight": "81500 g",
"price": "7 kUSD 500 USD",
"price_postapoc": "20 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "light_blue",
@@ -367,8 +350,7 @@
"moves": 150,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_grocerybot",
@@ -379,7 +361,6 @@
"weight": "81500 g",
"price": "7 kUSD 500 USD",
"price_postapoc": "2 USD 50 cent",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "white",
@@ -392,8 +373,7 @@
"moves": 150,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_grocerybot_busted",
@@ -404,7 +384,6 @@
"weight": "81500 g",
"price": "7 kUSD 500 USD",
"price_postapoc": "1 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "white",
@@ -417,8 +396,7 @@
"moves": 150,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_broken_cyborg",
@@ -430,7 +408,6 @@
"//": "It is a disgusting mass of rotting flesh and jagged metal pieces, no one will buy it.",
"price": "0 cent",
"price_postapoc": "0 cent",
- "to_hit": -3,
"material": [ "steel", "flesh" ],
"symbol": ";",
"color": "light_green",
@@ -444,8 +421,7 @@
"moves": 250,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_prototype_cyborg",
@@ -457,7 +433,6 @@
"//": "It is an affront to humanity, no one will buy it.",
"price": "0 cent",
"price_postapoc": "0 cent",
- "to_hit": -3,
"material": [ "steel", "flesh" ],
"symbol": ";",
"color": "light_green",
@@ -471,8 +446,7 @@
"moves": 250,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_hazmatbot",
@@ -483,7 +457,6 @@
"volume": "62500 ml",
"price": "100 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "light_green",
@@ -497,8 +470,7 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_molebot",
@@ -510,7 +482,6 @@
"volume": "62500 ml",
"price": "250 USD",
"price_postapoc": "10 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "light_green",
@@ -524,8 +495,7 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_skitterbot",
@@ -538,7 +508,6 @@
"volume": "105 L",
"price": "800 USD",
"price_postapoc": "100 USD",
- "to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
"color": "light_green",
@@ -552,8 +521,7 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE", "ROBOFAC_ROBOT_MEDIUM" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE", "ROBOFAC_ROBOT_MEDIUM" ]
},
{
"id": "bot_robofac_skittergun",
@@ -563,10 +531,9 @@
"description": "An inactive Hub 01 exterminatron. Using this item involves placing it on the ground and turning it on. If reprogrammed and reloaded successfully, the robot will track you while providing fire-support.",
"//": "Volume and weight based on Boston Dynamics Spot.",
"volume": "125 L",
- "weight": "36000 g",
+ "weight": "36 kg",
"price": "800 USD",
"price_postapoc": "250 USD",
- "to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
"color": "light_green",
@@ -580,8 +547,7 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE", "ROBOFAC_ROBOT_MEDIUM" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE", "ROBOFAC_ROBOT_MEDIUM" ]
},
{
"id": "bot_science_bot",
@@ -589,11 +555,10 @@
"type": "TOOL",
"name": { "str": "inactive lab defense bot" },
"description": "An inactive experimental robot plundered from a science lab. It resembles a human-sized spider and was designed to deploy manhacks. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully, the robot will race towards enemies and deploy a variety of experimental devices.",
- "weight": "100000 g",
- "volume": "65000 ml",
+ "weight": "100 kg",
+ "volume": "65 L",
"price": "800 USD",
"price_postapoc": "15 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "light_green",
@@ -607,19 +572,17 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_turret_searchlight",
"type": "TOOL",
"name": { "str": "inactive milspec searchlight" },
"description": "An inactive military-grade automated searchlight. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully, the searchlight will then identify you as an ally, survey the area, and illuminate approaching hostiles. Seems to have an unhealthy fascination with you.",
- "weight": "120000 g",
+ "weight": "120 kg",
"volume": "92500 ml",
"price": "5 kUSD",
"price_postapoc": "10 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "light_green",
@@ -633,8 +596,7 @@
"moves": 150,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_dispatch",
@@ -645,7 +607,6 @@
"weight": "250 kg",
"price": "100 kUSD",
"price_postapoc": "100 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "yellow",
@@ -658,8 +619,7 @@
"moves": 300,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 6 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_dispatch_military",
@@ -670,7 +630,6 @@
"weight": "300 kg",
"price": "1000 kUSD",
"price_postapoc": "250 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "green",
@@ -683,8 +642,7 @@
"moves": 300,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 6 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_turret_speaker",
@@ -695,7 +653,6 @@
"volume": "50500 ml",
"price": "5 kUSD",
"price_postapoc": "100 USD",
- "to_hit": -3,
"material": [ "steel" ],
"symbol": ";",
"color": "light_green",
@@ -708,8 +665,7 @@
"moves": 150,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE" ]
},
{
"id": "bot_tazer_hack",
@@ -720,7 +676,7 @@
"volume": "750 ml",
"price": "645 USD",
"price_postapoc": "30 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "cyan",
@@ -746,13 +702,11 @@
"volume": "50 L",
"price": "645 USD",
"price_postapoc": "30 USD",
- "to_hit": -3,
"material": [ "steel", "ceramic" ],
"symbol": ",",
"color": "cyan",
"use_action": { "type": "effect_on_conditions", "menu_text": "Activate", "effect_on_conditions": [ "yrax_trifacet_activation" ] },
- "flags": [ "SINGLE_USE" ],
- "melee_damage": { "bash": 6, "cut": 6 }
+ "flags": [ "SINGLE_USE" ]
},
{
"type": "TOOL",
@@ -766,10 +720,8 @@
"material": [ "steel", "yrax_quartz" ],
"volume": "119 L",
"weight": "221 kg",
- "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" },
"flags": [ "TRADER_AVOID", "NO_REPAIR", "SINGLE_USE" ],
- "use_action": { "type": "effect_on_conditions", "menu_text": "Activate", "effect_on_conditions": [ "yrax_triakis_activation" ] },
- "melee_damage": { "bash": 20, "cut": 15 }
+ "use_action": { "type": "effect_on_conditions", "menu_text": "Activate", "effect_on_conditions": [ "yrax_triakis_activation" ] }
},
{
"id": "bot_golden_monolith",
@@ -785,7 +737,6 @@
"material": [ "yrax_quartz", "gold" ],
"color": "yellow",
"flags": [ "TRADER_AVOID", "NO_REPAIR", "SINGLE_USE" ],
- "melee_damage": { "bash": 1000 },
"use_action": {
"type": "effect_on_conditions",
"menu_text": "Activate",
@@ -822,7 +773,7 @@
"volume": "750 ml",
"price": "600 USD",
"price_postapoc": "8 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "light_green",
@@ -848,7 +799,7 @@
"volume": "750 ml",
"price": "600 USD",
"price_postapoc": "8 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "light_green",
@@ -874,7 +825,7 @@
"volume": "750 ml",
"price": "600 USD",
"price_postapoc": "8 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "yellow",
@@ -900,7 +851,7 @@
"volume": "750 ml",
"price": "600 USD",
"price_postapoc": "8 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "blue",
@@ -926,7 +877,7 @@
"volume": "750 ml",
"price": "600 USD",
"price_postapoc": "8 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "cyan",
@@ -952,7 +903,7 @@
"volume": "750 ml",
"price": "600 USD",
"price_postapoc": "8 USD",
- "to_hit": -3,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "line", "balance": "clumsy" },
"material": [ "aluminum", "plastic" ],
"symbol": ",",
"color": "dark_gray",
@@ -979,7 +930,6 @@
"volume": "30 L",
"price": "100 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
"color": "light_green",
@@ -992,7 +942,6 @@
"moves": 100,
"skills": [ "electronics", "computer" ]
},
- "flags": [ "SINGLE_USE", "NO_SALVAGE" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "SINGLE_USE", "NO_SALVAGE" ]
}
]
diff --git a/data/json/items/fluff.json b/data/json/items/fluff.json
index d29757620eb36..1fc5b566de392 100644
--- a/data/json/items/fluff.json
+++ b/data/json/items/fluff.json
@@ -1243,7 +1243,7 @@
"type": "GENERIC",
"category": "other",
"name": { "str_sp": "Snakes and Ladders" },
- "description": "A board game for two or more players, regarded before the Cataclysm as as a worldwide classic. The objective of the game is to navigate one's game piece to the goal on the board, helped by climbing ladders but hindered by sliding down snakes.",
+ "description": "A board game for two or more players, regarded before the Cataclysm as a worldwide classic. The objective of the game is to navigate one's game piece to the goal on the board, helped by climbing ladders but hindered by sliding down snakes.",
"weight": "300 g",
"volume": "1800 ml",
"price": "25 cent",
diff --git a/data/json/items/furniture/seating.json b/data/json/items/furniture/seating.json
index 6a93f4a437fb6..5c45caa69cffd 100644
--- a/data/json/items/furniture/seating.json
+++ b/data/json/items/furniture/seating.json
@@ -13,7 +13,8 @@
"volume": "30 L",
"weight": "12 kg",
"material": [ "wood" ],
- "to_hit": -3
+ "to_hit": { "grip": "none", "length": "long", "surface": "any", "balance": "clumsy" },
+ "melee_damage": { "bash": 6 }
},
{
"type": "GENERIC",
@@ -28,8 +29,9 @@
"longest_side": "110 cm",
"volume": "570 L",
"weight": "27 kg",
- "material": [ { "type": "cotton", "portion": 75 }, { "type": "wood", "portion": 25 } ],
- "to_hit": -4
+ "material": [ { "type": "cotton", "portion": 3 }, { "type": "wood", "portion": 1 } ],
+ "to_hit": { "grip": "bad", "length": "long", "surface": "any", "balance": "clumsy" },
+ "melee_damage": { "bash": 6 }
},
{
"type": "GENERIC",
@@ -44,7 +46,9 @@
"longest_side": "45 cm",
"volume": "17 L",
"weight": "3 kg",
- "material": [ "wood" ]
+ "material": [ "wood" ],
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
+ "melee_damage": { "bash": 6 }
},
{
"type": "GENERIC",
@@ -59,7 +63,9 @@
"longest_side": "50 cm",
"volume": "20 L",
"weight": "11 kg",
- "material": [ "wood" ]
+ "material": [ "wood" ],
+ "to_hit": { "grip": "bad", "length": "short", "surface": "any", "balance": "clumsy" },
+ "melee_damage": { "bash": 6 }
},
{
"type": "GENERIC",
@@ -73,7 +79,10 @@
"longest_side": "80 cm",
"volume": "30 L",
"weight": "7500 g",
- "material": [ { "type": "steel", "portion": 975 }, { "type": "leather", "portion": 25 } ]
+ "material": [ { "type": "steel", "portion": 39 }, { "type": "leather", "portion": 1 } ],
+ "flags": [ "NO_SALVAGE" ],
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
+ "melee_damage": { "bash": 6 }
},
{
"type": "GENERIC",
@@ -88,8 +97,9 @@
"longest_side": "80 cm",
"volume": "30 L",
"weight": "5 kg",
- "material": [ { "type": "wood", "portion": 85 }, { "type": "steel", "portion": 15 } ],
- "to_hit": -3
+ "material": [ { "type": "wood", "portion": 17 }, { "type": "steel", "portion": 3 } ],
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
+ "melee_damage": { "bash": 6 }
},
{
"type": "GENERIC",
diff --git a/data/json/items/furniture/storage.json b/data/json/items/furniture/storage.json
index dfe264e7cf7bd..fda23c54e3229 100644
--- a/data/json/items/furniture/storage.json
+++ b/data/json/items/furniture/storage.json
@@ -25,6 +25,7 @@
],
"use_action": { "type": "deploy_furn", "furn_type": "f_foot_locker_aluminum" },
"to_hit": { "grip": "bad", "length": "long", "surface": "any", "balance": "clumsy" },
+ "melee_damage": { "bash": 6 },
"//": "Weight and pocket data recalculated from foot_locker with the use of the same resources but with the assumption that walls are gauge 16 aluminum."
},
{
diff --git a/data/json/items/generic.json b/data/json/items/generic.json
index 0317981cbd479..856c74d050be2 100644
--- a/data/json/items/generic.json
+++ b/data/json/items/generic.json
@@ -866,6 +866,7 @@
"//1": "It's specifically not rigid because volume of candlestick and candle should be additive.",
"max_contains_weight": "500 g",
"max_contains_volume": "550 ml",
+ "max_item_length": "300 mm",
"item_restriction": [ "candle", "candle_lit" ],
"transparent": true
}
@@ -1465,9 +1466,7 @@
"material": [ "steel", "plastic" ],
"weight": "31520 g",
"volume": "15 L",
- "to_hit": { "grip": "bad", "length": "short", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR", "NO_SALVAGE" ],
- "melee_damage": { "bash": 6, "cut": 6 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR", "NO_SALVAGE" ]
},
{
"type": "GENERIC",
@@ -1482,9 +1481,7 @@
"material": [ "steel", "plastic" ],
"weight": "32700 g",
"volume": "105 L",
- "to_hit": { "grip": "bad", "length": "short", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 4, "cut": 4 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1499,9 +1496,7 @@
"material": [ "steel", "plastic" ],
"weight": "32700 g",
"volume": "105 L",
- "to_hit": { "grip": "bad", "length": "long", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 4, "cut": 4 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1515,10 +1510,8 @@
"price_postapoc": "10 cent",
"material": [ "steel", "plastic" ],
"weight": "100 kg",
- "volume": "65000 ml",
- "to_hit": { "grip": "bad", "length": "long", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 4, "cut": 4 }
+ "volume": "65 L",
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1533,9 +1526,7 @@
"material": [ "steel", "plastic" ],
"weight": "140 kg",
"volume": "62500 ml",
- "to_hit": { "grip": "bad", "length": "long", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 6, "cut": 6 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1550,9 +1541,7 @@
"material": [ "steel", "plastic" ],
"weight": "140 kg",
"volume": "62500 ml",
- "to_hit": { "grip": "bad", "length": "long", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 6, "cut": 6 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1567,9 +1556,7 @@
"material": [ "steel", "plastic" ],
"weight": "140 kg",
"volume": "62500 ml",
- "to_hit": { "grip": "bad", "length": "long", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 6, "cut": 6 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1590,9 +1577,7 @@
"material": [ "steel", "plastic" ],
"weight": "140 kg",
"volume": "62500 ml",
- "to_hit": { "grip": "bad", "length": "long", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID" ],
- "melee_damage": { "bash": 6, "cut": 6 }
+ "flags": [ "TRADER_AVOID" ]
},
{
"type": "GENERIC",
@@ -1607,9 +1592,7 @@
"material": [ "steel", "plastic" ],
"weight": "170200 g",
"volume": "62500 ml",
- "to_hit": { "grip": "bad", "length": "long", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 6, "cut": 10 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1620,12 +1603,10 @@
"volume": "125 L",
"price": "10 USD",
"price_postapoc": "10 cent",
- "to_hit": { "grip": "bad", "length": "long", "surface": "any", "balance": "clumsy" },
"material": [ "superalloy" ],
"symbol": ";",
"color": "light_green",
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 7 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1636,12 +1617,10 @@
"volume": "250 L",
"price": "10 USD",
"price_postapoc": "10 cent",
- "to_hit": { "grip": "bad", "length": "long", "surface": "any", "balance": "clumsy" },
"material": [ "superalloy" ],
"symbol": ";",
"color": "light_green",
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1652,12 +1631,10 @@
"volume": "250 L",
"price": "10 USD",
"price_postapoc": "10 cent",
- "to_hit": { "grip": "bad", "length": "long", "surface": "any", "balance": "clumsy" },
"material": [ "superalloy" ],
"symbol": ";",
"color": "light_green",
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 8 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "GENERIC",
@@ -1672,9 +1649,7 @@
"material": [ "steel", "plastic" ],
"weight": "100 kg",
"volume": "85 L",
- "to_hit": { "grip": "bad", "length": "long", "surface": "line", "balance": "clumsy" },
- "flags": [ "TRADER_AVOID", "NO_REPAIR" ],
- "melee_damage": { "bash": 4, "cut": 4 }
+ "flags": [ "TRADER_AVOID", "NO_REPAIR" ]
},
{
"type": "AMMO",
@@ -2942,7 +2917,7 @@
"material": [ "cotton" ],
"weight": "514 g",
"container": "pillowcase",
- "volume": "1 L",
+ "volume": "40 L",
"flags": [ "SLEEP_AID" ],
"category": "other"
},
@@ -2958,7 +2933,7 @@
"material": [ "paper" ],
"weight": "514 g",
"container": "pillowcase",
- "volume": "1 L",
+ "volume": "40 L",
"flags": [ "SLEEP_AID" ],
"category": "other"
},
@@ -2973,7 +2948,7 @@
"price_postapoc": "1 USD",
"material": [ "cotton" ],
"weight": "774 g",
- "volume": "1750 ml",
+ "volume": "70 L",
"flags": [ "SLEEP_AID" ],
"variant_type": "generic",
"variants": [
@@ -3069,7 +3044,7 @@
"material": [ "cotton" ],
"weight": "514 g",
"container": "pillowcase",
- "volume": "1 L",
+ "volume": "40 L",
"flags": [ "SLEEP_AID" ],
"category": "other"
},
@@ -3101,6 +3076,7 @@
"volume": "15 ml",
"category": "drugs",
"emits": [ "emit_tobacco_trail" ],
+ "revert_to": "cigar_butt",
"use_action": [
{ "type": "firestarter", "moves": 200, "moves_slow": 2000 },
{
@@ -3148,6 +3124,7 @@
"volume": "4 ml",
"category": "drugs",
"emits": [ "emit_tobacco_trail" ],
+ "revert_to": "cig_butt",
"use_action": [
{ "type": "firestarter", "moves": 200, "moves_slow": 2000 },
{
@@ -3195,6 +3172,7 @@
"volume": "4 ml",
"category": "drugs",
"emits": [ "emit_joint_trail" ],
+ "revert_to": "joint_roach",
"use_action": [
{ "type": "firestarter", "moves": 200, "moves_slow": 2000 },
{
diff --git a/data/json/items/generic/bathroom_house.json b/data/json/items/generic/bathroom_house.json
index 2b7fb3e8baa42..f64d16f5bec99 100644
--- a/data/json/items/generic/bathroom_house.json
+++ b/data/json/items/generic/bathroom_house.json
@@ -10,9 +10,7 @@
"price_postapoc": "0 cent",
"weight": "100 g",
"volume": "100 ml",
- "material": [ "plastic" ],
- "to_hit": -1,
- "melee_damage": { "bash": 1 }
+ "material": [ "plastic" ]
},
{
"id": "soap_holder",
@@ -177,7 +175,6 @@
"volume": "400 ml",
"longest_side": "24 cm",
"price": "6 USD",
- "to_hit": { "grip": "solid", "length": "short", "surface": "any", "balance": "neutral" },
"snippet_category": [
{ "id": "hbrush1", "text": "An instrument of hair torture. There are round safety tips on the bristles." },
{ "id": "hbrush2", "text": "An old-fashioned hair-straightening device with a faux-wood handle." },
@@ -240,8 +237,8 @@
"volume": "2100 ml",
"//": "the volume is pretty bulky, but this is an old fashioned model.",
"material": [ "wood", "rubber" ],
- "to_hit": -1,
- "melee_damage": { "bash": 5 }
+ "to_hit": { "grip": "solid", "length": "short", "surface": "any", "balance": "neutral" },
+ "melee_damage": { "bash": 2 }
},
{
"id": "plunger_futuristic",
@@ -254,9 +251,7 @@
"price_postapoc": "10 cent",
"weight": "680 g",
"volume": "2400 ml",
- "material": [ "plastic" ],
- "to_hit": -1,
- "melee_damage": { "bash": 2 }
+ "material": [ "plastic" ]
},
{
"id": "toilet_paper",
@@ -305,8 +300,8 @@
"charges_per_use": 35,
"use_action": [ { "type": "link_up", "cable_length": 2, "charge_rate": "1500 W" } ],
"charged_qualities": [ [ "WINNOW", 1 ], [ "BLOW_HOT_AIR", 1 ] ],
- "to_hit": -1,
- "melee_damage": { "bash": 3 }
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
+ "melee_damage": { "bash": 2 }
},
{
"id": "curling_iron",
@@ -320,7 +315,7 @@
"volume": "250 ml",
"weight": "590 g",
"material": [ "ceramic", "steel" ],
- "to_hit": 1,
+ "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "uneven" },
"melee_damage": { "bash": 3 }
},
{
@@ -334,9 +329,7 @@
"price_postapoc": "0 cent",
"volume": "500 ml",
"weight": "160 g",
- "material": [ "steel", "plastic" ],
- "to_hit": 1,
- "melee_damage": { "bash": 3 }
+ "material": [ "steel", "plastic" ]
},
{
"id": "comb_lice",
diff --git a/data/json/items/generic/bedding.json b/data/json/items/generic/bedding.json
index cf9944d138916..406ddda31f653 100644
--- a/data/json/items/generic/bedding.json
+++ b/data/json/items/generic/bedding.json
@@ -10,10 +10,9 @@
"volume": "90 ml",
"price": "6 USD 50 cent",
"price_postapoc": "2 cent",
- "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "clumsy" },
"material": [ "cotton" ],
"flags": [ "SLEEP_AID_CONTAINER" ],
- "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "15 L", "max_contains_weight": "15 kg", "moves": 400 } ],
+ "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "42 L", "max_contains_weight": "15 kg", "moves": 400 } ],
"symbol": ")",
"color": "white",
"//": "Based on https://www.amazon.com/dp/B01MUDQUN9"
@@ -57,7 +56,6 @@
"volume": "564 ml",
"price": "20 USD",
"price_postapoc": "50 cent",
- "to_hit": -1,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "blanket",
@@ -82,7 +80,6 @@
"volume": "15500 ml",
"price": "15 USD",
"price_postapoc": "50 cent",
- "to_hit": { "grip": "none", "length": "long", "surface": "any", "balance": "clumsy" },
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "towel",
@@ -197,7 +194,6 @@
"volume": "15 L",
"price": "55 USD",
"price_postapoc": "1 USD 50 cent",
- "to_hit": -1,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "blanket",
@@ -223,7 +219,6 @@
"volume": "31 L",
"price": "195 USD",
"price_postapoc": "2 USD 50 cent",
- "to_hit": -1,
"material": [ "cotton", "fur" ],
"symbol": "[",
"looks_like": "blanket",
@@ -249,7 +244,6 @@
"volume": "5 L",
"price": "55 USD",
"price_postapoc": "2 USD",
- "to_hit": -1,
"material": [ "wool" ],
"symbol": "[",
"color": "white",
@@ -316,7 +310,6 @@
"volume": "1 L",
"price": "205 USD",
"price_postapoc": "5 USD",
- "to_hit": -1,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "blanket",
@@ -373,7 +366,6 @@
"volume": "700 ml",
"price": "5 USD",
"price_postapoc": "50 cent",
- "to_hit": -1,
"material": [ "dry_plant" ],
"symbol": "[",
"looks_like": "blanket",
@@ -398,7 +390,6 @@
"volume": "1400 ml",
"price": "10 USD",
"price_postapoc": "1 USD",
- "to_hit": -1,
"material": [ "dry_plant" ],
"symbol": "[",
"looks_like": "blanket",
diff --git a/data/json/items/generic/dining_kitchen.json b/data/json/items/generic/dining_kitchen.json
index 5e4097cdadbfa..43e10a342c492 100644
--- a/data/json/items/generic/dining_kitchen.json
+++ b/data/json/items/generic/dining_kitchen.json
@@ -11,8 +11,8 @@
"weight": "48 g",
"volume": "25 ml",
"material": [ "steel" ],
- "to_hit": -1,
- "melee_damage": { "bash": 2, "cut": 1 }
+ "to_hit": { "grip": "solid", "length": "hand", "surface": "point", "balance": "neutral" },
+ "melee_damage": { "cut": 1 }
},
{
"abstract": "base_utensil",
@@ -26,8 +26,8 @@
"weight": "158 g",
"volume": "75 ml",
"material": [ "steel" ],
- "to_hit": -1,
- "melee_damage": { "bash": 3, "cut": 2 }
+ "to_hit": { "grip": "solid", "length": "hand", "surface": "point", "balance": "neutral" },
+ "melee_damage": { "cut": 2 }
},
{
"abstract": "base_plastic_silverware",
@@ -40,8 +40,7 @@
"price_postapoc": "0 cent",
"weight": "28 g",
"volume": "25 ml",
- "material": [ "plastic" ],
- "melee_damage": { "bash": 1, "cut": 1 }
+ "material": [ "plastic" ]
},
{
"abstract": "base_ceramic_dish",
@@ -55,7 +54,8 @@
"material": [ "ceramic" ],
"weight": "375 g",
"volume": "375 ml",
- "to_hit": -1,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" },
+ "flags": [ "FRAGILE_MELEE" ],
"melee_damage": { "bash": 3 }
},
{
@@ -70,7 +70,8 @@
"material": [ "glass" ],
"weight": "322 g",
"volume": "262 ml",
- "to_hit": -1,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" },
+ "flags": [ "FRAGILE_MELEE" ],
"melee_damage": { "bash": 3 }
},
{
@@ -85,7 +86,7 @@
"material": [ "tin" ],
"weight": "262 g",
"volume": "262 ml",
- "to_hit": -1,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" },
"melee_damage": { "bash": 2 }
},
{
@@ -99,9 +100,7 @@
"price_postapoc": "0 cent",
"material": [ "plastic" ],
"weight": "130 g",
- "volume": "262 ml",
- "to_hit": -1,
- "melee_damage": { "bash": 1 }
+ "volume": "262 ml"
},
{
"abstract": "base_cookpot",
@@ -1256,12 +1255,12 @@
"category": "tools",
"name": { "str": "makeshift pot" },
"description": "A sheet of metal crudely hammered into a cooking pot. Good enough to cook food and boil water, but not as useful as proper cookware.",
- "weight": "6000 g",
+ "weight": "6 kg",
"volume": "1050 ml",
"longest_side": "20 cm",
"price": "2 USD",
"price_postapoc": "5 cent",
- "to_hit": 1,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" },
"material": [ "steel" ],
"symbol": ")",
"color": "light_gray",
@@ -1277,7 +1276,7 @@
"qualities": [ [ "COOK", 2 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ],
"use_action": [ "HEAT_ALL_ITEMS" ],
"flags": [ "ALLOWS_REMOTE_USE" ],
- "melee_damage": { "bash": 10 }
+ "melee_damage": { "bash": 6 }
},
{
"id": "pot_makeshift_copper",
@@ -1290,7 +1289,7 @@
"longest_side": "20 cm",
"price": "2 USD",
"price_postapoc": "5 cent",
- "to_hit": 1,
+ "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" },
"material": [ "copper" ],
"symbol": ")",
"color": "light_red",
@@ -1306,7 +1305,7 @@
"qualities": [ [ "COOK", 2 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ],
"use_action": [ "HEAT_ALL_ITEMS" ],
"flags": [ "ALLOWS_REMOTE_USE" ],
- "melee_damage": { "bash": 10 }
+ "melee_damage": { "bash": 2 }
},
{
"type": "GENERIC",
@@ -1400,10 +1399,8 @@
"material": [ "steel" ],
"weight": "300 g",
"volume": "250 ml",
- "to_hit": -1,
"qualities": [ [ "COOK", 1 ], [ "CONTAIN", 1 ] ],
- "use_action": [ "HEAT_SOLID_ITEMS" ],
- "melee_damage": { "bash": 2 }
+ "use_action": [ "HEAT_SOLID_ITEMS" ]
},
{
"type": "GENERIC",
diff --git a/data/json/items/generic/spares.json b/data/json/items/generic/spares.json
index 053391d75e325..503392918131b 100644
--- a/data/json/items/generic/spares.json
+++ b/data/json/items/generic/spares.json
@@ -142,10 +142,10 @@
"material": [ "steel" ],
"weight": "7 kg",
"volume": "3 L",
- "to_hit": -4,
+ "to_hit": { "grip": "bad", "length": "short", "surface": "any", "balance": "clumsy" },
"price": "100 USD",
"price_postapoc": "20 USD",
- "melee_damage": { "bash": 16 }
+ "melee_damage": { "bash": 8 }
},
{
"id": "nitrogen_membrane_filter",
diff --git a/data/json/items/generic/storage.json b/data/json/items/generic/storage.json
index ca905469cb6c5..9fa074c02977c 100644
--- a/data/json/items/generic/storage.json
+++ b/data/json/items/generic/storage.json
@@ -23,7 +23,6 @@
"longest_side": "45 cm",
"price": "40 USD",
"price_postapoc": "2 USD",
- "to_hit": -1,
"material": [ "nylon" ],
"symbol": "[",
"looks_like": "rope_6",
diff --git a/data/json/items/generic/toys_and_sports.json b/data/json/items/generic/toys_and_sports.json
index ae11e1f27fdbe..464ccb271f22f 100644
--- a/data/json/items/generic/toys_and_sports.json
+++ b/data/json/items/generic/toys_and_sports.json
@@ -9,7 +9,6 @@
"volume": "725 ml",
"price": "60 USD",
"price_postapoc": "0 cent",
- "to_hit": -1,
"material": [ "plastic" ],
"symbol": "|",
"color": "pink",
@@ -46,12 +45,10 @@
"longest_side": "37 cm",
"price": "12 USD",
"price_postapoc": "5 cent",
- "to_hit": -1,
"color": "blue",
"symbol": "/",
"material": [ "plastic" ],
- "flags": [ "NONCONDUCTIVE", "FLOTATION" ],
- "melee_damage": { "bash": 4 }
+ "flags": [ "NONCONDUCTIVE", "FLOTATION" ]
},
{
"id": "shuttlecock",
@@ -66,8 +63,7 @@
"price_postapoc": "0 cent",
"material": [ "rubber", "plastic" ],
"symbol": "-",
- "color": "white",
- "to_hit": -5
+ "color": "white"
},
{
"id": "golf_tee",
@@ -97,9 +93,7 @@
"price_postapoc": "0 cent",
"material": [ "plastic" ],
"symbol": "*",
- "color": "white",
- "to_hit": -3,
- "melee_damage": { "bash": 5 }
+ "color": "white"
},
{
"type": "AMMO",
@@ -117,14 +111,12 @@
"weight": "170 g",
"volume": "250 ml",
"longest_side": "57 mm",
- "damage": { "damage_type": "bash", "amount": 8 },
"range": 10,
"dispersion": 14,
"loudness": 0,
- "to_hit": -3,
"recovery_chance": 98,
"effects": [ "NEVER_MISFIRES", "NON_FOULING" ],
- "melee_damage": { "bash": 8 }
+ "thrown_damage": [ { "damage_type": "bash", "amount": 3 } ]
},
{
"type": "GENERIC",
@@ -161,10 +153,9 @@
"range": 12,
"dispersion": 12,
"loudness": 0,
- "to_hit": 3,
"recovery_chance": 99,
"effects": [ "NEVER_MISFIRES", "NON_FOULING" ],
- "thrown_damage": [ { "damage_type": "bash", "amount": 6 } ]
+ "thrown_damage": [ { "damage_type": "bash", "amount": 3 } ]
},
{
"type": "GENERIC",
@@ -179,9 +170,7 @@
"material": [ { "type": "leather", "portion": 9 }, { "type": "rubber" } ],
"weight": "400 g",
"volume": "750 ml",
- "longest_side": "29 cm",
- "to_hit": -1,
- "melee_damage": { "bash": 4 }
+ "longest_side": "29 cm"
},
{
"type": "GENERIC",
@@ -196,9 +185,7 @@
"material": [ "rubber" ],
"weight": "800 g",
"volume": "1 L",
- "longest_side": "239 mm",
- "to_hit": -1,
- "melee_damage": { "bash": 6 }
+ "longest_side": "239 mm"
},
{
"type": "GENERIC",
@@ -213,9 +200,7 @@
"material": [ "rubber" ],
"weight": "260 g",
"volume": "1 L",
- "longest_side": "26 cm",
- "to_hit": -1,
- "melee_damage": { "bash": 4 }
+ "longest_side": "26 cm"
},
{
"type": "TOOL",
diff --git a/data/json/items/gun/flintlock.json b/data/json/items/gun/flintlock.json
index 4b836fb5bf414..4066192961fb3 100644
--- a/data/json/items/gun/flintlock.json
+++ b/data/json/items/gun/flintlock.json
@@ -92,7 +92,7 @@
"durability": 6,
"blackpowder_tolerance": 96,
"clip_size": 1,
- "//": "Sources place muzzle loader firing rate at at up to 4 / minute for elite professionals. Nominal 30s will be cut down to 15s at skill 10.",
+ "//": "Sources place muzzle loader firing rate at up to 4 / minute for elite professionals. Nominal 30s will be cut down to 15s at skill 10.",
"reload": 3000,
"valid_mod_locations": [
[ "sling", 1 ],
diff --git a/data/json/items/melee/swords_and_blades.json b/data/json/items/melee/swords_and_blades.json
index 43221ec1c56f4..a00535d896abd 100644
--- a/data/json/items/melee/swords_and_blades.json
+++ b/data/json/items/melee/swords_and_blades.json
@@ -643,7 +643,7 @@
"volume": "60 ml",
"longest_side": "9 cm",
"price": "30 USD",
- "price_postapoc": "5 USD",
+ "price_postapoc": "2 USD",
"to_hit": { "grip": "solid", "length": "hand", "surface": "point", "balance": "neutral" },
"material": [ "steel", "plastic" ],
"symbol": ";",
diff --git a/data/json/items/tool/electronics.json b/data/json/items/tool/electronics.json
index 1f1678812b020..28624ef8ed7cd 100644
--- a/data/json/items/tool/electronics.json
+++ b/data/json/items/tool/electronics.json
@@ -587,7 +587,7 @@
"volume": "111 ml",
"longest_side": "15 cm",
"price": "1299 USD",
- "price_postapoc": "2 USD",
+ "price_postapoc": "1 USD",
"material": [ { "type": "aluminum", "portion": 75 }, { "type": "plastic", "portion": 25 } ],
"looks_like": "cell_phone",
"symbol": ";",
diff --git a/data/json/items/tool/explosives.json b/data/json/items/tool/explosives.json
index b5f61b08732c6..ace22dfcff91d 100644
--- a/data/json/items/tool/explosives.json
+++ b/data/json/items/tool/explosives.json
@@ -543,8 +543,7 @@
"price_postapoc": "0 cent",
"description": "This tear gas grenade has had its pin removed and is (or will shortly be) expelling highly noxious gas.",
"emits": [ "emit_tear_gas_stream" ],
- "countdown_interval": "50 seconds",
- "countdown_action": { "type": "transform", "target": "canister_empty" },
+ "revert_to": "canister_empty",
"flags": [ "TRADER_AVOID", "DANGEROUS" ]
},
{
@@ -788,7 +787,7 @@
"name": { "str": "armed smoke bomb" },
"description": "This smoke bomb has had its pin removed and is (or will shortly be) expelling thick smoke.",
"emits": [ "emit_smoke_stream" ],
- "countdown_action": { "type": "transform", "target": "canister_empty" },
+ "revert_to": "canister_empty",
"flags": [ "TRADER_AVOID" ]
},
{
@@ -1319,9 +1318,9 @@
"explosion": { "power": 34400, "shrapnel": { "casing_mass": 12600, "fragment_mass": 600 } },
"use_action": {
"target": "half_barrel_bomb_act",
- "msg": "You activate the fuze on the barrel bomb. Clear the area!",
+ "msg": "You activate the fuse on the barrel bomb. Clear the area!",
"target_timer": "100 seconds",
- "menu_text": "Activate fuze",
+ "menu_text": "Activate fuse",
"type": "transform"
},
"flags": [ "RADIO_MODABLE", "RADIO_INVOKE_PROC", "BOMB", "ALLOWS_REMOTE_USE" ],
@@ -1343,7 +1342,7 @@
"use_action": {
"type": "message",
"message": "You've already activated the bomb - clear the area immediately!",
- "name": "Activate fuze"
+ "name": "Activate fuse"
},
"explode_in_fire": true,
"explosion": { "power": 34400, "shrapnel": { "casing_mass": 12600, "fragment_mass": 600 } },
@@ -1368,9 +1367,9 @@
"explosion": { "power": 69200, "shrapnel": { "casing_mass": 12000, "fragment_mass": 600 } },
"use_action": {
"target": "full_barrel_bomb_act",
- "msg": "You activate the fuze on the barrel bomb. Clear the area!",
+ "msg": "You activate the fuse on the barrel bomb. Clear the area!",
"target_timer": "100 seconds",
- "menu_text": "Activate fuze",
+ "menu_text": "Activate fuse",
"type": "transform"
},
"flags": [ "RADIO_MODABLE", "RADIO_INVOKE_PROC", "BOMB", "ALLOWS_REMOTE_USE" ],
@@ -1392,7 +1391,7 @@
"use_action": {
"type": "message",
"message": "You've already activated the bomb - clear the area immediately!",
- "name": "Activate fuze"
+ "name": "Activate fuse"
},
"explode_in_fire": true,
"explosion": { "power": 69200, "shrapnel": { "casing_mass": 12000, "fragment_mass": 600 } },
diff --git a/data/json/items/tool/knives.json b/data/json/items/tool/knives.json
index 7f268ae5bac10..72cc0badfa057 100644
--- a/data/json/items/tool/knives.json
+++ b/data/json/items/tool/knives.json
@@ -157,7 +157,7 @@
"volume": "250 ml",
"longest_side": "20 cm",
"price": "40 USD",
- "price_postapoc": "5 USD",
+ "price_postapoc": "50 cent",
"to_hit": { "grip": "weapon", "length": "hand", "surface": "point", "balance": "neutral" },
"material": [ "bronze", "leather" ],
"symbol": "/",
@@ -178,7 +178,7 @@
"weight": "226 g",
"volume": "250 ml",
"price": "140 USD",
- "price_postapoc": "5 USD",
+ "price_postapoc": "3 USD",
"to_hit": -1,
"material": [ "steel", "plastic" ],
"symbol": ";",
@@ -216,7 +216,7 @@
"weight": "20 g",
"volume": "10 ml",
"price": "10 USD",
- "price_postapoc": "1 USD",
+ "price_postapoc": "50 cent",
"to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
@@ -254,7 +254,7 @@
"volume": "20 ml",
"longest_side": "12 cm",
"price": "4 USD",
- "price_postapoc": "1 USD",
+ "price_postapoc": "50 cent",
"to_hit": -3,
"material": [ "steel", "plastic" ],
"symbol": ";",
@@ -275,6 +275,8 @@
"weight": "500 g",
"volume": "250 ml",
"longest_side": "8 cm",
+ "price": "0 cent",
+ "price_postapoc": "0 cent",
"to_hit": -3,
"qualities": [ [ "CUT", 2 ], [ "BUTCHER", -18 ] ],
"melee_damage": { "bash": 5, "cut": 3 }
diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json
index aa5dbdf371a2d..12560ea226f19 100644
--- a/data/json/items/tool/workshop.json
+++ b/data/json/items/tool/workshop.json
@@ -760,7 +760,7 @@
"volume": "70 ml",
"longest_side": "12 cm",
"price": "30 USD",
- "price_postapoc": "5 USD",
+ "price_postapoc": "3 USD",
"to_hit": { "grip": "solid", "length": "hand", "surface": "point", "balance": "neutral" },
"material": [ "steel" ],
"symbol": ";",
diff --git a/data/json/mapgen/church.json b/data/json/mapgen/church.json
index b7612e48b580e..72436a6827bb3 100644
--- a/data/json/mapgen/church.json
+++ b/data/json/mapgen/church.json
@@ -310,10 +310,10 @@
"rows": [
" ",
" wBGBw wBGBw ",
- " wjt.wwwwwGGwwwwwFe1w ",
+ " wjt.wwwwwGGwwwwwFe0w ",
" Bj..HHwtsssstwth..SB ",
- " w.....+......+....6w ",
- " wK.ytmw.mttm.w.y.>7w ",
+ " w.....+......+....dw ",
+ " wK.ytmw.mttm.w.y.>Ew ",
" wwwDwwwwwDDwwwwwDwww ",
" x____x ",
" x____x ",
@@ -350,9 +350,9 @@
"m": "f_armchair",
"j": "f_bed",
"h": "f_chair",
- "1": "f_cupboard",
- "6": "f_cupboard",
- "7": "f_cupboard"
+ "0": "f_cupboard",
+ "d": "f_cupboard",
+ "E": "f_cupboard"
},
"items": {
"d": { "item": "SUS_office_desk", "chance": 50 },
diff --git a/data/json/mapgen/church_rural.json b/data/json/mapgen/church_rural.json
index b9fe85ce64881..ecf842de89e4c 100644
--- a/data/json/mapgen/church_rural.json
+++ b/data/json/mapgen/church_rural.json
@@ -61,7 +61,7 @@
" |||||||||||||| ",
"||||||||||||||||||| ",
"WWwwWW||||||||||||| ",
- "w...6W||||||||||||| ",
+ "w...0W||||||||||||| ",
"w>...W||||||||||||| ",
"WWwwWW||||||||||||| ",
" |||||||||||||| ",
@@ -82,7 +82,7 @@
],
"palettes": [ "roof_palette" ],
"terrain": { "|": "t_shingle_flat_roof", "W": "t_wood_wall_w", "w": "t_window", " ": "t_open_air", ".": "t_floor" },
- "computers": { "6": { "name": "Church Bells 1.0", "options": [ { "name": "Toll Bells", "action": "toll" } ] } }
+ "computers": { "0": { "name": "Church Bells 1.0", "options": [ { "name": "Toll Bells", "action": "toll" } ] } }
}
},
{
diff --git a/data/json/mapgen/city_blocks/urban_25_dense_diner_apt.json b/data/json/mapgen/city_blocks/urban_25_dense_diner_apt.json
index 3344f3b148130..c0e04692d6b71 100644
--- a/data/json/mapgen/city_blocks/urban_25_dense_diner_apt.json
+++ b/data/json/mapgen/city_blocks/urban_25_dense_diner_apt.json
@@ -360,12 +360,12 @@
"-..................- -................-",
"-...........=......- -...=............-",
"-..................- -................-",
- "-..................- 99-................-",
- "-..................-99 9v-................-",
- "-..................-#9 9#-......%%!%%.....-",
- "-.........A........-#9 9#-......%>__%Я....-",
- "-..................-v9 99-......%%%%%.....-",
- "-........Я.........-99 -.......ЯAA......-",
+ "-..................- RR-................-",
+ "-..................-RR Rv-................-",
+ "-..................-#R R#-......%%!%%.....-",
+ "-.........A........-#R R#-......%>__%Я....-",
+ "-..................-vR RR-......%%%%%.....-",
+ "-........Я.........-RR -.......ЯAA......-",
"-........Я.........- -................-",
"-..................- -................-",
"-............=&....- -................-",
@@ -379,7 +379,7 @@
" "
],
"palettes": [ "roof_palette" ],
- "terrain": { "9": "t_metal_railing", "!": "t_door_metal_pickable", "%": "t_brick_wall" },
+ "terrain": { "R": "t_metal_railing", "!": "t_door_metal_pickable", "%": "t_brick_wall" },
"place_monsters": [
{ "monster": "GROUP_ZOMBIE", "x": [ 1, 18 ], "y": [ 3, 20 ], "density": 0.02 },
{ "monster": "GROUP_ZOMBIE", "x": [ 31, 46 ], "y": [ 1, 19 ], "density": 0.03 }
diff --git a/data/json/mapgen/hotel_tower.json b/data/json/mapgen/hotel_tower.json
index 4dea627c757e9..f1c0fb83ca820 100644
--- a/data/json/mapgen/hotel_tower.json
+++ b/data/json/mapgen/hotel_tower.json
@@ -352,11 +352,11 @@
" --5-..fffffffffffffffffffffffffggffffffffffffffffffffffffffff..-5-- ",
" -.....f.....................................................f.....- ",
" -.....f.....ЯЯЯЯЯ.................................ЯЯЯЯЯ.....f.....- ",
- " ########....66666.................................66666.....####### ",
+ " ########....WWWWW.................................WWWWW.....####### ",
" #______+.....................AAAAAA.........................+____H# ",
" #_>_HHH#.....................AAAAAA.........................#___>H# ",
" ########.....................AAAAAA.........................####### ",
- " -..f.....66666.................................66666.....f..- ",
+ " -..f.....WWWWW.................................WWWWW.....f..- ",
" -..f.....ЯЯЯЯЯ.................................ЯЯЯЯЯ.....f..- ",
" -..f.....................................................f..- ",
" -..fffffffffffffffffffffffffggffffffffffffffffffffffffffff..- ",
@@ -370,8 +370,7 @@
],
"palettes": [ "roof_palette", "parametrized_highrise_walls_palette" ],
"terrain": { "_": "t_thconc_floor", "+": "t_door_metal_elocked" },
- "furniture": { "H": "f_generator_broken", "6": "f_water_heater_family" },
- "liquids": { "6": { "liquid": "water_clean", "amount": [ 0, 100 ] } },
+ "furniture": { "H": "f_generator_broken" },
"place_monster": [
{ "group": "GROUP_ROOF_ZOMBIE", "x": [ 7, 23 ], "y": [ 24, 46 ], "repeat": [ 1, 2 ] },
{ "group": "GROUP_ROOF_ZOMBIE", "x": [ 24, 47 ], "y": [ 27, 47 ], "repeat": [ 1, 2 ] },
diff --git a/data/json/mapgen/isherwood_farms/farm_isherwood.json b/data/json/mapgen/isherwood_farms/farm_isherwood.json
index 515b756a3ae68..8ff1139379951 100644
--- a/data/json/mapgen/isherwood_farms/farm_isherwood.json
+++ b/data/json/mapgen/isherwood_farms/farm_isherwood.json
@@ -251,29 +251,29 @@
" ",
" ",
" #######_____####### --------",
- " #666____________66# -......-",
- " #666_666______666_# -......-",
- " #66_____________66# -......-",
- " #_____*******___6_# --------......-",
- " #_66__*******____6# -.............-",
- " #66___*******____6# -..........:..-",
- " #_____*******___66# ,,,,,,,, -.............-",
- " #66___*******_____# ,,,,,,,, -.............-",
- " #_66__*******__6__# ,,,,,,,, -.............-",
+ " #HHH____________HH# -......-",
+ " #HHH_HHH______HHH_# -......-",
+ " #HH_____________HH# -......-",
+ " #_____*******___H_# --------......-",
+ " #_HH__*******____H# -.............-",
+ " #HH___*******____H# -..........:..-",
+ " #_____*******___HH# ,,,,,,,, -.............-",
+ " #HH___*******_____# ,,,,,,,, -.............-",
+ " #_HH__*******__H__# ,,,,,,,, -.............-",
" #_____*******_____# ,,,,,,,, -.&...........-",
- " #_66__*******___6_# ,,,,,,,, -.........X...-",
- " #66___*******___66# ,,,,,,,, -.............-",
- " #66___*******__666# ,,,,,,,, -.............-",
- " #6________________# ,,,,,,,, -..=..........-",
- " #666____666__666__# ,,,,,,,, -.............-",
- " #666_____________v# ,,,,,,,, -------------5-",
+ " #_HH__*******___H_# ,,,,,,,, -.........X...-",
+ " #HH___*******___HH# ,,,,,,,, -.............-",
+ " #HH___*******__HHH# ,,,,,,,, -.............-",
+ " #H________________# ,,,,,,,, -..=..........-",
+ " #HHH____HHH__HHH__# ,,,,,,,, -.............-",
+ " #HHH_____________v# ,,,,,,,, -------------5-",
" #######_____####### ",
" ",
" "
],
"palettes": [ "roof_palette" ],
- "terrain": { ".": "t_shingle_flat_roof", "6": "t_floor", ",": "t_metal_flat_roof", "*": "t_open_air_rooved", "#": "t_wall_wood" },
- "furniture": { "6": "f_hay" }
+ "terrain": { ".": "t_shingle_flat_roof", "H": "t_floor", ",": "t_metal_flat_roof", "*": "t_open_air_rooved", "#": "t_wall_wood" },
+ "furniture": { "H": "f_hay" }
}
},
{
diff --git a/data/json/mapgen/mall/mall_roof.json b/data/json/mapgen/mall/mall_roof.json
index eac02fca6ae46..c1167cbfe1727 100644
--- a/data/json/mapgen/mall/mall_roof.json
+++ b/data/json/mapgen/mall/mall_roof.json
@@ -187,7 +187,7 @@
" -.......................................ooo.............................................................................1______+EEEEE#4..- ",
" -.......................................................................................................................1______#EEEEE#...- ",
" -..................................................oooo.................................................................1______#######...- ",
- " -..................................................oooo................................................................9#9______>#.......- ",
+ " -..................................................oooo................................................................G#G______>#.......- ",
" -..................................................oooo.................................................................####+#####.......-- ",
" -..................................................oooo...................................................................................- ",
" -..................................................oooo...................................................................................- ",
@@ -207,7 +207,7 @@
"terrain": {
"#": "t_brick_wall",
"1": "t_door_metal_locked",
- "9": "t_gates_control_brick",
+ "G": "t_gates_control_brick",
"Ŋ": "t_elevator_control_off",
"E": "t_elevator",
"+": "t_door_c",
diff --git a/data/json/mapgen/motel.json b/data/json/mapgen/motel.json
index ae4e1ee2c183f..ddac0c2d9a1d3 100644
--- a/data/json/mapgen/motel.json
+++ b/data/json/mapgen/motel.json
@@ -24,7 +24,7 @@
"0": "t_sidewalk",
",": "t_concrete",
"R": "t_glass_railing",
- "2": [ [ "t_window_domestic", 11 ], [ "t_window_open", 2 ], [ "t_curtains", 5 ] ],
+ "O": [ [ "t_window_domestic", 11 ], [ "t_window_open", 2 ], [ "t_curtains", 5 ] ],
"+": [ "t_door_c", "t_door_locked" ],
"L": "t_door_locked",
"G": "t_door_glass_c",
@@ -318,28 +318,28 @@
"`###########%__%%%%%%%%%%__%%%%%%%%%* yy ",
"4#E........#_________________________ yy ",
"`#.........+_________________________ yy ",
- "`#.........2__ y y y y y ",
- "`#.........2__ y y y y y ",
+ "`#.........O__ y y y y y ",
+ "`#.........O__ y y y y y ",
"`#.........#__ y Á y y Á y Á y ",
"`###########__ y y y y y ",
"`#E........#__yyy y y y y ",
"`#.........+__ %",
- "`#.........2__ %",
- "`#.........2__ %",
+ "`#.........O__ %",
+ "`#.........O__ %",
"`#.........#__ %",
"`###########__ %",
"`#E........#__ %",
"`#.........+__ %",
- "`#.........2__ %",
- "`#.........2__ %",
+ "`#.........O__ %",
+ "`#.........O__ %",
"`#.........#__yyy y y y y y y%",
"`###########__ y y y y y y y%",
"`#E........#__ y É y y É y É y É y É y%",
"`#.........+__ y y y y y y y%",
- "`#.........2__ y y y y y y y%",
- "`#.........2___________________________________%",
+ "`#.........O__ y y y y y y y%",
+ "`#.........O___________________________________%",
"`#.........#___________________________________%",
- "`############22+###22+###22+###22+###22+###22+##",
+ "`############OO+###OO+###OO+###OO+###OO+###OO+##",
"```````````#N....#N....#N....#N....#N....#N....#",
"```````````#.....#.....#.....#.....#.....#.....#",
"```````````#.....#.....#.....#.....#.....#.....#",
@@ -387,28 +387,28 @@
"*###########%__%%%%%%%%%%__%%%%%%%%%_ %",
"4#E........#_________________________ %",
"*#.........+_________________________ %",
- "*#.........2__ y y y y y %",
- "*#.........2__ y y y y y %",
+ "*#.........O__ y y y y y %",
+ "*#.........O__ y y y y y %",
"*#.........#__ y Á y y Á y Á y %",
"*###########__ y y y y y %",
"*#E........#__yyy y y y y %",
"*#.........+__ %",
- "*#.........2__ %",
- "*#.........2__ %",
+ "*#.........O__ %",
+ "*#.........O__ %",
"*#.........#__ %",
"*###########__ %",
"*#E........#__ %",
"*#.........+__ %",
- "*#.........2__ %",
- "*#.........2__ %",
+ "*#.........O__ %",
+ "*#.........O__ %",
"*#.........#__yyy y y y y y y%",
"*###########__ y y y y y y y%",
"*#E........#__ y É y y É y É y É y É y%",
"*#.........+__ y y y y y y y%",
- "*#.........2__ y y y y y y y%",
- "*#.........2___________________________________%",
+ "*#.........O__ y y y y y y y%",
+ "*#.........O___________________________________%",
"*#.........#___________________________________%",
- "*############22+###22+###22+###22+###22+###22+##",
+ "*############OO+###OO+###OO+###OO+###OO+###OO+##",
"***********#N....#N....#N....#N....#N....#N....#",
"***********#.....#.....#.....#.....#.....#.....#",
"***********#.....#.....#.....#.....#.....#.....#",
@@ -567,28 +567,28 @@
" ###########RR ",
"4#E........#", "1" ] } ]
+ },
+ "then": [
+ { "math": [ "n_shield_turn", "=", "0" ] },
+ { "math": [ "n_ENERGY_SHIELD_HP", "+=", "n_SHIELD_REGEN" ] },
+ {
+ "math": [
+ "n_ENERGY_SHIELD_HP",
+ "=",
+ "n_ENERGY_SHIELD_HP > n_ENERGY_SHIELD_MAX_HP ? n_ENERGY_SHIELD_MAX_HP : n_ENERGY_SHIELD_HP"
+ ]
+ }
+ ]
+ }
+ ],
+ "else": [ { "u_remove_item_with": "afs_energy_shield" }, { "math": [ "u_shield_ratio", "=", "-1" ] } ]
+ }
+ ]
+ },
+ {
+ "id": "EOC_stop_shield",
+ "type": "effect_on_condition",
+ "effect": [
+ { "transform_item": { "context_val": "transform_target" } },
+ { "u_remove_item_with": "afs_energy_shield" },
+ { "math": [ "u_shield_ratio", "=", "-1" ] }
+ ]
+ },
+ {
+ "//": "This bit is only here to do a final update of the UI when a generator is dropped.",
+ "id": "EOC_check_drop_shield_gen",
+ "type": "effect_on_condition",
+ "eoc_type": "EVENT",
+ "required_event": "character_finished_activity",
+ "condition": {
+ "and": [
+ { "compare_string": [ "ACT_DROP", { "context_val": "activity" } ] },
+ { "math": [ "u_shield_power_ratio", ">=", "0" ] }
+ ]
+ },
+ "effect": [
+ { "math": [ "u_shield_power_ratio", "=", "-1" ] },
+ {
+ "//": "We check if we have another shield generator to update the UI power gauge.",
+ "u_run_inv_eocs": "all",
+ "search_data": [ { "worn_only": true, "flags": [ "SHIELD_GENERATOR" ] } ],
+ "true_eocs": [
+ {
+ "id": "_afs_drop_update_power",
+ "effect": [ { "math": [ "u_shield_power_ratio", "=", "n_val('power_percentage')" ] } ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EOC_detonate_shield",
+ "type": "effect_on_condition",
+ "eoc_type": "EVENT",
+ "required_event": "character_armor_destroyed",
+ "condition": { "and": [ { "compare_string": [ "afs_energy_shield", { "context_val": "itype" } ] } ] },
+ "effect": [
+ { "math": [ "u_shield_ratio", "=", "-1" ] },
+ { "u_emit": "heavy_rad_glimmer", "chance_mult": 2 },
+ { "u_message": "The shield blasts you with radiation as it dissipates.", "type": "bad" }
+ ]
+ }
+]
diff --git a/data/mods/Aftershock/items/armor/military_armor.json b/data/mods/Aftershock/items/armor/military_armor.json
index 61e2aa450befb..58e0443bff1a1 100644
--- a/data/mods/Aftershock/items/armor/military_armor.json
+++ b/data/mods/Aftershock/items/armor/military_armor.json
@@ -57,11 +57,11 @@
{
"id": "afs_military_vestxl",
"type": "ARMOR",
- "name": { "str_sp": "IPAV armor XL" },
+ "name": { "str": "IPAV armor" },
"copy-from": "afs_military_vest",
"description": "Multipurpose military armor for the torso and upper arms, intended to protect against a wide variety of ballistic or direct energy attacks. Made from a single piece of ablative carbide that keeps it relatively lightweight and completely disposable. Made to fit the uplifted, the heavily augmented, or similarly sized individuals.",
"proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "afs_military_cloak",
diff --git a/data/mods/Aftershock/items/bionics_mainline_override.json b/data/mods/Aftershock/items/bionics_mainline_override.json
index 22436f6cb1a35..f3fdb7d81e728 100644
--- a/data/mods/Aftershock/items/bionics_mainline_override.json
+++ b/data/mods/Aftershock/items/bionics_mainline_override.json
@@ -149,7 +149,7 @@
{
"abstract": "AID_AF_abstract",
"type": "GENERIC",
- "name": { "str_sp": "abstract Autodoc installation data" },
+ "name": { "str": "abstract Autodoc installation data", "//~": "NO_I18N" },
"material": [ "plastic" ],
"symbol": "#",
"weight": "35 g",
diff --git a/data/mods/Aftershock/items/cast_spell_items.json b/data/mods/Aftershock/items/cast_spell_items.json
index d03a664a04829..08f25c6372e9f 100644
--- a/data/mods/Aftershock/items/cast_spell_items.json
+++ b/data/mods/Aftershock/items/cast_spell_items.json
@@ -2,8 +2,8 @@
{
"abstract": "afs_caster",
"type": "TOOL_ARMOR",
- "name": { "str": "caster" },
- "description": "A generic techno doodad used to cast spells.",
+ "name": { "str": "caster", "//~": "NO_I18N" },
+ "description": { "str": "A generic techno doodad used to cast spells.", "//~": "NO_I18N" },
"weight": "100 g",
"volume": "250 ml",
"price": "50 USD",
diff --git a/data/mods/Aftershock/items/grenades.json b/data/mods/Aftershock/items/grenades.json
index 3539d0ea7f6d3..a43395f22456d 100644
--- a/data/mods/Aftershock/items/grenades.json
+++ b/data/mods/Aftershock/items/grenades.json
@@ -3,7 +3,7 @@
"abstract": "grenade_canister",
"type": "GENERIC",
"category": "weapons",
- "name": { "str": "canister grenade" },
+ "name": { "str": "canister grenade", "//~": "NO_I18N" },
"weight": "1058 g",
"volume": "270 ml",
"material": [ "steel" ],
diff --git a/data/mods/Aftershock/items/gun/advanced.json b/data/mods/Aftershock/items/gun/advanced.json
index a48dc79d444f4..91b387cb97aed 100644
--- a/data/mods/Aftershock/items/gun/advanced.json
+++ b/data/mods/Aftershock/items/gun/advanced.json
@@ -3,8 +3,8 @@
"abstract": "robogun_base",
"type": "GUN",
"reload_noise_volume": 10,
- "name": "base robogun",
- "description": "This is a pseudo item for monster attacks. If you see this, it's a bug.",
+ "name": { "str": "base robogun", "//~": "NO_I18N" },
+ "description": { "str": "This is a pseudo item for monster attacks. If you see this, it's a bug.", "//~": "NO_I18N" },
"material": [ "steel", "plastic" ],
"symbol": "(",
"color": "magenta",
diff --git a/data/mods/Aftershock/items/gun/plasma.json b/data/mods/Aftershock/items/gun/plasma.json
index c57858fd65b89..de3a88eb37847 100644
--- a/data/mods/Aftershock/items/gun/plasma.json
+++ b/data/mods/Aftershock/items/gun/plasma.json
@@ -4,8 +4,8 @@
"looks_like": "nailgun",
"type": "GUN",
"reload_noise": "pshht",
- "name": { "str": "plasma gun" },
- "description": "A plasma gun.",
+ "name": { "str": "plasma gun", "//~": "NO_I18N" },
+ "description": { "str": "A plasma gun.", "//~": "NO_I18N" },
"weight": "3904 g",
"volume": "750 ml",
"price": "750 USD",
diff --git a/data/mods/Aftershock/items/inactiverobot.json b/data/mods/Aftershock/items/inactiverobot.json
index e34d3ed3bee35..7fe0121892fbe 100644
--- a/data/mods/Aftershock/items/inactiverobot.json
+++ b/data/mods/Aftershock/items/inactiverobot.json
@@ -281,7 +281,7 @@
"abstract": "bot_medibot_base",
"type": "TOOL",
"looks_like": "mon_tripod",
- "name": "inactive medibot",
+ "name": { "str": "inactive medibot", "//~": "NO_I18N" },
"material": [ "steel", "plastic" ],
"weight": "70 kg",
"volume": "50 L",
@@ -304,7 +304,7 @@
{
"abstract": "bot_utilibot_base",
"type": "TOOL",
- "name": "inactive utilibot",
+ "name": { "str": "inactive utilibot", "//~": "NO_I18N" },
"looks_like": "mon_cleanerbot",
"price": "100 USD",
"price_postapoc": "100 USD",
@@ -355,7 +355,7 @@
{
"abstract": "bot_milbot_base",
"type": "TOOL",
- "name": "inactive military robot",
+ "name": { "str": "inactive military robot", "//~": "NO_I18N" },
"looks_like": "mon_secubot",
"material": [ "steel", "kevlar" ],
"weight": "140 kg",
@@ -386,7 +386,7 @@
{
"abstract": "bot_defbot_base",
"type": "TOOL",
- "name": "inactive defense robot",
+ "name": { "str": "inactive defense robot", "//~": "NO_I18N" },
"looks_like": "mon_riotbot",
"material": [ "steel", "plastic" ],
"weight": "140 kg",
@@ -402,7 +402,7 @@
{
"abstract": "bot_skitterbot_base",
"type": "TOOL",
- "name": "inactive skitterbot",
+ "name": { "str": "inactive skitterbot", "//~": "NO_I18N" },
"looks_like": "broken_skitterbot",
"material": [ "steel", "plastic" ],
"weight": "62650 g",
@@ -469,7 +469,7 @@
{
"abstract": "bot_eyebot_base",
"type": "TOOL",
- "name": "inactive eyebot",
+ "name": { "str": "inactive eyebot", "//~": "NO_I18N" },
"looks_like": "afs_broken_eyebot",
"price": "100 USD",
"price_postapoc": "100 USD",
diff --git a/data/mods/Aftershock/items/items.json b/data/mods/Aftershock/items/items.json
index b28f6d0ce4041..828ca1dca73c0 100644
--- a/data/mods/Aftershock/items/items.json
+++ b/data/mods/Aftershock/items/items.json
@@ -133,8 +133,8 @@
{
"id": "atomic_pseudo_churn",
"type": "TOOL",
- "name": { "str": "pseudo atomic butter churn" },
- "description": "This is a crafting_pseudo_item if you have it something is wrong.",
+ "name": { "str": "pseudo atomic butter churn", "//~": "NO_I18N" },
+ "description": { "str": "This is a crafting_pseudo_item if you have it something is wrong.", "//~": "NO_I18N" },
"weight": "6464 g",
"volume": "11356 ml",
"price": "200 USD",
diff --git a/data/mods/Aftershock/items/materials.json b/data/mods/Aftershock/items/materials.json
index 71ec9550567ba..c4e1c806b52c9 100644
--- a/data/mods/Aftershock/items/materials.json
+++ b/data/mods/Aftershock/items/materials.json
@@ -71,6 +71,23 @@
"resist": { "bash": 4, "cut": 6, "acid": 6, "heat": 2, "afs_plasma": 2, "bullet": 8, "electric": 0 },
"repair_difficulty": 9
},
+ {
+ "type": "material",
+ "id": "riemann_space",
+ "name": "Riemann space",
+ "density": 1,
+ "specific_heat_liquid": 0.52,
+ "specific_heat_solid": 0.52,
+ "latent_heat": 5200,
+ "chip_resist": 100,
+ "breathability": "SECOND_SKIN",
+ "dmg_adj": [ "resonating", "cascading", "unraveling", "fractal" ],
+ "bash_dmg_verb": "agitated",
+ "cut_dmg_verb": "agitated",
+ "soft": true,
+ "//": "Impenetrable to all damage types. The material energy shields are made of.",
+ "resist": { "bash": 1000, "cut": 1000, "acid": 1000, "heat": 1000, "bullet": 1000, "afs_plasma": 1000, "electric": 1000 }
+ },
{
"type": "material",
"id": "clearcrete",
diff --git a/data/mods/Aftershock/items/tools.json b/data/mods/Aftershock/items/tools.json
index f315aa1239efe..f40c8573b966d 100644
--- a/data/mods/Aftershock/items/tools.json
+++ b/data/mods/Aftershock/items/tools.json
@@ -613,8 +613,8 @@
{
"id": "nano_pseudo_forge",
"type": "TOOL",
- "name": { "str": "pseudo nano forge" },
- "description": "This is a crafting_pseudo_item if you have it something is wrong.",
+ "name": { "str": "pseudo nano forge", "//~": "NO_I18N" },
+ "description": { "str": "This is a crafting_pseudo_item if you have it something is wrong.", "//~": "NO_I18N" },
"weight": "6464 g",
"volume": "11356 ml",
"price": "200 USD",
@@ -682,8 +682,8 @@
{
"id": "pseudo_diamond_press",
"type": "TOOL",
- "name": { "str": "pseudo diamond press", "str_pl": "pseudo diamond presses" },
- "description": "This is a crafting_pseudo_item if you have it something is wrong.",
+ "name": { "str": "pseudo diamond press", "str_pl": "pseudo diamond presses", "//~": "NO_I18N" },
+ "description": { "str": "This is a crafting_pseudo_item if you have it something is wrong.", "//~": "NO_I18N" },
"weight": "6464 g",
"volume": "11356 ml",
"price": "200 USD",
diff --git a/data/mods/Aftershock/items/weapons.json b/data/mods/Aftershock/items/weapons.json
index b5d58c2a5f01c..7452e3ee9e626 100644
--- a/data/mods/Aftershock/items/weapons.json
+++ b/data/mods/Aftershock/items/weapons.json
@@ -183,8 +183,8 @@
"type": "GUN",
"symbol": "(",
"color": "green",
- "name": { "str_sp": "Tankbot Main Gun" },
- "description": "The 120mm cannon from a tankbot. If you have this, you'd best be debugging!",
+ "name": { "str_sp": "Tankbot Main Gun", "//~": "NO_I18N" },
+ "description": { "str": "The 120mm cannon from a tankbot. If you have this, you'd best be debugging!", "//~": "NO_I18N" },
"price": "999 kUSD 999 USD 99 cent",
"material": [ "steel" ],
"skill": "launcher",
diff --git a/data/mods/Aftershock/mobs/abstract_monsters.json b/data/mods/Aftershock/mobs/abstract_monsters.json
index 0ace2f573513b..cc2666fd85771 100644
--- a/data/mods/Aftershock/mobs/abstract_monsters.json
+++ b/data/mods/Aftershock/mobs/abstract_monsters.json
@@ -3,8 +3,11 @@
"abstract": "mon_milbot_base",
"type": "MONSTER",
"looks_like": "mon_secubot",
- "name": "military robot",
- "description": "A military robot still operating due to its internal power core. This one is armed with an electric prod and an integrated 5.56mm firearm.",
+ "name": { "str": "military robot", "//~": "NO_I18N" },
+ "description": {
+ "str": "A military robot still operating due to its internal power core. This one is armed with an electric prod and an integrated 5.56mm firearm.",
+ "//~": "NO_I18N"
+ },
"default_faction": "WraitheonRobotics",
"species": [ "ROBOT" ],
"volume": "62500 ml",
@@ -31,8 +34,11 @@
"abstract": "mon_defbot_base",
"type": "MONSTER",
"looks_like": "mon_secubot",
- "name": "defense robot",
- "description": "An automated defense robot still active due to its internal power source. This one is armed with an electric prod and an integrated 9mm firearm.",
+ "name": { "str": "defense robot", "//~": "NO_I18N" },
+ "description": {
+ "str": "An automated defense robot still active due to its internal power source. This one is armed with an electric prod and an integrated 9mm firearm.",
+ "//~": "NO_I18N"
+ },
"default_faction": "cop_bot",
"species": [ "ROBOT" ],
"diff": 10,
@@ -62,8 +68,11 @@
"type": "MONSTER",
"copy-from": "mon_defbot_base",
"looks_like": "mon_copbot",
- "name": "advanced robot",
- "description": "An advanced robot still functioning due to its internal fusion core. This model is armed with a powerful laser-emitter.",
+ "name": { "str": "advanced robot", "//~": "NO_I18N" },
+ "description": {
+ "str": "An advanced robot still functioning due to its internal fusion core. This model is armed with a powerful laser-emitter.",
+ "//~": "NO_I18N"
+ },
"default_faction": "defense_bot",
"species": [ "ROBOT" ],
"hp": 100,
@@ -77,8 +86,8 @@
{
"abstract": "afs_mon_reaver_abstract",
"type": "MONSTER",
- "name": { "str_sp": "bandits, pirates and reavers" },
- "description": "A scavenger willing to engage in violence to scavenge your remains.",
+ "name": { "str_sp": "bandits, pirates and reavers", "//~": "NO_I18N" },
+ "description": { "str": "A scavenger willing to engage in violence to scavenge your remains.", "//~": "NO_I18N" },
"default_faction": "reavers",
"species": [ "HUMAN" ],
"volume": "62500 ml",
diff --git a/data/mods/Aftershock/mutations/esper.json b/data/mods/Aftershock/mutations/esper.json
index b3dbf025eb3bc..39b7204d86a11 100644
--- a/data/mods/Aftershock/mutations/esper.json
+++ b/data/mods/Aftershock/mutations/esper.json
@@ -18,7 +18,7 @@
"id": "AFS_ELECTROKINETIC",
"name": "Electrokinetic",
"points": 0,
- "description": "The ability to to control electricity with your mind.",
+ "description": "The ability to control electricity with your mind.",
"types": [ "ESPER" ],
"starting_trait": false,
"purifiable": false,
diff --git a/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_outfitter.json b/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_outfitter.json
index 073e5462e2128..d20cee692047c 100644
--- a/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_outfitter.json
+++ b/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_outfitter.json
@@ -81,7 +81,11 @@
"subtype": "distribution",
"ammo": 100,
"magazine": 100,
- "items": [ { "group": "afs_armor_military_infantry_g", "prob": 90 }, { "item": "afs_backpack_rockets", "prob": 10 } ]
+ "items": [
+ { "group": "afs_armor_military_infantry_g", "prob": 85 },
+ { "item": "afs_backpack_rockets", "prob": 10 },
+ { "item": "afs_backpack_shieldgen", "prob": 5 }
+ ]
},
{
"type": "npc",
diff --git a/data/mods/Aftershock/spells.json b/data/mods/Aftershock/spells.json
index b3bb003811674..eb3240e66ff69 100644
--- a/data/mods/Aftershock/spells.json
+++ b/data/mods/Aftershock/spells.json
@@ -2,8 +2,8 @@
{
"id": "head_go_bye",
"type": "SPELL",
- "name": "Cranial Explosion",
- "description": "This fake spell occurs on cranial bomb activation. Likely fatal.",
+ "name": { "str": "Cranial Explosion", "//~": "NO_I18N" },
+ "description": { "str": "This fake spell occurs on cranial bomb activation. Likely fatal.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "self" ],
@@ -15,8 +15,11 @@
{
"id": "static_field",
"type": "SPELL",
- "name": "Bullet Shield Static Field",
- "description": "This fake spell occurs on hit_me with medium bullet forcefield CBM activated. Creates electrical field around PC. May shock PC.",
+ "name": { "str": "Bullet Shield Static Field", "//~": "NO_I18N" },
+ "description": {
+ "str": "This fake spell occurs on hit_me with medium bullet forcefield CBM activated. Creates electrical field around PC. May shock PC.",
+ "//~": "NO_I18N"
+ },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "self" ],
@@ -34,8 +37,8 @@
{
"id": "conversion_field_flash",
"type": "SPELL",
- "name": "Conversion Field Flash",
- "description": "Flashbang effect on hit against shield.",
+ "name": { "str": "Conversion Field Flash", "//~": "NO_I18N" },
+ "description": { "str": "Flashbang effect on hit against shield.", "//~": "NO_I18N" },
"effect": "flashbang",
"shape": "blast",
"valid_targets": [ "self" ],
@@ -47,8 +50,11 @@
{
"id": "radiation_field",
"type": "SPELL",
- "name": "Hacked Shield Radiation",
- "description": "This fake spell occurs intermittently with the heavy bullet forcefield CBM activated. Creates an electrical field around the PC. May shock the PC.",
+ "name": { "str": "Hacked Shield Radiation", "//~": "NO_I18N" },
+ "description": {
+ "str": "This fake spell occurs intermittently with the heavy bullet forcefield CBM activated. Creates an electrical field around the PC. May shock the PC.",
+ "//~": "NO_I18N"
+ },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "self" ],
@@ -66,8 +72,8 @@
{
"id": "gunship_drive_overload",
"type": "SPELL",
- "name": { "str": "Damage Robots EMP" },
- "description": "Damages all robots",
+ "name": { "str": "Damage Robots EMP", "//~": "NO_I18N" },
+ "description": { "str": "Damages all robots", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ally" ],
"effect": "attack",
"shape": "blast",
@@ -83,8 +89,8 @@
{
"id": "prison_cell_open",
"type": "SPELL",
- "name": { "str": "Open prison gratings" },
- "description": "Open prison gratings",
+ "name": { "str": "Open prison gratings", "//~": "NO_I18N" },
+ "description": { "str": "Open prison gratings", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "ter_transform",
"shape": "blast",
@@ -96,8 +102,8 @@
{
"id": "afs_generic_free_turn",
"type": "SPELL",
- "name": "Aftershock Extra Turn",
- "description": "Grants you an extra turn.",
+ "name": { "str": "Aftershock Extra Turn", "//~": "NO_I18N" },
+ "description": { "str": "Grants you an extra turn.", "//~": "NO_I18N" },
"message": "",
"valid_targets": [ "self" ],
"effect": "mod_moves",
@@ -109,8 +115,8 @@
{
"id": "afs_clairvoyance_cone",
"type": "SPELL",
- "name": "Aftershock Clairvoyance Cone",
- "description": "Reveals a cone shaped area centered on the caster.",
+ "name": { "str": "Aftershock Clairvoyance Cone", "//~": "NO_I18N" },
+ "description": { "str": "Reveals a cone shaped area centered on the caster.", "//~": "NO_I18N" },
"message": "",
"valid_targets": [ "hostile", "ground", "ally" ],
"flags": [ "CONCENTRATE", "IGNORE_WALLS" ],
@@ -136,8 +142,8 @@
{
"id": "afs_generic_speed_bonus",
"type": "SPELL",
- "name": "Aftershock Stacking Speed Bonus",
- "description": "Grants you a stackable speed bonus.",
+ "name": { "str": "Aftershock Stacking Speed Bonus", "//~": "NO_I18N" },
+ "description": { "str": "Grants you a stackable speed bonus.", "//~": "NO_I18N" },
"message": "",
"valid_targets": [ "self" ],
"effect": "attack",
@@ -151,9 +157,9 @@
{
"id": "cream_prot_cold",
"type": "SPELL",
- "name": "Heat Retention Cream",
+ "name": { "str": "Heat Retention Cream", "//~": "NO_I18N" },
"//": "Used for heat retention cream not castable",
- "description": "You rub the thick cream all over your body in preparation for the expected cold.",
+ "description": { "str": "You rub the thick cream all over your body in preparation for the expected cold.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_LEGS", "NO_HANDS" ],
"effect": "spawn_item",
@@ -174,8 +180,8 @@
{
"type": "SPELL",
"id": "afs_motion_sensor_spell",
- "name": { "str": "motion sensor spell" },
- "description": "EOCs the victim.",
+ "name": { "str": "motion sensor spell", "//~": "NO_I18N" },
+ "description": { "str": "EOCs the victim.", "//~": "NO_I18N" },
"valid_targets": [ "self", "hostile", "ally" ],
"max_level": 1,
"flags": [ "SILENT", "NO_EXPLOSION_SFX" ],
@@ -190,8 +196,8 @@
{
"id": "spell_fusion_fan",
"type": "SPELL",
- "name": "Plasma fan",
- "description": "Your weapon releases a searing fan of plasma.",
+ "name": { "str": "Plasma fan", "//~": "NO_I18N" },
+ "description": { "str": "Your weapon releases a searing fan of plasma.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "cone",
"field_id": "fd_rad_glimmer",
@@ -214,8 +220,8 @@
{
"id": "spell_electric_chain",
"type": "SPELL",
- "name": "Superconductive Arc",
- "description": "Your weapon arcs electricity to a nearby target.",
+ "name": { "str": "Superconductive Arc", "//~": "NO_I18N" },
+ "description": { "str": "Your weapon arcs electricity to a nearby target.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "line",
"valid_targets": [ "hostile", "ground" ],
@@ -232,8 +238,8 @@
{
"id": "spell_electric_chain_2",
"type": "SPELL",
- "name": "Superconductive Arc II",
- "description": "Your bionic weapon arcs electricity to a nearby target.",
+ "name": { "str": "Superconductive Arc II", "//~": "NO_I18N" },
+ "description": { "str": "Your bionic weapon arcs electricity to a nearby target.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "ally", "hostile", "ground" ],
@@ -255,8 +261,8 @@
{
"id": "spell_electric_chain_3",
"type": "SPELL",
- "name": "Superconductive Arc III",
- "description": "Your bionic weapon arcs electricity to a nearby target.",
+ "name": { "str": "Superconductive Arc III", "//~": "NO_I18N" },
+ "description": { "str": "Your bionic weapon arcs electricity to a nearby target.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "ally", "hostile", "ground" ],
@@ -277,8 +283,8 @@
{
"id": "bio_blade_electric_arc",
"type": "SPELL",
- "name": "Superconductive Arc",
- "description": "Your bionic weapon arcs electricity to a nearby target.",
+ "name": { "str": "Superconductive Arc", "//~": "NO_I18N" },
+ "description": { "str": "Your bionic weapon arcs electricity to a nearby target.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "hostile", "ally", "self" ],
@@ -296,8 +302,8 @@
{
"id": "bio_blade_electric_arc_2",
"type": "SPELL",
- "name": "Superconductive Arc",
- "description": "Your bionic weapon arcs electricity to a nearby target.",
+ "name": { "str": "Superconductive Arc", "//~": "NO_I18N" },
+ "description": { "str": "Your bionic weapon arcs electricity to a nearby target.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "hostile", "ally", "self" ],
@@ -314,9 +320,9 @@
{
"id": "cream_greater_prot_cold",
"type": "SPELL",
- "name": "Heat Retention Cream Xtreme",
+ "name": { "str": "Heat Retention Cream Xtreme", "//~": "NO_I18N" },
"//": "Used for heat retention cream not castable",
- "description": "You rub the thick cream all over your body in preparation for unbearable cold.",
+ "description": { "str": "You rub the thick cream all over your body in preparation for unbearable cold.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_LEGS", "NO_HANDS" ],
"effect": "spawn_item",
@@ -337,9 +343,9 @@
{
"id": "protection_from_cold",
"type": "SPELL",
- "name": "Emergency Insulation",
+ "name": { "str": "Emergency Insulation", "//~": "NO_I18N" },
"//": "Used for CBM not castable",
- "description": "You feel a jolt through your body as energy pulses through the wires in your flesh.",
+ "description": { "str": "You feel a jolt through your body as energy pulses through the wires in your flesh.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_LEGS", "NO_HANDS", "NO_PROJECTILE" ],
"effect": "attack",
@@ -354,8 +360,8 @@
{
"id": "cryo_blast",
"type": "SPELL",
- "name": "Cryokinetic Blast",
- "description": "You blast a cone of frigid air toward the target.",
+ "name": { "str": "Cryokinetic Blast", "//~": "NO_I18N" },
+ "description": { "str": "You blast a cone of frigid air toward the target.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "cone",
"valid_targets": [ "ally", "hostile", "ground" ],
@@ -383,8 +389,11 @@
{
"type": "SPELL",
"id": "escape_pod",
- "name": "Escape Pod Launch",
- "description": "You're slammed back against the seat as the pod launches at incredible speed from the ship!",
+ "name": { "str": "Escape Pod Launch", "//~": "NO_I18N" },
+ "description": {
+ "str": "You're slammed back against the seat as the pod launches at incredible speed from the ship!",
+ "//~": "NO_I18N"
+ },
"effect": "effect_on_condition",
"effect_str": "EOC_ESCAPE_POD_CHAIR",
"valid_targets": "ground",
diff --git a/data/mods/Aftershock/spells/hologram_spells.json b/data/mods/Aftershock/spells/hologram_spells.json
index b30451a64c85a..9da7dccb3e79a 100644
--- a/data/mods/Aftershock/spells/hologram_spells.json
+++ b/data/mods/Aftershock/spells/hologram_spells.json
@@ -60,8 +60,11 @@
{
"id": "afs_holo_flare_explosion",
"type": "SPELL",
- "name": { "str": "Holographic Flash Explosion" },
- "description": "Causes an existing hologram to explode into burning light, harming and stunning enemies close to it.",
+ "name": { "str": "Holographic Flash Explosion", "//~": "NO_I18N" },
+ "description": {
+ "str": "Causes an existing hologram to explode into burning light, harming and stunning enemies close to it.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile", "ground", "ally" ],
"effect": "attack",
"effect_str": "stunned",
diff --git a/data/mods/Aftershock/spells/jetpack_spells.json b/data/mods/Aftershock/spells/jetpack_spells.json
index f85f59e8f4761..ce1b7b81e92df 100644
--- a/data/mods/Aftershock/spells/jetpack_spells.json
+++ b/data/mods/Aftershock/spells/jetpack_spells.json
@@ -23,8 +23,11 @@
{
"id": "rocket_jump_levitate",
"type": "SPELL",
- "name": { "str": "Rocket Jump Levitation" },
- "description": "Chained before a rocket jump. Grants a brief instant of levitation to simulate a rocket pack-s limited flying ability.",
+ "name": { "str": "Rocket Jump Levitation", "//~": "NO_I18N" },
+ "description": {
+ "str": "Chained before a rocket jump. Grants a brief instant of levitation to simulate a rocket pack-s limited flying ability.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"flags": [ "NO_HANDS", "NO_LEGS" ],
"effect": "attack",
diff --git a/data/mods/Aftershock/spells/monster_spells.json b/data/mods/Aftershock/spells/monster_spells.json
index c1ac718ef810f..704692765cf9a 100644
--- a/data/mods/Aftershock/spells/monster_spells.json
+++ b/data/mods/Aftershock/spells/monster_spells.json
@@ -2,8 +2,8 @@
{
"id": "isohypsa_buff",
"type": "SPELL",
- "name": { "str": "Isohypsa Coordination" },
- "description": "Increases the speed of simpler Wraitheon drones.",
+ "name": { "str": "Isohypsa Coordination", "//~": "NO_I18N" },
+ "description": { "str": "Increases the speed of simpler Wraitheon drones.", "//~": "NO_I18N" },
"valid_targets": [ "self", "ally" ],
"targeted_monster_ids": [
"mon_chickenbot",
@@ -37,8 +37,8 @@
{
"type": "SPELL",
"id": "afs_heat_drain",
- "name": { "str": "Heat Drain" },
- "description": "Spews a burst of very cold air.",
+ "name": { "str": "Heat Drain", "//~": "NO_I18N" },
+ "description": { "str": "Spews a burst of very cold air.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"max_level": 10,
"min_damage": 0,
diff --git a/data/mods/Aftershock/ui.json b/data/mods/Aftershock/ui.json
new file mode 100644
index 0000000000000..0d58f964803d1
--- /dev/null
+++ b/data/mods/Aftershock/ui.json
@@ -0,0 +1,326 @@
+[
+ {
+ "//": "Extend with the danger widget",
+ "copy-from": "legacy_classic_sidebar",
+ "type": "widget",
+ "id": "legacy_classic_sidebar",
+ "extend": { "widgets": [ "shield_layout" ] }
+ },
+ {
+ "//": "Extend with the danger widget",
+ "copy-from": "legacy_compact_sidebar",
+ "type": "widget",
+ "id": "legacy_compact_sidebar",
+ "extend": { "widgets": [ "shield_layout" ] }
+ },
+ {
+ "//": "Extend with the danger widget",
+ "copy-from": "legacy_labels_narrow_sidebar",
+ "type": "widget",
+ "id": "legacy_labels_narrow_sidebar",
+ "extend": { "widgets": [ "shield_layout" ] }
+ },
+ {
+ "//": "Extend with the danger widget",
+ "copy-from": "legacy_labels_sidebar",
+ "type": "widget",
+ "id": "legacy_labels_sidebar",
+ "extend": { "widgets": [ "shield_layout" ] }
+ },
+ {
+ "//": "Extend with the danger widget",
+ "copy-from": "structured_sidebar",
+ "type": "widget",
+ "id": "structured_sidebar",
+ "extend": { "widgets": [ "shield_layout" ] }
+ },
+ {
+ "id": "shield_layout",
+ "type": "widget",
+ "style": "layout",
+ "arrange": "minimum_columns",
+ "label": "SHIELD",
+ "label_align": "right",
+ "text_align": "right",
+ "widgets": [ "shield_layout_1", "shield_layout_2" ],
+ "flags": [ "W_NO_PADDING" ]
+ },
+ {
+ "id": "shield_layout_2",
+ "type": "widget",
+ "style": "layout",
+ "arrange": "rows",
+ "label": "SHIELD",
+ "widgets": [ "shield_empty", "shield_rad_warning" ]
+ },
+ {
+ "id": "shield_layout_1",
+ "type": "widget",
+ "style": "layout",
+ "arrange": "rows",
+ "label": "SHIELD",
+ "widgets": [ "shield_title", "shield_gauge", "shield_power_gauge" ]
+ },
+ {
+ "id": "shield_gauge",
+ "type": "widget",
+ "style": "text",
+ "label": "INTGR",
+ "width": 19,
+ "clauses": [
+ {
+ "id": "full30",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇",
+ "condition": { "math": [ "u_shield_ratio", ">=", "96.67" ] }
+ },
+ {
+ "id": "full29",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▅",
+ "condition": { "math": [ "u_shield_ratio", ">=", "93.33" ] }
+ },
+ {
+ "id": "full28",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▂",
+ "condition": { "math": [ "u_shield_ratio", ">=", "90.00" ] }
+ },
+ {
+ "id": "full27",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "86.67" ] }
+ },
+ {
+ "id": "full26",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "83.33" ] }
+ },
+ {
+ "id": "full25",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "80.00" ] }
+ },
+ {
+ "id": "full24",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "76.67" ] }
+ },
+ {
+ "id": "full23",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "73.33" ] }
+ },
+ {
+ "id": "full22",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "70.00" ] }
+ },
+ {
+ "id": "full21",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "66.67" ] }
+ },
+ {
+ "id": "full20",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "63.33" ] }
+ },
+ {
+ "id": "full19",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "60.00" ] }
+ },
+ {
+ "id": "full18",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "56.67" ] }
+ },
+ {
+ "id": "full17",
+ "text": "▇ ▇ ▇ ▇ ▇ ▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "53.33" ] }
+ },
+ {
+ "id": "full16",
+ "text": "▇ ▇ ▇ ▇ ▇ ▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "50.00" ] }
+ },
+ {
+ "id": "full15",
+ "text": "▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "46.67" ] }
+ },
+ {
+ "id": "full14",
+ "text": "▇ ▇ ▇ ▇ ▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "43.33" ] }
+ },
+ {
+ "id": "full13",
+ "text": "▇ ▇ ▇ ▇ ▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "40.00" ] }
+ },
+ {
+ "id": "full12",
+ "text": "▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "36.67" ] }
+ },
+ {
+ "id": "full11",
+ "text": "▇ ▇ ▇ ▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "33.33" ] }
+ },
+ {
+ "id": "full10",
+ "text": "▇ ▇ ▇ ▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "30.00" ] }
+ },
+ {
+ "id": "full9",
+ "text": "▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "26.67" ] }
+ },
+ {
+ "id": "full8",
+ "text": "▇ ▇ ▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "23.33" ] }
+ },
+ {
+ "id": "full7",
+ "text": "▇ ▇ ▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "20.00" ] }
+ },
+ {
+ "id": "full6",
+ "text": "▇ ▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "16.67" ] }
+ },
+ {
+ "id": "full5",
+ "text": "▇ ▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "13.33" ] }
+ },
+ {
+ "id": "full4",
+ "text": "▇ ▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "10.00" ] }
+ },
+ {
+ "id": "full3",
+ "text": "▇ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "6.67" ] }
+ },
+ {
+ "id": "full2",
+ "text": "▅ ",
+ "condition": { "math": [ "u_shield_ratio", ">=", "3.33" ] }
+ },
+ {
+ "id": "full1",
+ "text": "▂ ",
+ "condition": { "math": [ "u_shield_ratio", ">", "0.00" ] }
+ },
+ {
+ "id": "empty",
+ "text": " OFFLINE ",
+ "condition": { "math": [ "u_shield_ratio", "<=", "0.00" ] }
+ }
+ ],
+ "flags": [ "W_NO_PADDING" ]
+ },
+ {
+ "id": "shield_power_gauge",
+ "type": "widget",
+ "style": "text",
+ "label": "POWER",
+ "width": 19,
+ "clauses": [
+ {
+ "id": "full10",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "90" ] }
+ },
+ {
+ "id": "full9",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "80" ] }
+ },
+ {
+ "id": "full8",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "70" ] }
+ },
+ {
+ "id": "full7",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "60" ] }
+ },
+ {
+ "id": "full6",
+ "text": "▇ ▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "50" ] }
+ },
+ {
+ "id": "full5",
+ "text": "▇ ▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "40" ] }
+ },
+ {
+ "id": "full4",
+ "text": "▇ ▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "30" ] }
+ },
+ {
+ "id": "full3",
+ "text": "▇ ▇ ▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "20" ] }
+ },
+ {
+ "id": "full2",
+ "text": "▇ ▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">=", "10" ] }
+ },
+ {
+ "id": "full1",
+ "text": "▇ ",
+ "condition": { "math": [ "u_shield_power_ratio", ">", "0" ] }
+ },
+ {
+ "id": "empty",
+ "text": " OFFLINE ",
+ "condition": { "math": [ "u_shield_power_ratio", "<=", "0" ] }
+ }
+ ],
+ "flags": [ "W_NO_PADDING" ]
+ },
+ {
+ "id": "shield_rad_warning",
+ "type": "widget",
+ "width": 8,
+ "style": "text",
+ "clauses": [
+ {
+ "id": "danger",
+ "text": " ☢DNGR☢",
+ "color": "red",
+ "condition": { "and": [ { "math": [ "u_shield_ratio", "<", "25" ] }, { "math": [ "u_shield_ratio", ">=", "0" ] } ] }
+ }
+ ],
+ "default_clause": { "text": " ☢DNGR☢", "color": "dark_gray" },
+ "flags": [ "W_LABEL_NONE", "W_NO_PADDING" ]
+ },
+ {
+ "id": "shield_title",
+ "type": "widget",
+ "width": 8,
+ "style": "text",
+ "string": "SHIELDING:",
+ "flags": [ "W_LABEL_NONE", "W_NO_PADDING" ]
+ },
+ {
+ "id": "shield_empty",
+ "type": "widget",
+ "width": 8,
+ "style": "text",
+ "string": "",
+ "flags": [ "W_LABEL_NONE", "W_NO_PADDING" ]
+ }
+]
diff --git a/data/mods/Aftershock/vehicles/vehicle_parts.json b/data/mods/Aftershock/vehicles/vehicle_parts.json
index b6e44323df47d..8f0655c61f5cd 100644
--- a/data/mods/Aftershock/vehicles/vehicle_parts.json
+++ b/data/mods/Aftershock/vehicles/vehicle_parts.json
@@ -242,7 +242,7 @@
"id": "veh_tools_kitchen",
"type": "vehicle_part",
"copy-from": "veh_tools_kitchen",
- "description": "A table rig with a faucet for water tank access, fume hood, drawers and fixtures for storing tools, low power electric connectors and valves for for fuel tank connections.",
+ "description": "A table rig with a faucet for water tank access, fume hood, drawers and fixtures for storing tools, low power electric connectors and valves for fuel tank connections.",
"item": "veh_tools_kitchen",
"looks_like": "kitchen_unit",
"extend": { "allowed_tools": [ "afs_atompot" ] }
diff --git a/data/mods/DinoMod/mapgen/dinoexhibit.json b/data/mods/DinoMod/mapgen/dinoexhibit.json
index 31dabb41cf2ff..50d0c20c3636f 100644
--- a/data/mods/DinoMod/mapgen/dinoexhibit.json
+++ b/data/mods/DinoMod/mapgen/dinoexhibit.json
@@ -13,23 +13,23 @@
".................~~~~~..",
".................y~~~y..",
"yyyyyyyyyyyyyyyyyy~~~yy^",
- "###############|||o*ooo|",
- "#..............|t|D |",
- "#.#############| |JJJ Q|",
- "#.#...#...#...#|j* D Q|",
- "#.#I..#...#.I.#||||*||||",
- "#.#...#..I#...#.j......#",
- "#.##u###u###u##........#",
- "#......................#",
- "#.####u#####u##.. .#",
- "#.#.....#.....#..HH .#",
- "#.#.....#.....#..HH .#",
- "#.#.....#.....#.%%%%*%%#",
- "#.#.....#.....#.%.....%#",
- "#.#....I#...I.#.%PPPPP%#",
- "#.#############.%%%%%%%#",
- "#......................#",
- "########################"
+ "ŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦ###o*ooo#",
+ "Ŧ..............#t#D #",
+ "Ŧ.ŦŦŦŦŦŦŦŦŦŦŦŦŦ# #JJJ Q#",
+ "Ŧ.Ŧ...Ŧ...Ŧ...Ŧ#j* D Q#",
+ "Ŧ.ŦI..Ŧ...Ŧ.I.Ŧ####*####",
+ "Ŧ.Ŧ...Ŧ..IŦ...Ŧ.j......Ŧ",
+ "Ŧ.ŦŦuŦŦŦuŦŦŦuŦŦ........Ŧ",
+ "Ŧ......................Ŧ",
+ "Ŧ.ŦŦŦŦuŦŦŦŦŦuŦŦ.. .Ŧ",
+ "Ŧ.Ŧ.....Ŧ.....Ŧ..HH .Ŧ",
+ "Ŧ.Ŧ.....Ŧ.....Ŧ..HH .Ŧ",
+ "Ŧ.Ŧ.....Ŧ.....Ŧ.||||*||Ŧ",
+ "Ŧ.Ŧ.....Ŧ.....Ŧ.|.....|Ŧ",
+ "Ŧ.Ŧ....IŦ...I.Ŧ.|PPPPP|Ŧ",
+ "Ŧ.ŦŦŦŦŦŦŦŦŦŦŦŦŦ.|||||||Ŧ",
+ "Ŧ......................Ŧ",
+ "ŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦ"
],
"flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN" ],
"palettes": [ "city_block_foundation_palette" ],
@@ -83,23 +83,23 @@
".................~~~~~..",
".................y~~~y..",
"yyyyyyyyyyyyyyyyyy~~~yy^",
- "###############|||o*ooo|",
- "#..............|t|D |",
- "#.#############| |JJJ Q|",
- "#.#...#...#...#|j* D Q|",
- "#.#I..#...#.I.#||||*||||",
- "#.#...#..I#...#.j......#",
- "#.##u###u###u##........#",
- "#......................#",
- "#.####u#####u##.. .#",
- "#.#.....#.....#..HH .#",
- "#.#.....#.....#..HH .#",
- "#.#.....#.....#.%%%%*%%#",
- "#.#.....#.....#.%.....%#",
- "#.#....I#...I.#.%PPPPP%#",
- "#.#############.%%%%%%%#",
- "#......................#",
- "########################"
+ "ŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦ###o*ooo#",
+ "Ŧ..............#t#D #",
+ "Ŧ.ŦŦŦŦŦŦŦŦŦŦŦŦŦ# #JJJ Q#",
+ "Ŧ.Ŧ...Ŧ...Ŧ...Ŧ#j* D Q#",
+ "Ŧ.ŦI..Ŧ...Ŧ.I.Ŧ####*####",
+ "Ŧ.Ŧ...Ŧ..IŦ...Ŧ.j......Ŧ",
+ "Ŧ.ŦŦuŦŦŦuŦŦŦuŦŦ........Ŧ",
+ "Ŧ......................Ŧ",
+ "Ŧ.ŦŦŦŦuŦŦŦŦŦuŦŦ.. .Ŧ",
+ "Ŧ.Ŧ.....Ŧ.....Ŧ..HH .Ŧ",
+ "Ŧ.Ŧ.....Ŧ.....Ŧ..HH .Ŧ",
+ "Ŧ.Ŧ.....Ŧ.....Ŧ.||||*||Ŧ",
+ "Ŧ.Ŧ.....Ŧ.....Ŧ.|.....|Ŧ",
+ "Ŧ.Ŧ....IŦ...I.Ŧ.|PPPPP|Ŧ",
+ "Ŧ.ŦŦŦŦŦŦŦŦŦŦŦŦŦ.|||||||Ŧ",
+ "Ŧ......................Ŧ",
+ "ŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦ"
],
"flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN" ],
"palettes": [ "city_block_foundation_palette" ],
diff --git a/data/mods/Magiclysm/Spells/alien_mages.json b/data/mods/Magiclysm/Spells/alien_mages.json
index bfaf6ae9a16bd..12171793bd551 100644
--- a/data/mods/Magiclysm/Spells/alien_mages.json
+++ b/data/mods/Magiclysm/Spells/alien_mages.json
@@ -2,8 +2,8 @@
{
"id": "monster_heal_spell",
"type": "SPELL",
- "name": "Heal Self Monster ",
- "description": "A spell for a monster to heal themselves. How DARE they!",
+ "name": { "str": "Heal Self Monster ", "//~": "NO_I18N" },
+ "description": { "str": "A spell for a monster to heal themselves. How DARE they!", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "SILENT", "RANDOM_DAMAGE" ],
"effect": "attack",
@@ -16,8 +16,8 @@
{
"id": "migo_fleshwarper_blood_poison_spell",
"type": "SPELL",
- "name": "Blood Poison Monster",
- "description": "Projects a spray of acrid blood and gore all around the monster while also doing damage.",
+ "name": { "str": "Blood Poison Monster", "//~": "NO_I18N" },
+ "description": { "str": "Projects a spray of acrid blood and gore all around the monster while also doing damage.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "RANDOM_DAMAGE", "RANDOM_DURATION", "RANDOM_AOE", "SPLIT_DAMAGE" ],
"effect": "attack",
@@ -42,8 +42,8 @@
{
"id": "migo_fleshwarper_mutate",
"type": "SPELL",
- "name": "Fleshwarp Target ",
- "description": "A spell for the mi-go fleshwarper to cause a random mutation.",
+ "name": { "str": "Fleshwarp Target", "//~": "NO_I18N" },
+ "description": { "str": "A spell for the mi-go fleshwarper to cause a random mutation.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"//": "Random 25% to 75% chance to cause a mutation",
"flags": [ "SILENT", "RANDOM_DAMAGE" ],
@@ -57,8 +57,11 @@
{
"id": "migo_nethermancer_summon_nether",
"type": "SPELL",
- "name": "Summon Nether Being",
- "description": "A spell for the mi-go nethermancer to summon a nether being. It's a bug if you have this.",
+ "name": { "str": "Summon Nether Being", "//~": "NO_I18N" },
+ "description": {
+ "str": "A spell for the mi-go nethermancer to summon a nether being. It's a bug if you have this.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "ground" ],
"flags": [ "HOSTILE_SUMMON", "LOUD", "NO_PROJECTILE", "SPAWN_GROUP" ],
"shape": "blast",
@@ -77,8 +80,8 @@
{
"id": "sorcerer_hand_monster",
"type": "SPELL",
- "name": "Sorcerer's Hand Monster",
- "description": "Pull a target or set of items to you.",
+ "name": { "str": "Sorcerer's Hand Monster", "//~": "NO_I18N" },
+ "description": { "str": "Pull a target or set of items to you.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "CONCENTRATE", "NO_HANDS", "NO_LEGS" ],
"effect": "pull_target",
@@ -92,8 +95,8 @@
{
"id": "teleport_anchor_monster",
"type": "SPELL",
- "name": "Teleport Anchor Monster",
- "description": "Prevent the target from being able to teleport.",
+ "name": { "str": "Teleport Anchor Monster", "//~": "NO_I18N" },
+ "description": { "str": "Prevent the target from being able to teleport.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "CONCENTRATE", "NO_HANDS", "NO_LEGS" ],
"effect": "attack",
@@ -111,8 +114,8 @@
{
"id": "triffid_brambles_arc",
"type": "SPELL",
- "name": "Triffid Summon Brambles",
- "description": "Call up brambles to trap a pathetic mammal. This is the triffid version with no math.",
+ "name": { "str": "Triffid Summon Brambles", "//~": "NO_I18N" },
+ "description": { "str": "Call up brambles to trap a pathetic mammal. This is the triffid version with no math.", "//~": "NO_I18N" },
"valid_targets": [ "ground", "hostile" ],
"effect": "ter_transform",
"effect_str": "druid_summoned_brambles",
@@ -129,8 +132,11 @@
{
"id": "triffid_summon_tanglevine",
"type": "SPELL",
- "name": "Summon Tanglevine",
- "description": "This spell causes an animated vine to burst from the ground and attempt to seize a nearby target and hold it fast.",
+ "name": { "str": "Summon Tanglevine", "//~": "NO_I18N" },
+ "description": {
+ "str": "This spell causes an animated vine to burst from the ground and attempt to seize a nearby target and hold it fast.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "ground" ],
"flags": [ "RANDOM_AOE", "RANDOM_DURATION", "HOSTILE_SUMMON" ],
"effect": "summon",
@@ -150,8 +156,8 @@
{
"id": "triffid_pollen_cone",
"type": "SPELL",
- "name": { "str": "Pollen Spray" },
- "description": "Spews pollen in a cone.",
+ "name": { "str": "Pollen Spray", "//~": "NO_I18N" },
+ "description": { "str": "Spews pollen in a cone.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"max_level": 5,
"flags": [ "SILENT", "NO_HANDS", "NO_LEGS", "SPLIT_DAMAGE" ],
@@ -170,8 +176,8 @@
{
"id": "triffid_pollen_heal",
"type": "SPELL",
- "name": { "str": "Pollen Heal" },
- "description": "Heals other triffids.",
+ "name": { "str": "Pollen Heal", "//~": "NO_I18N" },
+ "description": { "str": "Heals other triffids.", "//~": "NO_I18N" },
"valid_targets": [ "ally" ],
"max_level": 5,
"flags": [ "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DAMAGE" ],
@@ -187,8 +193,8 @@
{
"id": "triffid_pollen_speed",
"type": "SPELL",
- "name": { "str": "Pollen enhancement" },
- "description": "Increases the speed of other triffids.",
+ "name": { "str": "Pollen enhancement", "//~": "NO_I18N" },
+ "description": { "str": "Increases the speed of other triffids.", "//~": "NO_I18N" },
"valid_targets": [ "ally" ],
"max_level": 8,
"flags": [ "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION" ],
@@ -205,8 +211,8 @@
{
"id": "triffid_pollen_blind",
"type": "SPELL",
- "name": { "str": "Pollen blinding" },
- "description": "Blind target and emit pollen.",
+ "name": { "str": "Pollen blinding", "//~": "NO_I18N" },
+ "description": { "str": "Blind target and emit pollen.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"max_level": 8,
"flags": [ "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION" ],
@@ -223,8 +229,8 @@
{
"id": "triffid_pollen_emit",
"type": "SPELL",
- "name": { "str": "Pollen Emit Spell" },
- "description": "Causes a pollen emit when the triffid seedshaper uses other spells.",
+ "name": { "str": "Pollen Emit Spell", "//~": "NO_I18N" },
+ "description": { "str": "Causes a pollen emit when the triffid seedshaper uses other spells.", "//~": "NO_I18N" },
"valid_targets": [ "ally", "hostile", "ground" ],
"max_level": 1,
"flags": [ "SILENT", "NO_HANDS", "NO_LEGS" ],
diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json
index a4ffec0a9a813..decb07f5f403b 100644
--- a/data/mods/Magiclysm/Spells/animist.json
+++ b/data/mods/Magiclysm/Spells/animist.json
@@ -111,8 +111,8 @@
{
"abstract": "summon_abstract_zombie",
"type": "SPELL",
- "name": "Abstract Summon Zombie",
- "description": "Abstract of Summon Undead spell.",
+ "name": { "str": "Abstract Summon Zombie", "//~": "NO_I18N" },
+ "description": { "str": "Abstract of Summon Undead spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"min_damage": 1,
"max_damage": 1,
@@ -132,8 +132,8 @@
"id": "summon_zombie",
"copy-from": "summon_abstract_zombie",
"type": "SPELL",
- "name": "Summon Zombie",
- "description": "Summon a zombie. Part of Summon Undead spell.",
+ "name": { "str": "Summon Zombie", "//~": "NO_I18N" },
+ "description": { "str": "Summon a zombie. Part of Summon Undead spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_zombie",
@@ -146,8 +146,8 @@
"id": "summon_tough_zombie",
"copy-from": "summon_abstract_zombie",
"type": "SPELL",
- "name": "Summon Tough Zombie",
- "description": "Summon a tough zombie. Part of Summon Undead spell.",
+ "name": { "str": "Summon Tough Zombie", "//~": "NO_I18N" },
+ "description": { "str": "Summon a tough zombie. Part of Summon Undead spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_zombie_tough",
@@ -160,8 +160,8 @@
"id": "summon_zombie_brute",
"copy-from": "summon_abstract_zombie",
"type": "SPELL",
- "name": "Summon Zombie Brute",
- "description": "Summon a zombie brute. Part of Summon Undead spell.",
+ "name": { "str": "Summon Zombie Brute", "//~": "NO_I18N" },
+ "description": { "str": "Summon a zombie brute. Part of Summon Undead spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_zombie_brute",
@@ -174,8 +174,8 @@
"id": "summon_skeleton",
"copy-from": "summon_abstract_zombie",
"type": "SPELL",
- "name": "Summon Skeleton Zombie",
- "description": "Summon a skeleton zombie. Part of Summon Undead spell.",
+ "name": { "str": "Summon Skeleton Zombie", "//~": "NO_I18N" },
+ "description": { "str": "Summon a skeleton zombie. Part of Summon Undead spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_skeleton",
@@ -188,8 +188,8 @@
"id": "summon_skeleton_brute",
"copy-from": "summon_abstract_zombie",
"type": "SPELL",
- "name": "Summon Skeletal Brute",
- "description": "Summon a skeletal brute. Part of Summon Undead spell.",
+ "name": { "str": "Summon Skeletal Brute", "//~": "NO_I18N" },
+ "description": { "str": "Summon a skeletal brute. Part of Summon Undead spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_skeleton_brute",
@@ -202,8 +202,8 @@
"id": "summon_skeleton_hulk",
"copy-from": "summon_abstract_zombie",
"type": "SPELL",
- "name": "Summon Skeletal Juggernaut",
- "description": "Summon a skeletal juggernaut. Part of Summon Undead spell.",
+ "name": { "str": "Summon Skeletal Juggernaut", "//~": "NO_I18N" },
+ "description": { "str": "Summon a skeletal juggernaut. Part of Summon Undead spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_skeleton_hulk",
@@ -256,8 +256,8 @@
{
"abstract": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Abstract Summon Swarm",
- "description": "Abstract of Summon Undead Swarm spell.",
+ "name": { "str": "Abstract Summon Swarm", "//~": "NO_I18N" },
+ "description": { "str": "Abstract of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"min_damage": 3,
"max_damage": 3,
@@ -277,8 +277,8 @@
"id": "summon_zombie_dog",
"copy-from": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Summon Zombie Dog",
- "description": "Summon a zombie dog. Part of Summon Undead Swarm spell.",
+ "name": { "str": "Summon Zombie Dog", "//~": "NO_I18N" },
+ "description": { "str": "Summon a zombie dog. Part of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_zombie_dog",
@@ -291,8 +291,8 @@
"id": "summon_dog_skeleton",
"copy-from": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Summon Skeletal Dog",
- "description": "Summon a skeletal dog. Part of Summon Undead Swarm spell.",
+ "name": { "str": "Summon Skeletal Dog", "//~": "NO_I18N" },
+ "description": { "str": "Summon a skeletal dog. Part of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_dog_skeleton",
@@ -305,8 +305,8 @@
"id": "summon_zougar",
"copy-from": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Summon Decayed Pouncer",
- "description": "Summon a decayed pouncer. Part of Summon Undead Swarm spell.",
+ "name": { "str": "Summon Decayed Pouncer", "//~": "NO_I18N" },
+ "description": { "str": "Summon a decayed pouncer. Part of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_zougar",
@@ -319,8 +319,8 @@
"id": "summon_wolf_skeleton",
"copy-from": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Summon Skeletal Wolf",
- "description": "Summon a skeletal wolf. Part of Summon Undead Swarm spell.",
+ "name": { "str": "Summon Skeletal Wolf", "//~": "NO_I18N" },
+ "description": { "str": "Summon a skeletal wolf. Part of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_wolf_skeleton",
@@ -333,8 +333,8 @@
"id": "summon_dog_zombie_brute",
"copy-from": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Summon Barghest",
- "description": "Summon a barghest. Part of Summon Undead Swarm spell.",
+ "name": { "str": "Summon Barghest", "//~": "NO_I18N" },
+ "description": { "str": "Summon a barghest. Part of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_dog_zombie_brute",
@@ -347,8 +347,8 @@
"id": "summon_dog_skeleton_brute",
"copy-from": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Summon Boneplate Wolf",
- "description": "Summon a boneplate wolf. Part of Summon Undead Swarm spell.",
+ "name": { "str": "Summon Boneplate Wolf", "//~": "NO_I18N" },
+ "description": { "str": "Summon a boneplate wolf. Part of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_dog_skeleton_brute",
@@ -361,8 +361,8 @@
"id": "summon_dog_zombie_hulk",
"copy-from": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Summon Hulking Horror",
- "description": "Summon a Hulking Horror. Part of Summon Undead Swarm spell.",
+ "name": { "str": "Summon Hulking Horror", "//~": "NO_I18N" },
+ "description": { "str": "Summon a Hulking Horror. Part of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_dog_zombie_hulk",
@@ -375,8 +375,8 @@
"id": "summon_zougar_hunter",
"copy-from": "summon_abstract_swarm",
"type": "SPELL",
- "name": "Summon Spearcat Hunter",
- "description": "Summon a spearcat hunter. Part of Summon Undead Swarm spell.",
+ "name": { "str": "Summon Spearcat Hunter", "//~": "NO_I18N" },
+ "description": { "str": "Summon a spearcat hunter. Part of Summon Undead Swarm spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_zougar_hunter",
@@ -508,8 +508,8 @@
{
"id": "life_detonation_explosion",
"type": "SPELL",
- "name": "Life Detonation Explosion",
- "description": "Detonation for life detonation spell.",
+ "name": { "str": "Life Detonation Explosion", "//~": "NO_I18N" },
+ "description": { "str": "Detonation for life detonation spell.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "EVOCATION_SPELL", "CONCENTRATE", "SOMATIC", "SILENT", "SPLIT_DAMAGE" ],
"effect": "attack",
@@ -852,8 +852,8 @@
{
"id": "devour_damage",
"type": "SPELL",
- "name": "Devour Damage",
- "description": "Deal deadly damage to ally. You can see it only in debug mode.",
+ "name": { "str": "Devour Damage", "//~": "NO_I18N" },
+ "description": { "str": "Deal deadly damage to ally. You can see it only in debug mode.", "//~": "NO_I18N" },
"valid_targets": [ "ally" ],
"flags": [ "EVOCATION_SPELL", "SILENT", "PERCENTAGE_DAMAGE" ],
"effect": "attack",
@@ -865,8 +865,8 @@
{
"id": "devour_healing",
"type": "SPELL",
- "name": "Devour Healing",
- "description": "Heal the player. You can see it only in debug mode.",
+ "name": { "str": "Devour Healing", "//~": "NO_I18N" },
+ "description": { "str": "Heal the player. You can see it only in debug mode.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "EVOCATION_SPELL", "CONCENTRATE", "SOMATIC", "SILENT", "NO_PROJECTILE" ],
"effect": "attack",
@@ -951,8 +951,11 @@
{
"id": "animist_mass_hiding_self",
"type": "SPELL",
- "name": "A Shadow in the Crowd Self",
- "description": "Puts an effect on you so anyone affected by A Shadow in the Crowd knows to ignore you. It's a bug if you have this directly.",
+ "name": { "str": "A Shadow in the Crowd Self", "//~": "NO_I18N" },
+ "description": {
+ "str": "Puts an effect on you so anyone affected by A Shadow in the Crowd knows to ignore you. It's a bug if you have this directly.",
+ "//~": "NO_I18N"
+ },
"message": "",
"teachable": false,
"valid_targets": [ "self" ],
@@ -1109,8 +1112,8 @@
{
"id": "animist_radiation_bolt",
"type": "SPELL",
- "name": "Magic Fissile Radiation",
- "description": "Spawns a radiation field near the target. It's a bug if you have it directly.",
+ "name": { "str": "Magic Fissile Radiation", "//~": "NO_I18N" },
+ "description": { "str": "Spawns a radiation field near the target. It's a bug if you have it directly.", "//~": "NO_I18N" },
"flags": [ "EVOCATION_SPELL", "NO_EXPLOSION_SFX" ],
"valid_targets": [ "self" ],
"effect": "emit",
diff --git a/data/mods/Magiclysm/Spells/attunements/Boreal_Mage.json b/data/mods/Magiclysm/Spells/attunements/Boreal_Mage.json
index d1352ef627154..c871212ca55d4 100644
--- a/data/mods/Magiclysm/Spells/attunements/Boreal_Mage.json
+++ b/data/mods/Magiclysm/Spells/attunements/Boreal_Mage.json
@@ -30,8 +30,11 @@
{
"type": "SPELL",
"id": "auroral_wave_cold",
- "name": "Auroral Wave",
- "description": "This is the cold damage portion of the Auroral Wave spell, it is a wider blast around the central high damage cone.",
+ "name": { "str": "Auroral Wave", "//~": "NO_I18N" },
+ "description": {
+ "str": "This is the cold damage portion of the Auroral Wave spell, it is a wider blast around the central high damage cone.",
+ "//~": "NO_I18N"
+ },
"effect": "attack",
"shape": "cone",
"valid_targets": [ "hostile", "ground" ],
diff --git a/data/mods/Magiclysm/Spells/attunements/Cleansing_Flame.json b/data/mods/Magiclysm/Spells/attunements/Cleansing_Flame.json
index 638d30ead02e5..d8b53ed71fcb8 100644
--- a/data/mods/Magiclysm/Spells/attunements/Cleansing_Flame.json
+++ b/data/mods/Magiclysm/Spells/attunements/Cleansing_Flame.json
@@ -83,8 +83,8 @@
},
{
"id": "immolate_transform",
- "name": "Immolate Transform",
- "description": "The part of the Immolate spell that causes the transform.",
+ "name": { "str": "Immolate Transform", "//~": "NO_I18N" },
+ "description": { "str": "The part of the Immolate spell that causes the transform.", "//~": "NO_I18N" },
"valid_targets": [ "ally", "hostile", "ground" ],
"type": "SPELL",
"effect": "ter_transform",
@@ -136,8 +136,8 @@
{
"id": "immolate_push",
"type": "SPELL",
- "name": "Immolate Push Effect",
- "description": "The immolate spell is powerful enough to push targets from its epicenter.",
+ "name": { "str": "Immolate Push Effect", "//~": "NO_I18N" },
+ "description": { "str": "The immolate spell is powerful enough to push targets from its epicenter.", "//~": "NO_I18N" },
"effect": "directed_push",
"shape": "blast",
"valid_targets": [ "ally", "hostile", "ground" ],
@@ -176,8 +176,11 @@
{
"id": "cleansingflame_hermes_burn",
"type": "SPELL",
- "name": "Hermes Reborn Fire",
- "description": "Give some frost damage for Hermes Reborn spell. Subspell; you aren't allowed to see it except in debug mode.",
+ "name": { "str": "Hermes Reborn Fire", "//~": "NO_I18N" },
+ "description": {
+ "str": "Give some frost damage for Hermes Reborn spell. Subspell; you aren't allowed to see it except in debug mode.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"max_level": 35,
"flags": [ "SPLIT_DAMAGE" ],
diff --git a/data/mods/Magiclysm/Spells/attunements/Earth_Elemental.json b/data/mods/Magiclysm/Spells/attunements/Earth_Elemental.json
index 0009dc7b87f13..a48d369be7573 100644
--- a/data/mods/Magiclysm/Spells/attunements/Earth_Elemental.json
+++ b/data/mods/Magiclysm/Spells/attunements/Earth_Elemental.json
@@ -40,8 +40,8 @@
{
"id": "quake_transform",
"type": "SPELL",
- "name": "Quake Transform",
- "description": "Causes rubble to be spawned occasionally.",
+ "name": { "str": "Quake Transform", "//~": "NO_I18N" },
+ "description": { "str": "Causes rubble to be spawned occasionally.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "EVOCATION_SPELL", "SILENT", "NO_EXPLOSION_SFX", "IGNORE_WALLS" ],
"effect": "ter_transform",
@@ -89,10 +89,10 @@
},
{
"id": "single_rock_blast",
- "name": "Single Rock Blast",
"type": "SPELL",
"flags": [ "EVOCATION_SPELL", "NO_EXPLOSION_SFX" ],
- "description": "A single portion of the rock blast spell.",
+ "name": { "str": "Single Rock Blast", "//~": "NO_I18N" },
+ "description": { "str": "A single portion of the rock blast spell.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"effect": "attack",
"shape": "blast",
@@ -106,9 +106,9 @@
},
{
"id": "rock_blast_push",
- "name": "Rock Blast Push",
"type": "SPELL",
- "description": "The push portion of the rock blast spell.",
+ "name": { "str": "Rock Blast Push", "//~": "NO_I18N" },
+ "description": { "str": "The push portion of the rock blast spell.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "EVOCATION_SPELL", "NO_EXPLOSION_SFX" ],
"effect": "directed_push",
diff --git a/data/mods/Magiclysm/Spells/attunements/Glacier_Mage.json b/data/mods/Magiclysm/Spells/attunements/Glacier_Mage.json
index 0463d9db6344a..95624e1230650 100644
--- a/data/mods/Magiclysm/Spells/attunements/Glacier_Mage.json
+++ b/data/mods/Magiclysm/Spells/attunements/Glacier_Mage.json
@@ -29,8 +29,8 @@
{
"type": "SPELL",
"id": "ice_clave_blunt",
- "name": "Ice Clave",
- "description": "This is the blunt damage portion of the Ice Clave spell.",
+ "name": { "str": "Ice Clave", "//~": "NO_I18N" },
+ "description": { "str": "This is the blunt damage portion of the Ice Clave spell.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "cone",
"flags": [ "EVOCATION_SPELL", "SPLIT_DAMAGE" ],
@@ -80,8 +80,8 @@
{
"id": "frozen_winds_push",
"type": "SPELL",
- "name": "Frozen Winds Push Effect",
- "description": "This is the push effect portion of the Frozen Winds spell.",
+ "name": { "str": "Frozen Winds Push Effect", "//~": "NO_I18N" },
+ "description": { "str": "This is the push effect portion of the Frozen Winds spell.", "//~": "NO_I18N" },
"effect": "directed_push",
"shape": "line",
"flags": [ "EVOCATION_SPELL" ],
diff --git a/data/mods/Magiclysm/Spells/attunements/Golemancer.json b/data/mods/Magiclysm/Spells/attunements/Golemancer.json
index ddb6689c0ea02..51de036a1559b 100644
--- a/data/mods/Magiclysm/Spells/attunements/Golemancer.json
+++ b/data/mods/Magiclysm/Spells/attunements/Golemancer.json
@@ -36,8 +36,8 @@
"id": "summon_golem_focus",
"type": "SPELL",
"spell_class": "NONE",
- "name": "Give Back Core",
- "description": "Gives back a golem's core. You should not see this spell.",
+ "name": { "str": "Give Back Core", "//~": "NO_I18N" },
+ "description": { "str": "Gives back a golem's core. You should not see this spell.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "golemcore",
diff --git a/data/mods/Magiclysm/Spells/attunements/Gravity_Mage.json b/data/mods/Magiclysm/Spells/attunements/Gravity_Mage.json
index ed1a173467ca9..cff9836e02b1d 100644
--- a/data/mods/Magiclysm/Spells/attunements/Gravity_Mage.json
+++ b/data/mods/Magiclysm/Spells/attunements/Gravity_Mage.json
@@ -2,8 +2,8 @@
{
"id": "gravitymage_graviton_damage",
"type": "SPELL",
- "name": "Graviton Polarization Damage",
- "description": "Handles the damage part of Graviton Polarization - if you see this, something went wrong.",
+ "name": { "str": "Graviton Polarization Damage", "//~": "NO_I18N" },
+ "description": { "str": "Handles the damage part of Graviton Polarization - if you see this, something went wrong.", "//~": "NO_I18N" },
"valid_targets": [ "self", "ally", "hostile", "ground" ],
"effect": "attack",
"shape": "blast",
@@ -65,8 +65,8 @@
{
"id": "gravitymage_graviton_centerdamage",
"type": "SPELL",
- "name": "Graviton Polarization Center Damage",
- "description": "Handles damage in the extreme center of the Graviton.",
+ "name": { "str": "Graviton Polarization Center Damage", "//~": "NO_I18N" },
+ "description": { "str": "Handles damage in the extreme center of the Graviton.", "//~": "NO_I18N" },
"valid_targets": [ "self", "ally", "hostile", "ground" ],
"effect": "attack",
"shape": "blast",
diff --git a/data/mods/Magiclysm/Spells/attunements/Ice_Elemental.json b/data/mods/Magiclysm/Spells/attunements/Ice_Elemental.json
index df714fa54ab07..8a948b344b7c0 100644
--- a/data/mods/Magiclysm/Spells/attunements/Ice_Elemental.json
+++ b/data/mods/Magiclysm/Spells/attunements/Ice_Elemental.json
@@ -55,8 +55,11 @@
{
"id": "cold_heart_slow",
"type": "SPELL",
- "name": "Cold Heart Slowdown",
- "description": "Causes slowdown from the Cold Heart spell. Subspell; you aren't allowed to see it except in debug mode.",
+ "name": { "str": "Cold Heart Slowdown", "//~": "NO_I18N" },
+ "description": {
+ "str": "Causes slowdown from the Cold Heart spell. Subspell; you aren't allowed to see it except in debug mode.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"effect": "attack",
"shape": "blast",
diff --git a/data/mods/Magiclysm/Spells/attunements/Magnetism_Mage.json b/data/mods/Magiclysm/Spells/attunements/Magnetism_Mage.json
index 99e3ce43efad9..1b20ef39abf7d 100644
--- a/data/mods/Magiclysm/Spells/attunements/Magnetism_Mage.json
+++ b/data/mods/Magiclysm/Spells/attunements/Magnetism_Mage.json
@@ -193,8 +193,8 @@
{
"id": "railgun_sparks",
"type": "SPELL",
- "name": "Railgun Sparks",
- "description": "The spark portion of the Railgun spell.",
+ "name": { "str": "Railgun Sparks", "//~": "NO_I18N" },
+ "description": { "str": "The spark portion of the Railgun spell.", "//~": "NO_I18N" },
"valid_targets": [ "ground", "hostile", "ally" ],
"effect": "attack",
"shape": "line",
@@ -240,8 +240,11 @@
{
"id": "magnetismmage_electrolaser_electro",
"type": "SPELL",
- "name": "Electrolaser Electric Damage",
- "description": "Give some electric damage for Electrolaser spell. Subspell; you aren't allowed to see it except in debug mode.",
+ "name": { "str": "Electrolaser Electric Damage", "//~": "NO_I18N" },
+ "description": {
+ "str": "Give some electric damage for Electrolaser spell. Subspell; you aren't allowed to see it except in debug mode.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "EVOCATION_SPELL" ],
"effect": "attack",
@@ -261,8 +264,11 @@
{
"id": "robot_disabler",
"type": "SPELL",
- "name": "Surge mod moves",
- "description": "Subtract some moves from targeted_monster_ids monsters. Subspell; you aren't allowed to see it except in debug mode.",
+ "name": { "str": "Surge mod moves", "//~": "NO_I18N" },
+ "description": {
+ "str": "Subtract some moves from targeted_monster_ids monsters. Subspell; you aren't allowed to see it except in debug mode.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"targeted_monster_species": [ "ROBOT", "CYBORG" ],
"effect": "mod_moves",
diff --git a/data/mods/Magiclysm/Spells/attunements/Radiation_Mage.json b/data/mods/Magiclysm/Spells/attunements/Radiation_Mage.json
index b881643363f2e..053dd528abe47 100644
--- a/data/mods/Magiclysm/Spells/attunements/Radiation_Mage.json
+++ b/data/mods/Magiclysm/Spells/attunements/Radiation_Mage.json
@@ -26,8 +26,8 @@
{
"id": "shortwave_2",
"type": "SPELL",
- "name": "Shortwave 2",
- "description": "Cook nearby monsters (and yourself to an extent).",
+ "name": { "str": "Shortwave 2", "//~": "NO_I18N" },
+ "description": { "str": "Cook nearby monsters (and yourself to an extent).", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "EVOCATION_SPELL", "SOMATIC", "MUST_HAVE_CLASS_TO_LEARN", "SPLIT_DAMAGE" ],
"effect": "attack",
diff --git a/data/mods/Magiclysm/Spells/attunements/Soulfire.json b/data/mods/Magiclysm/Spells/attunements/Soulfire.json
index 5f93db12a72f4..7afb040f8e1af 100644
--- a/data/mods/Magiclysm/Spells/attunements/Soulfire.json
+++ b/data/mods/Magiclysm/Spells/attunements/Soulfire.json
@@ -34,8 +34,8 @@
{
"id": "soul_afterburner_effect_1",
"type": "SPELL",
- "name": "Soul Burn",
- "description": "This is a description for a spell the player will never see.",
+ "name": { "str": "Soul Burn", "//~": "NO_I18N" },
+ "description": { "str": "This is a description for a spell the player will never see.", "//~": "NO_I18N" },
"flags": [ "ENHANCEMENT_SPELL" ],
"effect": "attack",
"effect_str": "soul_burn",
diff --git a/data/mods/Magiclysm/Spells/attunements/Storm_Elemental.json b/data/mods/Magiclysm/Spells/attunements/Storm_Elemental.json
index 150c3052f813c..012ce0feaf968 100644
--- a/data/mods/Magiclysm/Spells/attunements/Storm_Elemental.json
+++ b/data/mods/Magiclysm/Spells/attunements/Storm_Elemental.json
@@ -26,8 +26,8 @@
{
"type": "SPELL",
"id": "storm_chain_1",
- "name": "Storm Chain 1",
- "description": "#1 in the storm chain series of effects.",
+ "name": { "str": "Storm Chain 1", "//~": "NO_I18N" },
+ "description": { "str": "#1 in the storm chain series of effects.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "line",
"damage_type": "electric",
@@ -52,8 +52,8 @@
{
"type": "SPELL",
"id": "storm_chain_2",
- "name": "Storm Chain 2",
- "description": "#2 in the storm chain series of effects.",
+ "name": { "str": "Storm Chain 2", "//~": "NO_I18N" },
+ "description": { "str": "#2 in the storm chain series of effects.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "line",
"damage_type": "electric",
@@ -78,8 +78,8 @@
{
"type": "SPELL",
"id": "storm_chain_3",
- "name": "Storm Chain 3",
- "description": "#3 in the storm chain series of effects.",
+ "name": { "str": "Storm Chain 3", "//~": "NO_I18N" },
+ "description": { "str": "#3 in the storm chain series of effects.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "line",
"damage_type": "electric",
diff --git a/data/mods/Magiclysm/Spells/attunements/Tundra_Mage.json b/data/mods/Magiclysm/Spells/attunements/Tundra_Mage.json
index 652c7d0bbe11d..981ca934d0d3d 100644
--- a/data/mods/Magiclysm/Spells/attunements/Tundra_Mage.json
+++ b/data/mods/Magiclysm/Spells/attunements/Tundra_Mage.json
@@ -27,8 +27,8 @@
{
"type": "SPELL",
"id": "cold_snap_freeze",
- "name": "Cold Snap Freeze",
- "description": "Freezes the target monster in place.",
+ "name": { "str": "Cold Snap Freeze", "//~": "NO_I18N" },
+ "description": { "str": "Freezes the target monster in place.", "//~": "NO_I18N" },
"effect": "mod_moves",
"shape": "blast",
"max_level": 35,
diff --git a/data/mods/Magiclysm/Spells/attunements/Void_Mage.json b/data/mods/Magiclysm/Spells/attunements/Void_Mage.json
index 793b5d749563c..830c7c31eb779 100644
--- a/data/mods/Magiclysm/Spells/attunements/Void_Mage.json
+++ b/data/mods/Magiclysm/Spells/attunements/Void_Mage.json
@@ -33,8 +33,11 @@
{
"id": "voidmage_final_grasp_slowdown",
"type": "SPELL",
- "name": "Final Grasp Slowdown",
- "description": "Removes some moves from an enemy. Subspell; you aren't allowed to see it except in debug mode.",
+ "name": { "str": "Final Grasp Slowdown", "//~": "NO_I18N" },
+ "description": {
+ "str": "Removes some moves from an enemy. Subspell; you aren't allowed to see it except in debug mode.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"flags": [ "EVOCATION_SPELL" ],
"effect": "mod_moves",
@@ -82,10 +85,13 @@
]
},
{
- "abstract": "horizon_vortex_abstract",
- "name": "Horizon Vortex Abstract",
"type": "SPELL",
- "description": "Causes some damage in the Horizon Vortex spell. Subspell; you aren't allowed to see it except in debug mode.",
+ "abstract": "horizon_vortex_abstract",
+ "name": { "str": "Horizon Vortex Abstract", "//~": "NO_I18N" },
+ "description": {
+ "str": "Causes some damage in the Horizon Vortex spell. Subspell; you aren't allowed to see it except in debug mode.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"flags": [ "NO_PROJECTILE", "LOUD", "RANDOM_TARGET" ],
"message": "",
@@ -102,7 +108,7 @@
"id": "horizon_vortex_fire",
"copy-from": "horizon_vortex_abstract",
"type": "SPELL",
- "name": "Horizon Vortex Heat Damage",
+ "name": { "str": "Horizon Vortex Heat Damage", "//~": "NO_I18N" },
"extend": { "flags": [ "RANDOM_DAMAGE" ] },
"damage_type": "heat"
},
@@ -110,7 +116,7 @@
"id": "horizon_vortex_acid",
"copy-from": "horizon_vortex_abstract",
"type": "SPELL",
- "name": "Horizon Vortex Acid Damage",
+ "name": { "str": "Horizon Vortex Acid Damage", "//~": "NO_I18N" },
"extend": { "flags": [ "RANDOM_DAMAGE" ] },
"damage_type": "acid"
},
@@ -118,7 +124,7 @@
"id": "horizon_vortex_bash",
"copy-from": "horizon_vortex_abstract",
"type": "SPELL",
- "name": "Horizon Vortex Bash Damage",
+ "name": { "str": "Horizon Vortex Bash Damage", "//~": "NO_I18N" },
"extend": { "flags": [ "RANDOM_DAMAGE" ] },
"damage_type": "bash"
},
@@ -126,7 +132,7 @@
"id": "horizon_vortex_nether",
"copy-from": "horizon_vortex_abstract",
"type": "SPELL",
- "name": "Horizon Vortex Pure Damage",
+ "name": { "str": "Horizon Vortex Pure Damage", "//~": "NO_I18N" },
"extend": { "flags": [ "RANDOM_DAMAGE" ] },
"damage_type": "nether"
},
@@ -134,7 +140,7 @@
"id": "horizon_vortex_cold",
"copy-from": "horizon_vortex_abstract",
"type": "SPELL",
- "name": "Horizon Vortex Cold Damage",
+ "name": { "str": "Horizon Vortex Cold Damage", "//~": "NO_I18N" },
"damage_type": "cold",
"max_level": 35
},
@@ -142,7 +148,7 @@
"id": "horizon_vortex_cut",
"copy-from": "horizon_vortex_abstract",
"type": "SPELL",
- "name": "Horizon Vortex Cut Damage",
+ "name": { "str": "Horizon Vortex Cut Damage", "//~": "NO_I18N" },
"damage_type": "cut",
"max_level": 35
},
@@ -150,7 +156,7 @@
"id": "horizon_vortex_electric",
"copy-from": "horizon_vortex_abstract",
"type": "SPELL",
- "name": "Horizon Vortex Electric Damage",
+ "name": { "str": "Horizon Vortex Electric Damage", "//~": "NO_I18N" },
"damage_type": "electric",
"max_level": 35
},
@@ -158,7 +164,7 @@
"id": "horizon_vortex_stab",
"copy-from": "horizon_vortex_abstract",
"type": "SPELL",
- "name": "Horizon Vortex Stab Damage",
+ "name": { "str": "Horizon Vortex Stab Damage", "//~": "NO_I18N" },
"damage_type": "stab",
"max_level": 35
}
diff --git a/data/mods/Magiclysm/Spells/attunements/Vulcanist.json b/data/mods/Magiclysm/Spells/attunements/Vulcanist.json
index 9bd726856105d..7a24a3ab2e992 100644
--- a/data/mods/Magiclysm/Spells/attunements/Vulcanist.json
+++ b/data/mods/Magiclysm/Spells/attunements/Vulcanist.json
@@ -2,8 +2,8 @@
{
"id": "lava_bomb_shrapnel",
"type": "SPELL",
- "name": "Lava Bomb Shrapnel",
- "description": "This is a sub spell for the Lava Bomb spell.",
+ "name": { "str": "Lava Bomb Shrapnel", "//~": "NO_I18N" },
+ "description": { "str": "This is a sub spell for the Lava Bomb spell.", "//~": "NO_I18N" },
"flags": [ "EVOCATION_SPELL" ],
"effect": "attack",
"shape": "blast",
@@ -21,8 +21,8 @@
{
"id": "lava_bomb_heat",
"type": "SPELL",
- "name": "Lava Bomb Heat",
- "description": "This is a sub spell for the Lava Bomb spell.",
+ "name": { "str": "Lava Bomb Heat", "//~": "NO_I18N" },
+ "description": { "str": "This is a sub spell for the Lava Bomb spell.", "//~": "NO_I18N" },
"flags": [ "EVOCATION_SPELL", "SPLIT_DAMAGE" ],
"effect": "attack",
"shape": "blast",
@@ -39,8 +39,8 @@
{
"id": "lava_bomb_ter",
"type": "SPELL",
- "name": "Lava Bomb Terrain",
- "description": "This is a sub spell for the Lava Bomb spell.",
+ "name": { "str": "Lava Bomb Terrain", "//~": "NO_I18N" },
+ "description": { "str": "This is a sub spell for the Lava Bomb spell.", "//~": "NO_I18N" },
"effect": "ter_transform",
"effect_str": "lava_bomb",
"shape": "blast",
@@ -112,8 +112,8 @@
{
"type": "SPELL",
"id": "vulcanist_pyroclastic_flow_smoke",
- "name": "Pyroclastic Flow Smoke",
- "description": "Creates smoke in the area. Subspell; you aren't allowed to see it except in debug mode.",
+ "name": { "str": "Pyroclastic Flow Smoke", "//~": "NO_I18N" },
+ "description": { "str": "Creates smoke in the area. Subspell; you aren't allowed to see it except in debug mode.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "line",
"valid_targets": [ "hostile", "ground", "ally" ],
diff --git a/data/mods/Magiclysm/Spells/attunements/Wither_Mage.json b/data/mods/Magiclysm/Spells/attunements/Wither_Mage.json
index ae4bfa78e190b..2e894220194b3 100644
--- a/data/mods/Magiclysm/Spells/attunements/Wither_Mage.json
+++ b/data/mods/Magiclysm/Spells/attunements/Wither_Mage.json
@@ -2,8 +2,8 @@
{
"type": "SPELL",
"id": "assassin_teleport",
- "name": "Assassin Teleport",
- "description": "This is a sub-spell for Assassin Strike. It teleports you.",
+ "name": { "str": "Assassin Teleport", "//~": "NO_I18N" },
+ "description": { "str": "This is a sub-spell for Assassin Strike. It teleports you.", "//~": "NO_I18N" },
"effect": "short_range_teleport",
"shape": "blast",
"valid_targets": [ "none" ],
@@ -14,8 +14,8 @@
{
"type": "SPELL",
"id": "assassin_toxic_smoke",
- "name": "Assassin Toxic Smoke",
- "description": "This is a sub-spell for Assassin Strike. It generates toxic smoke in an area.",
+ "name": { "str": "Assassin Toxic Smoke", "//~": "NO_I18N" },
+ "description": { "str": "This is a sub-spell for Assassin Strike. It generates toxic smoke in an area.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "ground", "hostile" ],
@@ -86,8 +86,8 @@
{
"type": "SPELL",
"id": "life_drain_stamina",
- "name": "Life Drain Stamina",
- "description": "Gives you a bit of stamina. Subspell; you aren't allowed to see it except in debug mode.",
+ "name": { "str": "Life Drain Stamina", "//~": "NO_I18N" },
+ "description": { "str": "Gives you a bit of stamina. Subspell; you aren't allowed to see it except in debug mode.", "//~": "NO_I18N" },
"effect": "recover_energy",
"effect_str": "STAMINA",
"flags": [ "RESTORATION_SPELL" ],
diff --git a/data/mods/Magiclysm/Spells/biomancer.json b/data/mods/Magiclysm/Spells/biomancer.json
index 51bbf533159a0..110c33345a32e 100644
--- a/data/mods/Magiclysm/Spells/biomancer.json
+++ b/data/mods/Magiclysm/Spells/biomancer.json
@@ -307,8 +307,8 @@
{
"id": "biomancer_visceral_paralyze",
"type": "SPELL",
- "name": "Visceral Paralysis",
- "description": "Paralytic side effect of Projection.",
+ "name": { "str": "Visceral Paralysis", "//~": "NO_I18N" },
+ "description": { "str": "Paralytic side effect of Projection.", "//~": "NO_I18N" },
"valid_targets": [ "ally", "hostile" ],
"effect": "attack",
"effect_str": "biomancer_dart_venom",
@@ -331,8 +331,8 @@
{
"id": "biomancer_visceral_backlash",
"type": "SPELL",
- "name": "Visceral Backlash",
- "description": "Hits the user with side effects too.",
+ "name": { "str": "Visceral Backlash", "//~": "NO_I18N" },
+ "description": { "str": "Hits the user with side effects too.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "biomancer_visceral_side_effects",
@@ -365,8 +365,8 @@
{
"id": "corrosive_aura_spell",
"type": "SPELL",
- "name": "Caustic Feedback",
- "description": "This is a sub-spell of the Caustic Aura spell.",
+ "name": { "str": "Caustic Feedback", "//~": "NO_I18N" },
+ "description": { "str": "This is a sub-spell of the Caustic Aura spell.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"effect": "attack",
"shape": "blast",
diff --git a/data/mods/Magiclysm/Spells/black_dragon.json b/data/mods/Magiclysm/Spells/black_dragon.json
index 75c5604a2ca77..840bec6a37dfa 100644
--- a/data/mods/Magiclysm/Spells/black_dragon.json
+++ b/data/mods/Magiclysm/Spells/black_dragon.json
@@ -103,8 +103,8 @@
{
"id": "dragon_shell_retaliation_black",
"type": "SPELL",
- "name": "Black Dragon Shell Retaliation",
- "description": "Acid burst that punishes attackers.",
+ "name": { "str": "Black Dragon Shell Retaliation", "//~": "NO_I18N" },
+ "description": { "str": "Acid burst that punishes attackers.", "//~": "NO_I18N" },
"effect": "attack",
"effect_str": "dragon_acidburn",
"shape": "blast",
@@ -179,8 +179,8 @@
{
"type": "SPELL",
"id": "health_recovery",
- "name": "Health Recovery",
- "description": "Minor health recovery spell associated with Dragon Boost.",
+ "name": { "str": "Health Recovery", "//~": "NO_I18N" },
+ "description": { "str": "Minor health recovery spell associated with Dragon Boost.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"shape": "blast",
@@ -191,8 +191,8 @@
{
"type": "SPELL",
"id": "stamina_recovery",
- "name": "Stamina Recovery",
- "description": "Minor stamina recovery spell associated with Dragon Boost.",
+ "name": { "str": "Stamina Recovery", "//~": "NO_I18N" },
+ "description": { "str": "Minor stamina recovery spell associated with Dragon Boost.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "recover_energy",
"effect_str": "STAMINA",
diff --git a/data/mods/Magiclysm/Spells/classless.json b/data/mods/Magiclysm/Spells/classless.json
index 5a0bf1c60cf99..e34088fa13d4c 100644
--- a/data/mods/Magiclysm/Spells/classless.json
+++ b/data/mods/Magiclysm/Spells/classless.json
@@ -31,8 +31,8 @@
{
"id": "crystallize_mana_1",
"type": "SPELL",
- "name": "Crystallize Mana (1)",
- "description": "Mana Crystal Spawner. If you can see this you probably debugged it in.",
+ "name": { "str": "Crystallize Mana (1)", "//~": "NO_I18N" },
+ "description": { "str": "Mana Crystal Spawner. If you can see this you probably debugged it in.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "CHANNELING_SPELL", "PERMANENT", "NO_LEGS", "CONCENTRATE" ],
@@ -52,8 +52,8 @@
{
"id": "crystallize_mana_crystal_5",
"type": "SPELL",
- "name": "Crystallize Mana (5)",
- "description": "Mana Crystal Spawner. If you can see this you probably debugged it in.",
+ "name": { "str": "Crystallize Mana (5)", "//~": "NO_I18N" },
+ "description": { "str": "Mana Crystal Spawner. If you can see this you probably debugged it in.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "CHANNELING_SPELL", "PERMANENT", "NO_LEGS", "CONCENTRATE" ],
@@ -73,8 +73,8 @@
{
"id": "mana_fatigue",
"type": "SPELL",
- "name": "Mana Fatigue",
- "description": "Secondary effect of Crystallize Mana.",
+ "name": { "str": "Mana Fatigue", "//~": "NO_I18N" },
+ "description": { "str": "Secondary effect of Crystallize Mana.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "mana_fatigue",
@@ -604,8 +604,8 @@
{
"id": "eoc_evocation_setup",
"type": "SPELL",
- "name": "Set Up Proficiency: Evocation",
- "description": "Sets up proficiency gain. This is a bug if you have it.",
+ "name": { "str": "Set Up Proficiency: Evocation", "//~": "NO_I18N" },
+ "description": { "str": "Sets up proficiency gain. This is a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "NO_LEGS" ],
@@ -625,8 +625,8 @@
{
"id": "eoc_channeling_setup",
"type": "SPELL",
- "name": "Set Up Proficiency: Channeling",
- "description": "Sets up proficiency gain. This is a bug if you have it.",
+ "name": { "str": "Set Up Proficiency: Channeling", "//~": "NO_I18N" },
+ "description": { "str": "Sets up proficiency gain. This is a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "NO_LEGS" ],
@@ -646,8 +646,8 @@
{
"id": "eoc_summon_setup",
"type": "SPELL",
- "name": "Set Up Proficiency: Conjuration",
- "description": "Sets up proficiency gain. This is a bug if you have it.",
+ "name": { "str": "Set Up Proficiency: Conjuration", "//~": "NO_I18N" },
+ "description": { "str": "Sets up proficiency gain. This is a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "NO_LEGS" ],
@@ -667,8 +667,8 @@
{
"id": "eoc_enhancement_setup",
"type": "SPELL",
- "name": "Set Up Proficiency: Enhancement",
- "description": "Sets up proficiency gain. This is a bug if you have it.",
+ "name": { "str": "Set Up Proficiency: Enhancement", "//~": "NO_I18N" },
+ "description": { "str": "Sets up proficiency gain. This is a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "NO_LEGS" ],
@@ -688,8 +688,8 @@
{
"id": "eoc_enervation_setup",
"type": "SPELL",
- "name": "Set Up Proficiency: Enervation",
- "description": "Sets up proficiency gain. This is a bug if you have it.",
+ "name": { "str": "Set Up Proficiency: Enervation", "//~": "NO_I18N" },
+ "description": { "str": "Sets up proficiency gain. This is a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "NO_LEGS" ],
@@ -709,8 +709,8 @@
{
"id": "eoc_conveyance_setup",
"type": "SPELL",
- "name": "Set Up Proficiency: Conveyance",
- "description": "Sets up proficiency gain. This is a bug if you have it.",
+ "name": { "str": "Set Up Proficiency: Conveyance", "//~": "NO_I18N" },
+ "description": { "str": "Sets up proficiency gain. This is a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "NO_LEGS" ],
@@ -730,8 +730,8 @@
{
"id": "eoc_restoration_setup",
"type": "SPELL",
- "name": "Set Up Proficiency: Restoration",
- "description": "Sets up proficiency gain. This is a bug if you have it.",
+ "name": { "str": "Set Up Proficiency: Restoration", "//~": "NO_I18N" },
+ "description": { "str": "Sets up proficiency gain. This is a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "NO_LEGS" ],
@@ -751,8 +751,8 @@
{
"id": "eoc_transformation_setup",
"type": "SPELL",
- "name": "Set Up Proficiency: Transformation",
- "description": "Sets up proficiency gain. This is a bug if you have it.",
+ "name": { "str": "Set Up Proficiency: Transformation", "//~": "NO_I18N" },
+ "description": { "str": "Sets up proficiency gain. This is a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"spell_class": "NONE",
"flags": [ "NO_LEGS" ],
diff --git a/data/mods/Magiclysm/Spells/consumables.json b/data/mods/Magiclysm/Spells/consumables.json
index 1c833e6be2a12..ba8df220edeae 100644
--- a/data/mods/Magiclysm/Spells/consumables.json
+++ b/data/mods/Magiclysm/Spells/consumables.json
@@ -2,8 +2,8 @@
{
"id": "flower_fern_spell",
"type": "SPELL",
- "name": "Flower fern effect",
- "description": "Gives small positive effect.",
+ "name": { "str": "Flower fern effect", "//~": "NO_I18N" },
+ "description": { "str": "Gives small positive effect.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "NO_LEGS", "SILENT", "NO_HANDS" ],
"effect": "attack",
@@ -16,8 +16,8 @@
{
"id": "glowing_mushroom_spell",
"type": "SPELL",
- "name": "Glowing mushroom effect",
- "description": "Gives small speed increasing effect.",
+ "name": { "str": "Glowing mushroom effect", "//~": "NO_I18N" },
+ "description": { "str": "Gives small speed increasing effect.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "NO_LEGS", "SILENT", "NO_HANDS" ],
"effect": "attack",
@@ -30,8 +30,8 @@
{
"id": "whiskflower_spell",
"type": "SPELL",
- "name": "Whiskflower effect",
- "description": "Make you drunk.",
+ "name": { "str": "Whiskflower effect", "//~": "NO_I18N" },
+ "description": { "str": "Make you drunk.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "NO_LEGS", "SILENT", "NO_HANDS" ],
"effect": "attack",
@@ -44,8 +44,8 @@
{
"id": "sojourners_palm_spell",
"type": "SPELL",
- "name": "Sojourners palm effect",
- "description": "teleport you in a small area.",
+ "name": { "str": "Sojourners palm effect", "//~": "NO_I18N" },
+ "description": { "str": "teleport you in a small area.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "NO_LEGS", "SILENT", "NO_HANDS" ],
"effect": "short_range_teleport",
@@ -59,8 +59,8 @@
{
"id": "funnelcap_spell",
"type": "SPELL",
- "name": "Funnelcap effect",
- "description": "Restore a bit of mana.",
+ "name": { "str": "Funnelcap effect", "//~": "NO_I18N" },
+ "description": { "str": "Restore a bit of mana.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "NO_LEGS", "SILENT", "NO_HANDS" ],
"effect": "recover_energy",
@@ -73,8 +73,8 @@
{
"id": "pfruit_regeneration_spell",
"type": "SPELL",
- "name": "Apple Potion Healing Effect",
- "description": "Heals the target.",
+ "name": { "str": "Apple Potion Healing Effect", "//~": "NO_I18N" },
+ "description": { "str": "Heals the target.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"min_damage": -1,
"max_damage": -1,
diff --git a/data/mods/Magiclysm/Spells/dragonbreath.json b/data/mods/Magiclysm/Spells/dragonbreath.json
index 8787ec7f5b9a4..9c995a764d3f3 100644
--- a/data/mods/Magiclysm/Spells/dragonbreath.json
+++ b/data/mods/Magiclysm/Spells/dragonbreath.json
@@ -2,8 +2,8 @@
{
"type": "SPELL",
"id": "dragon_deep_breath",
- "name": { "str": "Take a Deep Breath" },
- "description": "Preps for using dragon breath.",
+ "name": { "str": "Take a Deep Breath", "//~": "NO_I18N" },
+ "description": { "str": "Preps for using dragon breath.", "//~": "NO_I18N" },
"flags": [ "VERBAL", "NO_HANDS", "NO_LEGS", "MUST_HAVE_CLASS_TO_LEARN" ],
"valid_targets": [ "hostile" ],
"max_level": 40,
@@ -17,8 +17,8 @@
{
"type": "SPELL",
"id": "dragon_deep_breath_self",
- "name": { "str": "Took a Deep Breath" },
- "description": "Grants the effect for a dragon to use deep breath.",
+ "name": { "str": "Took a Deep Breath", "//~": "NO_I18N" },
+ "description": { "str": "Grants the effect for a dragon to use deep breath.", "//~": "NO_I18N" },
"flags": [ "VERBAL", "NO_HANDS", "NO_LEGS", "MUST_HAVE_CLASS_TO_LEARN" ],
"valid_targets": [ "self" ],
"max_level": 1,
@@ -31,14 +31,14 @@
{
"type": "effect_type",
"id": "effect_dragon_deep_breath",
- "name": [ "Deep Breath" ],
- "desc": [ "You are ready to use your breath weapon." ]
+ "name": [ { "str": "Deep Breath", "//~": "NO_I18N" } ],
+ "desc": [ { "str": "You are ready to use your breath weapon.", "//~": "NO_I18N" } ]
},
{
"type": "SPELL",
"id": "dragon_breath_black",
- "name": { "str": "Black Dragons' Breath" },
- "description": "Spews a line of acid from your mouth.",
+ "name": { "str": "Black Dragons' Breath", "//~": "NO_I18N" },
+ "description": { "str": "Spews a line of acid from your mouth.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ally", "ground" ],
"damage_type": "acid",
"max_level": 40,
diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json
index bda8f92ca3ee2..f41c3e1208818 100644
--- a/data/mods/Magiclysm/Spells/druid.json
+++ b/data/mods/Magiclysm/Spells/druid.json
@@ -124,8 +124,11 @@
{
"id": "druid_naturequiver1",
"type": "SPELL",
- "name": "Nature's Quiver",
- "description": "This spell conjures a magical quiver as part of the nature's bow spell. It's a bug if you have it directly.",
+ "name": { "str": "Nature's Quiver", "//~": "NO_I18N" },
+ "description": {
+ "str": "This spell conjures a magical quiver as part of the nature's bow spell. It's a bug if you have it directly.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "none" ],
"flags": [ "CONJURATION_SPELL", "SILENT" ],
"min_damage": 1,
@@ -139,8 +142,11 @@
{
"id": "druid_naturearrows1",
"type": "SPELL",
- "name": "Nature's Arrows",
- "description": "This spell conjures magical arrows as part of the nature's bow spell. It's a bug if you have it directly.",
+ "name": { "str": "Nature's Arrows", "//~": "NO_I18N" },
+ "description": {
+ "str": "This spell conjures magical arrows as part of the nature's bow spell. It's a bug if you have it directly.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "none" ],
"flags": [ "CONJURATION_SPELL", "SILENT" ],
"min_damage": { "math": [ "( (u_spell_level('druid_naturebow1') * 3) + 15) * (summoning_proficiency_modifier())" ] },
@@ -185,8 +191,11 @@
{
"id": "druid_naturequiver1_plus",
"type": "SPELL",
- "name": "Nature's Quiver",
- "description": "This spell conjures a magical quiver as part of the nature's bow spell. It's a bug if you have it directly.",
+ "name": { "str": "Nature's Quiver", "//~": "NO_I18N" },
+ "description": {
+ "str": "This spell conjures a magical quiver as part of the nature's bow spell. It's a bug if you have it directly.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "none" ],
"flags": [ "CONJURATION_SPELL", "SILENT" ],
"min_damage": 1,
@@ -200,8 +209,11 @@
{
"id": "druid_naturearrows1_plus",
"type": "SPELL",
- "name": "Nature's Arrows",
- "description": "This spell conjures magical arrows as part of the nature's bow spell. It's a bug if you have it directly.",
+ "name": { "str": "Nature's Arrows", "//~": "NO_I18N" },
+ "description": {
+ "str": "This spell conjures magical arrows as part of the nature's bow spell. It's a bug if you have it directly.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "none" ],
"flags": [ "CONJURATION_SPELL", "SILENT" ],
"min_damage": { "math": [ "( (u_spell_level('druid_naturebow1_plus') * 4) + 30) * (summoning_proficiency_modifier())" ] },
@@ -651,8 +663,8 @@
{
"id": "druid_cause_rot_terrain",
"type": "SPELL",
- "name": "Cause Rot Terrain Rot",
- "description": "The ruin terrain effect of the Cause Rot spell. It's a bug if you have it directly.",
+ "name": { "str": "Cause Rot Terrain Rot", "//~": "NO_I18N" },
+ "description": { "str": "The ruin terrain effect of the Cause Rot spell. It's a bug if you have it directly.", "//~": "NO_I18N" },
"effect": "ter_transform",
"effect_str": "ter_druid_cause_rot_terrain",
"shape": "blast",
@@ -1076,8 +1088,8 @@
{
"id": "druid_renew_forest_spell_real",
"type": "SPELL",
- "name": "Renewing the Forest Real",
- "description": "The actual spell that casts Renewing the Forest. It's a bug if you have it.",
+ "name": { "str": "Renewing the Forest Real", "//~": "NO_I18N" },
+ "description": { "str": "The actual spell that casts Renewing the Forest. It's a bug if you have it.", "//~": "NO_I18N" },
"flags": [ "CHANNELING_SPELL", "SILENT", "VERBAL", "IGNORE_WALLS" ],
"valid_targets": [ "ground" ],
"shape": "blast",
diff --git a/data/mods/Magiclysm/Spells/earthshaper.json b/data/mods/Magiclysm/Spells/earthshaper.json
index 413cdd26cbbe6..e9ea99892c5e6 100644
--- a/data/mods/Magiclysm/Spells/earthshaper.json
+++ b/data/mods/Magiclysm/Spells/earthshaper.json
@@ -358,8 +358,8 @@
{
"id": "earthshaper_pillar_side_effect",
"type": "SPELL",
- "name": "Pillar Side Effect",
- "description": "Bash effect that follows, levels reduce damage and AoE.",
+ "name": { "str": "Pillar Side Effect", "//~": "NO_I18N" },
+ "description": { "str": "Bash effect that follows, levels reduce damage and AoE.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "bash",
"shape": "blast",
@@ -402,8 +402,11 @@
{
"id": "pertifying_touch_moves",
"type": "SPELL",
- "name": "Petrifying Touch Moves Removing",
- "description": "Delete some amount of moves from monster, and inflict DoT. You can see it only in debug mode.",
+ "name": { "str": "Petrifying Touch Moves Removing", "//~": "NO_I18N" },
+ "description": {
+ "str": "Delete some amount of moves from monster, and inflict DoT. You can see it only in debug mode.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"flags": [ "EVOCATION_SPELL", "SILENT", "NO_EXPLOSION_SFX", "SPLIT_DAMAGE" ],
"effect": "mod_moves",
@@ -479,8 +482,8 @@
{
"id": "eshaper_impalement_moves",
"type": "SPELL",
- "name": "Impalement Moves Removing",
- "description": "Delete some random amount of moves from monster. You can see it only in debug mode.",
+ "name": { "str": "Impalement Moves Removing", "//~": "NO_I18N" },
+ "description": { "str": "Delete some random amount of moves from monster. You can see it only in debug mode.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "EVOCATION_SPELL", "SILENT", "RANDOM_DAMAGE", "NO_PROJECTILE", "NO_EXPLOSION_SFX" ],
"effect": "mod_moves",
@@ -571,8 +574,8 @@
{
"id": "eshaper_spawn_hammer",
"type": "SPELL",
- "name": "Utility Molding (Hammer)",
- "description": "Spawn the Utility molding hammer. It's a bug if you have this spell directly.",
+ "name": { "str": "Utility Molding (Hammer)", "//~": "NO_I18N" },
+ "description": { "str": "Spawn the Utility molding hammer. It's a bug if you have this spell directly.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "CONJURATION_SPELL", "SILENT", "NO_EXPLOSION_SFX" ],
"min_damage": 1,
@@ -586,8 +589,8 @@
{
"id": "eshaper_spawn_pickaxe",
"type": "SPELL",
- "name": "Utility Molding (Pickaxe)",
- "description": "Spawn the Utility molding pickaxe. It's a bug if you have this spell directly.",
+ "name": { "str": "Utility Molding (Pickaxe)", "//~": "NO_I18N" },
+ "description": { "str": "Spawn the Utility molding pickaxe. It's a bug if you have this spell directly.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "CONJURATION_SPELL", "SILENT", "NO_EXPLOSION_SFX" ],
"min_damage": 1,
@@ -601,8 +604,8 @@
{
"id": "eshaper_spawn_axe",
"type": "SPELL",
- "name": "Utility Molding (Axe)",
- "description": "Spawn the Utility molding axe. It's a bug if you have this spell directly.",
+ "name": { "str": "Utility Molding (Axe)", "//~": "NO_I18N" },
+ "description": { "str": "Spawn the Utility molding axe. It's a bug if you have this spell directly.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "CONJURATION_SPELL", "SILENT", "NO_EXPLOSION_SFX" ],
"min_damage": 1,
@@ -616,8 +619,8 @@
{
"id": "eshaper_spawn_knife",
"type": "SPELL",
- "name": "Utility Molding (Knife)",
- "description": "Spawn the Utility molding knife. It's a bug if you have this spell directly.",
+ "name": { "str": "Utility Molding (Knife)", "//~": "NO_I18N" },
+ "description": { "str": "Spawn the Utility molding knife. It's a bug if you have this spell directly.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "CONJURATION_SPELL", "SILENT", "NO_EXPLOSION_SFX" ],
"min_damage": 1,
@@ -631,8 +634,8 @@
{
"id": "eshaper_spawn_shovel",
"type": "SPELL",
- "name": "Utility Molding (Shovel)",
- "description": "Spawn the Utility molding shovel. It's a bug if you have this spell directly.",
+ "name": { "str": "Utility Molding (Shovel)", "//~": "NO_I18N" },
+ "description": { "str": "Spawn the Utility molding shovel. It's a bug if you have this spell directly.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "CONJURATION_SPELL", "SILENT", "NO_EXPLOSION_SFX" ],
"min_damage": 1,
@@ -696,8 +699,8 @@
{
"type": "SPELL",
"id": "eshaper_crystal_wrap_damage",
- "name": "Crystal Wrapping Damage",
- "description": "Return some damage to attacker. You can see it only in debug mode.",
+ "name": { "str": "Crystal Wrapping Damage", "//~": "NO_I18N" },
+ "description": { "str": "Return some damage to attacker. You can see it only in debug mode.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"flags": [ "CONJURATION_SPELL", "SILENT", "RANDOM_DAMAGE", "NO_EXPLOSION_SFX" ],
diff --git a/data/mods/Magiclysm/Spells/feral_wizards.json b/data/mods/Magiclysm/Spells/feral_wizards.json
index 0a15bded306a4..41bd657036cce 100644
--- a/data/mods/Magiclysm/Spells/feral_wizards.json
+++ b/data/mods/Magiclysm/Spells/feral_wizards.json
@@ -2,8 +2,8 @@
{
"id": "mirror_image_rad_mage",
"type": "SPELL",
- "name": "Mirror Image Radiation Mage",
- "description": "This spell summons duplicates of the radiation mage. It's a bug if you have it.",
+ "name": { "str": "Mirror Image Radiation Mage", "//~": "NO_I18N" },
+ "description": { "str": "This spell summons duplicates of the radiation mage. It's a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_mirror_image_rad_mage",
@@ -22,8 +22,8 @@
{
"id": "feral_rad_mage_rad_spell",
"type": "SPELL",
- "name": "Create Rads Radiation Mage",
- "description": "This spell creates radiation gas around a target. It's a bug if you have it.",
+ "name": { "str": "Create Rads Radiation Mage", "//~": "NO_I18N" },
+ "description": { "str": "This spell creates radiation gas around a target. It's a bug if you have it.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"effect": "emit",
"effect_str": "emit_rad_cloud",
@@ -36,8 +36,8 @@
{
"id": "feral_rad_mage_summon_spell",
"type": "SPELL",
- "name": "Summon Zombie",
- "description": "A spell for the feral rad mage to summon a zombie. It's a bug if you have this.",
+ "name": { "str": "Summon Zombie", "//~": "NO_I18N" },
+ "description": { "str": "A spell for the feral rad mage to summon a zombie. It's a bug if you have this.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "WONDER", "NO_PROJECTILE" ],
"max_level": 1,
@@ -76,8 +76,8 @@
{
"id": "feral_animist_summon_zombie",
"type": "SPELL",
- "name": "Summon Zombie",
- "description": "A spell for the feral rad mage to summon a normal zombie. It's a bug if you have this.",
+ "name": { "str": "Summon Zombie", "//~": "NO_I18N" },
+ "description": { "str": "A spell for the feral rad mage to summon a normal zombie. It's a bug if you have this.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"flags": [ "HOSTILE_SUMMON", "LOUD", "NO_PROJECTILE" ],
"min_damage": 1,
@@ -96,8 +96,11 @@
{
"id": "feral_animist_summon_tough_zombie",
"type": "SPELL",
- "name": "Summon Tough Zombie",
- "description": "A spell for the feral rad mage to summon a tough zombie brute. It's a bug if you have this.",
+ "name": { "str": "Summon Tough Zombie", "//~": "NO_I18N" },
+ "description": {
+ "str": "A spell for the feral rad mage to summon a tough zombie brute. It's a bug if you have this.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "ground" ],
"flags": [ "HOSTILE_SUMMON", "LOUD", "NO_PROJECTILE" ],
"min_damage": 1,
@@ -116,8 +119,8 @@
{
"id": "feral_animist_summon_zombie_brute",
"type": "SPELL",
- "name": "Summon Zombie Brute",
- "description": "A spell for the feral rad mage to summon a zombie brute. It's a bug if you have this.",
+ "name": { "str": "Summon Zombie Brute", "//~": "NO_I18N" },
+ "description": { "str": "A spell for the feral rad mage to summon a zombie brute. It's a bug if you have this.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"flags": [ "HOSTILE_SUMMON", "LOUD", "NO_PROJECTILE" ],
"min_damage": 1,
@@ -136,8 +139,11 @@
{
"id": "feral_animist_summon_zombie_hulk",
"type": "SPELL",
- "name": "Radiation Mage Summon Zombie",
- "description": "A spell for the feral rad mage to summon a zombie hulk. They probably won't cast this--but good luck if they do.",
+ "name": { "str": "Radiation Mage Summon Zombie", "//~": "NO_I18N" },
+ "description": {
+ "str": "A spell for the feral rad mage to summon a zombie hulk. They probably won't cast this--but good luck if they do.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "ground" ],
"flags": [ "HOSTILE_SUMMON", "LOUD", "NO_PROJECTILE" ],
"min_damage": 1,
@@ -156,8 +162,11 @@
{
"id": "feral_rad_mage_swap_spell",
"type": "SPELL",
- "name": "Change Places with mirror image",
- "description": "The spell for the feral radiation mage swapping places with a mirror image. It's a bug if you have it.",
+ "name": { "str": "Change Places with mirror image", "//~": "NO_I18N" },
+ "description": {
+ "str": "The spell for the feral radiation mage swapping places with a mirror image. It's a bug if you have it.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "ally" ],
"targeted_monster_ids": [ "mon_mirror_image_rad_mage" ],
"flags": [ "NO_LEGS", "LOUD", "SOMATIC", "SWAP_POS", "NO_PROJECTILE" ],
@@ -171,8 +180,8 @@
{
"id": "dispel_magic_monster",
"type": "SPELL",
- "name": "Dispel Magic Monster",
- "description": "Dispel magic for monsters so they'll only dispel their enemies",
+ "name": { "str": "Dispel Magic Monster", "//~": "NO_I18N" },
+ "description": { "str": "Dispel magic for monsters so they'll only dispel their enemies", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"effect": "attack",
"effect_str": "effect_dispel_magic",
@@ -186,8 +195,8 @@
{
"id": "disjunction_monster",
"type": "SPELL",
- "name": "Disjunction Monster",
- "description": "Disjunction for monsters so they'll only dispel their enemies",
+ "name": { "str": "Disjunction Monster", "//~": "NO_I18N" },
+ "description": { "str": "Disjunction for monsters so they'll only dispel their enemies", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"effect": "attack",
"effect_str": "effect_disjunction",
@@ -201,8 +210,8 @@
{
"id": "summon_wolf_druid_monster",
"type": "SPELL",
- "name": "Summon Wolf Monster",
- "description": "Call to the wilds for aid from some wolves. This is the monster version.",
+ "name": { "str": "Summon Wolf Monster", "//~": "NO_I18N" },
+ "description": { "str": "Call to the wilds for aid from some wolves. This is the monster version.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"min_damage": 1,
"max_damage": 3,
@@ -226,7 +235,7 @@
"id": "feral_stormshaper_summon_stormhammer_spell",
"type": "SPELL",
"name": { "str": "Call Stormhammer Monster", "//~": "NO_I18N" },
- "description": "Summon a stormhammer by effect. You should never see this.",
+ "description": { "str": "Summon a stormhammer by effect. You should never see this.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"max_level": 20,
"flags": [ "SOMATIC", "NO_LEGS" ],
@@ -242,7 +251,10 @@
"id": "feral_stormshaper_summon_stormhammer_spell_internal_cooldown",
"type": "SPELL",
"name": { "str": "Call Stormhammer Monster Cooldown", "//~": "NO_I18N" },
- "description": "Designed to make any future stormhammers have a much longer cooldown than the first one so that dispelling them is tactically advantageous. You shouldn't see this.",
+ "description": {
+ "str": "Designed to make any future stormhammers have a much longer cooldown than the first one so that dispelling them is tactically advantageous. You shouldn't see this.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"flags": [ "SOMATIC", "NO_LEGS", "RANDOM_DURATION" ],
"shape": "blast",
diff --git a/data/mods/Magiclysm/Spells/infrastructure.json b/data/mods/Magiclysm/Spells/infrastructure.json
index b70628ba40e09..8221d947977e5 100644
--- a/data/mods/Magiclysm/Spells/infrastructure.json
+++ b/data/mods/Magiclysm/Spells/infrastructure.json
@@ -2,8 +2,8 @@
{
"id": "blood_mage_healing",
"type": "SPELL",
- "name": "Blood Mage Healing Effect",
- "description": "Heals the caster.",
+ "name": { "str": "Blood Mage Healing Effect", "//~": "NO_I18N" },
+ "description": { "str": "Heals the caster.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"min_damage": -1,
"max_damage": -1,
@@ -14,8 +14,11 @@
{
"id": "boreal_mage_cold_damage",
"type": "SPELL",
- "name": "Boreal Mage Cold Damage",
- "description": "AoE cold attack around the player. If you are seeing this spell, you have debugged it in.",
+ "name": { "str": "Boreal Mage Cold Damage", "//~": "NO_I18N" },
+ "description": {
+ "str": "AoE cold attack around the player. If you are seeing this spell, you have debugged it in.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX", "SPLIT_DAMAGE" ],
"effect": "attack",
@@ -29,8 +32,8 @@
{
"type": "SPELL",
"id": "FIRE_ELEMENTAL_BURNBACK",
- "name": "Fire Elemental Burnback",
- "description": "The burnback effect from the Fire Elemental Attunement.",
+ "name": { "str": "Fire Elemental Burnback", "//~": "NO_I18N" },
+ "description": { "str": "The burnback effect from the Fire Elemental Attunement.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"min_damage": 5,
@@ -44,8 +47,8 @@
{
"type": "SPELL",
"id": "GAIAS_CHOSEN_THORNS",
- "name": "Gaia's Chosen Thorns",
- "description": "The thorns effect from the Gaia's Chosen Attunement.",
+ "name": { "str": "Gaia's Chosen Thorns", "//~": "NO_I18N" },
+ "description": { "str": "The thorns effect from the Gaia's Chosen Attunement.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"flags": [ "SILENT", "RANDOM_DAMAGE", "SPLIT_DAMAGE" ],
@@ -59,8 +62,8 @@
{
"id": "glacier_mage_attack",
"type": "SPELL",
- "name": "Glacier Mage Attack",
- "description": "Deal some damage to a monster you attack.",
+ "name": { "str": "Glacier Mage Attack", "//~": "NO_I18N" },
+ "description": { "str": "Deal some damage to a monster you attack.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "RANDOM_DAMAGE", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ],
"effect": "attack",
@@ -77,8 +80,8 @@
{
"id": "glacier_mage_bash_damage",
"type": "SPELL",
- "name": "Glacier Mage Bash AoE",
- "description": "Deal some bash damage around the player.",
+ "name": { "str": "Glacier Mage Bash AoE", "//~": "NO_I18N" },
+ "description": { "str": "Deal some bash damage around the player.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX" ],
"effect": "attack",
@@ -92,8 +95,8 @@
{
"id": "golemancer_block",
"type": "SPELL",
- "name": "Golemancer's block",
- "description": "Block huge damage in the next 1 second.",
+ "name": { "str": "Golemancer's block", "//~": "NO_I18N" },
+ "description": { "str": "Block huge damage in the next 1 second.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "golemancer_block",
@@ -105,8 +108,8 @@
{
"type": "SPELL",
"id": "ICE_ELEMENTAL_COLD_DAMAGE",
- "name": "Ice Elemental Cold Damage",
- "description": "The cold damage effect from the Ice Elemental Attunement.",
+ "name": { "str": "Ice Elemental Cold Damage", "//~": "NO_I18N" },
+ "description": { "str": "The cold damage effect from the Ice Elemental Attunement.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"flags": [ "NO_PROJECTILE", "NO_EXPLOSION_SFX", "SPLIT_DAMAGE" ],
@@ -120,8 +123,8 @@
{
"id": "permafrost_mage_moves_substract",
"type": "SPELL",
- "name": "Permafrost Mage Moves Subtract",
- "description": "Subtract some moves from monster that attack you.",
+ "name": { "str": "Permafrost Mage Moves Subtract", "//~": "NO_I18N" },
+ "description": { "str": "Subtract some moves from monster that attack you.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "RANDOM_DAMAGE", "NO_EXPLOSION_SFX" ],
"shape": "blast",
@@ -134,8 +137,8 @@
{
"id": "radiation_mage_clairvoyance",
"type": "SPELL",
- "name": "Radiation Mage Clairvoyance",
- "description": "Emit clairvoyance around the player.",
+ "name": { "str": "Radiation Mage Clairvoyance", "//~": "NO_I18N" },
+ "description": { "str": "Emit clairvoyance around the player.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "ally", "hostile", "ground", "self" ],
@@ -149,8 +152,11 @@
{
"id": "mind_read",
"type": "SPELL",
- "name": "Mind Reading",
- "description": "You can predict some movements of your enemies (just slowdown in fact). If you are seeing this spell, you have debugged it in.",
+ "name": { "str": "Mind Reading", "//~": "NO_I18N" },
+ "description": {
+ "str": "You can predict some movements of your enemies (just slowdown in fact). If you are seeing this spell, you have debugged it in.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX" ],
"effect": "attack",
@@ -166,8 +172,11 @@
{
"id": "soul_pressure",
"type": "SPELL",
- "name": "Soul Pressure",
- "description": "This is a spell that represents the Soulfire putting a burning pressure on nearby opponents. If you are seeing this spell, you have debugged it in.",
+ "name": { "str": "Soul Pressure", "//~": "NO_I18N" },
+ "description": {
+ "str": "This is a spell that represents the Soulfire putting a burning pressure on nearby opponents. If you are seeing this spell, you have debugged it in.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX", "SPLIT_DAMAGE" ],
"effect": "attack",
@@ -184,8 +193,8 @@
{
"type": "SPELL",
"id": "STORM_ELEMENTAL_ZAPBACK",
- "name": "Storm Elemental Zapback",
- "description": "The zapback effect from the Storm Elemental Attunement.",
+ "name": { "str": "Storm Elemental Zapback", "//~": "NO_I18N" },
+ "description": { "str": "The zapback effect from the Storm Elemental Attunement.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"flags": [ "NO_PROJECTILE", "NO_EXPLOSION_SFX" ],
@@ -199,8 +208,8 @@
{
"id": "solar_blinding",
"type": "SPELL",
- "name": "Solar Blinding",
- "description": "Make your enemies blind for a short time.",
+ "name": { "str": "Solar Blinding", "//~": "NO_I18N" },
+ "description": { "str": "Make your enemies blind for a short time.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX" ],
"effect": "attack",
@@ -217,8 +226,8 @@
{
"id": "tundra_mage_aoe",
"type": "SPELL",
- "name": "Tundra Mage Slowdown DoT AoE",
- "description": "Deal some cold DoT around the player, and slowdown monsters nearby.",
+ "name": { "str": "Tundra Mage Slowdown DoT AoE", "//~": "NO_I18N" },
+ "description": { "str": "Deal some cold DoT around the player, and slowdown monsters nearby.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX", "SPLIT_DAMAGE" ],
"effect": "attack",
@@ -235,8 +244,8 @@
{
"id": "void_claws",
"type": "SPELL",
- "name": "Void Claws",
- "description": "This is a spell that causes a DoT effect whenever you hit.",
+ "name": { "str": "Void Claws", "//~": "NO_I18N" },
+ "description": { "str": "This is a spell that causes a DoT effect whenever you hit.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX", "SPLIT_DAMAGE" ],
"effect": "attack",
@@ -254,8 +263,8 @@
{
"id": "wither_mage_withering",
"type": "SPELL",
- "name": "Withering",
- "description": "Give some stats when you attack your enemies.",
+ "name": { "str": "Withering", "//~": "NO_I18N" },
+ "description": { "str": "Give some stats when you attack your enemies.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "withering_eff",
@@ -267,8 +276,8 @@
{
"id": "wither_mage_bio_damage",
"type": "SPELL",
- "name": "Wither Mage bio DoT AoE",
- "description": "Deal some toxic DoT around the player.",
+ "name": { "str": "Wither Mage bio DoT AoE", "//~": "NO_I18N" },
+ "description": { "str": "Deal some toxic DoT around the player.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX", "SPLIT_DAMAGE" ],
"effect": "attack",
diff --git a/data/mods/Magiclysm/Spells/item_only.json b/data/mods/Magiclysm/Spells/item_only.json
index 38a5265e11332..8f90f2b2416c0 100644
--- a/data/mods/Magiclysm/Spells/item_only.json
+++ b/data/mods/Magiclysm/Spells/item_only.json
@@ -2,9 +2,12 @@
{
"id": "twisted_restore",
"type": "SPELL",
- "name": "Twisted Restoration",
+ "name": { "str": "Twisted Restoration", "//~": "NO_I18N" },
"//": "Used for potion of Twisted Restoration, not castable",
- "description": "This spell overclocks your heart, generating new flesh and muscle. It is unwise to use this in immediate danger, and may be fatal if done in critical condition.",
+ "description": {
+ "str": "This spell overclocks your heart, generating new flesh and muscle. It is unwise to use this in immediate danger, and may be fatal if done in critical condition.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_LEGS", "NO_HANDS", "NO_PROJECTILE" ],
"max_level": 1,
@@ -31,9 +34,12 @@
{
"id": "twisted_restore_improved",
"type": "SPELL",
- "name": "Improved Twisted Restoration",
+ "name": { "str": "Improved Twisted Restoration", "//~": "NO_I18N" },
"//": "Used for Animist-exclusive potion, not castable",
- "description": "This spell overclocks your heart, generating new flesh and muscle. It is unwise to use this in immediate danger, and may be fatal if done in critical condition. Improved brewing mitigates the strain of the spell.",
+ "description": {
+ "str": "This spell overclocks your heart, generating new flesh and muscle. It is unwise to use this in immediate danger, and may be fatal if done in critical condition. Improved brewing mitigates the strain of the spell.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_LEGS", "NO_HANDS", "NO_PROJECTILE" ],
"max_level": 1,
@@ -53,8 +59,8 @@
{
"id": "conj_throwing_blade3",
"type": "SPELL",
- "name": "Conjure Throwing Blade I",
- "description": "Conjures 3 throwing knives.",
+ "name": { "str": "Conjure Throwing Blade I", "//~": "NO_I18N" },
+ "description": { "str": "Conjures 3 throwing knives.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "throwing_knife",
@@ -71,8 +77,8 @@
{
"id": "conj_mag_throw_blade_group",
"type": "SPELL",
- "name": "Conjure Random Magical Throwing Blade",
- "description": "Conjures a magical throwing knife, one of the spells specified in extra effects.",
+ "name": { "str": "Conjure Random Magical Throwing Blade", "//~": "NO_I18N" },
+ "description": { "str": "Conjures a magical throwing knife, one of the spells specified in extra effects.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "WONDER" ],
"effect": "none",
@@ -101,8 +107,8 @@
{
"id": "conj_mag_throw_blade_1",
"type": "SPELL",
- "name": "Conjure Magical Throwing Blade I",
- "description": "Conjures 1 magical throwing knife.",
+ "name": { "str": "Conjure Magical Throwing Blade I", "//~": "NO_I18N" },
+ "description": { "str": "Conjures 1 magical throwing knife.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "magical_throwing_knife",
@@ -116,8 +122,8 @@
{
"id": "conj_mag_throw_blade_fire",
"type": "SPELL",
- "name": "Conjure Magical Throwing Blade Fire",
- "description": "Conjures 1 magical throwing knife.",
+ "name": { "str": "Conjure Magical Throwing Blade Fire", "//~": "NO_I18N" },
+ "description": { "str": "Conjures 1 magical throwing knife.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "magical_throwing_knife_fire",
@@ -131,8 +137,8 @@
{
"id": "conj_mag_throw_blade_cold",
"type": "SPELL",
- "name": "Conjure Magical Throwing Blade Cold",
- "description": "Conjures 1 magical throwing knife.",
+ "name": { "str": "Conjure Magical Throwing Blade Cold", "//~": "NO_I18N" },
+ "description": { "str": "Conjures 1 magical throwing knife.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "magical_throwing_knife_cold",
@@ -146,8 +152,8 @@
{
"id": "conj_mag_throw_blade_cut",
"type": "SPELL",
- "name": "Conjure Magical Throwing Blade Cut",
- "description": "Conjures 1 magical throwing knife.",
+ "name": { "str": "Conjure Magical Throwing Blade Cut", "//~": "NO_I18N" },
+ "description": { "str": "Conjures 1 magical throwing knife.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "magical_throwing_knife_cut",
@@ -161,8 +167,8 @@
{
"id": "conj_mag_throw_blade_biological",
"type": "SPELL",
- "name": "Conjure Magical Throwing Blade Biological",
- "description": "Conjures 1 magical throwing knife.",
+ "name": { "str": "Conjure Magical Throwing Blade Biological", "//~": "NO_I18N" },
+ "description": { "str": "Conjures 1 magical throwing knife.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "magical_throwing_knife_biological",
@@ -176,8 +182,8 @@
{
"id": "magical_throwing_knife_pure_special",
"type": "SPELL",
- "name": "Conjure Magical Throwing Blade Pure",
- "description": "Conjures 1 magical throwing knife.",
+ "name": { "str": "Conjure Magical Throwing Blade Pure", "//~": "NO_I18N" },
+ "description": { "str": "Conjures 1 magical throwing knife.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "magical_throwing_knife_pure_special",
@@ -191,8 +197,8 @@
{
"id": "potion_recover_mana",
"type": "SPELL",
- "name": "Recover Mana",
- "description": "You regain mana.",
+ "name": { "str": "Recover Mana", "//~": "NO_I18N" },
+ "description": { "str": "You regain mana.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"min_damage": 250,
"damage_increment": 50.0,
@@ -213,8 +219,8 @@
{
"id": "mana_doping",
"type": "SPELL",
- "name": { "str": "Pain" },
- "description": "Increases pain.",
+ "name": { "str": "Pain", "//~": "NO_I18N" },
+ "description": { "str": "Increases pain.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_LEGS", "NO_HANDS" ],
"//": "Listed as a recover energy effect with a negative modifier that decreases with each level of the spell, which makes it cause damage instead.",
@@ -232,9 +238,9 @@
{
"id": "lupercalia",
"type": "SPELL",
- "name": "Lupercalian Release",
+ "name": { "str": "Lupercalian Release", "//~": "NO_I18N" },
"//": "Used for wolfshead cufflinks not castable",
- "description": "This spell transforms you into a werewolf. There may be some cons to this.",
+ "description": { "str": "This spell transforms you into a werewolf. There may be some cons to this.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_LEGS", "NO_HANDS" ],
"effect": "spawn_item",
@@ -255,8 +261,8 @@
{
"id": "wolfsbane",
"type": "SPELL",
- "name": "Wolfsbane",
- "description": "The tip of the spear glows white hot as you strike.",
+ "name": { "str": "Wolfsbane", "//~": "NO_I18N" },
+ "description": { "str": "The tip of the spear glows white hot as you strike.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "NO_HANDS", "NO_LEGS" ],
"damage_type": "heat",
@@ -268,8 +274,8 @@
{
"id": "mana_bolt_random",
"type": "SPELL",
- "name": "Mana Bolt",
- "description": "Semi controlled mana rocket.",
+ "name": { "str": "Mana Bolt", "//~": "NO_I18N" },
+ "description": { "str": "Semi controlled mana rocket.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "RANDOM_TARGET", "RANDOM_DAMAGE", "SILENT" ],
"effect": "attack",
@@ -283,8 +289,8 @@
{
"id": "missile_volley",
"type": "SPELL",
- "name": "Missile volley",
- "description": "Cast a swarm of mana bolts in random directions.",
+ "name": { "str": "Missile volley", "//~": "NO_I18N" },
+ "description": { "str": "Cast a swarm of mana bolts in random directions.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "WONDER" ],
"effect": "attack",
@@ -299,8 +305,8 @@
{
"id": "gorgon_spell",
"type": "SPELL",
- "name": "Petrification",
- "description": "Freeze!",
+ "name": { "str": "Petrification", "//~": "NO_I18N" },
+ "description": { "str": "Freeze!", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "NO_PROJECTILE", "IGNORE_WALLS" ],
"effect": "mod_moves",
@@ -315,8 +321,8 @@
{
"id": "disorient_spell",
"type": "SPELL",
- "name": "Disorientation",
- "description": "Mental sledgehammer strike.",
+ "name": { "str": "Disorientation", "//~": "NO_I18N" },
+ "description": { "str": "Mental sledgehammer strike.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "NO_PROJECTILE", "IGNORE_WALLS" ],
"effect": "attack",
@@ -333,8 +339,8 @@
{
"id": "super_hot_spell",
"type": "SPELL",
- "name": "Propulsion",
- "description": "Yep, you are fast.",
+ "name": { "str": "Propulsion", "//~": "NO_I18N" },
+ "description": { "str": "Yep, you are fast.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "NO_LEGS", "LOUD", "SOMATIC" ],
"effect": "mod_moves",
@@ -345,8 +351,11 @@
{
"id": "flask_clairvoyance",
"type": "SPELL",
- "name": "Omniscientia",
- "description": "Connect the user to a few ethereal sensory organs, that allow the user to \"feel\" the territory nearby.",
+ "name": { "str": "Omniscientia", "//~": "NO_I18N" },
+ "description": {
+ "str": "Connect the user to a few ethereal sensory organs, that allow the user to \"feel\" the territory nearby.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "IGNORE_WALLS", "NO_LEGS", "SILENT", "NO_EXPLOSION_SFX" ],
"effect": "attack",
@@ -360,8 +369,8 @@
{
"id": "flask_spear",
"type": "SPELL",
- "name": "Lancea",
- "description": "Release a long, spear-like line of liquid, which punctures things on the path.",
+ "name": { "str": "Lancea", "//~": "NO_I18N" },
+ "description": { "str": "Release a long, spear-like line of liquid, which punctures things on the path.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "NO_LEGS", "SILENT", "RANDOM_DAMAGE" ],
"min_aoe": 5,
@@ -377,8 +386,8 @@
{
"id": "flask_confusion",
"type": "SPELL",
- "name": "Turbatio",
- "description": "Mental sledgehammer strike.",
+ "name": { "str": "Turbatio", "//~": "NO_I18N" },
+ "description": { "str": "Mental sledgehammer strike.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "NO_PROJECTILE", "IGNORE_WALLS" ],
"effect": "attack",
@@ -394,8 +403,8 @@
{
"id": "flask_teleport_rand",
"type": "SPELL",
- "name": "Effugium",
- "description": "Teleport the caster to a random point nearby.",
+ "name": { "str": "Effugium", "//~": "NO_I18N" },
+ "description": { "str": "Teleport the caster to a random point nearby.", "//~": "NO_I18N" },
"effect": "short_range_teleport",
"shape": "blast",
"valid_targets": [ "ground" ],
@@ -408,8 +417,8 @@
{
"id": "flask_teleport",
"type": "SPELL",
- "name": "Ecfugium",
- "description": "Teleport the caster to a selected point nearby.",
+ "name": { "str": "Ecfugium", "//~": "NO_I18N" },
+ "description": { "str": "Teleport the caster to a selected point nearby.", "//~": "NO_I18N" },
"effect": "short_range_teleport",
"shape": "blast",
"valid_targets": [ "ground" ],
@@ -422,8 +431,8 @@
{
"id": "flask_shadow_field",
"type": "SPELL",
- "name": "Umbra",
- "description": "Shrouds the user in a field of darkness.",
+ "name": { "str": "Umbra", "//~": "NO_I18N" },
+ "description": { "str": "Shrouds the user in a field of darkness.", "//~": "NO_I18N" },
"effect": "attack",
"field_id": "fd_darkness",
"min_field_intensity": 1,
@@ -441,8 +450,8 @@
{
"id": "flask_fireball",
"type": "SPELL",
- "name": "Flamma",
- "description": "Molotovs magic equivalent.",
+ "name": { "str": "Flamma", "//~": "NO_I18N" },
+ "description": { "str": "Molotovs magic equivalent.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "self", "ally", "hostile", "ground" ],
@@ -463,8 +472,8 @@
{
"id": "flask_invisibility",
"type": "SPELL",
- "name": "Caecitas",
- "description": "You are invisible now, and no one can see you. They still can hear or smell though.",
+ "name": { "str": "Caecitas", "//~": "NO_I18N" },
+ "description": { "str": "You are invisible now, and no one can see you. They still can hear or smell though.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "invisibility",
@@ -476,8 +485,11 @@
{
"id": "flask_feather",
"type": "SPELL",
- "name": "Pluma",
- "description": "Allows you to decrease your inertia, which allows you to jump from the skyscraper's roof onto the pavement below, unharmed.",
+ "name": { "str": "Pluma", "//~": "NO_I18N" },
+ "description": {
+ "str": "Allows you to decrease your inertia, which allows you to jump from the skyscraper's roof onto the pavement below, unharmed.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "feather_fall",
@@ -489,8 +501,8 @@
{
"id": "flask_night_vision",
"type": "SPELL",
- "name": "Visio",
- "description": "Grants you the ability to see in the dark.",
+ "name": { "str": "Visio", "//~": "NO_I18N" },
+ "description": { "str": "Grants you the ability to see in the dark.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "dark_sight",
@@ -502,8 +514,11 @@
{
"id": "flask_charm",
"type": "SPELL",
- "name": "Venuste",
- "description": "Make a creature ignore their own thoughts and make them think more positively towards a user, temporarily turning them friendly.",
+ "name": { "str": "Venuste", "//~": "NO_I18N" },
+ "description": {
+ "str": "Make a creature ignore their own thoughts and make them think more positively towards a user, temporarily turning them friendly.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"flags": [ "NO_LEGS" ],
"effect": "charm_monster",
@@ -519,8 +534,8 @@
{
"id": "flask_sludge_field",
"type": "SPELL",
- "name": "Lutum",
- "description": "Cover the ground with a thick, sticky mass.",
+ "name": { "str": "Lutum", "//~": "NO_I18N" },
+ "description": { "str": "Cover the ground with a thick, sticky mass.", "//~": "NO_I18N" },
"effect": "attack",
"field_id": "fd_sludge",
"min_field_intensity": 1,
@@ -540,8 +555,8 @@
{
"id": "flask_speed",
"type": "SPELL",
- "name": "Velocitas",
- "description": "Makes you faster for quite some time.",
+ "name": { "str": "Velocitas", "//~": "NO_I18N" },
+ "description": { "str": "Makes you faster for quite some time.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_speed_eff",
@@ -553,8 +568,8 @@
{
"id": "flask_healing",
"type": "SPELL",
- "name": "Sanatio",
- "description": "Makes you feel healthier.",
+ "name": { "str": "Sanatio", "//~": "NO_I18N" },
+ "description": { "str": "Makes you feel healthier.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_healing_eff",
@@ -566,8 +581,8 @@
{
"id": "flask_stamina",
"type": "SPELL",
- "name": "Constantia",
- "description": "You can't get tired.",
+ "name": { "str": "Constantia", "//~": "NO_I18N" },
+ "description": { "str": "You can't get tired.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_stamina_eff",
@@ -579,8 +594,8 @@
{
"id": "flask_rebreather",
"type": "SPELL",
- "name": "Spiritus",
- "description": "Allow you to breathe underwater.",
+ "name": { "str": "Spiritus", "//~": "NO_I18N" },
+ "description": { "str": "Allow you to breathe underwater.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "spawn_item",
"effect_str": "flask_ethereal_rebreather",
@@ -592,8 +607,8 @@
{
"id": "flask_excitement",
"type": "SPELL",
- "name": "Motus",
- "description": "Improve your reaction abilities, which makes you a better fighter.",
+ "name": { "str": "Motus", "//~": "NO_I18N" },
+ "description": { "str": "Improve your reaction abilities, which makes you a better fighter.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_excitement",
@@ -605,8 +620,11 @@
{
"id": "flask_resistance",
"type": "SPELL",
- "name": "Resistentia",
- "description": "A thin layer of energy covers your body, and allows you to take more physical damage than before.",
+ "name": { "str": "Resistentia", "//~": "NO_I18N" },
+ "description": {
+ "str": "A thin layer of energy covers your body, and allows you to take more physical damage than before.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_resistance",
@@ -618,8 +636,8 @@
{
"id": "flask_illumination",
"type": "SPELL",
- "name": "Illuminatio",
- "description": "Emit a bright light from your body.",
+ "name": { "str": "Illuminatio", "//~": "NO_I18N" },
+ "description": { "str": "Emit a bright light from your body.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_illumination",
@@ -631,8 +649,11 @@
{
"id": "flask_mana_regen",
"type": "SPELL",
- "name": "Recuperatio",
- "description": "Increase the amount of ley-lines your body can process at once, making you restore your mana pool faster.",
+ "name": { "str": "Recuperatio", "//~": "NO_I18N" },
+ "description": {
+ "str": "Increase the amount of ley-lines your body can process at once, making you restore your mana pool faster.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_mana_regen",
@@ -644,8 +665,8 @@
{
"id": "flask_max_mana",
"type": "SPELL",
- "name": "Augere",
- "description": "The capability to hold mana in you is increased - for a while.",
+ "name": { "str": "Augere", "//~": "NO_I18N" },
+ "description": { "str": "The capability to hold mana in you is increased - for a while.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_max_mana",
@@ -657,8 +678,8 @@
{
"id": "flask_regeneration",
"type": "SPELL",
- "name": "Renovamen",
- "description": "Slowly regenerate your damaged body.",
+ "name": { "str": "Renovamen", "//~": "NO_I18N" },
+ "description": { "str": "Slowly regenerate your damaged body.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "flask_regeneration",
@@ -670,8 +691,8 @@
{
"id": "flask_regeneration_effect",
"type": "SPELL",
- "name": "Renovamen Healing Effect",
- "description": "Heals the target.",
+ "name": { "str": "Renovamen Healing Effect", "//~": "NO_I18N" },
+ "description": { "str": "Heals the target.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"min_damage": -1,
"max_damage": -1,
@@ -683,8 +704,8 @@
{
"id": "flask_mood",
"type": "SPELL",
- "name": "Iocus",
- "description": "Makes you fun.",
+ "name": { "str": "Iocus", "//~": "NO_I18N" },
+ "description": { "str": "Makes you fun.", "//~": "NO_I18N" },
"effect": "morale",
"effect_str": "morale_iocus",
"shape": "blast",
@@ -698,8 +719,8 @@
{
"id": "flask_toxin",
"type": "SPELL",
- "name": "Toxicum",
- "description": "Release a toxic gas which will poison everybody in range.",
+ "name": { "str": "Toxicum", "//~": "NO_I18N" },
+ "description": { "str": "Release a toxic gas which will poison everybody in range.", "//~": "NO_I18N" },
"valid_targets": [ "self", "ally", "hostile", "ground" ],
"flags": [ "NO_LEGS", "RANDOM_DURATION", "SPLIT_DAMAGE" ],
"effect": "attack",
@@ -721,8 +742,8 @@
{
"id": "flask_venom",
"type": "SPELL",
- "name": "Venenum",
- "description": "Poison the targeted enemy.",
+ "name": { "str": "Venenum", "//~": "NO_I18N" },
+ "description": { "str": "Poison the targeted enemy.", "//~": "NO_I18N" },
"min_dot": 5,
"max_dot": 5,
"effect": "attack",
@@ -738,8 +759,8 @@
{
"id": "alchemist_mine_pull",
"type": "SPELL",
- "name": "Mana explosion",
- "description": "Pull all creatures nearby, except the Alchemist.",
+ "name": { "str": "Mana explosion", "//~": "NO_I18N" },
+ "description": { "str": "Pull all creatures nearby, except the Alchemist.", "//~": "NO_I18N" },
"valid_targets": [ "ally", "hostile", "ground", "item", "field" ],
"effect": "area_pull",
"shape": "blast",
@@ -755,8 +776,8 @@
{
"id": "alchemist_mine_explosion",
"type": "SPELL",
- "name": "Mana explosion damage",
- "description": "Deal some damage to creatures, except the Alchemist.",
+ "name": { "str": "Mana explosion damage", "//~": "NO_I18N" },
+ "description": { "str": "Deal some damage to creatures, except the Alchemist.", "//~": "NO_I18N" },
"valid_targets": [ "ally", "hostile", "ground" ],
"effect": "attack",
"shape": "blast",
@@ -771,8 +792,8 @@
{
"id": "bramble_spear_slow",
"type": "SPELL",
- "name": "Bramble spear slow",
- "description": "Sticky sap coats your enemies.",
+ "name": { "str": "Bramble spear slow", "//~": "NO_I18N" },
+ "description": { "str": "Sticky sap coats your enemies.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "RANDOM_DAMAGE" ],
"shape": "blast",
@@ -785,8 +806,8 @@
{
"id": "druid_thorn_skin_attacked",
"type": "SPELL",
- "name": "Thorn skin aura",
- "description": "Deal a small amount of damage to anything that attacks you.",
+ "name": { "str": "Thorn skin aura", "//~": "NO_I18N" },
+ "description": { "str": "Deal a small amount of damage to anything that attacks you.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "RANDOM_DAMAGE" ],
"shape": "blast",
@@ -800,8 +821,8 @@
{
"id": "forge_teleport",
"type": "SPELL",
- "name": "Forge Teleport",
- "description": "Travel to the forge marking your return point in the process.",
+ "name": { "str": "Forge Teleport", "//~": "NO_I18N" },
+ "description": { "str": "Travel to the forge marking your return point in the process.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "effect_on_condition",
"effect_str": "EOC_FORGE_TELEPORT",
@@ -811,8 +832,8 @@
{
"id": "forge_return_teleport",
"type": "SPELL",
- "name": "Forge Return Teleport",
- "description": "Travel back to your saved forge return point.",
+ "name": { "str": "Forge Return Teleport", "//~": "NO_I18N" },
+ "description": { "str": "Travel back to your saved forge return point.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "effect_on_condition",
"effect_str": "EOC_FORGE_RETURN_TELEPORT",
@@ -822,8 +843,8 @@
{
"id": "ring_of_flight_spell",
"type": "SPELL",
- "name": "Flight",
- "description": "You can fly.",
+ "name": { "str": "Flight", "//~": "NO_I18N" },
+ "description": { "str": "You can fly.", "//~": "NO_I18N" },
"message": "",
"valid_targets": [ "self" ],
"effect": "attack",
@@ -835,8 +856,8 @@
{
"id": "mbracer_blinding_strike_spell",
"type": "SPELL",
- "name": "The Blinding Strike",
- "description": "Your attacks are much faster.",
+ "name": { "str": "The Blinding Strike", "//~": "NO_I18N" },
+ "description": { "str": "Your attacks are much faster.", "//~": "NO_I18N" },
"message": "",
"valid_targets": [ "self" ],
"effect": "attack",
diff --git a/data/mods/Magiclysm/Spells/kelvinist.json b/data/mods/Magiclysm/Spells/kelvinist.json
index 87619f4c2670a..04b3f6df0b6af 100644
--- a/data/mods/Magiclysm/Spells/kelvinist.json
+++ b/data/mods/Magiclysm/Spells/kelvinist.json
@@ -651,8 +651,8 @@
{
"id": "kelvinist_extinguish_fire_emit_cold",
"type": "SPELL",
- "name": "Extinguish Cold Emit",
- "description": "The cold emit from the Extinguish spell. It's a bug if you have it directly.",
+ "name": { "str": "Extinguish Cold Emit", "//~": "NO_I18N" },
+ "description": { "str": "The cold emit from the Extinguish spell. It's a bug if you have it directly.", "//~": "NO_I18N" },
"flags": [ "ENERVATION_SPELL", "SILENT" ],
"valid_targets": [ "ground" ],
"max_level": 20,
diff --git a/data/mods/Magiclysm/Spells/lizardfolk_shaman.json b/data/mods/Magiclysm/Spells/lizardfolk_shaman.json
index a648464f73fe0..22b2577a8b688 100644
--- a/data/mods/Magiclysm/Spells/lizardfolk_shaman.json
+++ b/data/mods/Magiclysm/Spells/lizardfolk_shaman.json
@@ -2,8 +2,8 @@
{
"type": "SPELL",
"id": "spell_summon_crocodile",
- "name": "Summon Crocodile",
- "description": "Summons a crocodile.",
+ "name": { "str": "Summon Crocodile", "//~": "NO_I18N" },
+ "description": { "str": "Summons a crocodile.", "//~": "NO_I18N" },
"flags": [ "HOSTILE_SUMMON", "NO_PROJECTILE" ],
"valid_targets": [ "ground" ],
"base_casting_time": 200,
@@ -20,8 +20,8 @@
{
"type": "SPELL",
"id": "spell_shaman_base",
- "name": "An Ancient Reptilian Spell",
- "description": "Causes one of the shaman spells to be cast.",
+ "name": { "str": "An Ancient Reptilian Spell", "//~": "NO_I18N" },
+ "description": { "str": "Causes one of the shaman spells to be cast.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"effect": "none",
"shape": "blast",
diff --git a/data/mods/Magiclysm/Spells/monsterspells.json b/data/mods/Magiclysm/Spells/monsterspells.json
index 1a2c8840fd53d..281b8c84b57d4 100644
--- a/data/mods/Magiclysm/Spells/monsterspells.json
+++ b/data/mods/Magiclysm/Spells/monsterspells.json
@@ -2,8 +2,8 @@
{
"id": "blood_suck",
"type": "SPELL",
- "name": { "str": "Blood Suck" },
- "description": "Sucks blood from one foe.",
+ "name": { "str": "Blood Suck", "//~": "NO_I18N" },
+ "description": { "str": "Sucks blood from one foe.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "NO_HANDS", "NO_LEGS" ],
"damage_type": "stab",
@@ -21,8 +21,8 @@
{
"id": "bear_trap",
"type": "SPELL",
- "name": "Bear Trap",
- "description": "A trap that summons bears! Not what you were expecting, is it?",
+ "name": { "str": "Bear Trap", "//~": "NO_I18N" },
+ "description": { "str": "A trap that summons bears! Not what you were expecting, is it?", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"flags": [ "HOSTILE_SUMMON", "LOUD", "NO_PROJECTILE" ],
"min_damage": 3,
@@ -40,8 +40,8 @@
{
"id": "forge_trap",
"type": "SPELL",
- "name": "Forge Trap",
- "description": "A trap that summons forge hounds! Not what you were expecting, is it?",
+ "name": { "str": "Forge Trap", "//~": "NO_I18N" },
+ "description": { "str": "A trap that summons forge hounds! Not what you were expecting, is it?", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"flags": [ "HOSTILE_SUMMON", "LOUD", "NO_PROJECTILE" ],
"min_damage": 3,
@@ -59,8 +59,8 @@
{
"id": "rocket_punch",
"type": "SPELL",
- "name": "Rocket Punch",
- "description": "Ejects giant fist from arm.",
+ "name": { "str": "Rocket Punch", "//~": "NO_I18N" },
+ "description": { "str": "Ejects giant fist from arm.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "NO_LEGS" ],
"damage_type": "bash",
@@ -77,8 +77,8 @@
{
"id": "summon_vengeance",
"type": "SPELL",
- "name": { "str": "Spirits of Vengeance" },
- "description": "Summons spirits of vengeance.",
+ "name": { "str": "Spirits of Vengeance", "//~": "NO_I18N" },
+ "description": { "str": "Summons spirits of vengeance.", "//~": "NO_I18N" },
"valid_targets": [ "ground" ],
"flags": [ "HOSTILE_SUMMON", "PERMANENT" ],
"effect": "summon",
@@ -96,8 +96,8 @@
{
"type": "SPELL",
"id": "teleport_charge",
- "name": "Teleport Charge",
- "description": "Edit all this tomorrow.",
+ "name": { "str": "Teleport Charge", "//~": "NO_I18N" },
+ "description": { "str": "Edit all this tomorrow.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"flags": [ "IGNORE_WALLS" ],
"effect": "dash",
@@ -113,8 +113,8 @@
{
"id": "prank",
"type": "SPELL",
- "name": "Leprechaun Prank",
- "description": "Pranks the PC. Gag humor.",
+ "name": { "str": "Leprechaun Prank", "//~": "NO_I18N" },
+ "description": { "str": "Pranks the PC. Gag humor.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "NO_LEGS" ],
"max_level": 5,
@@ -127,8 +127,8 @@
{
"id": "gas_attack",
"type": "SPELL",
- "name": "Gas Attack",
- "description": "Spreads toxic gas around itself.",
+ "name": { "str": "Gas Attack", "//~": "NO_I18N" },
+ "description": { "str": "Spreads toxic gas around itself.", "//~": "NO_I18N" },
"valid_targets": [ "self", "hostile", "ground" ],
"flags": [ "NO_HANDS", "NO_LEGS", "NO_PROJECTILE" ],
"damage_type": "biological",
@@ -154,8 +154,8 @@
{
"type": "SPELL",
"id": "mon_demon_fireball",
- "name": "Demon Fireball",
- "description": "This is a monster only spell.",
+ "name": { "str": "Demon Fireball", "//~": "NO_I18N" },
+ "description": { "str": "This is a monster only spell.", "//~": "NO_I18N" },
"flags": [ "IGNITE_FLAMMABLE", "SPLIT_DAMAGE" ],
"valid_targets": [ "hostile", "ground", "ally", "self" ],
"min_damage": 15,
@@ -172,8 +172,8 @@
{
"type": "SPELL",
"id": "mon_summon_demon_spiderlings",
- "name": "Summon Demon Spiderlings",
- "description": "Summons 4 permanent demon spiderlings.",
+ "name": { "str": "Summon Demon Spiderlings", "//~": "NO_I18N" },
+ "description": { "str": "Summons 4 permanent demon spiderlings.", "//~": "NO_I18N" },
"flags": [ "HOSTILE_SUMMON", "PERMANENT", "NO_PROJECTILE" ],
"valid_targets": [ "ground" ],
"min_damage": 4,
@@ -190,8 +190,8 @@
{
"type": "SPELL",
"id": "demon_breath_fire",
- "name": { "str": "Hellfire Belch" },
- "description": "Spits supernatural napalm from your mouth.",
+ "name": { "str": "Hellfire Belch", "//~": "NO_I18N" },
+ "description": { "str": "Spits supernatural napalm from your mouth.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ally", "ground" ],
"damage_type": "heat",
"max_level": 30,
@@ -208,8 +208,8 @@
{
"id": "shambling_aoe",
"type": "SPELL",
- "name": "Shambling attack",
- "description": "Devastating AoE attack. You can see it only on debug mode.",
+ "name": { "str": "Shambling attack", "//~": "NO_I18N" },
+ "description": { "str": "Devastating AoE attack. You can see it only on debug mode.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "cone",
"valid_targets": [ "hostile", "ground" ],
@@ -226,8 +226,8 @@
{
"type": "SPELL",
"id": "spell_feral_wizard_base",
- "name": "Wild Magic Monster Sorcery",
- "description": "Causes one of the spells to be cast, used for the feral wizard.",
+ "name": { "str": "Wild Magic Monster Sorcery", "//~": "NO_I18N" },
+ "description": { "str": "Causes one of the spells to be cast, used for the feral wizard.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"effect": "none",
"shape": "blast",
@@ -243,8 +243,8 @@
{
"id": "monster_downed_stomp",
"type": "SPELL",
- "name": "Monster Downed Stomp",
- "description": "The monster stomps on the ground and knocks anyone nearby off their feet.",
+ "name": { "str": "Monster Downed Stomp", "//~": "NO_I18N" },
+ "description": { "str": "The monster stomps on the ground and knocks anyone nearby off their feet.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground" ],
"effect": "attack",
"effect_str": "downed",
@@ -260,8 +260,8 @@
{
"id": "mon_troll_regenerate_limb_spell",
"type": "SPELL",
- "name": "Troll regenerate limbs",
- "description": "Allows trolls to remove the maimed effect if their HP is high enough.",
+ "name": { "str": "Troll regenerate limbs", "//~": "NO_I18N" },
+ "description": { "str": "Allows trolls to remove the maimed effect if their HP is high enough.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "remove_effect",
"effect_str": "maimed_arm",
@@ -270,8 +270,8 @@
{
"type": "SPELL",
"id": "monster_invisibility_spell",
- "name": { "str": "monster invisibility" },
- "description": "Makes the target invisible",
+ "name": { "str": "monster invisibility", "//~": "NO_I18N" },
+ "description": { "str": "Makes the target invisible", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"effect": "attack",
"effect_str": "invisibility",
@@ -286,8 +286,8 @@
{
"id": "monster_ranged_gas_attack",
"type": "SPELL",
- "name": "Gas Attack Ranged",
- "description": "Spreads toxic gas around at range.",
+ "name": { "str": "Gas Attack Ranged", "//~": "NO_I18N" },
+ "description": { "str": "Spreads toxic gas around at range.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "NO_PROJECTILE" ],
"damage_type": "biological",
@@ -311,8 +311,8 @@
{
"type": "SPELL",
"id": "mon_bloodlust_spell",
- "name": { "str": "Bloodlust" },
- "description": "Speeds up an ally.",
+ "name": { "str": "Bloodlust", "//~": "NO_I18N" },
+ "description": { "str": "Speeds up an ally.", "//~": "NO_I18N" },
"valid_targets": [ "ally" ],
"effect": "attack",
"shape": "blast",
@@ -330,8 +330,8 @@
{
"type": "SPELL",
"id": "ankheg_acid_spit",
- "name": { "str": "Ankheg Acid Spit" },
- "description": "Spews a line of acid from your mouth.",
+ "name": { "str": "Ankheg Acid Spit", "//~": "NO_I18N" },
+ "description": { "str": "Spews a line of acid from your mouth.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"damage_type": "acid",
"max_level": 40,
@@ -353,8 +353,8 @@
{
"type": "SPELL",
"id": "ankheg_acid_spit_self",
- "name": { "str": "Ankheg Acid Spit Self" },
- "description": "Maims the ankheg's acid gland after spitting acid.",
+ "name": { "str": "Ankheg Acid Spit Self", "//~": "NO_I18N" },
+ "description": { "str": "Maims the ankheg's acid gland after spitting acid.", "//~": "NO_I18N" },
"flags": [ "RANDOM_DURATION", "NO_HANDS", "NO_LEGS", "MUST_HAVE_CLASS_TO_LEARN" ],
"valid_targets": [ "self" ],
"effect": "attack",
@@ -366,8 +366,8 @@
{
"type": "SPELL",
"id": "catoblepas_gaze_spell",
- "name": { "str": "catoblepas gaze" },
- "description": "Does a big thwack of damage if the target can see the catoblepas",
+ "name": { "str": "catoblepas gaze", "//~": "NO_I18N" },
+ "description": { "str": "Does a big thwack of damage if the target can see the catoblepas", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"effect": "effect_on_condition",
"effect_str": "EOC_CATOBLEPAS_GAZE",
@@ -448,7 +448,7 @@
"type": "SPELL",
"id": "feral_dabble_spell_selector_spell",
"name": { "str": "Dabbler Spell selector", "//~": "NO_I18N" },
- "description": "Random chance for a feral to have a single spell. This picks a random spell.",
+ "description": { "str": "Random chance for a feral to have a single spell. This picks a random spell.", "//~": "NO_I18N" },
"flags": [ "SILENT", "NO_HANDS", "NO_LEGS", "MUST_HAVE_CLASS_TO_LEARN" ],
"valid_targets": [ "hostile" ],
"max_level": 1,
@@ -466,8 +466,11 @@
{
"id": "summon_wisps_monster",
"type": "SPELL",
- "name": "Ignus Fatuus Monster",
- "description": "Summons ghostly foxfire worked from living marsh vapor to lead your enemies astray. With more experience, this spell can conjure multiple ghost lights.",
+ "name": { "str": "Ignus Fatuus Monster", "//~": "NO_I18N" },
+ "description": {
+ "str": "Summons ghostly foxfire worked from living marsh vapor to lead your enemies astray. With more experience, this spell can conjure multiple ghost lights.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "ground" ],
"effect": "summon",
"effect_str": "mon_wisp",
@@ -491,8 +494,11 @@
{
"id": "windrun_monster",
"type": "SPELL",
- "name": "Windrunning Monster",
- "description": "A magical wind pushes you forward as you move, easing your movements and increasing speed.",
+ "name": { "str": "Windrunning Monster", "//~": "NO_I18N" },
+ "description": {
+ "str": "A magical wind pushes you forward as you move, easing your movements and increasing speed.",
+ "//~": "NO_I18N"
+ },
"energy_source": "MANA",
"difficulty": 1,
"effect": "attack",
diff --git a/data/mods/Magiclysm/Spells/stormshaper.json b/data/mods/Magiclysm/Spells/stormshaper.json
index 87d29c3d9fbce..de706868d3bd7 100644
--- a/data/mods/Magiclysm/Spells/stormshaper.json
+++ b/data/mods/Magiclysm/Spells/stormshaper.json
@@ -30,8 +30,8 @@
{
"id": "shocking_lash_base",
"type": "SPELL",
- "name": "Shocking Lash Base",
- "description": "Reference spell definition used for Shocking Lash and Shocking Lash Jump.",
+ "name": { "str": "Shocking Lash Base", "//~": "NO_I18N" },
+ "description": { "str": "Reference spell definition used for Shocking Lash and Shocking Lash Jump.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "hostile" ],
@@ -63,8 +63,8 @@
{
"id": "shocking_lash_2",
"type": "SPELL",
- "name": "Shocking Lash Jump",
- "description": "The secondary jump from Shocking Lash.",
+ "name": { "str": "Shocking Lash Jump", "//~": "NO_I18N" },
+ "description": { "str": "The secondary jump from Shocking Lash.", "//~": "NO_I18N" },
"copy-from": "shocking_lash_base",
"field_id": "none",
"flags": [ "RANDOM_TARGET" ],
@@ -341,8 +341,8 @@
{
"type": "SPELL",
"id": "stormshaper_ionization_thunderclap",
- "name": "Ionization Thunderclap",
- "description": "Adds the actual flashbang effect.",
+ "name": { "str": "Ionization Thunderclap", "//~": "NO_I18N" },
+ "description": { "str": "Adds the actual flashbang effect.", "//~": "NO_I18N" },
"valid_targets": [ "hostile", "ground", "self", "ally" ],
"effect": "flashbang",
"shape": "blast",
@@ -387,8 +387,8 @@
{
"id": "thorns_zap",
"type": "SPELL",
- "name": "Repelling Arc Aura",
- "description": "This is a sub-spell of the Repelling Arc spell.",
+ "name": { "str": "Repelling Arc Aura", "//~": "NO_I18N" },
+ "description": { "str": "This is a sub-spell of the Repelling Arc spell.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"effect": "attack",
"shape": "blast",
@@ -562,8 +562,8 @@
{
"id": "shipwrecker_push",
"type": "SPELL",
- "name": "Shipwrecker Push",
- "description": "Push monsters around the player. You can see it only in debug mode.",
+ "name": { "str": "Shipwrecker Push", "//~": "NO_I18N" },
+ "description": { "str": "Push monsters around the player. You can see it only in debug mode.", "//~": "NO_I18N" },
"effect": "area_push",
"shape": "cone",
"valid_targets": [ "ally", "hostile", "item", "ground" ],
@@ -651,8 +651,8 @@
{
"id": "vacuum_decompression_pull",
"type": "SPELL",
- "name": "Vacuum Decompression Pull",
- "description": "Pull monsters around the target. You can see it only in debug mode.",
+ "name": { "str": "Vacuum Decompression Pull", "//~": "NO_I18N" },
+ "description": { "str": "Pull monsters around the target. You can see it only in debug mode.", "//~": "NO_I18N" },
"effect": "area_pull",
"shape": "blast",
"valid_targets": [ "hostile", "item", "ground" ],
@@ -778,8 +778,8 @@
{
"id": "shocking_teleport_damage",
"type": "SPELL",
- "name": { "str": "Shocking Teleport damage" },
- "description": "Deal some damage around the teleportation. You can see it only in debug mode.",
+ "name": { "str": "Shocking Teleport damage", "//~": "NO_I18N" },
+ "description": { "str": "Deal some damage around the teleportation. You can see it only in debug mode.", "//~": "NO_I18N" },
"//": "extra_effects for shocking_teleport, currently doesn't work, because of various issues in dash/teleport and extra_effects incompabilies.",
"valid_targets": [ "ally", "hostile", "ground" ],
"effect": "attack",
@@ -894,8 +894,8 @@
{
"id": "electric_waves_damage",
"type": "SPELL",
- "name": { "str": "Electric Waves Damage" },
- "description": "Blasts, generated by Electric Waves.",
+ "name": { "str": "Electric Waves Damage", "//~": "NO_I18N" },
+ "description": { "str": "Blasts, generated by Electric Waves.", "//~": "NO_I18N" },
"valid_targets": [ "ally", "hostile", "ground" ],
"effect": "attack",
"shape": "blast",
@@ -999,8 +999,8 @@
{
"id": "stormshaper_cloak_fog_emitter",
"type": "SPELL",
- "name": "Cloak of Fog Real",
- "description": "The spell that puts the effect of Cloak of Fog on you. It's a bug if you can see it.",
+ "name": { "str": "Cloak of Fog Real", "//~": "NO_I18N" },
+ "description": { "str": "The spell that puts the effect of Cloak of Fog on you. It's a bug if you can see it.", "//~": "NO_I18N" },
"valid_targets": [ "self" ],
"flags": [ "ENHANCEMENT_SPELL" ],
"effect": "attack",
@@ -1013,8 +1013,8 @@
{
"id": "stormshaper_cloak_fog_wonder",
"type": "SPELL",
- "name": "Cloak of Fog Wonder",
- "description": "Places other fog locations nearby. The number depends on your cloak of fog level.",
+ "name": { "str": "Cloak of Fog Wonder", "//~": "NO_I18N" },
+ "description": { "str": "Places other fog locations nearby. The number depends on your cloak of fog level.", "//~": "NO_I18N" },
"flags": [ "WONDER", "NO_EXPLOSION_SFX" ],
"valid_targets": [ "self" ],
"effect": "attack",
@@ -1026,8 +1026,8 @@
{
"id": "stormshaper_cloak_fog_random",
"type": "SPELL",
- "name": "Cloak of Fog Random",
- "description": "The spell that puts the effect of Cloak of Fog on you. It's a bug if you can see it.",
+ "name": { "str": "Cloak of Fog Random", "//~": "NO_I18N" },
+ "description": { "str": "The spell that puts the effect of Cloak of Fog on you. It's a bug if you can see it.", "//~": "NO_I18N" },
"flags": [ "ENHANCEMENT_SPELL", "RANDOM_TARGET", "NO_EXPLOSION_SFX" ],
"valid_targets": [ "ground" ],
"message": "",
@@ -1069,8 +1069,8 @@
{
"id": "stormshaper_heart_of_hurricane_throw",
"type": "SPELL",
- "name": "Heart of the Hurricane Throw",
- "description": "This is the spell that throws your target back. It's a bug if you have it directly.",
+ "name": { "str": "Heart of the Hurricane Throw", "//~": "NO_I18N" },
+ "description": { "str": "This is the spell that throws your target back. It's a bug if you have it directly.", "//~": "NO_I18N" },
"message": "The winds lash out and hurl away!",
"valid_targets": [ "ally", "hostile", "item", "ground" ],
"spell_class": "STORMSHAPER",
@@ -1108,8 +1108,11 @@
{
"id": "stormshaper_cloak_frog_transform",
"type": "SPELL",
- "name": "Cloak of Frog Transform",
- "description": "Grants the caster some post-threshold Batrachian mutations if they aren't already a frog mutant.",
+ "name": { "str": "Cloak of Frog Transform", "//~": "NO_I18N" },
+ "description": {
+ "str": "Grants the caster some post-threshold Batrachian mutations if they aren't already a frog mutant.",
+ "//~": "NO_I18N"
+ },
"flags": [ "TRANSFORMATION_SPELL", "NO_EXPLOSION_SFX" ],
"valid_targets": [ "self" ],
"effect": "effect_on_condition",
@@ -1150,8 +1153,8 @@
{
"id": "stormshaper_cloak_frog_summon_wonder",
"type": "SPELL",
- "name": "Cloak of Frog Wonder",
- "description": "Places other frog locations nearby. The number depends on your cloak of frog level.",
+ "name": { "str": "Cloak of Frog Wonder", "//~": "NO_I18N" },
+ "description": { "str": "Places other frog locations nearby. The number depends on your cloak of frog level.", "//~": "NO_I18N" },
"flags": [ "TRANSFORMATION_SPELL", "WONDER", "NO_EXPLOSION_SFX" ],
"valid_targets": [ "self" ],
"effect": "attack",
@@ -1163,8 +1166,8 @@
{
"id": "stormshaper_cloak_frog_summon",
"type": "SPELL",
- "name": "Cloak of Frog Summon",
- "description": "The spell that creates the frogs. It's a bug if you have it.",
+ "name": { "str": "Cloak of Frog Summon", "//~": "NO_I18N" },
+ "description": { "str": "The spell that creates the frogs. It's a bug if you have it.", "//~": "NO_I18N" },
"flags": [ "TRANSFORMATION_SPELL", "RANDOM_TARGET", "NO_EXPLOSION_SFX", "SPAWN_GROUP" ],
"valid_targets": [ "ground", "hostile" ],
"message": "",
diff --git a/data/mods/Magiclysm/Spells/technomancer.json b/data/mods/Magiclysm/Spells/technomancer.json
index f3712969899a0..9fd07e141dc31 100644
--- a/data/mods/Magiclysm/Spells/technomancer.json
+++ b/data/mods/Magiclysm/Spells/technomancer.json
@@ -512,8 +512,8 @@
{
"id": "overcharge_burn",
"type": "SPELL",
- "name": "Overcharge Burn",
- "description": "The side effects of casting the overcharge spell.",
+ "name": { "str": "Overcharge Burn", "//~": "NO_I18N" },
+ "description": { "str": "The side effects of casting the overcharge spell.", "//~": "NO_I18N" },
"message": "",
"effect": "spawn_item",
"effect_str": "overcharge_burn_scar",
diff --git a/data/mods/Magiclysm/effects/effect_potion_fruit.json b/data/mods/Magiclysm/effects/effect_potion_fruit.json
index c9cbbb2ab045b..e812697e1fb91 100644
--- a/data/mods/Magiclysm/effects/effect_potion_fruit.json
+++ b/data/mods/Magiclysm/effects/effect_potion_fruit.json
@@ -56,8 +56,8 @@
{
"id": "pfruit_aura_thorns",
"type": "SPELL",
- "name": "Blackberry fruit aura thorns",
- "description": "Stab a monster that attacked you.",
+ "name": { "str": "Blackberry fruit aura thorns", "//~": "NO_I18N" },
+ "description": { "str": "Stab a monster that attacked you.", "//~": "NO_I18N" },
"valid_targets": [ "hostile" ],
"flags": [ "RANDOM_DAMAGE" ],
"shape": "blast",
diff --git a/data/mods/Magiclysm/effects/effects.json b/data/mods/Magiclysm/effects/effects.json
index 5206dbdb7dda8..90c59c3b1c1e4 100644
--- a/data/mods/Magiclysm/effects/effects.json
+++ b/data/mods/Magiclysm/effects/effects.json
@@ -1485,8 +1485,8 @@
{
"type": "effect_type",
"id": "effect_feral_stormshaper_stormhammer",
- "name": [ "Wielding Stormhammer" ],
- "desc": [ "You are a monster wielding a stormhammer, as this effect indicates." ],
+ "name": [ { "str": "Wielding Stormhammer", "//~": "NO_I18N" } ],
+ "desc": [ { "str": "You are a monster wielding a stormhammer, as this effect indicates.", "//~": "NO_I18N" } ],
"show_in_info": true
},
{
diff --git a/data/mods/Magiclysm/items/armor.json b/data/mods/Magiclysm/items/armor.json
index 4597a60052688..aa4d9c1832093 100644
--- a/data/mods/Magiclysm/items/armor.json
+++ b/data/mods/Magiclysm/items/armor.json
@@ -40,10 +40,10 @@
{
"id": "xl_armguard_demonchitin",
"type": "ARMOR",
- "name": { "str": "pair of XL demon chitin arm guards", "str_pl": "pairs of XL demon chitin arm guards" },
+ "name": { "str": "pair of demon chitin arm guards", "str_pl": "pairs of demon chitin arm guards" },
"copy-from": "armguard_demonchitin",
"proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "armor_demonchitin",
@@ -58,10 +58,10 @@
{
"id": "xl_armor_demonchitin",
"type": "ARMOR",
- "name": { "str": "XL demon chitin armor" },
+ "name": { "str": "demon chitin armor" },
"copy-from": "armor_demonchitin",
"proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "helmet_demonchitin",
@@ -76,10 +76,10 @@
{
"id": "xl_helmet_demonchitin",
"type": "ARMOR",
- "name": { "str": "XL demon chitin helmet" },
+ "name": { "str": "demon chitin helmet" },
"copy-from": "helmet_demonchitin",
"proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "gauntlets_demonchitin",
@@ -94,10 +94,10 @@
{
"id": "xl_gauntlets_demonchitin",
"type": "ARMOR",
- "name": { "str": "pair of XL demon chitin gauntlets", "str_pl": "pairs of XL demon chitin gauntlets" },
+ "name": { "str": "pair of demon chitin gauntlets", "str_pl": "pairs of demon chitin gauntlets" },
"copy-from": "gauntlets_demonchitin",
"proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "boots_demonchitin",
@@ -112,10 +112,10 @@
{
"id": "xl_boots_demonchitin",
"type": "ARMOR",
- "name": { "str": "pair of XL demon chitin boots", "str_pl": "pairs of XL demon chitin boots" },
+ "name": { "str": "pair of demon chitin boots", "str_pl": "pairs of demon chitin boots" },
"copy-from": "boots_demonchitin",
"proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"type": "PET_ARMOR",
diff --git a/data/mods/Magiclysm/items/black_dragon_items.json b/data/mods/Magiclysm/items/black_dragon_items.json
index e37a35e7abe03..9fc40783690e7 100644
--- a/data/mods/Magiclysm/items/black_dragon_items.json
+++ b/data/mods/Magiclysm/items/black_dragon_items.json
@@ -271,11 +271,11 @@
"id": "boots_xlblack_dragon_scale",
"copy-from": "boots_black_dragon_scale",
"type": "ARMOR",
- "name": { "str": "pair of XL black dragonscale boots", "str_pl": "pairs of XL black dragonscale boots" },
+ "name": { "str": "pair of black dragonscale boots", "str_pl": "pairs of black dragonscale boots" },
"description": "Massive boots made of incredibly durable black dragonscale, modified to fit even the strangest of bodies. Very protective, and surprisingly light.",
"weight": "1545 g",
"volume": "6250 ml",
- "extend": { "flags": [ "OVERSIZE" ] },
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] },
"material_thickness": 5,
"environmental_protection": 3,
"armor": [ { "encumbrance": 40, "coverage": 100, "covers": [ "foot_l", "foot_r" ] } ]
@@ -284,11 +284,11 @@
"id": "boots_xlblack_dragon_hide",
"copy-from": "boots_black_dragon_hide",
"type": "ARMOR",
- "name": { "str": "pair of XL black dragonhide boots", "str_pl": "pairs of XL black dragonhide boots" },
+ "name": { "str": "pair of black dragonhide boots", "str_pl": "pairs of black dragonhide boots" },
"description": "Massive boots made of very durable black dragonhide, modified to fit even the strangest of bodies. Very protective, and surprisingly light.",
"weight": "955 g",
"volume": "6250 ml",
- "extend": { "flags": [ "OVERSIZE" ] },
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] },
"material_thickness": 3,
"environmental_protection": 3,
"armor": [ { "encumbrance": 25, "coverage": 100, "covers": [ "foot_l", "foot_r" ] } ]
@@ -297,11 +297,11 @@
"id": "gauntlets_xlblack_dragon_scale",
"copy-from": "gauntlets_black_dragon_scale",
"type": "ARMOR",
- "name": { "str": "pair of XL black dragonscale gauntlets", "str_pl": "pairs of XL black dragonscale gauntlets" },
+ "name": { "str": "pair of black dragonscale gauntlets", "str_pl": "pairs of black dragonscale gauntlets" },
"description": "A pair of heavy-duty gauntlets made of incredibly durable black dragonscale that covers your hands, or whatever you use as hands.",
"weight": "680 g",
"volume": "2 L",
- "extend": { "flags": [ "OVERSIZE" ] },
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] },
"material_thickness": 4,
"environmental_protection": 3,
"armor": [ { "encumbrance": 30, "coverage": 100, "covers": [ "hand_l", "hand_r" ] } ]
@@ -310,11 +310,11 @@
"id": "gloves_xlblack_dragon_hide",
"copy-from": "gloves_black_dragon_hide",
"type": "ARMOR",
- "name": { "str": "pair of XL black dragonhide gloves", "str_pl": "pairs of XL black dragonhide gloves" },
+ "name": { "str": "pair of black dragonhide gloves", "str_pl": "pairs of black dragonhide gloves" },
"description": "A pair of gloves made of very durable black dragonhide, modified to be easy to wear while providing maximum protection under extreme conditions. Sized to fit even the strangest of anatomy.",
"weight": "430 g",
"volume": "1500 ml",
- "extend": { "flags": [ "OVERSIZE" ] },
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] },
"material_thickness": 2,
"environmental_protection": 1,
"armor": [ { "encumbrance": 18, "coverage": 100, "covers": [ "hand_l", "hand_r" ] } ]
@@ -323,7 +323,7 @@
"id": "helmet_xlblack_dragon_scale",
"copy-from": "helmet_black_dragon_scale",
"type": "ARMOR",
- "name": { "str": "XL black dragonscale helmet" },
+ "name": "black dragonscale helmet",
"description": "A massive helmet made from incredibly durable black dragonscale, held together with black dragonhide. It comes equipped with a full face visor you can raise and is large enough to fit even the strangest of heads.",
"use_action": { "type": "transform", "target": "helmet_xlblack_dragon_scale_raised", "msg": "You raise your visor." },
"weight": "1256 g",
@@ -334,13 +334,13 @@
{ "covers": [ "head" ], "coverage": 100, "encumbrance": 42 },
{ "covers": [ "eyes", "mouth" ], "coverage": 100, "encumbrance": 20 }
],
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "helmet_xlblack_dragon_scale_raised",
"copy-from": "helmet_black_dragon_scale_raised",
"type": "ARMOR",
- "name": { "str": "XL black dragonscale helmet (raised visor)", "str_pl": "XL black dragonscale helmets (raised visor)" },
+ "name": { "str": "black dragonscale helmet (raised visor)", "str_pl": "black dragonscale helmets (raised visor)" },
"description": "A massive helmet made from incredibly durable black dragonscale, held together with black dragonhide. It is large enough to fit even the strangest of heads. The visor is raised",
"use_action": { "type": "transform", "target": "helmet_xlblack_dragon_scale", "msg": "You put down your visor." },
"material_thickness": 5,
@@ -348,17 +348,17 @@
"armor": [ { "covers": [ "head" ], "coverage": 100, "encumbrance": 42 } ],
"weight": "1256 g",
"volume": "4500 ml",
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "helmet_xlblack_dragon_hide",
"copy-from": "helmet_black_dragon_hide",
"type": "ARMOR",
- "name": { "str": "XL black dragonhide helmet" },
+ "name": "black dragonhide helmet",
"description": "A massive helmet made from very durable black dragonhide. It protects your head well, and doesn't cover your face, but is large enough to fit even the strangest of heads.",
"weight": "815 g",
"volume": "4500 ml",
- "extend": { "flags": [ "OVERSIZE" ] },
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] },
"material_thickness": 3,
"environmental_protection": 1,
"armor": [ { "encumbrance": 26, "coverage": 100, "covers": [ "head" ] } ]
@@ -367,11 +367,11 @@
"id": "suit_xlblack_dragon_scale",
"copy-from": "suit_black_dragon_scale",
"type": "ARMOR",
- "name": { "str": "XL black dragonscale armor" },
+ "name": "black dragonscale armor",
"description": "A massive full suit of incredibly durable black dragon scale mail. It comes with all the accoutrements that cover your torso, legs, and arms; sized to fit even the strangest of bodies.",
"weight": "6250 g",
"volume": "18 L",
- "extend": { "flags": [ "OVERSIZE" ] },
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] },
"material_thickness": 5,
"environmental_protection": 3,
"armor": [ { "encumbrance": 35, "coverage": 100, "covers": [ "leg_l", "leg_r", "torso", "arm_l", "arm_r" ] } ]
@@ -380,11 +380,11 @@
"id": "suit_xlblack_dragon_hide",
"copy-from": "suit_black_dragon_hide",
"type": "ARMOR",
- "name": { "str": "XL black dragonhide armor" },
+ "name": "black dragonhide armor",
"description": "A massive full suit of very durable black dragonhide armor. It comes with all the accoutrements that cover your torso, legs, and arms; sized to fit even the strangest of bodies.",
"weight": "5500 g",
"volume": "18 L",
- "extend": { "flags": [ "OVERSIZE" ] },
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] },
"material_thickness": 3,
"environmental_protection": 2,
"armor": [ { "encumbrance": 26, "coverage": 100, "covers": [ "leg_l", "leg_r", "torso", "arm_l", "arm_r" ] } ]
@@ -393,7 +393,7 @@
"id": "backpack_black_dragon_hide",
"//": "After adding more dragons, maybe make it more generic",
"type": "ARMOR",
- "name": { "str": "dragonhide backpack" },
+ "name": "dragonhide backpack",
"description": "A custom-built backpack. Made of very durable dragon leather and carefully crafted to hold as much stuff as possible.",
"weight": "900 g",
"volume": "5250 ml",
@@ -423,7 +423,7 @@
"id": "backpack_xl_black_dragon_hide",
"copy-from": "backpack_black_dragon_hide",
"type": "ARMOR",
- "name": { "str": "XL dragonhide backpack" },
+ "name": "dragonhide backpack",
"weight": "1200 g",
"volume": "6250 ml",
"price": "2 kUSD 800 USD",
@@ -442,7 +442,7 @@
"warmth": 9,
"material_thickness": 4,
"environmental_protection": 3,
- "extend": { "flags": [ "OVERSIZE" ] },
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] },
"armor": [ { "encumbrance": [ 8, 40 ], "coverage": 40, "covers": [ "torso" ] } ]
}
]
diff --git a/data/mods/Magiclysm/items/enchanted_belts.json b/data/mods/Magiclysm/items/enchanted_belts.json
index 14ecdc1478a6f..1307684828591 100644
--- a/data/mods/Magiclysm/items/enchanted_belts.json
+++ b/data/mods/Magiclysm/items/enchanted_belts.json
@@ -2,8 +2,8 @@
{
"abstract": "mbelt_leather",
"type": "TOOL_ARMOR",
- "name": "magic leather belt",
- "description": "A leather belt. Useful for making your pair of pants fit.",
+ "name": { "str": "magic leather belt", "//~": "NO_I18N" },
+ "description": { "str": "A leather belt. Useful for making your pair of pants fit.", "//~": "NO_I18N" },
"weight": "102 g",
"volume": "250 ml",
"price": "900 USD",
diff --git a/data/mods/Magiclysm/items/enchanted_bracelet.json b/data/mods/Magiclysm/items/enchanted_bracelet.json
index 0e117fc231229..ddd33f884fe09 100644
--- a/data/mods/Magiclysm/items/enchanted_bracelet.json
+++ b/data/mods/Magiclysm/items/enchanted_bracelet.json
@@ -2,8 +2,8 @@
{
"abstract": "platinum_bracelet_magic",
"type": "TOOL_ARMOR",
- "name": { "str": "platinum bracelet" },
- "description": "A bracelet, completely covered with a large amount of runes from both sides.",
+ "name": { "str": "platinum bracelet", "//~": "NO_I18N" },
+ "description": { "str": "A bracelet, completely covered with a large amount of runes from both sides.", "//~": "NO_I18N" },
"weight": "50 g",
"volume": "25 ml",
"material": [ "platinum", "crystallized_mana" ],
diff --git a/data/mods/Magiclysm/items/enchanted_clothes.json b/data/mods/Magiclysm/items/enchanted_clothes.json
index cb656c0de6105..4885672885a53 100644
--- a/data/mods/Magiclysm/items/enchanted_clothes.json
+++ b/data/mods/Magiclysm/items/enchanted_clothes.json
@@ -140,19 +140,19 @@
"id": "xl_gambeson_parabolan",
"//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.",
"type": "ARMOR",
- "name": { "str": "XL parabolan wool gambeson" },
+ "name": { "str": "parabolan wool gambeson" },
"copy-from": "gambeson_parabolan",
"proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "xs_gambeson_parabolan",
- "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.",
+ "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.",
"type": "ARMOR",
- "name": { "str": "XS parabolan wool gambeson" },
+ "name": { "str": "parabolan wool gambeson" },
"copy-from": "gambeson_parabolan",
"proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 },
- "extend": { "flags": [ "UNDERSIZE" ] }
+ "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }
},
{
"id": "gambeson_parabolan_thinsleeved",
@@ -207,19 +207,19 @@
"id": "xl_gambeson_parabolan_thinsleeved",
"//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.",
"type": "ARMOR",
- "name": { "str": "XL thin-sleeved parabolan wool gambeson" },
+ "name": { "str": "thin-sleeved parabolan wool gambeson" },
"copy-from": "gambeson_parabolan_thinsleeved",
"proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "xs_gambeson_parabolan_thinsleeved",
- "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.",
+ "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.",
"type": "ARMOR",
- "name": { "str": "XS thin-sleeved parabolan wool gambeson" },
+ "name": { "str": "thin-sleeved parabolan wool gambeson" },
"copy-from": "gambeson_parabolan_thinsleeved",
"proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 },
- "extend": { "flags": [ "UNDERSIZE" ] }
+ "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }
},
{
"id": "gambeson_parabolan_vest",
@@ -263,19 +263,19 @@
"id": "xl_gambeson_parabolan_vest",
"//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.",
"type": "ARMOR",
- "name": { "str": "XL sleeveless parabolan wool gambeson" },
+ "name": { "str": "sleeveless parabolan wool gambeson" },
"copy-from": "gambeson_parabolan_vest",
"proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "xs_gambeson_parabolan_vest",
- "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.",
+ "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.",
"type": "ARMOR",
- "name": { "str": "XS sleeveless parabolan wool gambeson" },
+ "name": { "str": "sleeveless parabolan wool gambeson" },
"copy-from": "gambeson_parabolan_vest",
"proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 },
- "extend": { "flags": [ "UNDERSIZE" ] }
+ "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }
},
{
"id": "gambeson_pants_parabolan",
@@ -310,19 +310,19 @@
"id": "xl_gambeson_pants_parabolan",
"//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.",
"type": "ARMOR",
- "name": { "str": "XL parabolan wool heavy arming pants", "str_pl": "pairs of XL parabolan wool heavy arming pants" },
+ "name": { "str": "parabolan wool heavy arming pants", "str_pl": "pairs of parabolan wool heavy arming pants" },
"copy-from": "gambeson_pants_parabolan",
"proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "xs_gambeson_pants_parabolan",
- "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.",
+ "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.",
"type": "ARMOR",
- "name": { "str": "XS parabolan wool heavy arming pants", "str_pl": "pairs of XS parabolan wool heavy arming pants" },
+ "name": { "str": "parabolan wool heavy arming pants", "str_pl": "pairs of parabolan wool heavy arming pants" },
"copy-from": "gambeson_pants_parabolan",
"proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 },
- "extend": { "flags": [ "UNDERSIZE" ] }
+ "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }
},
{
"id": "gambeson_gloves_parabolan",
@@ -374,19 +374,19 @@
"id": "xl_gambeson_gloves_parabolan",
"//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.",
"type": "ARMOR",
- "name": { "str": "XL parabolan wool arming mittens", "str_pl": "pairs of XL parabolan wool arming mittens" },
+ "name": { "str": "parabolan wool arming mittens", "str_pl": "pairs of parabolan wool arming mittens" },
"copy-from": "gambeson_gloves_parabolan",
"proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 },
- "extend": { "flags": [ "OVERSIZE" ] }
+ "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }
},
{
"id": "xs_gambeson_gloves_parabolan",
- "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.",
+ "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.",
"type": "ARMOR",
- "name": { "str": "XS parabolan wool arming mittens", "str_pl": "pairs of XS parabolan wool arming mittens" },
+ "name": { "str": "parabolan wool arming mittens", "str_pl": "pairs of parabolan wool arming mittens" },
"copy-from": "gambeson_gloves_parabolan",
"proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 },
- "extend": { "flags": [ "UNDERSIZE" ] }
+ "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }
},
{
"id": "coat_lab_plus_one",
diff --git a/data/mods/Magiclysm/items/enchanted_masks.json b/data/mods/Magiclysm/items/enchanted_masks.json
index 377b9bee3be79..63aaff3525765 100644
--- a/data/mods/Magiclysm/items/enchanted_masks.json
+++ b/data/mods/Magiclysm/items/enchanted_masks.json
@@ -3,8 +3,8 @@
"abstract": "mmask",
"type": "TOOL_ARMOR",
"category": "armor",
- "name": "magic mask",
- "description": "A generic magic mask.",
+ "name": { "str": "magic mask", "//~": "NO_I18N" },
+ "description": { "str": "A generic magic mask.", "//~": "NO_I18N" },
"weight": "442 g",
"volume": "750 ml",
"price": "2 kUSD",
diff --git a/data/mods/Magiclysm/items/enchanted_rings.json b/data/mods/Magiclysm/items/enchanted_rings.json
index fc096e2e68772..30c7c7dd43928 100644
--- a/data/mods/Magiclysm/items/enchanted_rings.json
+++ b/data/mods/Magiclysm/items/enchanted_rings.json
@@ -2,8 +2,8 @@
{
"abstract": "mring_copper",
"type": "TOOL_ARMOR",
- "name": "copper magic ring",
- "description": "A generic copper magic ring.",
+ "name": { "str": "copper magic ring", "//~": "NO_I18N" },
+ "description": { "str": "A generic copper magic ring.", "//~": "NO_I18N" },
"weight": "4 g",
"volume": "1 ml",
"price": "50 USD",
@@ -28,8 +28,8 @@
{
"abstract": "mring_silver",
"type": "TOOL_ARMOR",
- "name": "magic ring",
- "description": "A generic silver magic ring.",
+ "name": { "str": "silver magic ring", "//~": "NO_I18N" },
+ "description": { "str": "A generic silver magic ring.", "//~": "NO_I18N" },
"weight": "5 g",
"volume": "1 ml",
"price": "50 USD",
@@ -54,8 +54,8 @@
{
"abstract": "mring_gold",
"type": "TOOL_ARMOR",
- "name": "magic ring",
- "description": "A generic gold magic ring.",
+ "name": { "str": "gold magic ring", "//~": "NO_I18N" },
+ "description": { "str": "A generic gold magic ring.", "//~": "NO_I18N" },
"weight": "9 g",
"volume": "1 ml",
"price": "50 USD",
@@ -80,8 +80,8 @@
{
"abstract": "mring_platinum",
"type": "TOOL_ARMOR",
- "name": "magic ring",
- "description": "A generic platinum magic ring",
+ "name": { "str": "platinum magic ring", "//~": "NO_I18N" },
+ "description": { "str": "A generic platinum magic ring", "//~": "NO_I18N" },
"weight": "11 g",
"volume": "1 ml",
"price": "50 USD",
diff --git a/data/mods/Magiclysm/items/ethereal_items.json b/data/mods/Magiclysm/items/ethereal_items.json
index e2b266fe6b2ce..13c4d8ace6ffa 100644
--- a/data/mods/Magiclysm/items/ethereal_items.json
+++ b/data/mods/Magiclysm/items/ethereal_items.json
@@ -1563,8 +1563,8 @@
"copy-from": "abstractmap",
"type": "GENERIC",
"category": "maps",
- "name": "earthshaper map",
- "description": "This is a magical map that, if everything works correctly, you'll never actually see.",
+ "name": { "str": "earthshaper map", "//~": "NO_I18N" },
+ "description": { "str": "This is a magical map that, if everything works correctly, you'll never actually see.", "//~": "NO_I18N" },
"color": "brown",
"use_action": {
"type": "reveal_map",
@@ -1585,8 +1585,8 @@
"copy-from": "abstractmap",
"type": "GENERIC",
"category": "maps",
- "name": "earthshaper map",
- "description": "This is a magical map that, if everything works correctly, you'll never actually see.",
+ "name": { "str": "earthshaper map", "//~": "NO_I18N" },
+ "description": { "str": "This is a magical map that, if everything works correctly, you'll never actually see.", "//~": "NO_I18N" },
"color": "brown",
"use_action": {
"type": "reveal_map",
@@ -1607,8 +1607,8 @@
"copy-from": "abstractmap",
"type": "GENERIC",
"category": "maps",
- "name": "earthshaper map",
- "description": "This is a magical map that, if everything works correctly, you'll never actually see.",
+ "name": { "str": "earthshaper map", "//~": "NO_I18N" },
+ "description": { "str": "This is a magical map that, if everything works correctly, you'll never actually see.", "//~": "NO_I18N" },
"color": "brown",
"use_action": {
"type": "reveal_map",
@@ -1629,8 +1629,8 @@
"copy-from": "abstractmap",
"type": "GENERIC",
"category": "maps",
- "name": "earthshaper map",
- "description": "This is a magical map that, if everything works correctly, you'll never actually see.",
+ "name": { "str": "earthshaper map", "//~": "NO_I18N" },
+ "description": { "str": "This is a magical map that, if everything works correctly, you'll never actually see.", "//~": "NO_I18N" },
"color": "brown",
"use_action": {
"type": "reveal_map",
@@ -1651,8 +1651,8 @@
"copy-from": "abstractmap",
"type": "GENERIC",
"category": "maps",
- "name": "earthshaper map",
- "description": "This is a magical map that, if everything works correctly, you'll never actually see.",
+ "name": { "str": "earthshaper map", "//~": "NO_I18N" },
+ "description": { "str": "This is a magical map that, if everything works correctly, you'll never actually see.", "//~": "NO_I18N" },
"color": "brown",
"use_action": {
"type": "reveal_map",
@@ -1674,8 +1674,8 @@
"copy-from": "abstractmap",
"type": "GENERIC",
"category": "maps",
- "name": "earthshaper map",
- "description": "This is a magical map that, if everything works correctly, you'll never actually see.",
+ "name": { "str": "earthshaper map", "//~": "NO_I18N" },
+ "description": { "str": "This is a magical map that, if everything works correctly, you'll never actually see.", "//~": "NO_I18N" },
"color": "brown",
"use_action": {
"type": "reveal_map",
@@ -1694,8 +1694,8 @@
{
"id": "item_druid_disinfectant",
"type": "GENERIC",
- "name": { "str_sp": "druid antiseptic" },
- "description": "A magical disinfectant. You should never actually see this.",
+ "name": { "str_sp": "druid antiseptic", "//~": "NO_I18N" },
+ "description": { "str": "A magical disinfectant. You should never actually see this.", "//~": "NO_I18N" },
"weight": "0 g",
"volume": "0 ml",
"symbol": "~",
diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json
index d7063a420b241..5eaf86f33e0e2 100644
--- a/data/mods/Magiclysm/items/spell_scrolls.json
+++ b/data/mods/Magiclysm/items/spell_scrolls.json
@@ -1453,7 +1453,7 @@
"id": "spell_scroll_kelvinist_anti_cold",
"//": "Kelvinist spell",
"name": { "str": "Scroll of Cloak of Warmth", "str_pl": "Scrolls of Cloak of Warmth" },
- "description": "Winter-be-gone through the power of of modern magic.",
+ "description": "Winter-be-gone through the power of modern magic.",
"use_action": { "type": "learn_spell", "spells": [ "kelvinist_anti_cold" ] }
},
{
@@ -1462,7 +1462,7 @@
"id": "spell_scroll_kelvinist_anti_heat",
"//": "Kelvinist spell",
"name": { "str": "Scroll of Cloak of Chill", "str_pl": "Scrolls of Cloak of Chill" },
- "description": "Summer-be-gone through the power of of modern magic.",
+ "description": "Summer-be-gone through the power of modern magic.",
"use_action": { "type": "learn_spell", "spells": [ "kelvinist_anti_heat" ] }
},
{
diff --git a/data/mods/Magiclysm/items/tools.json b/data/mods/Magiclysm/items/tools.json
index 3164ccd89ebe0..e8c27a3fbbcd7 100644
--- a/data/mods/Magiclysm/items/tools.json
+++ b/data/mods/Magiclysm/items/tools.json
@@ -166,7 +166,10 @@
"id": "magic_circle_rank_1",
"type": "TOOL",
"name": { "str": "Magic Circle Rank 1", "str_pl": "Magic Circles Rank 1" },
- "description": "This is the pseudo-tool provided by having a nearby magic circle. You shouldn't see this as an individual item.",
+ "description": {
+ "str": "This is the pseudo-tool provided by having a nearby magic circle. You shouldn't see this as an individual item.",
+ "//~": "NO_I18N"
+ },
"symbol": "O",
"color": "red",
"weight": "0 g",
@@ -178,7 +181,10 @@
"id": "magic_circle_rank_2",
"type": "TOOL",
"name": { "str": "Magic Circle Rank 2", "str_pl": "Magic Circles Rank 2" },
- "description": "This is the pseudo-tool provided by having a nearby magic circle. You shouldn't see this as an individual item.",
+ "description": {
+ "str": "This is the pseudo-tool provided by having a nearby magic circle. You shouldn't see this as an individual item.",
+ "//~": "NO_I18N"
+ },
"symbol": "O",
"color": "red",
"weight": "0 g",
diff --git a/data/mods/Magiclysm/items/weapons.json b/data/mods/Magiclysm/items/weapons.json
index 78fa510593adc..29a5241dbc041 100644
--- a/data/mods/Magiclysm/items/weapons.json
+++ b/data/mods/Magiclysm/items/weapons.json
@@ -44,7 +44,7 @@
"type": "GUN",
"copy-from": "fake_item",
"name": { "str": "barbed javelin" },
- "description": "Fake gun that fires barbed javelins.",
+ "description": { "str": "Fake gun that fires barbed javelins.", "//~": "NO_I18N" },
"flags": [ "NEVER_JAMS", "NONCONDUCTIVE", "NO_REPAIR", "WATERPROOF_GUN", "NO_SALVAGE", "NO_UNLOAD", "NO_TURRET" ],
"skill": "rifle",
"durability": 10,
diff --git a/data/mods/Magiclysm/monster_attacks.json b/data/mods/Magiclysm/monster_attacks.json
index 965d650005b1c..9ab72e2a3985e 100644
--- a/data/mods/Magiclysm/monster_attacks.json
+++ b/data/mods/Magiclysm/monster_attacks.json
@@ -32,8 +32,8 @@
{
"id": "teravolt_explosion",
"type": "SPELL",
- "name": "Teravolt Explosion",
- "description": "Create a giant explosion with spark field. You can see it only in debug mode.",
+ "name": { "str": "Teravolt Explosion", "//~": "NO_I18N" },
+ "description": { "str": "Create a giant explosion with spark field. You can see it only in debug mode.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "hostile", "ground" ],
@@ -90,8 +90,8 @@
{
"id": "electric_turret_line",
"type": "SPELL",
- "name": "Lightning Line Attack",
- "description": "Line heat attack for stormcaller's thunder pillar.",
+ "name": { "str": "Lightning Line Attack", "//~": "NO_I18N" },
+ "description": { "str": "Line heat attack for stormcaller's thunder pillar.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "cone",
"valid_targets": [ "hostile", "ground" ],
@@ -112,8 +112,8 @@
{
"id": "electric_turret_blast",
"type": "SPELL",
- "name": "Lightning Blast Attack",
- "description": "Blast electric attack for stormcaller's thunder pillar.",
+ "name": { "str": "Lightning Blast Attack", "//~": "NO_I18N" },
+ "description": { "str": "Blast electric attack for stormcaller's thunder pillar.", "//~": "NO_I18N" },
"effect": "attack",
"shape": "blast",
"valid_targets": [ "hostile", "ground" ],
diff --git a/data/mods/Magiclysm/mutations/debug_mutations.json b/data/mods/Magiclysm/mutations/debug_mutations.json
index 346566e44e36a..f11a45d569b70 100644
--- a/data/mods/Magiclysm/mutations/debug_mutations.json
+++ b/data/mods/Magiclysm/mutations/debug_mutations.json
@@ -2,11 +2,11 @@
{
"type": "mutation",
"id": "VAULT_DEFENDER",
- "name": { "str": "Vault Defender" },
+ "name": { "str": "Vault Defender", "//~": "NO_I18N" },
"points": 99,
"valid": false,
"player_display": false,
- "description": "To cast bug killing spells.",
+ "description": { "str": "To cast bug killing spells.", "//~": "NO_I18N" },
"debug": false,
"enchantments": [
{ "condition": "ALWAYS", "values": [ { "value": "ARMOR_BULLET", "add": -100 }, { "value": "PERCEPTION", "add": 15 } ] }
@@ -15,8 +15,11 @@
{
"id": "librarian_blinding",
"type": "SPELL",
- "name": "Soul Pressure",
- "description": "This is a spell that represents the Soulfire putting a burning pressure on nearby opponents. If you are seeing this spell, you have debugged it in.",
+ "name": { "str": "Soul Pressure", "//~": "NO_I18N" },
+ "description": {
+ "str": "This is a spell that represents the Soulfire putting a burning pressure on nearby opponents. If you are seeing this spell, you have debugged it in.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "hostile" ],
"flags": [ "SILENT", "NO_PROJECTILE" ],
"effect": "attack",
@@ -34,11 +37,11 @@
{
"type": "mutation",
"id": "LIBRARY_DEFENDER",
- "name": { "str": "library defender" },
+ "name": { "str": "library defender", "//~": "NO_I18N" },
"points": 99,
"valid": false,
"player_display": false,
- "description": "To cast bug killing spells.",
+ "description": { "str": "To cast bug killing spells.", "//~": "NO_I18N" },
"debug": false,
"enchantments": [
{
diff --git a/data/mods/Magiclysm/mutations/magical.json b/data/mods/Magiclysm/mutations/magical.json
index 38731bc45db04..73ce02aee7cf0 100644
--- a/data/mods/Magiclysm/mutations/magical.json
+++ b/data/mods/Magiclysm/mutations/magical.json
@@ -16,9 +16,12 @@
{
"type": "mutation",
"id": "DRUID_SHIFTER_BEAR_FORM_TRAITS",
- "name": { "str": "Bear Form" },
+ "name": { "str": "Bear Form", "//~": "NO_I18N" },
"points": 98,
- "description": "You are a bear. This provides the actual effects of bear form. Should not be player-visible",
+ "description": {
+ "str": "You are a bear. This provides the actual effects of bear form. Should not be player-visible",
+ "//~": "NO_I18N"
+ },
"valid": false,
"starting_trait": false,
"purifiable": false,
@@ -83,9 +86,12 @@
{
"type": "mutation",
"id": "DRUID_SHIFTER_COUGAR_FORM_TRAITS",
- "name": { "str": "Cougar Form" },
+ "name": { "str": "Cougar Form", "//~": "NO_I18N" },
"points": 98,
- "description": "You are a cougar. This provides the actual effects of cougar form. Should not be player-visible.",
+ "description": {
+ "str": "You are a cougar. This provides the actual effects of cougar form. Should not be player-visible.",
+ "//~": "NO_I18N"
+ },
"starting_trait": false,
"purifiable": false,
"valid": false,
@@ -147,9 +153,12 @@
{
"type": "mutation",
"id": "DRUID_SHIFTER_DEER_FORM_TRAITS",
- "name": { "str": "Deer Form" },
+ "name": { "str": "Deer Form", "//~": "NO_I18N" },
"points": 98,
- "description": "You are a deer. This provides the actual effects of deer form. Should not be player-visible",
+ "description": {
+ "str": "You are a deer. This provides the actual effects of deer form. Should not be player-visible",
+ "//~": "NO_I18N"
+ },
"valid": false,
"starting_trait": false,
"purifiable": false,
@@ -205,9 +214,12 @@
{
"type": "mutation",
"id": "DRUID_SHIFTER_RAVEN_FORM_TRAITS",
- "name": { "str": "Raven Form" },
+ "name": { "str": "Raven Form", "//~": "NO_I18N" },
"points": 0,
- "description": "You are a raven. This provides the actual effects of raven form. Should not be player-visible.",
+ "description": {
+ "str": "You are a raven. This provides the actual effects of raven form. Should not be player-visible.",
+ "//~": "NO_I18N"
+ },
"starting_trait": false,
"purifiable": false,
"valid": false,
@@ -251,9 +263,12 @@
{
"type": "mutation",
"id": "DRUID_SHIFTER_MANA_REDUCER",
- "name": { "str": "Mana Reducer Druid Forms" },
+ "name": { "str": "Mana Reducer Druid Forms", "//~": "NO_I18N" },
"points": 0,
- "description": "Prevents you from regenerating mana while in druid shapeshifting form. You should never actually see this.",
+ "description": {
+ "str": "Prevents you from regenerating mana while in druid shapeshifting form. You should never actually see this.",
+ "//~": "NO_I18N"
+ },
"starting_trait": false,
"purifiable": false,
"valid": false,
diff --git a/data/mods/Magiclysm/mutations/mutation_effects.json b/data/mods/Magiclysm/mutations/mutation_effects.json
index 78324829d9347..afb4bace55b2c 100644
--- a/data/mods/Magiclysm/mutations/mutation_effects.json
+++ b/data/mods/Magiclysm/mutations/mutation_effects.json
@@ -21,8 +21,8 @@
{
"type": "effect_type",
"id": "dragon_acidburn",
- "name": [ "Dragon Acid burn" ],
- "desc": [ "Burned with a black dragon's acid" ],
+ "name": [ { "str": "Dragon Acid burn", "//~": "NO_I18N" } ],
+ "desc": [ { "str": "Burned with a black dragon's acid", "//~": "NO_I18N" } ],
"max_intensity": 4,
"int_add_val": 1,
"base_mods": { "speed_mod": [ -20 ], "pain_amount": [ 20 ], "hurt_amount": [ 3 ] },
@@ -31,8 +31,8 @@
{
"type": "effect_type",
"id": "lesser_dragon_acidburn",
- "name": [ "Lesser Dragon Acid burn" ],
- "desc": [ "Burned with a less potent version of a black dragon's acid" ],
+ "name": [ { "str": "Lesser Dragon Acid burn", "//~": "NO_I18N" } ],
+ "desc": [ { "str": "Burned with a less potent version of a black dragon's acid", "//~": "NO_I18N" } ],
"max_intensity": 4,
"int_add_val": 1,
"base_mods": { "speed_mod": [ -10 ], "pain_amount": [ 10 ], "hurt_amount": [ 1 ] },
diff --git a/data/mods/Magiclysm/mutations/temporary.json b/data/mods/Magiclysm/mutations/temporary.json
index 3e5f6421f3758..30b221f302ba1 100644
--- a/data/mods/Magiclysm/mutations/temporary.json
+++ b/data/mods/Magiclysm/mutations/temporary.json
@@ -45,8 +45,8 @@
{
"type": "mutation",
"id": "EARTHSHAPER_STONE_SLEEP",
- "name": { "str": "Stony Sleep" },
- "description": "You are resting in the depths of the earth. You should never actually see this.",
+ "name": { "str": "Stony Sleep", "//~": "NO_I18N" },
+ "description": { "str": "You are resting in the depths of the earth. You should never actually see this.", "//~": "NO_I18N" },
"player_display": false,
"points": 0,
"enchantments": [
diff --git a/data/mods/Magiclysm/traits/manatouched.json b/data/mods/Magiclysm/traits/manatouched.json
index 202397e23f1b4..f2b7c1a3beaf7 100644
--- a/data/mods/Magiclysm/traits/manatouched.json
+++ b/data/mods/Magiclysm/traits/manatouched.json
@@ -153,8 +153,11 @@
{
"id": "sp_mana_siphon",
"type": "SPELL",
- "name": "Mana Siphon",
- "description": "This is the spell portion of the mana siphon series of mutations. If you have this spell you probably debugged it in.",
+ "name": { "str": "Mana Siphon", "//~": "NO_I18N" },
+ "description": {
+ "str": "This is the spell portion of the mana siphon series of mutations. If you have this spell you probably debugged it in.",
+ "//~": "NO_I18N"
+ },
"valid_targets": [ "self" ],
"min_damage": 5,
"damage_increment": 5.0,
diff --git a/data/mods/Magiclysm/vehicles/summoned_vehicles.json b/data/mods/Magiclysm/vehicles/summoned_vehicles.json
index 1ccf5d92dab78..dde866bcdc552 100644
--- a/data/mods/Magiclysm/vehicles/summoned_vehicles.json
+++ b/data/mods/Magiclysm/vehicles/summoned_vehicles.json
@@ -101,7 +101,7 @@
"type": "AMMO",
"category": "chems",
"name": { "str_sp": "mana core power" },
- "description": "Seeing this is a bug.",
+ "description": { "str": "Seeing this is a bug.", "//~": "NO_I18N" },
"weight": "10 g",
"volume": "10 ml",
"phase": "solid",
diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json b/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json
index 106e768949f20..70a90b6f09d62 100644
--- a/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json
+++ b/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json
@@ -350,6 +350,143 @@
{ "u_lose_effect": "effect_psi_intense_concentration" }
]
},
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_END_PSI_POWERS_SPECIFIC",
+ "//": "This will remove a single toggleable power, selected by the player (or no power).",
+ "effect": [
+ {
+ "title": "Stop concentrating on which power?",
+ "run_eoc_selector": [
+ "EOC_BIOKIN_REMOVE_OVERCOME_PAIN",
+ "EOC_BIOKIN_REMOVE_PHYSICAL_ENHANCE",
+ "EOC_BIOKIN_REMOVE_BREATHE_SKIN",
+ "EOC_BIOKIN_REMOVE_HARDENED_SKIN",
+ "EOC_BIOKIN_REMOVE_CLIMATE_CONTROL",
+ "EOC_BIOKIN_REMOVE_ENHANCE_MOBILITY",
+ "EOC_BIOKIN_REMOVE_HAMMERHAND",
+ "EOC_BIOKIN_REMOVE_REFLEX_ENHANCE",
+ "EOC_BIOKIN_REMOVE_METABOLISM_ENHANCE",
+ "EOC_CLAIR_REMOVE_NIGHT_EYES",
+ "EOC_CLAIR_REMOVE_SPEED_READ",
+ "EOC_CLAIR_REMOVE_DANGER_SENSE",
+ "EOC_CLAIR_REMOVE_SEE_AURAS",
+ "EOC_CLAIR_REMOVE_RANGED_ENHANCE",
+ "EOC_CLAIR_REMOVE_DODGE_POWER",
+ "EOC_CLAIR_REMOVE_CRAFT_BONUS",
+ "EOC_CLAIR_REMOVE_CLEAR_SIGHT",
+ "EOC_CLAIR_REMOVE_GROUP_TACTICS",
+ "EOC_ELECTROKIN_REMOVE_SEE_ELECTRICITY",
+ "EOC_ELECTROKIN_REMOVE_ZAP_ENEMIES",
+ "EOC_ELECTROKIN_REMOVE_MELEE_ATTACKS",
+ "EOC_ELECTROKIN_REMOVE_HACKING_INTERFACE",
+ "EOC_ELECTROKIN_REMOVE_PERSONAL_BATTERY",
+ "EOC_ELECTROKIN_REMOVE_REDUCE_PAIN",
+ "EOC_ELECTROKIN_REMOVE_SPEED_BOOST",
+ "EOC_ELECTROKIN_REMOVE_LIGHTNING_AURA",
+ "EOC_PHOTOKIN_REMOVE_LIGHT_LOCAL",
+ "EOC_PHOTOKIN_REMOVE_LIGHT_DODGE",
+ "EOC_PHOTOKIN_REMOVE_RAD_IMMUNITY",
+ "EOC_PHOTOKIN_REMOVE_CAMOUFLAGE",
+ "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",
+ "EOC_PYRO_REMOVE_TORCH_WELD",
+ "EOC_PYROKIN_REMOVE_FLAME_IMMUNITY",
+ "EOC_TELEKIN_REMOVE_MOMENTUM",
+ "EOC_TELEKIN_REMOVE_LIFTING_FIELD",
+ "EOC_TELEKIN_REMOVE_TELEKINETIC_STRENGTH",
+ "EOC_TELEKIN_REMOVE_SHIELD",
+ "EOC_TELEKIN_REMOVE_JACKING_TOOL",
+ "EOC_TELEKIN_REMOVE_LEVITATION",
+ "EOC_TELEPATH_REMOVE_TELEPATHIC_CONCENTRATION",
+ "EOC_TELEPATH_REMOVE_TELEPATHIC_SHIELD",
+ "EOC_TELEPATH_REMOVE_TELEPATHIC_MORALE",
+ "EOC_TELEPATH_REMOVE_SENSE_MINDS",
+ "EOC_TELEPORT_REMOVE_EPHEMERAL_WALK",
+ "EOC_TELEPORT_REMOVE_STRIDE",
+ "EOC_VITAKIN_REMOVE_SLOW_BLEEDING",
+ "EOC_VITAKIN_REMOVE_CONCENTRATED_HEALING",
+ "EOC_VITAKIN_REMOVE_HEALTH_POWER",
+ "EOC_VITAKIN_REMOVE_CURE_DISEASE",
+ "EOC_VITAKIN_REMOVE_SUPER_HEAL",
+ "EOC_VITAKIN_REMOVE_RETURN_FROM_DEATH",
+ "EOC_MOM_NO_EFFECT"
+ ],
+ "names": [
+ "Overcome Pain",
+ "Physical Enhancement",
+ "Oxygen Absorption",
+ "Hardened Skin",
+ "Temperature Adaptability",
+ "Enhance Mobility",
+ "Hammerhand",
+ "Heightened Reflexes",
+ "Metabolic Hyperefficiency",
+ "Night Eyes",
+ "Speed Reader",
+ "Premonition",
+ "Aura Sight",
+ "Marksman's Eye",
+ "Combat Sense",
+ "Intuitive Artisan",
+ "Clarity",
+ "Prescient Tactician",
+ "Spark Sight",
+ "Electrical Discharge",
+ "Voltaic Strikes",
+ "Hacking Interface",
+ "Electron Overflow",
+ "Pain Suppression",
+ "Neuro-acceleration",
+ "Galvanic Aura",
+ "Candle's Glow",
+ "Trick of the Light",
+ "Lucent Barrier",
+ "Chameleoflage",
+ "Mirror-Mask",
+ "Radio Transception",
+ "Veil of Light",
+ "Blinding Radiance",
+ "Banked Flames",
+ "Cloak of Warmth",
+ "Blazing Aura",
+ "Incandescent Lance",
+ "Flameshield",
+ "Momentum Alteration",
+ "Lifting Field",
+ "Enhance Strength",
+ "Inertial Barrier",
+ "Lift Vehicle",
+ "Levitation",
+ "Concentration Trance",
+ "Telepathic Shield",
+ "Mood Stabilization",
+ "Sense Minds",
+ "Ephemeral Walk",
+ "Extended Stride",
+ "Coagulation",
+ "Leukocyte Accumulation",
+ "Healthy Glow",
+ "Immunostimulus",
+ "Anabolic Rejuvenation",
+ "Accelerated Resuscitation",
+ "cancel"
+ ],
+ "hide_failing": true,
+ "allow_cancel": true
+ }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_MOM_NO_EFFECT",
+ "effect": [ ]
+ },
{
"type": "effect_on_condition",
"id": "EOC_END_PSI_POWERS_MAINTAINED",
diff --git a/data/mods/MindOverMatter/furniture_and_terrain/terrain_alien.json b/data/mods/MindOverMatter/furniture_and_terrain/terrain_alien.json
index 07855616be19f..c0ab1e48d8aed 100644
--- a/data/mods/MindOverMatter/furniture_and_terrain/terrain_alien.json
+++ b/data/mods/MindOverMatter/furniture_and_terrain/terrain_alien.json
@@ -146,7 +146,7 @@
"id": "t_tree_small_alien_2",
"name": "alien tree",
"looks_like": "t_bamboo_tall",
- "description": "A tall, thin alien plant. From a distance it seems more like a column than a tree, but when you get closer you can see that it's made up of a series of of broad, serrated leaves all folded so closely together that they form a single stalk.",
+ "description": "A tall, thin alien plant. From a distance it seems more like a column than a tree, but when you get closer you can see that it's made up of a series of broad, serrated leaves all folded so closely together that they form a single stalk.",
"symbol": "7",
"color": "dark_gray",
"move_cost": 0,
diff --git a/data/mods/MindOverMatter/hobbies.json b/data/mods/MindOverMatter/hobbies.json
index c511d19789d58..eed87a99c15b0 100644
--- a/data/mods/MindOverMatter/hobbies.json
+++ b/data/mods/MindOverMatter/hobbies.json
@@ -152,7 +152,7 @@
"subtype": "hobby",
"id": "mid_electrokinetic",
"name": "Arising Electrokinetic",
- "description": "Something happened during the storms that raged during the Cataclysm, and now you can do things that would have once seemed impossible. You an hurl lightning bolts from your hands, like some kind of superhero, and your smartphone still has a full charge even though you haven't plugged it in in weeks. Some kind of huge wasp attacked you in the woods and there was a crackle like thunder and it fell to the ground twitching. You didn't stop to check if it would move again.",
+ "description": "Something happened during the storms that raged during the Cataclysm, and now you can do things that would have once seemed impossible. You an hurl lightning bolts from your hands, like some kind of superhero, and your smartphone still has a full charge even though you haven't plugged it in weeks. Some kind of huge wasp attacked you in the woods and there was a crackle like thunder and it fell to the ground twitching. You didn't stop to check if it would move again.",
"points": 7,
"traits": [ "ELECTROKINETIC", "ELECTRO_SHIELD" ],
"skills": [ { "level": 6, "name": "metaphysics" } ],
diff --git a/data/mods/MindOverMatter/mutations/traits.json b/data/mods/MindOverMatter/mutations/traits.json
index 70c1bb34edb93..8cf996c6e305c 100644
--- a/data/mods/MindOverMatter/mutations/traits.json
+++ b/data/mods/MindOverMatter/mutations/traits.json
@@ -8,7 +8,12 @@
"starting_trait": false,
"purifiable": false,
"valid": false,
- "spells_learned": [ [ "biokin_physical_enhance", 2 ], [ "biokin_overcome_pain", 2 ], [ "classless_toggleable_concentration_end", 1 ] ]
+ "spells_learned": [
+ [ "biokin_physical_enhance", 2 ],
+ [ "biokin_overcome_pain", 2 ],
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
+ ]
},
{
"type": "mutation",
@@ -19,7 +24,12 @@
"starting_trait": false,
"purifiable": false,
"valid": false,
- "spells_learned": [ [ "clair_night_vision", 2 ], [ "clair_speed_reading", 2 ], [ "classless_toggleable_concentration_end", 1 ] ]
+ "spells_learned": [
+ [ "clair_night_vision", 2 ],
+ [ "clair_speed_reading", 2 ],
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
+ ]
},
{
"type": "mutation",
@@ -33,7 +43,8 @@
"spells_learned": [
[ "electrokinetic_see_electric", 2 ],
[ "electrokinetic_shock_touch", 2 ],
- [ "classless_toggleable_concentration_end", 1 ]
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
]
},
{
@@ -49,7 +60,8 @@
"spells_learned": [
[ "photokinetic_create_light", 2 ],
[ "photokinetic_light_local", 2 ],
- [ "classless_toggleable_concentration_end", 1 ]
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
]
},
{
@@ -61,7 +73,12 @@
"starting_trait": false,
"purifiable": false,
"valid": false,
- "spells_learned": [ [ "pyrokinetic_eruption", 2 ], [ "pyrokinetic_flash", 2 ], [ "classless_toggleable_concentration_end", 1 ] ]
+ "spells_learned": [
+ [ "pyrokinetic_eruption", 2 ],
+ [ "pyrokinetic_flash", 2 ],
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
+ ]
},
{
"type": "mutation",
@@ -72,7 +89,12 @@
"starting_trait": false,
"purifiable": false,
"valid": false,
- "spells_learned": [ [ "telepathic_concentration", 2 ], [ "telepathic_mind_sense", 2 ], [ "classless_toggleable_concentration_end", 1 ] ]
+ "spells_learned": [
+ [ "telepathic_concentration", 2 ],
+ [ "telepathic_mind_sense", 2 ],
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
+ ]
},
{
"type": "mutation",
@@ -83,7 +105,12 @@
"starting_trait": false,
"purifiable": false,
"valid": false,
- "spells_learned": [ [ "telekinetic_pull", 2 ], [ "telekinetic_push", 2 ], [ "classless_toggleable_concentration_end", 1 ] ]
+ "spells_learned": [
+ [ "telekinetic_pull", 2 ],
+ [ "telekinetic_push", 2 ],
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
+ ]
},
{
"type": "mutation",
@@ -94,7 +121,12 @@
"starting_trait": false,
"purifiable": false,
"valid": false,
- "spells_learned": [ [ "teleport_blink", 2 ], [ "teleport_slow", 2 ], [ "classless_toggleable_concentration_end", 1 ] ]
+ "spells_learned": [
+ [ "teleport_blink", 2 ],
+ [ "teleport_slow", 2 ],
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
+ ]
},
{
"type": "mutation",
@@ -105,7 +137,12 @@
"starting_trait": false,
"purifiable": false,
"valid": false,
- "spells_learned": [ [ "vita_slow_bleeding", 2 ], [ "vita_health_power", 2 ], [ "classless_toggleable_concentration_end", 1 ] ]
+ "spells_learned": [
+ [ "vita_slow_bleeding", 2 ],
+ [ "vita_health_power", 2 ],
+ [ "classless_toggleable_concentration_end", 1 ],
+ [ "classless_specific_concentration_end", 1 ]
+ ]
},
{
"type": "mutation",
diff --git a/data/mods/MindOverMatter/powers/classless.json b/data/mods/MindOverMatter/powers/classless.json
index de3c36cd2ec38..24a42ca8bc94c 100644
--- a/data/mods/MindOverMatter/powers/classless.json
+++ b/data/mods/MindOverMatter/powers/classless.json
@@ -16,5 +16,22 @@
"energy_source": "STAMINA",
"base_energy_cost": 0,
"base_casting_time": 0
+ },
+ {
+ "id": "classless_specific_concentration_end",
+ "type": "SPELL",
+ "name": "[Ψ]Stop Concentrating (Individual)",
+ "description": "End your concentration on a specific power.\n\nChanneling this power always succeeds.",
+ "teachable": false,
+ "valid_targets": [ "self" ],
+ "skill": "metaphysics",
+ "flags": [ "PSIONIC", "NO_FAIL", "NON_MAGICAL", "SILENT", "NO_HANDS", "NO_LEGS" ],
+ "effect": "effect_on_condition",
+ "effect_str": "EOC_END_PSI_POWERS_SPECIFIC",
+ "shape": "blast",
+ "max_level": 1,
+ "energy_source": "STAMINA",
+ "base_energy_cost": 0,
+ "base_casting_time": 0
}
]
diff --git a/data/mods/MindOverMatter/snippets/snippets_new.json b/data/mods/MindOverMatter/snippets/snippets_new.json
index 789685f560f39..bc97fe907d061 100644
--- a/data/mods/MindOverMatter/snippets/snippets_new.json
+++ b/data/mods/MindOverMatter/snippets/snippets_new.json
@@ -185,7 +185,7 @@
{
"name": "testing report I2-8129",
"id": "lab_file_clairsentience_02",
- "text": "Subject O21 was placed blindfolded in a completely dark room with a deck of shuffled playing cards, instructed to remove the blindfold, and asked to sort them in standard order: clubs, diamonds, hearts, spades, each in numerical order. Task was completed in 6:03 with 18/52 cards in the proper order and minor to major ordering errors in all other cards. Subject was then asked to to drink from the coffee cup in the room. Cup was placed on a shelf above the door to prevent movement around the room from discovering it, but task was completed in 1:14, with the only difficulty being subject's height (158 cm) making it harder to reach the shelf. Subject was then asked to cross the room to the table, pick up the paper, and read the sequence of numbers written on it. Subject was unable to do so, only correctly reciting the first two digits.\n\nExperiment does uphold the thesis that successful NOBLE HORIZON mathematicians perceive their surroundings through means other than light. As O21 was unable to read the document, their sense is not \"sight\" as such. Further experimentation to determine its limits is necessary."
+ "text": "Subject O21 was placed blindfolded in a completely dark room with a deck of shuffled playing cards, instructed to remove the blindfold, and asked to sort them in standard order: clubs, diamonds, hearts, spades, each in numerical order. Task was completed in 6:03 with 18/52 cards in the proper order and minor to major ordering errors in all other cards. Subject was then asked to drink from the coffee cup in the room. Cup was placed on a shelf above the door to prevent movement around the room from discovering it, but task was completed in 1:14, with the only difficulty being subject's height (158 cm) making it harder to reach the shelf. Subject was then asked to cross the room to the table, pick up the paper, and read the sequence of numbers written on it. Subject was unable to do so, only correctly reciting the first two digits.\n\nExperiment does uphold the thesis that successful NOBLE HORIZON mathematicians perceive their surroundings through means other than light. As O21 was unable to read the document, their sense is not \"sight\" as such. Further experimentation to determine its limits is necessary."
},
{
"name": "COLD BELOW progress report",
@@ -257,7 +257,7 @@
"name": "testing report I4-7707",
"id": "lab_file_telekinesis_04",
"weight": 1000,
- "text": "Dr. Richardson,\nPer request, we assessed the ability of three JUNIPER GOLD mathematicians to affect very small masses. Subjects were ordered to look into a microscope at water flora, then at bacterial samples, and then at images from electron microscopes. While it makes intuitive sense that larger masses would require more effort and control to manipulate through telekinesis, its actual behavior does not always follow logical constraints--see the way that barriers react to external forces. In this experiment, we found that manipulating water flora was possible but bacterial samples and electron microscopes both failed. Our initial hypothesis was that direct observation was required, but the bacterial test provided that is not sufficient to explain JUNIPER GOLD's limitations. It is currently unclear if this is a psychological limitation or something inherent to to JUNIPER GOLD. Further testing with a wider variety of mathematicians is required.\nMadeline Robbins\nResearcher"
+ "text": "Dr. Richardson,\nPer request, we assessed the ability of three JUNIPER GOLD mathematicians to affect very small masses. Subjects were ordered to look into a microscope at water flora, then at bacterial samples, and then at images from electron microscopes. While it makes intuitive sense that larger masses would require more effort and control to manipulate through telekinesis, its actual behavior does not always follow logical constraints--see the way that barriers react to external forces. In this experiment, we found that manipulating water flora was possible but bacterial samples and electron microscopes both failed. Our initial hypothesis was that direct observation was required, but the bacterial test provided that is not sufficient to explain JUNIPER GOLD's limitations. It is currently unclear if this is a psychological limitation or something inherent to JUNIPER GOLD. Further testing with a wider variety of mathematicians is required.\nMadeline Robbins\nResearcher"
},
{
"name": "Big or small, which is it?",
@@ -375,7 +375,7 @@
"//": "This is a refernce to Panaceus testing",
"id": "lab_file_vitakinesis_02",
"weight": 1000,
- "text": "Application of matrix technology and XE037 samples together with cutting-edge medical advances blah blah you know the drill. Anyway, we sourced the samples, we synthesized the compound, we did the tests. It's magic. I know that sounds dumb but it's literally magic. Animal testing showed complete remission of every cancer they developed. \"Alright, Eric,\" you say, \"that's fine but cancer testing in animals is b̵u̵l̵l̵s̵h̵i̵t̵\"clinically irrelevant due to to high real-world failure rates in humans\". Sure, yes, you're right. But we sourced some enthusiastic voluntolds from XEDRA-12's stock and a couple of them had cancer they were planning on testing XE037 interactions with. Well they aren't going to anymore because XV471 cleaned them right up. Totally healthy. Zero cancer.\n\nSubject B84 had cystic fibrosis and it's gone. GONE. Perfectly normal lungs. Now what's that other than magic?\n\nYou want to get more funding for this, just authorize selling XV471 to some sick Russian oligarch for like $10 billion. He gets cured and the money keeps flowing. And honestly it needs to be that expensive with how much this stuff costs to produce. We get the materials and process them and nine times out of ten it's just a sugar pill for no damn reason I can find. But that tenth time, wow.\n\nShred this after you read it. I don't need the director lecturing me about professionalism again."
+ "text": "Application of matrix technology and XE037 samples together with cutting-edge medical advances blah blah you know the drill. Anyway, we sourced the samples, we synthesized the compound, we did the tests. It's magic. I know that sounds dumb but it's literally magic. Animal testing showed complete remission of every cancer they developed. \"Alright, Eric,\" you say, \"that's fine but cancer testing in animals is b̵u̵l̵l̵s̵h̵i̵t̵\"clinically irrelevant due to high real-world failure rates in humans\". Sure, yes, you're right. But we sourced some enthusiastic voluntolds from XEDRA-12's stock and a couple of them had cancer they were planning on testing XE037 interactions with. Well they aren't going to anymore because XV471 cleaned them right up. Totally healthy. Zero cancer.\n\nSubject B84 had cystic fibrosis and it's gone. GONE. Perfectly normal lungs. Now what's that other than magic?\n\nYou want to get more funding for this, just authorize selling XV471 to some sick Russian oligarch for like $10 billion. He gets cured and the money keeps flowing. And honestly it needs to be that expensive with how much this stuff costs to produce. We get the materials and process them and nine times out of ten it's just a sugar pill for no damn reason I can find. But that tenth time, wow.\n\nShred this after you read it. I don't need the director lecturing me about professionalism again."
},
{
"name": "Treatment time until complete recovery",
diff --git a/data/mods/No_Hope/mapgen_palettes/house_general_palette.json b/data/mods/No_Hope/mapgen_palettes/house_general_palette.json
index ec60785aed585..3423754cec37a 100644
--- a/data/mods/No_Hope/mapgen_palettes/house_general_palette.json
+++ b/data/mods/No_Hope/mapgen_palettes/house_general_palette.json
@@ -21,11 +21,17 @@
}
}
},
- "palettes": [ "standard_domestic_palette", { "param": "damage_palette" }, { "param": "tidyness_palette" } ]
+ "palettes": [
+ "standard_domestic_palette",
+ { "param": "damage_palette" },
+ { "param": "tidyness_palette" },
+ "parametrized_walls_palette"
+ ]
},
{
"type": "palette",
"id": "standard_domestic_palette",
+ "palettes": [ "parametrized_walls_palette" ],
"//": "Adjusts vanilla palette to make houses not using the above more damaged.",
"//1": "TODO: Would ideally copy-from the vanilla palette and only override what it changes if #73299 is resolved",
"toilets": { "t": { } },
@@ -116,8 +122,6 @@
"t_door_c"
],
"^": "t_gutter_downspout",
- "|": "t_wall_w",
- "#": "t_brick_wall",
":": "t_wall_glass",
"¶": "t_door_glass_c",
"-": "t_sidewalk",
diff --git a/data/mods/No_Hope/mapgen_palettes/other_palettes.json b/data/mods/No_Hope/mapgen_palettes/other_palettes.json
index e67818aeb2b7e..668ae7986b4ce 100644
--- a/data/mods/No_Hope/mapgen_palettes/other_palettes.json
+++ b/data/mods/No_Hope/mapgen_palettes/other_palettes.json
@@ -3,6 +3,7 @@
"type": "palette",
"id": "house_w_foundation_palette",
"//1": "TODO: These would ideally copy-from the vanilla palettes and only override what it changes if #73299 is resolved",
+ "palettes": [ "parametrized_walls_palette" ],
"furniture": {
"A": "f_stool",
"B": "f_rotary_clothesline",
@@ -50,7 +51,6 @@
"p": "t_region_groundcover_urban",
"X": "t_region_groundcover_urban",
" ": "t_floor",
- "|": "t_wall_w",
"<": "t_wood_stairs_up",
">": "t_wood_stairs_down",
"o": [
@@ -277,10 +277,10 @@
{
"type": "palette",
"id": "office_doctor",
+ "palettes": [ "parametrized_walls_palette" ],
"terrain": {
" ": "t_region_groundcover_urban",
"!": "t_door_locked_interior",
- "#": "t_wall_w",
"$": "t_floor",
"&": "t_floor",
"+": [ [ "t_door_b", 20 ], [ "t_door_frame", 10 ], [ "t_door_o", 70 ], [ "t_door_c", 5 ], [ "t_door_locked_interior", 3 ] ],
@@ -863,33 +863,16 @@
"type": "palette",
"id": "gun_store_palette",
"//": " P, U, S, h, F, e, |, o, k, z, c, and > are all still available for more terrain or furniture",
+ "palettes": [ "parametrized_walls_palette" ],
"toilets": { "&": { } },
- "parameters": {
- "interior_wall_type": {
- "type": "ter_str_id",
- "default": {
- "distribution": [
- [ "t_wall_b", 1 ],
- [ "t_wall_g", 1 ],
- [ "t_wall_p", 1 ],
- [ "t_wall_P", 1 ],
- [ "t_wall_r", 1 ],
- [ "t_wall_w", 6 ],
- [ "t_wall_y", 1 ]
- ]
- }
- }
- },
"terrain": {
"-": "t_wall_w",
- "#": "t_brick_wall",
"q": "t_thconc_floor",
"&": "t_thconc_floor",
":": "t_window_bars_alarm",
"+": [ [ "t_door_metal_pickable", 90 ], [ "t_door_metal_o", 5 ], [ "t_door_metal_c", 15 ] ],
"D": [ [ "t_door_o", 40 ], [ "t_door_c", 40 ], [ "t_door_locked_interior", 20 ] ],
",": [ [ "t_region_groundcover_urban", 100 ], [ "t_region_shrub", 10 ] ],
- "I": { "param": "interior_wall_type", "fallback": "t_brick_wall" },
"@": "t_region_shrub_decorative",
"u": "t_region_shrub",
"B": "t_region_groundcover_barren",
@@ -949,7 +932,7 @@
"m": "f_rack",
"Y": "f_rack",
"y": "f_rack",
- "|": "f_locker",
+ "F": "f_locker",
"Q": "f_rack",
"K": "f_rack",
"L": [ [ "f_rack_l", 65 ], [ "f_rack", 35 ] ],
diff --git a/data/mods/TEST_DATA/expected_dps_data/junk_dps.json b/data/mods/TEST_DATA/expected_dps_data/junk_dps.json
index c0d013764a514..80c1f644f7988 100644
--- a/data/mods/TEST_DATA/expected_dps_data/junk_dps.json
+++ b/data/mods/TEST_DATA/expected_dps_data/junk_dps.json
@@ -17,7 +17,6 @@
"expected_dps": {
"banjo": 5.53,
"saxophone": 5.55,
- "pool_ball": 5.58,
"knuckle_skewer": 5.58,
"rock_sock": 5.63,
"2x4": 5.66,
@@ -78,7 +77,6 @@
"arisaka_monopod_deployed": 8.66,
"arisaka_monopod": 8.66,
"stick": 9.04,
- "pot_makeshift_copper": 9.61,
"bolt_ballista_steel": 7.64,
"chain": 9.64,
"pastaextruder": 5.89
diff --git a/data/mods/TEST_DATA/items.json b/data/mods/TEST_DATA/items.json
index ab8ecdc5aa48a..2f9f0031019c7 100644
--- a/data/mods/TEST_DATA/items.json
+++ b/data/mods/TEST_DATA/items.json
@@ -1784,7 +1784,6 @@
"weight": "190 g",
"volume": "3938 ml",
"price": "0 cent",
- "to_hit": 1,
"material": [ "plastic" ],
"symbol": ")",
"color": "light_cyan",
@@ -1826,7 +1825,6 @@
"weight": "453 g",
"volume": "500 ml",
"price": "20 USD",
- "to_hit": -1,
"material": [ "leather" ],
"symbol": ")",
"color": "brown",
@@ -1864,7 +1862,6 @@
"volume": "15 ml",
"price": "0 cent",
"price_postapoc": "25 cent",
- "to_hit": -5,
"material": [ "rubber" ],
"symbol": ")",
"color": "white",
@@ -1892,7 +1889,6 @@
"volume": "15 ml",
"price": "0 cent",
"price_postapoc": "25 cent",
- "to_hit": -5,
"material": [ "plastic" ],
"symbol": ")",
"color": "white",
@@ -1970,7 +1966,6 @@
"longest_side": "40 cm",
"price": "0 cent",
"price_postapoc": "10 cent",
- "to_hit": -5,
"symbol": ")",
"pocket_data": [
{
@@ -2613,7 +2608,6 @@
"price": "4 USD 80 cent",
"price_postapoc": "2 USD 50 cent",
"install_time": "30 s",
- "to_hit": 1,
"material": [ "steel" ],
"symbol": ":",
"color": "dark_gray",
@@ -2873,7 +2867,6 @@
"volume": "100 L",
"price": "70 kUSD",
"price_postapoc": "300 USD",
- "to_hit": 1,
"material": [ "qt_steel", "ceramic", "kevlar_rigid" ],
"symbol": "[",
"looks_like": "depowered_armor",
@@ -3001,7 +2994,6 @@
"volume": "13 L",
"price": "2 kUSD 850 USD",
"price_postapoc": "20 USD",
- "to_hit": -3,
"material": [ "kevlar_layered", "cotton" ],
"symbol": "[",
"looks_like": "touring_suit",
@@ -3196,7 +3188,6 @@
"volume": "4 L",
"price": "200 USD",
"price_postapoc": "1 USD",
- "to_hit": 1,
"material": [ "cotton", "fur" ],
"symbol": "[",
"looks_like": "pants",
@@ -3807,7 +3798,6 @@
"volume": "17500 ml",
"price": "1 kUSD 200 USD",
"price_postapoc": "30 USD",
- "to_hit": -5,
"material": [ "chitin" ],
"symbol": "[",
"looks_like": "armor_larmor",
@@ -3909,7 +3899,6 @@
"volume": "250 ml",
"price": "14 USD",
"price_postapoc": "5 USD",
- "to_hit": -3,
"material": [ "plastic" ],
"symbol": "[",
"looks_like": "glasses_safety",
@@ -4019,7 +4008,6 @@
"volume": "1 L",
"price": "40 USD",
"price_postapoc": "10 cent",
- "to_hit": 1,
"material": [ "leather" ],
"symbol": "[",
"looks_like": "gloves_leather",
@@ -4039,7 +4027,6 @@
"volume": "3500 ml",
"price": "89 USD",
"price_postapoc": "50 cent",
- "to_hit": -3,
"material": [ "lycra" ],
"symbol": "[",
"looks_like": "touring_suit",
@@ -4062,7 +4049,6 @@
"volume": "3500 ml",
"price": "89 USD",
"price_postapoc": "50 cent",
- "to_hit": -3,
"material": [ "fur" ],
"symbol": "[",
"looks_like": "touring_suit",
@@ -4085,7 +4071,6 @@
"volume": "3500 ml",
"price": "89 USD",
"price_postapoc": "50 cent",
- "to_hit": -3,
"material": [ "cotton" ],
"symbol": "[",
"looks_like": "touring_suit",
@@ -4109,7 +4094,6 @@
"volume": "1 L",
"price": "40 USD",
"price_postapoc": "10 cent",
- "to_hit": 1,
"symbol": "[",
"looks_like": "gloves_leather",
"color": "red",
@@ -4135,7 +4119,6 @@
"volume": "1 L",
"price": "40 USD",
"price_postapoc": "10 cent",
- "to_hit": 1,
"symbol": "[",
"looks_like": "gloves_leather",
"color": "red",
@@ -4163,7 +4146,6 @@
"volume": "1 L",
"price": "40 USD",
"price_postapoc": "10 cent",
- "to_hit": 1,
"material": [ "leather" ],
"symbol": "[",
"looks_like": "gloves_leather",
@@ -4191,7 +4173,6 @@
"volume": "1 L",
"price": "40 USD",
"price_postapoc": "10 cent",
- "to_hit": 1,
"material": [ "leather" ],
"symbol": "[",
"looks_like": "gloves_leather",
@@ -4659,7 +4640,6 @@
"volume": "2916 ml",
"price": "600 USD",
"price_postapoc": "120 USD",
- "to_hit": -5,
"symbol": "[",
"looks_like": "armor_larmor",
"material": [ "lc_steel", "lc_steel_chain" ],
@@ -4824,7 +4804,6 @@
"volume": "2500 ml",
"price": "2 kUSD 800 USD",
"price_postapoc": "15 USD",
- "to_hit": -1,
"material": [ "aluminum", "plastic" ],
"symbol": ";",
"color": "light_gray",
@@ -4976,7 +4955,6 @@
"material": [ "stone" ],
"weight": "100 g",
"volume": "250 ml",
- "to_hit": -3,
"melee_damage": { "bash": 1 },
"revert_to": "cheese_hard"
},
@@ -4995,7 +4973,6 @@
"material": [ "stone" ],
"weight": "100 g",
"volume": "250 ml",
- "to_hit": -3,
"melee_damage": { "bash": 1 }
},
{
@@ -5014,7 +4991,6 @@
"material": [ "stone" ],
"weight": "100 g",
"volume": "250 ml",
- "to_hit": -3,
"melee_damage": { "bash": 1 }
},
{
@@ -5032,7 +5008,6 @@
"material": [ "stone" ],
"weight": "100 g",
"volume": "250 ml",
- "to_hit": -3,
"//": "Do not use calcium, iron or vitamin C! Those are calculated as RDAs, and you only get 96% of the listed value! No, that doesn't make any sense! But that's how it is. So use a normal vitamin. This is for a camp test, not a vitamin test...",
"vitamins": [ [ "mutant_toxin", 100 ], [ "mutagen", 200 ] ],
"melee_damage": { "bash": 1 }
diff --git a/data/mods/TEST_DATA/legacy_to_hit.json b/data/mods/TEST_DATA/legacy_to_hit.json
index 11978051de7fd..bbdb41c96d33a 100644
--- a/data/mods/TEST_DATA/legacy_to_hit.json
+++ b/data/mods/TEST_DATA/legacy_to_hit.json
@@ -29,16 +29,6 @@
"anvil_heavy",
"ar10",
"arisaka_monopod",
- "armchair",
- "armor_aztec",
- "armor_cuirass",
- "armor_larmor_chest",
- "armor_lc_chestplate",
- "armor_lc_heavy_chestplate",
- "armor_lc_light_chestplate",
- "armor_lorica",
- "armor_riot_torso",
- "armor_thessalonian",
"art_crystal",
"art_disc",
"art_jelly",
@@ -58,9 +48,7 @@
"ballista",
"barb_launcher",
"barometer",
- "baseball",
"basket",
- "basketball",
"battery_charger",
"bbgun",
"bee_sting",
@@ -82,64 +70,19 @@
"boat_board",
"bolas",
"bond_410",
- "bondage_suit",
"bone_fossil",
"bone_plaster",
"boobytrap",
- "bookplate",
- "bot_EMP_hack",
- "bot_antimateriel",
- "bot_broken_cyborg",
- "bot_c4_hack",
- "bot_crows_m240",
- "bot_dispatch",
- "bot_dispatch_military",
- "bot_flashbang_hack",
- "bot_gasbomb_hack",
- "bot_grenade_hack",
- "bot_grocerybot",
- "bot_grocerybot_busted",
- "bot_hazmatbot",
- "bot_lab_security_drone_BM",
- "bot_lab_security_drone_BM2",
- "bot_lab_security_drone_BS",
- "bot_lab_security_drone_GM",
- "bot_lab_security_drone_GR",
- "bot_lab_security_drone_YM",
- "bot_manhack",
- "bot_molebot",
- "bot_nursebot",
- "bot_prototype_cyborg",
- "bot_rifleturret",
- "bot_robofac_camspy",
- "bot_robofac_skittergun",
- "bot_science_bot",
- "bot_secubot",
- "bot_secubot_liberty",
- "bot_skitterbot",
- "bot_talon_m202a1",
- "bot_tazer_hack",
- "bot_turret",
- "bot_turret_riot",
- "bot_turret_searchlight",
- "bot_turret_speaker",
- "bot_yrax_trifacet",
"boxcutter",
"bren2_556",
"bren2_762",
"brogyaga",
"brogyeki",
- "broken_exodii_quad",
- "broken_exodii_sniper_drone",
- "broken_exodii_turret",
- "broken_exodii_worker",
- "broken_yrax_trifacet",
"bronze_hoe",
"bronze_shears",
"broom",
"browning_blr",
"brush",
- "brush_toilet",
"burette",
"butane_tank",
"c4",
@@ -158,13 +101,10 @@
"chainsaw_off",
"chainsaw_on",
"chair_folding",
- "chair_plywood",
- "chair_wood",
"cheek_pad",
"chemical_thrower",
"chemistry_set",
"chemistry_set_basic",
- "chestguard_metal_sheets_heavy",
"chisel",
"chitin_plate",
"churn",
@@ -173,7 +113,6 @@
"clarinet",
"closed_loop_extractor_large",
"closed_loop_extractor_small",
- "clown_suit",
"colt_army",
"colt_lightning",
"colt_navy",
@@ -184,20 +123,14 @@
"compbow",
"compcrossbow",
"compositecrossbow",
- "compressor",
"copper_knife",
"cot",
"counterweight",
"crafted_suppressor",
"crater_bomb",
"cu_pipe",
- "cuirass_bronze",
- "cuirass_lightplate",
- "cuirass_scrap",
- "cuirass_tire",
"cured_hide",
"cured_pelt",
- "curling_iron",
"cuvettes",
"cz600",
"damaged_shelter_kit",
@@ -208,13 +141,9 @@
"deflated_wheel_motorbike",
"deflated_wheel_slick",
"deflated_wheel_wide",
- "denim_overalls",
"digging_stick",
- "dinosuit",
"directional_antenna",
"diveknife",
- "down_blanket",
- "dragonsuit",
"draw_plate",
"drift",
"drill_rock_primitive",
@@ -237,7 +166,6 @@
"extension_cable",
"extinguisher",
"fake_dynamite_50lbs",
- "felinesuit",
"feral_human_thrown_rock",
"fiber_mat",
"fighter_sting",
@@ -252,7 +180,6 @@
"floodlight",
"fn_fal_semi",
"foldframe",
- "football",
"forged_shears",
"frame",
"frame_wood",
@@ -262,7 +189,6 @@
"full_barrel_bomb",
"full_barrel_bomb_act",
"funnel_separation",
- "fur_blanket",
"g_shovel",
"garand",
"gas_charger",
@@ -278,9 +204,6 @@
"glowstick",
"glowstick_dead",
"glowstick_lit",
- "golf_ball",
- "grass_blanket",
- "grass_sheet",
"grenade",
"grenade_act",
"grenade_emp",
@@ -288,7 +211,6 @@
"grenade_inc",
"grenade_inc_act",
"grinder_blade",
- "hair_dryer",
"half_barrel_bomb",
"half_barrel_bomb_act",
"hammer_pocket_test",
@@ -313,7 +235,6 @@
"hydrogen_tank",
"hygrometer",
"hygroscope",
- "indoor_volleyball",
"inflatable_airbag",
"inflatable_section",
"integrated_electrokit",
@@ -322,11 +243,7 @@
"inter_bayonet",
"it_battery_mount",
"iwi_tavor_x95_300blk",
- "jacket_leather_mod",
- "jumpsuit",
- "jumpsuit_xl",
"kantele",
- "kevlar",
"kevlar_shears",
"kord",
"kp32",
@@ -339,7 +256,6 @@
"large_tent_kit",
"laser_rifle",
"lawn_dart",
- "lc_mirror_armor",
"leather_funnel",
"leather_tarp",
"light_detector",
@@ -374,7 +290,6 @@
"masonrysaw_on",
"mdrx",
"melting_point",
- "mess_tray",
"metal_butcher_rack",
"metal_funnel",
"metal_smoking_rack",
@@ -418,7 +333,6 @@
"oil_press_electric",
"omnicamera",
"omnicamera_reinforced",
- "outfit_storage",
"oxygen_cylinder",
"p220_10",
"p226_357sig",
@@ -440,13 +354,8 @@
"plasma_rifle",
"plastic_boat_hull",
"platinum_grille",
- "plunger_futuristic",
- "plunger_toilet",
"pockknife",
- "pool_ball",
"portal",
- "pot_makeshift",
- "pot_makeshift_copper",
"power_cord",
"pressure_tank",
"primitive_knife",
@@ -454,7 +363,6 @@
"psl",
"punch_bone",
"punch_nail",
- "quilt",
"rack_test_tube",
"rack_test_tube_micro",
"radio",
@@ -509,23 +417,17 @@
"seat",
"seat_bench",
"sextant",
- "shark_suit",
- "shark_suit_faraday",
- "sharksuit",
"sharp_rock",
"sharps",
"shavingkit",
"shears",
- "sheet",
"sheet_metal_small",
"shelter_kit",
"shot_suppressor",
"shotgun_s",
"shovel",
- "shuttlecock",
"sig_assault_rifle",
"sks",
- "sleeping_bag",
"sm_extinguisher",
"smg_40",
"smg_45",
@@ -545,40 +447,24 @@
"still_lab",
"stone_chopper",
"stopcock",
- "storage_line",
- "subsuit_xl",
"suppressor",
"surv_rocket_launcher",
"survivor_hairtrimmer",
"survivor_shavingkit",
"swage",
- "swimming_kickboard",
"tac338",
"tac50",
- "talking_doll",
"tavor_12",
"tearer",
- "technician_coveralls",
- "technician_coveralls_h",
"telepad",
"teleporter",
"tempered_glass_sheet",
"tent_kit",
"tent_pole",
- "test_100_kcal",
- "test_200_kcal",
"test_2x4",
- "test_500_kcal",
- "test_armguard",
- "test_armor_chitin",
"test_balanced_sword",
- "test_balloon",
- "test_bird_boots",
- "test_boxing_gloves",
"test_clumsy_sword",
"test_compbow",
- "test_condom",
- "test_crafted_suppressor",
"test_ebook_reader",
"test_fire_ax",
"test_fire_ax_mostly_steel",
@@ -586,35 +472,20 @@
"test_fire_sword",
"test_glass_pipe_mostly_glass",
"test_glass_pipe_mostly_steel",
- "test_goggles_welding",
- "test_jug_plastic",
- "test_jumpsuit_cotton",
- "test_jumpsuit_fur",
- "test_jumpsuit_lycra",
"test_normal_sword",
- "test_pants_fur",
"test_pipe",
"test_pointy_stick",
- "test_power_armor",
"test_power_cord",
"test_power_cord_25_loss",
- "test_rock_cheese",
"test_screwdriver",
- "test_shackles",
"test_shears",
"test_shears_mostly_plastic",
"test_shears_mostly_steel",
"test_sheet_metal_small",
"test_sonic_screwdriver",
"test_standing_lamp",
- "test_swat_armor",
"test_umbrella",
- "test_ups",
"test_waist_apron_long",
- "test_waterproof_bag",
- "test_waterskin",
- "test_winglets",
- "test_winglets_left",
"testflames",
"throw_extinguisher",
"throw_extinguisher_act",
@@ -624,7 +495,6 @@
"tire_medium_slick",
"tire_motorbike",
"tire_wide",
- "tireplate",
"toolset",
"torch",
"torch_lit",
@@ -633,7 +503,6 @@
"trimmer_off",
"tripwire",
"trumpet",
- "trunks",
"tuba",
"type99",
"ugl_buttstock",
@@ -642,7 +511,6 @@
"vac_pump",
"varmint_airgun",
"vehicle_controls",
- "vest_leather_mod",
"voltmeter",
"vortex",
"walther_p22",
@@ -657,11 +525,6 @@
"weather_reader",
"weatherby_5",
"weighted_dart",
- "wetsuit",
- "wetsuit_gloves",
- "wetsuit_pants",
- "wetsuit_spring",
- "wetsuit_thick",
"wheel",
"wheel_10",
"wheel_armor",
@@ -685,11 +548,9 @@
"winchester_1887",
"wind_mill",
"wind_turbine",
- "wolfsuit",
"wood_panel",
"wood_plate",
"wood_sheet",
- "wool_suit",
"xd_10",
"xedra_antenna",
"xedra_gun",
@@ -795,11 +656,6 @@
"xlswat_armor"
]
},
- {
- "type": "test_data",
- "//": "Generic Guns",
- "legacy_to_hit": [ "bot_antimateriel", "bot_rifleturret", "bot_secubot", "bot_talon_m202a1", "bot_turret" ]
- },
{
"type": "test_data",
"//": "Limb WIP",
diff --git a/data/mods/TEST_DATA/monsters.json b/data/mods/TEST_DATA/monsters.json
index 07cbe1fd8dfb4..4c2750818eb0f 100644
--- a/data/mods/TEST_DATA/monsters.json
+++ b/data/mods/TEST_DATA/monsters.json
@@ -427,5 +427,50 @@
"dodge": 2,
"bleed_rate": 60,
"armor": { "bash": 8, "cut": 10, "electric": 1 }
+ },
+ {
+ "id": "mon_dummy_reproducer_eggs",
+ "type": "MONSTER",
+ "name": { "str": "debug reproducer (eggs)", "str_pl": "debug reproducers (eggs)" },
+ "description": "Monster used to test `baby_type` work.",
+ "default_faction": "",
+ "volume": "100 ml",
+ "weight": "100 g",
+ "hp": 5,
+ "speed": 100,
+ "color": "white",
+ "symbol": "1",
+ "reproduction": { "baby_type": { "baby_egg": "egg_chicken" }, "baby_count": 1, "baby_timer": 1 },
+ "baby_flags": [ "SPRING", "SUMMER", "AUTUMN", "WINTER" ]
+ },
+ {
+ "id": "mon_dummy_reproducer_egg_group",
+ "copy-from": "mon_dummy_reproducer_eggs",
+ "type": "MONSTER",
+ "name": { "str": "debug reproducer (egg group)", "str_pl": "debug reproducers (egg group)" },
+ "color": "green",
+ "symbol": "2",
+ "reproduction": { "baby_type": { "baby_egg_group": "book_gunmags" }, "baby_count": 1, "baby_timer": 1 },
+ "baby_flags": [ "SPRING", "SUMMER", "AUTUMN", "WINTER" ]
+ },
+ {
+ "id": "mon_dummy_reproducer_mon",
+ "copy-from": "mon_dummy_reproducer_eggs",
+ "type": "MONSTER",
+ "name": { "str": "debug reproducer (monster)", "str_pl": "debug reproducers (monster)" },
+ "color": "cyan",
+ "symbol": "3",
+ "reproduction": { "baby_type": { "baby_monster": "mon_dog_bull" }, "baby_count": 1, "baby_timer": 1 },
+ "baby_flags": [ "SPRING", "SUMMER", "AUTUMN", "WINTER" ]
+ },
+ {
+ "id": "mon_dummy_reproducer_mon_group",
+ "copy-from": "mon_dummy_reproducer_eggs",
+ "type": "MONSTER",
+ "name": { "str": "debug reproducer (mongroup)", "str_pl": "debug reproducers (mongroup)" },
+ "color": "yellow",
+ "symbol": "4",
+ "reproduction": { "baby_type": { "baby_monster_group": "GROUP_PET_CATS" }, "baby_count": 1, "baby_timer": 1 },
+ "baby_flags": [ "SPRING", "SUMMER", "AUTUMN", "WINTER" ]
}
]
diff --git a/data/mods/TropiCataclysm/modinfo.json b/data/mods/TropiCataclysm/modinfo.json
index 85520ea597be0..c47cf671be187 100644
--- a/data/mods/TropiCataclysm/modinfo.json
+++ b/data/mods/TropiCataclysm/modinfo.json
@@ -4,11 +4,11 @@
"id": "tropicata",
"name": "TropiCataclysm",
"authors": [ "Xaritscin" ],
+ "maintainers": [ "Karol1223" ],
"description": "Changes the setting from New England to an undisclosed region in Brazil. Initially based out of Desert Region mod.",
"category": "content",
"dependencies": [ "dda" ],
- "version": "0.80",
- "obsolete": false
+ "version": "0.80"
},
{
"type": "EXTERNAL_OPTION",
diff --git a/data/mods/Xedra_Evolved/effects/effects.json b/data/mods/Xedra_Evolved/effects/effects.json
index 2d0dbed6e5bbf..d166d43fe3ed3 100644
--- a/data/mods/Xedra_Evolved/effects/effects.json
+++ b/data/mods/Xedra_Evolved/effects/effects.json
@@ -2314,7 +2314,7 @@
{
"type": "effect_type",
"id": "effect_lilin_vampire_immune",
- "//": "Hidden effects, prevents you from being vampirized",
+ "//": "Hidden effect, prevents you from being vampirized",
"name": [ "" ],
"desc": [ "" ],
"removes_effects": [ "vampire_virus" ]
@@ -2322,14 +2322,30 @@
{
"type": "effect_type",
"id": "effect_gained_lilin_power",
- "//": "Hidden effects, prevents you from gaining more lilin powers too quickly",
+ "//": "Hidden effect, prevents you from gaining more lilin powers too quickly",
"name": [ "" ],
"desc": [ "" ]
},
{
"type": "effect_type",
"id": "effect_lilin_temporary_glorious",
- "//": "Hidden effects, tracking whether you have EOC_LILIN_TEMPORARY_GLORIOUS active.",
+ "//": "Hidden effect, tracking whether you have EOC_LILIN_TEMPORARY_GLORIOUS active.",
+ "name": [ "" ],
+ "desc": [ "" ]
+ },
+ {
+ "type": "effect_type",
+ "id": "lilit_prevent_death_escape",
+ "//": "Hidden effect, allows you to get away after turning into an owl.",
+ "name": [ "" ],
+ "desc": [ "" ],
+ "removes_effects": [ "grabbed", "downed" ],
+ "enchantments": [ { "values": [ { "value": "EVASION", "add": 0.55 } ] } ]
+ },
+ {
+ "type": "effect_type",
+ "id": "lilit_prevent_death_cooldown",
+ "//": "Hidden effect, used to prevent Their Worm Shall Not Die from activating multiple times back to back",
"name": [ "" ],
"desc": [ "" ]
},
@@ -2480,13 +2496,13 @@
"desc": [ "Now they will know why they fear the night." ],
"rating": "good",
"limb_score_mods": [
- { "limb_score": "balance", "modifier": 1.2 },
- { "limb_score": "breathing", "modifier": 1.5 },
- { "limb_score": "lift", "modifier": 1.25 },
- { "limb_score": "grip", "modifier": 1.25 },
- { "limb_score": "reaction", "modifier": 1.35 },
- { "limb_score": "block", "modifier": 1.3 },
- { "limb_score": "vision", "modifier": 1.5 }
+ { "limb_score": "balance", "modifier": 1.1 },
+ { "limb_score": "breathing", "modifier": 1.3 },
+ { "limb_score": "lift", "modifier": 1.1 },
+ { "limb_score": "grip", "modifier": 1.15 },
+ { "limb_score": "reaction", "modifier": 1.2 },
+ { "limb_score": "block", "modifier": 1.1 },
+ { "limb_score": "vision", "modifier": 1.35 }
],
"flags": [ "EFFECT_LIMB_SCORE_MOD" ]
},
@@ -2526,6 +2542,15 @@
],
"removes_effects": [ "grabbed", "bleed" ]
},
+ {
+ "type": "effect_type",
+ "id": "effect_lilin_mesmerize_tracker",
+ "name": [ "Mesmerized" ],
+ "desc": [ "You are in a daze." ],
+ "apply_message": "",
+ "remove_message": "You snap out of your trance.",
+ "show_in_info": true
+ },
{
"type": "effect_type",
"id": "effect_lilin_aoe_daze",
@@ -2596,5 +2621,22 @@
{ "limb_score": "vision", "modifier": 0.55 }
],
"flags": [ "EFFECT_LIMB_SCORE_MOD" ]
+ },
+ {
+ "type": "effect_type",
+ "id": "effect_lilin_owl_form_pass_through_walls",
+ "//": "Allows owl form lilin with the appropriate traits to fly through walls and avoid attacks",
+ "name": [ "" ],
+ "desc": [ "" ],
+ "enchantments": [
+ {
+ "condition": { "u_has_trait": "TURN_INTO_OWL_TRAITS" },
+ "values": [ { "value": "EVASION", "add": { "math": [ "0.4 + (u_vitamin('lilin_ruach_vitamin') / 18000)" ] } } ]
+ },
+ {
+ "condition": { "and": [ { "u_has_trait": "TURN_INTO_OWL_TRAITS" }, { "not": "is_day" } ] },
+ "values": [ { "value": "PHASE_DISTANCE", "add": 1 } ]
+ }
+ ]
}
]
diff --git a/data/mods/Xedra_Evolved/items/clothes.json b/data/mods/Xedra_Evolved/items/clothes.json
index 8e96eba81bedb..941ce7a6390f2 100644
--- a/data/mods/Xedra_Evolved/items/clothes.json
+++ b/data/mods/Xedra_Evolved/items/clothes.json
@@ -96,7 +96,7 @@
{
"id": "syndicalist_states_tshirt",
"name": { "str": "CSA t-shirt" },
- "description": "A short-sleeved cotton shirt with a globe at the bottom with a C above the globe with an S to the left and A to the right. The background is like a flag with with the top left being the corner of a black triangle and the bottom right is a red triangle. They meet in the middle with the globe.",
+ "description": "A short-sleeved cotton shirt with a globe at the bottom with a C above the globe with an S to the left and A to the right. The background is like a flag with the top left being the corner of a black triangle and the bottom right is a red triangle. They meet in the middle with the globe.",
"weight": 1
}
]
diff --git a/data/mods/Xedra_Evolved/jmath.json b/data/mods/Xedra_Evolved/jmath.json
index 3de7956b105d1..45f0d1d676062 100644
--- a/data/mods/Xedra_Evolved/jmath.json
+++ b/data/mods/Xedra_Evolved/jmath.json
@@ -149,5 +149,18 @@
"id": "selkie_has_weather_mastery",
"num_args": 0,
"return": "1 + (u_has_trait('SELKIE_CHANGE_WEATHER_MASTER') * 1.5)"
+ },
+ {
+ "type": "jmath_function",
+ "id": "lilin_has_ruach_efficiency",
+ "num_args": 0,
+ "return": "1 - min( ( (u_has_trait('LILIN_RUACH_EFFICIENCY') * 0.15) + (u_has_trait('LILIN_RUACH_EFFICIENCY_UPGRADE') * 0.15) + ( u_has_trait('LILIN_RUACH_EFFICIENCY_UPGRADE') * max( ( (u_vitamin('lilin_ruach_vitamin') - 3500 ) / 12000 ), 0) ) ), 0.33)"
+ },
+ {
+ "type": "jmath_function",
+ "id": "lilin_has_ruach_efficiency_beta",
+ "//": "For use when the lilit is the beta talker of the spell EoC, such as when it's targeting someone else",
+ "num_args": 0,
+ "return": "1 - min( ( (n_has_trait('LILIN_RUACH_EFFICIENCY') * 0.15) + (n_has_trait('LILIN_RUACH_EFFICIENCY_UPGRADE') * 0.15) + ( n_has_trait('LILIN_RUACH_EFFICIENCY_UPGRADE') * max( ( (n_vitamin('lilin_ruach_vitamin') - 3500 ) / 12000 ), 0) ) ), 0.33)"
}
]
diff --git a/data/mods/Xedra_Evolved/missions.json b/data/mods/Xedra_Evolved/missions.json
index 1ed12cb29a985..93d2034942f07 100644
--- a/data/mods/Xedra_Evolved/missions.json
+++ b/data/mods/Xedra_Evolved/missions.json
@@ -68,9 +68,7 @@
"destination": "cabin_sevenoclock",
"difficulty": 1,
"value": 0,
- "start": {
- "assign_mission_target": { "om_terrain": "cabin_sevenoclock_north", "om_special": "cabin_sevenoclock", "search_range": 1800 }
- },
+ "start": { "assign_mission_target": { "om_terrain": "cabin_sevenoclock", "om_special": "old cabin", "search_range": 1800 } },
"origins": [ "ORIGIN_SECONDARY" ],
"has_generic_rewards": false,
"dialogue": {
@@ -94,7 +92,7 @@
"difficulty": 1,
"value": 0,
"start": {
- "assign_mission_target": { "om_terrain": "field_deathworm_north", "om_special": "field_deathworm", "search_range": 1800 }
+ "assign_mission_target": { "om_terrain": "field_deathworm", "om_special": "acid-scarred field", "search_range": 1800 }
},
"origins": [ "ORIGIN_SECONDARY" ],
"has_generic_rewards": false,
diff --git a/data/mods/Xedra_Evolved/mutations/paraclesians/ierde_mutations.json b/data/mods/Xedra_Evolved/mutations/paraclesians/ierde_mutations.json
index 32d57374343a3..07ef562a0e6a6 100644
--- a/data/mods/Xedra_Evolved/mutations/paraclesians/ierde_mutations.json
+++ b/data/mods/Xedra_Evolved/mutations/paraclesians/ierde_mutations.json
@@ -127,7 +127,7 @@
"points": 3,
"visibility": 0,
"ugliness": 0,
- "description": "Upon gaining this ability the Ierde gains the ability to, while underground, rest and recover energy as though sleeping. Activate to to begin the vigil.",
+ "description": "Upon gaining this ability the Ierde gains the ability to, while underground, rest and recover energy as though sleeping. Activate to begin the vigil.",
"prereqs": [ "IERDE_EYES" ],
"category": [ "IERDE" ],
"activated_is_setup": false,
diff --git a/data/mods/Xedra_Evolved/mutations/xe_lilin.json b/data/mods/Xedra_Evolved/mutations/xe_lilin.json
index 2d53005719ff3..7213ecc12851e 100644
--- a/data/mods/Xedra_Evolved/mutations/xe_lilin.json
+++ b/data/mods/Xedra_Evolved/mutations/xe_lilin.json
@@ -53,6 +53,7 @@
}
],
"activated_eocs": [ "EOC_LILIN_SPEND_RUACH_FOR_POWERS" ],
+ "activation_msg": "You dedicate some ruach to increasing your power.",
"cancels": [ "DREAMER", "DREAMSMITH", "EATER", "INVENTOR" ]
},
{
@@ -94,6 +95,16 @@
"threshreq": [ "THRESH_LILIN" ],
"spells_learned": [ [ "lilin_drain_ruach_long_ranged_spell", 1 ], [ "lilin_drain_ruach_melee_spell", 1 ] ]
},
+ {
+ "type": "mutation",
+ "id": "LILIN_GAIN_EXTRA_RUACH_FROM_SLEEPY_PEOPLE",
+ "name": { "//~": "This is a reference to Psalm 132:4", "str": "Given Sleep to Their Eyes" },
+ "points": 2,
+ "description": "In sleep, a person's defenses are down and it is easier for the things in the night to prey upon them. You gain additional ruach from sleeping targets.",
+ "prereqs": [ "LILIN_SLEEP_EASY_DURING_DAY" ],
+ "prereqs2": [ "LILIN_ATTRIBUTE_BONUSES_PERCEPTION" ],
+ "category": [ "LILIN" ]
+ },
{
"type": "mutation",
"id": "LILIN_CHANGE_WEATHER_FOG",
@@ -137,6 +148,7 @@
"prereqs": [ "LILIN_HOLD_MORE_RUACH_2", "LILIN_HOLD_MORE_RUACH_3" ],
"prereqs2": [ "LILIN_AVOID_SLEEP" ],
"category": [ "LILIN" ],
+ "activation_msg": "",
"activated_eocs": [ "EOC_LILIN_TURN_INTO_OWL_activated" ],
"deactivated_eocs": [ "EOC_LILIN_TURN_INTO_OWL_deactivated" ]
},
@@ -159,6 +171,32 @@
"category": [ "LILIN" ],
"spells_learned": [ [ "lilin_avoid_sleep_spell", 1 ] ]
},
+ {
+ "type": "mutation",
+ "id": "LILIN_BONUS_PERSUASION",
+ "name": { "//~": "This is a reference to Proverbs 5:3", "str": "Smoother than Oil" },
+ "points": 2,
+ "description": "Your presence is intoxicating, and humans have a hard time resisting your charms. You gain a bonus to your persuasion chance as long as you aren't empty of ruach.",
+ "prereqs": [ "PRETTY", "BEAUTIFUL" ],
+ "category": [ "LILIN" ],
+ "enchantments": [
+ {
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1" ] },
+ "values": [ { "value": "SOCIAL_PERSUADE", "add": { "math": [ "12 + (12 * u_has_trait('THRESH_LILIN') )" ] } } ]
+ }
+ ]
+ },
+ {
+ "type": "mutation",
+ "id": "LILIN_MESMERIZE_TARGET",
+ "name": { "//~": "This is a reference to Jeremiah 10:14", "str": "Senseless and Without Knowledge" },
+ "points": 5,
+ "description": "You can temporarily beguile a single human, fey, or avian target, causing them to stand senseless or wander in a daze. Any damage will bring the target out of their trance.",
+ "prereqs": [ "LILIN_BONUS_PERSUASION" ],
+ "prereqs2": [ "LILIN_TEMPORARY_GLORIOUS", "LILIN_TEMPORARY_GLORIOUS_2" ],
+ "category": [ "LILIN" ],
+ "spells_learned": [ [ "lilin_mesmerize_target_spell", 1 ] ]
+ },
{
"type": "mutation",
"id": "LILIN_AOE_LINE_DISEASE",
@@ -181,6 +219,16 @@
"category": [ "LILIN" ],
"spells_learned": [ [ "lilin_disease_enhancement_damage_spell", 1 ] ]
},
+ {
+ "type": "mutation",
+ "id": "LILIN_BLINDING_TARGET",
+ "name": { "str": "Dwelling in Deep Darkness" },
+ "points": 4,
+ "description": "You may cut a single target off from light, completely blinding them. You may only do this at night, and only indoors or out in the wilderness.",
+ "prereqs": [ "LILIN_THE_EVIL_EYE" ],
+ "category": [ "LILIN" ],
+ "spells_learned": [ [ "lilin_blinding_target_spell", 1 ] ]
+ },
{
"type": "mutation",
"id": "LILIN_TEMPORARY_GLORIOUS",
@@ -188,11 +236,13 @@
"description": "You can use your powers to spin a web of illusion around yourself, increasing your attractiveness to a supernatural degree. While the harsh light of the sun destroys the illusion, you need merely to move back into the shadows to restore it.",
"points": 2,
"purifiable": false,
- "prereqs": [ "PRETTY", "BEAUTIFUL" ],
+ "prereqs": [ "BEAUTIFUL" ],
+ "prereqs2": [ "LILIN_BONUS_PERSUASION" ],
"category": [ "LILIN" ],
"changes_to": [ "LILIN_TEMPORARY_GLORIOUS_2" ],
"active": true,
"activated_is_setup": true,
+ "activation_msg": "",
"activated_eocs": [ "EOC_LILIN_TEMPORARY_GLORIOUS_activated" ],
"processed_eocs": [ "EOC_LILIN_TEMPORARY_GLORIOUS_processed" ],
"deactivated_eocs": [ "EOC_LILIN_TEMPORARY_GLORIOUS_deactivated" ]
@@ -210,6 +260,7 @@
"threshreq": [ "THRESH_LILIN" ],
"active": true,
"activated_is_setup": true,
+ "activation_msg": "",
"activated_eocs": [ "EOC_LILIN_TEMPORARY_GLORIOUS_activated" ],
"processed_eocs": [ "EOC_LILIN_TEMPORARY_GLORIOUS_processed" ],
"deactivated_eocs": [ "EOC_LILIN_TEMPORARY_GLORIOUS_deactivated" ]
@@ -224,6 +275,7 @@
"category": [ "LILIN" ],
"active": true,
"activated_is_setup": true,
+ "activation_msg": "",
"activated_eocs": [ "EOC_LILIN_ATTRIBUTE_BONUSES_activated" ],
"deactivated_eocs": [ "EOC_LILIN_ATTRIBUTE_BONUSES_deactivated" ]
},
@@ -403,6 +455,23 @@
}
]
},
+ {
+ "type": "mutation",
+ "id": "LILIN_EASIER_WEAKPOINT_ATTACKS",
+ "name": { "str": "Shattering the Broken Vessels" },
+ "description": "Attuned to darkness and disease, you can easily spot the cracks in your enemies' defenses. You have an easier chance to hit enemy weakpoints, increasing as your ruach rises.",
+ "points": 4,
+ "purifiable": false,
+ "prereqs": [ "LILIN_GAIN_MORE_FOCUS" ],
+ "prereqs2": [ "LILIN_NIGHT_VISION" ],
+ "category": [ "LILIN" ],
+ "enchantments": [
+ {
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1" ] },
+ "values": [ { "value": "WEAKPOINT_ACCURACY", "multiply": { "math": [ "0.5 + (u_vitamin('lilin_ruach_vitamin') / 2000 )" ] } } ]
+ }
+ ]
+ },
{
"type": "mutation",
"id": "LILIN_STEALTH_MODIFIER_IN_DARKNESS",
@@ -418,6 +487,7 @@
"condition": {
"and": [
{ "not": { "and": [ "is_day", "u_is_outside" ] } },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1" ] },
{ "or": [ { "math": [ "moon_phase() ==6" ] }, { "math": [ "moon_phase() == 2" ] } ] }
]
},
@@ -427,13 +497,20 @@
"condition": {
"and": [
{ "not": { "and": [ "is_day", "u_is_outside" ] } },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1" ] },
{ "or": [ { "math": [ "moon_phase() == 7" ] }, { "math": [ "moon_phase() == 1" ] } ] }
]
},
"values": [ { "value": "STEALTH_MODIFIER", "add": { "math": [ "25 + (u_vitamin('lilin_ruach_vitamin') / 400)" ] } } ]
},
{
- "condition": { "and": [ { "not": { "and": [ "is_day", "u_is_outside" ] } }, { "math": [ "moon_phase() == 0" ] } ] },
+ "condition": {
+ "and": [
+ { "not": { "and": [ "is_day", "u_is_outside" ] } },
+ { "math": [ "moon_phase() == 0" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1" ] }
+ ]
+ },
"values": [ { "value": "STEALTH_MODIFIER", "add": { "math": [ "40 + (u_vitamin('lilin_ruach_vitamin') / 300)" ] } } ]
}
]
@@ -454,6 +531,29 @@
}
]
},
+ {
+ "type": "mutation",
+ "id": "LILIN_REDUCED_NEEDS_WITH_RUACH",
+ "name": { "//~": "This is a reference to Proverbs 25:16", "str": "Eating Drops of Honey" },
+ "description": "When filled with ruach, no other food or drink compares. The more ruach you have, the less mundane hunger or thirst troubles you.",
+ "points": 6,
+ "starting_trait": false,
+ "purifiable": false,
+ "changes_to": [ "LILIN_REDUCED_NEEDS_WITH_RUACH_AND_KCAL_DRAIN" ],
+ "prereqs": [ "LILIN_ATTRIBUTE_BONUSES" ],
+ "prereqs2": [ "LILIN_DRAIN_RUACH_DISTANCE", "LILIN_DRAIN_RUACH_LONG_DISTANCE" ],
+ "category": [ "LILIN" ],
+ "enchantments": [
+ {
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1" ] },
+ "values": [
+ { "value": "HUNGER", "multiply": { "math": [ "-0.15 - (u_vitamin('lilin_ruach_vitamin') / 10000)" ] } },
+ { "value": "THIRST", "multiply": { "math": [ "-0.15 - (u_vitamin('lilin_ruach_vitamin') / 10000)" ] } },
+ { "value": "METABOLISM", "multiply": { "math": [ "-0.15 - (u_vitamin('lilin_ruach_vitamin') / 10000)" ] } }
+ ]
+ }
+ ]
+ },
{
"type": "mutation",
"id": "LILIN_BONUS_HEALING",
@@ -484,6 +584,7 @@
"prereqs": [ "LILIN_BONUS_HEALING" ],
"prereqs2": [ "LILIN_ATTRIBUTE_BONUSES_STRENGTH" ],
"category": [ "LILIN" ],
+ "activation_msg": "",
"activated_eocs": [ "EOC_LILIN_BONUS_HEALING_ACTIVE_activated" ],
"deactivated_eocs": [ "EOC_LILIN_BONUS_HEALING_ACTIVE_deactivated" ]
},
@@ -524,6 +625,32 @@
"category": [ "LILIN" ],
"threshreq": [ "THRESH_LILIN" ]
},
+ {
+ "type": "mutation",
+ "id": "LILIN_RUACH_EFFICIENCY",
+ "name": { "//~": "This is a reference to Proverbs 23:5", "str": "Glancing at Riches" },
+ "description": "You've learned how to more efficiently use your ruach, greedily keeping some behind for yourself when you activate your powers. Powers that cost ruach have their initial and periodic costs reduced by 15%. This does not reduce the continual ruach cost of staying alive.",
+ "points": 5,
+ "starting_trait": false,
+ "purifiable": false,
+ "prereqs": [ "LILIN_HOLD_MORE_RUACH", "LILIN_HOLD_MORE_RUACH_2", "LILIN_HOLD_MORE_RUACH_3" ],
+ "prereqs2": [ "LILIN_GAIN_MORE_FOCUS" ],
+ "changes_to": [ "LILIN_RUACH_EFFICIENCY_UPGRADE" ],
+ "category": [ "LILIN" ]
+ },
+ {
+ "type": "mutation",
+ "id": "LILIN_RUACH_EFFICIENCY_UPGRADE",
+ "name": { "//~": "This is a reference to Jeremiah 5:27", "str": "Like a Cage Full of Birds" },
+ "description": "You jealously parcel out your ruach, only spending exactly as much as you need and no more. Powers that cost ruach have their initial and periodic costs reduced by 15%, with an additional reduction that grows based on your total amount of ruach, to a maximum reduction of 33%. This does not reduce the continual ruach cost of staying alive.",
+ "points": 10,
+ "starting_trait": false,
+ "purifiable": false,
+ "prereqs": [ "LILIN_TEMPORARY_GLORIOUS_2" ],
+ "prereqs2": [ "LILIN_RUACH_EFFICIENCY" ],
+ "category": [ "LILIN" ],
+ "threshreq": [ "THRESH_LILIN" ]
+ },
{
"type": "mutation",
"id": "LILIN_READ_CRAFT_IN_DARKNESS",
@@ -537,6 +664,19 @@
"threshreq": [ "THRESH_LILIN" ],
"flags": [ "CRAFT_IN_DARKNESS", "READ_IN_DARKNESS" ]
},
+ {
+ "type": "mutation",
+ "id": "LILIN_OWL_FORM_PASS_THROUGH_WALLS",
+ "name": { "str": "Like an Unclean Spirit" },
+ "description": "Your owl form is half spirit and half flesh. You have a high chance to dodge any attacks against you, and may pass straight through walls as long as it is night.",
+ "points": 6,
+ "purifiable": false,
+ "player_display": false,
+ "prereqs": [ "LILIN_TURN_INTO_OWL" ],
+ "prereqs2": [ "LILIN_UNCANNY_DODGE_WHILE_REAPING" ],
+ "category": [ "LILIN" ],
+ "threshreq": [ "THRESH_LILIN" ]
+ },
{
"type": "mutation",
"id": "LILIN_LIMB_SCORE_BONUSES_AT_NIGHT",
@@ -570,6 +710,7 @@
"prereqs2": [ "LILIN_TURN_INTO_OWL" ],
"category": [ "LILIN" ],
"threshreq": [ "THRESH_LILIN" ],
+ "activation_msg": "",
"activated_eocs": [ "EOC_LILIN_TRANSFORM_INTO_WAR_OWL_FORM_activated" ],
"deactivated_eocs": [ "EOC_LILIN_TRANSFORM_INTO_WAR_OWL_FORM_deactivated" ]
},
@@ -582,8 +723,32 @@
"points": 0,
"active": true,
"activated_is_setup": false,
+ "activation_msg": "",
"activated_eocs": [ "EOC_LILIN_STRIX_LEAP" ]
},
+ {
+ "type": "mutation",
+ "id": "LILIN_REDUCED_NEEDS_WITH_RUACH_AND_KCAL_DRAIN",
+ "name": { "//~": "This is a reference to Exodus 16:12", "str": "Eating Meat at Twilight" },
+ "description": "When filled with ruach, no other food or drink compares. The more ruach you have, the less mundane hunger or thirst troubles you. In addition, drinking ruach from your victims assuages your hunger and thirst.",
+ "points": 6,
+ "starting_trait": false,
+ "purifiable": false,
+ "prereqs": [ "LILIN_REDUCED_NEEDS_WITH_RUACH" ],
+ "prereqs2": [ "LILIN_BONUS_HEALING_ACTIVE" ],
+ "category": [ "LILIN" ],
+ "threshreq": [ "THRESH_LILIN" ],
+ "enchantments": [
+ {
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1" ] },
+ "values": [
+ { "value": "HUNGER", "multiply": { "math": [ "-0.15 - (u_vitamin('lilin_ruach_vitamin') / 10000)" ] } },
+ { "value": "THIRST", "multiply": { "math": [ "-0.15 - (u_vitamin('lilin_ruach_vitamin') / 10000)" ] } },
+ { "value": "METABOLISM", "multiply": { "math": [ "-0.15 - (u_vitamin('lilin_ruach_vitamin') / 10000)" ] } }
+ ]
+ }
+ ]
+ },
{
"type": "mutation",
"id": "LILIN_DISEASE_MELEE_STRIKES",
@@ -607,5 +772,16 @@
"category": [ "LILIN" ],
"threshreq": [ "THRESH_LILIN" ],
"spells_learned": [ [ "lilin_instant_heal_spell", 1 ] ]
+ },
+ {
+ "type": "mutation",
+ "id": "LILIN_PREVENT_DEATH_TRIGGER",
+ "name": { "//~": "This is a reference to Isaiah 66:24", "str": "Their Worm Shall Not Die" },
+ "points": 15,
+ "description": "When taking fatal damage, instead of dying you assume the form of an owl, allowing you to fly away from danger and recover. This does not function during the day, if you are out of ruach, or if you are killed by fire.",
+ "prereqs": [ "LILIN_INSTANT_HEAL" ],
+ "prereqs2": [ "LILIN_OWL_FORM_PASS_THROUGH_WALLS" ],
+ "category": [ "LILIN" ],
+ "threshreq": [ "THRESH_LILIN" ]
}
]
diff --git a/data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json b/data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json
index ca3c919ae3187..5040105ef725f 100644
--- a/data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json
+++ b/data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json
@@ -274,5 +274,19 @@
{ "math": [ "u_ruach_days_left", "=", "trunc(u_vitamin('lilin_ruach_vitamin') / 240)" ] },
{ "run_eocs": "EOC_LILIN_UPDATE_MAX_RUACH_LEVELS" }
]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_CONDITION_CHECK_LILIN_IN_CITY_ON_OMT_ENTER",
+ "eoc_type": "EVENT",
+ "required_event": "avatar_enters_omt",
+ "condition": { "u_has_trait": "LILIN_TRAITS" },
+ "effect": [
+ {
+ "if": { "map_in_city": { "mutator": "u_loc_relative", "target": "(0,0,0)" } },
+ "then": { "math": [ "u_lilit_is_in_civilization", "=", "1" ] },
+ "else": { "math": [ "u_lilit_is_in_civilization", "=", "0" ] }
+ }
+ ]
}
]
diff --git a/data/mods/Xedra_Evolved/mutations/xe_lilin_trait_eocs.json b/data/mods/Xedra_Evolved/mutations/xe_lilin_trait_eocs.json
index 792c4028ee1f5..39446626c7a9c 100644
--- a/data/mods/Xedra_Evolved/mutations/xe_lilin_trait_eocs.json
+++ b/data/mods/Xedra_Evolved/mutations/xe_lilin_trait_eocs.json
@@ -10,9 +10,9 @@
"run_eocs": [
{
"id": "EOC_LILIN_TEMPORARY_GLORIOUS_activated_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "60" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "60 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "60" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "60 * lilin_has_ruach_efficiency()" ] },
{ "u_add_trait": "BEAUTIFUL3" },
{ "u_add_effect": "effect_lilin_temporary_glorious", "duration": "PERMANENT" },
{ "u_message": "You spin a beguiling web of illusion around yourself.", "type": "good" },
@@ -65,9 +65,9 @@
"run_eocs": [
{
"id": "EOC_LILIN_TEMPORARY_GLORIOUS_maintenance_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "60" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "60 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "60" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "60 * lilin_has_ruach_efficiency()" ] },
{
"u_message": "You feel a chill on your skin as you maintain your web of pleasing illusions.",
"type": "mixed"
@@ -108,9 +108,9 @@
"run_eocs": [
{
"id": "EOC_LILIN_ATTRIBUTE_BONUSES_activated_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "80" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "80 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "80" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "80 * lilin_has_ruach_efficiency()" ] },
{ "u_add_effect": "effect_lilin_attribute_bonuses", "duration": "PERMANENT" },
{ "u_message": "You draw on your ruach to enhance your physical abilities.", "type": "good" },
{
@@ -160,9 +160,9 @@
"run_eocs": [
{
"id": "EOC_LILIN_ATTRIBUTE_BONUSES_maintenance_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "60" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "60 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "60" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "60 * lilin_has_ruach_efficiency()" ] },
{
"u_message": "You feel a chill on your skin as you maintain your enhanced physical abilities.",
"type": "mixed"
@@ -194,11 +194,15 @@
"run_eocs": [
{
"id": "EOC_LILIN_TURN_INTO_OWL_activated_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "360" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "360 * lilin_has_ruach_efficiency()" ] },
"effect": [
{ "u_assign_activity": "ACT_GENERIC_EOC", "duration": 1.5 },
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "360" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "360 * lilin_has_ruach_efficiency()" ] },
{ "u_add_trait": "TURN_INTO_OWL_TRAITS" },
+ {
+ "if": { "u_has_trait": "LILIN_OWL_FORM_PASS_THROUGH_WALLS" },
+ "then": { "u_add_effect": "effect_lilin_owl_form_pass_through_walls", "duration": "PERMANENT" }
+ },
{ "math": [ "u_calories('dont_affect_weariness': true)", "/=", "4" ] },
{
"u_message": "Your eyes grow wide as feathers sprout from your arms and you take to the air on silent wings.",
@@ -222,6 +226,7 @@
"effect": [
{ "u_message": "Your wings recede and you land on now-humanoid legs.", "type": "neutral" },
{ "u_lose_trait": "TURN_INTO_OWL_TRAITS" },
+ { "u_lose_effect": "effect_lilin_owl_form_pass_through_walls" },
{ "math": [ "u_calories('dont_affect_weariness': true)", "*=", "4" ] }
]
}
@@ -244,9 +249,9 @@
"run_eocs": [
{
"id": "EOC_LILIN_BONUS_HEALING_ACTIVE_activated_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "50" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "100 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "50" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "100 * lilin_has_ruach_efficiency()" ] },
{ "u_add_effect": "effect_lilin_bonus_healing_active", "duration": "PERMANENT" },
{ "u_message": "You pour ruach into your wounds and your body begins healing.", "type": "good" },
{ "run_eocs": [ "EOC_LILIN_BONUS_HEALING_ACTIVE_maintenance" ], "time_in_future": [ 8, 15 ] }
@@ -289,9 +294,9 @@
"run_eocs": [
{
"id": "EOC_LILIN_BONUS_HEALING_ACTIVE_maintenance_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "50" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "100 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "50" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "100 * lilin_has_ruach_efficiency()" ] },
{ "u_message": "You feel icy pinpricks on your skin as your wounds heal.", "type": "mixed" },
{
"if": { "math": [ "u_hp('torso')", "<", "u_hp_max('torso')" ] },
@@ -317,7 +322,23 @@
"if": { "math": [ "u_hp('leg_r')", "<", "u_hp_max('leg_r')" ] },
"then": { "math": [ "u_hp('leg_r')", "++" ] }
},
- { "run_eocs": [ "EOC_LILIN_BONUS_HEALING_ACTIVE_maintenance" ], "time_in_future": [ 8, 15 ] }
+ {
+ "if": {
+ "and": [
+ { "math": [ "u_hp('torso')", "==", "u_hp_max('torso')" ] },
+ { "math": [ "u_hp('head')", "==", "u_hp_max('head')" ] },
+ { "math": [ "u_hp('arm_l')", "==", "u_hp_max('arm_l')" ] },
+ { "math": [ "u_hp('arm_r')", "==", "u_hp_max('arm_r')" ] },
+ { "math": [ "u_hp('leg_l')", "==", "u_hp_max('leg_l')" ] },
+ { "math": [ "u_hp('leg_r')", "==", "u_hp_max('leg_r')" ] }
+ ]
+ },
+ "then": [
+ { "u_message": "With your body restored, you no longer need to dedicate ruach to healing it.", "type": "neutral" },
+ { "run_eocs": "EOC_LILIN_BONUS_HEALING_deactivate_future", "time_in_future": 0 }
+ ],
+ "else": { "run_eocs": [ "EOC_LILIN_BONUS_HEALING_ACTIVE_maintenance" ], "time_in_future": [ 8, 15 ] }
+ }
],
"false_effect": [
{ "u_message": "You don't have enough ruach accelerate your healing.", "type": "neutral" },
@@ -383,10 +404,10 @@
"run_eocs": [
{
"id": "EOC_LILIN_TRANSFORM_INTO_WAR_OWL_FORM_activated_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "480" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "480 * lilin_has_ruach_efficiency()" ] },
"effect": [
{ "u_assign_activity": "ACT_GENERIC_EOC", "duration": 1.5 },
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "480" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "480 * lilin_has_ruach_efficiency()" ] },
{ "u_add_trait": "LILIN_WAR_OWL_FORM_TRAITS" },
{ "u_add_trait": "LILIN_WAR_OWL_FORM_LEAPER" },
{ "math": [ "u_calories('dont_affect_weariness': true)", "*=", "1.5" ] },
@@ -444,5 +465,95 @@
}
}
]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_LILIN_PREVENT_DEATH_INITIATE",
+ "eoc_type": "PREVENT_DEATH",
+ "condition": {
+ "and": [
+ { "u_has_trait": "LILIN_PREVENT_DEATH_TRIGGER" },
+ { "not": "is_day" },
+ { "not": { "u_has_effect": "onfire" } },
+ { "not": { "u_is_in_field": "fd_fire" } },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">", "0" ] },
+ { "not": { "u_has_effect": "lilit_prevent_death_cooldown" } }
+ ]
+ },
+ "effect": [
+ { "u_message": "As yours wounds overtake you, you cast forth your spirit in the form of an owl.", "popup": true },
+ { "run_eocs": [ "EOC_LILIN_PREVENT_DEATH_PROCESSING" ] }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_LILIN_PREVENT_DEATH_DAMAGE_TRACKER",
+ "eoc_type": "EVENT",
+ "required_event": "character_takes_damage",
+ "condition": { "u_has_trait": "LILIN_PREVENT_DEATH_TRIGGER" },
+ "effect": [
+ {
+ "if": { "math": [ "u_hp('torso')", ">", "0" ] },
+ "then": { "math": [ "u_lilin_return_from_death_hp_torso", "=", "u_hp('torso')" ] }
+ },
+ {
+ "if": { "math": [ "u_hp('head')", ">", "0" ] },
+ "then": { "math": [ "u_lilin_return_from_death_hp_head", "=", "u_hp('head')" ] }
+ },
+ {
+ "if": { "math": [ "u_hp('arm_l')", ">", "0" ] },
+ "then": { "math": [ "u_lilin_return_from_death_hp_arm_l", "=", "u_hp('arm_l')" ] }
+ },
+ {
+ "if": { "math": [ "u_hp('arm_r')", ">", "0" ] },
+ "then": { "math": [ "u_lilin_return_from_death_hp_arm_r", "=", "u_hp('arm_r')" ] }
+ },
+ {
+ "if": { "math": [ "u_hp('leg_l')", ">", "0" ] },
+ "then": { "math": [ "u_lilin_return_from_death_hp_leg_l", "=", "u_hp('leg_l')" ] }
+ },
+ {
+ "if": { "math": [ "u_hp('leg_r')", ">", "0" ] },
+ "then": { "math": [ "u_lilin_return_from_death_hp_leg_r", "=", "u_hp('leg_r')" ] }
+ }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_LILIN_PREVENT_DEATH_PROCESSING",
+ "condition": { "u_has_trait": "LILIN_PREVENT_DEATH_TRIGGER" },
+ "effect": [
+ {
+ "if": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">", "3000 * lilin_has_ruach_efficiency()" ] },
+ "then": { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "3000 * lilin_has_ruach_efficiency()" ] },
+ "else": { "math": [ "u_vitamin('lilin_ruach_vitamin')", "=", "0" ] }
+ },
+ { "math": [ "u_hp('ALL_MINOR')", "=", "999" ] },
+ { "math": [ "u_hp('torso')", "=", "max( u_lilin_return_from_death_hp_torso, 10)" ] },
+ { "math": [ "u_hp('head')", "=", "max( u_lilin_return_from_death_hp_head, 10)" ] },
+ { "math": [ "u_hp('arm_l')", "=", "max( u_lilin_return_from_death_hp_arm_l, 10)" ] },
+ { "math": [ "u_hp('arm_r')", "=", "max( u_lilin_return_from_death_hp_arm_r, 10)" ] },
+ { "math": [ "u_hp('leg_l')", "=", "max( u_lilin_return_from_death_hp_leg_l, 10)" ] },
+ { "math": [ "u_hp('leg_r')", "=", "max( u_lilin_return_from_death_hp_leg_r, 10)" ] },
+ { "math": [ "u_vitamin('redcells')", "=", "0" ] },
+ { "math": [ "u_vitamin('bad_food')", "=", "0" ] },
+ { "math": [ "u_vitamin('blood')", "=", "0" ] },
+ { "u_lose_effect": "corroding" },
+ { "u_lose_effect": "dazed" },
+ { "u_lose_effect": "downed" },
+ { "u_lose_effect": "stunned" },
+ { "u_lose_effect": "venom_blind" },
+ { "u_lose_effect": "sap" },
+ { "u_lose_effect": "staggered_character" },
+ { "u_lose_effect": "nausea" },
+ { "u_lose_effect": "bleed" },
+ { "u_lose_effect": "blind" },
+ { "u_lose_effect": "deaf" },
+ { "u_lose_effect": "grabbed" },
+ { "u_add_effect": "lilit_prevent_death_escape", "duration": 15 },
+ { "u_add_effect": "lilit_prevent_death_cooldown", "duration": 300 },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "+=", "360 * lilin_has_ruach_efficiency()" ] },
+ { "u_activate_trait": "LILIN_TURN_INTO_OWL" }
+ ]
}
]
diff --git a/data/mods/Xedra_Evolved/spells/lilin_spell_eocs.json b/data/mods/Xedra_Evolved/spells/lilin_spell_eocs.json
index 184f7d89bd455..cef20d3612672 100644
--- a/data/mods/Xedra_Evolved/spells/lilin_spell_eocs.json
+++ b/data/mods/Xedra_Evolved/spells/lilin_spell_eocs.json
@@ -3,14 +3,27 @@
"type": "effect_on_condition",
"id": "EOC_LILIN_RUACH_DRAIN",
"//": "Humans and humanlike fae give about one day's worth (240) ruach, aliens give a totally random amount, Nether creatures are a huge gamble (they could give you tons of ruach but could also absorb some from you), inhuman fae and vampires give a random amount within a few hours (20-60), animals and cyborgs give an hour's worth (5-15), insects give half of what animals give (2-7), nothing else gives any.",
+ "//2": "Ferals currently don't sleep, but future-proofing for when or if they might",
"condition": "u_is_character",
"effect": [
- { "math": [ "n_vitamin('lilin_ruach_vitamin')", "+=", "rng(200,300)" ] },
+ {
+ "if": { "and": [ { "npc_has_trait": "LILIN_GAIN_EXTRA_RUACH_FROM_SLEEPY_PEOPLE" }, { "u_has_effect": "asleep" } ] },
+ "then": { "math": [ "n_vitamin('lilin_ruach_vitamin')", "+=", "rng(200,300) * 1.5" ] },
+ "else": { "math": [ "n_vitamin('lilin_ruach_vitamin')", "+=", "rng(200,300)" ] }
+ },
{ "npc_message": "You feel a rush of warmth as you absorb the ruach.", "type": "good" },
{ "math": [ "u_lilin_ruach_drained_recently", "=", "1" ] },
- { "run_eocs": "EOC_LILIN_RUACH_DRAIN_SIDE_EFFECTS" }
+ { "run_eocs": "EOC_LILIN_RUACH_DRAIN_SIDE_EFFECTS" },
+ {
+ "if": { "npc_has_trait": "LILIN_REDUCED_NEEDS_WITH_RUACH_AND_KCAL_DRAIN" },
+ "then": { "run_eocs": "EOC_LILIN_RUACH_DRAIN_SIDE_GAIN_SUSTENANCE" }
+ }
],
"false_effect": [
+ {
+ "if": { "npc_has_trait": "LILIN_REDUCED_NEEDS_WITH_RUACH_AND_KCAL_DRAIN" },
+ "then": { "run_eocs": "EOC_LILIN_RUACH_DRAIN_SIDE_GAIN_SUSTENANCE" }
+ },
{
"if": {
"and": [
@@ -27,7 +40,11 @@
]
},
"then": [
- { "math": [ "n_vitamin('lilin_ruach_vitamin')", "+=", "rng(200,300)" ] },
+ {
+ "if": { "and": [ { "npc_has_trait": "LILIN_GAIN_EXTRA_RUACH_FROM_SLEEPY_PEOPLE" }, { "u_has_effect": "asleep" } ] },
+ "then": { "math": [ "n_vitamin('lilin_ruach_vitamin')", "+=", "rng(200,300) * 1.5" ] },
+ "else": { "math": [ "n_vitamin('lilin_ruach_vitamin')", "+=", "rng(200,300)" ] }
+ },
{ "npc_message": "You feel a rush of warmth as you absorb the ruach.", "type": "good" },
{ "run_eocs": "EOC_LILIN_RUACH_DRAIN_SIDE_EFFECTS" }
],
@@ -221,12 +238,146 @@
}
]
},
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_LILIN_RUACH_DRAIN_SIDE_GAIN_SUSTENANCE",
+ "//": "For ease of keeping track, we give the same kcal as ruach here. Remember that lilin with this trait have greatly-reduced metabolism",
+ "//2": "Vitamins do not check for quantity because there's no hypervitaminosis. If that gets re-added, this will need to be revisited",
+ "condition": "u_is_character",
+ "effect": [
+ {
+ "if": { "math": [ "n_calories()", "<=", "118000" ] },
+ "then": { "math": [ "n_calories('dont_affect_weariness': true)", "+=", "rng(200,300)" ] }
+ },
+ {
+ "if": { "math": [ "n_val('thirst')", ">=", "-60" ] },
+ "then": { "math": [ "n_val('thirst')", "-=", "rng(10,25)" ] }
+ },
+ { "math": [ "n_vitamin('iron')", "+=", "rng(15,30)" ] },
+ { "math": [ "n_vitamin('vitC')", "+=", "rng(15,30)" ] },
+ { "math": [ "n_vitamin('calcium')", "+=", "rng(15,30)" ] }
+ ],
+ "false_effect": [
+ {
+ "if": {
+ "and": [
+ { "not": { "u_has_species": "ZOMBIE" } },
+ {
+ "or": [
+ { "u_has_species": "CHANGELING" },
+ { "u_has_species": "HOMULLUS" },
+ { "u_has_species": "FERAL" },
+ { "u_has_species": "HUMAN" },
+ { "u_has_species": "RENFIELD" }
+ ]
+ }
+ ]
+ },
+ "then": [
+ {
+ "if": { "math": [ "n_calories()", "<=", "118000" ] },
+ "then": { "math": [ "n_calories('dont_affect_weariness': true)", "+=", "rng(200,300)" ] }
+ },
+ {
+ "if": { "math": [ "n_val('thirst')", ">=", "-60" ] },
+ "then": { "math": [ "n_val('thirst')", "-=", "rng(10,25)" ] }
+ },
+ { "math": [ "n_vitamin('iron')", "+=", "rng(15,30)" ] },
+ { "math": [ "n_vitamin('vitC')", "+=", "rng(15,30)" ] },
+ { "math": [ "n_vitamin('calcium')", "+=", "rng(15,30)" ] }
+ ],
+ "else": {
+ "if": { "or": [ { "u_has_species": "PLANT" }, { "u_has_species": "MIGO" } ] },
+ "then": [
+ {
+ "if": { "math": [ "n_calories()", "<=", "118000" ] },
+ "then": { "math": [ "n_calories('dont_affect_weariness': true)", "+=", "rng(0,250)" ] }
+ },
+ {
+ "if": { "math": [ "n_val('thirst')", ">=", "-60" ] },
+ "then": { "math": [ "n_val('thirst')", "-=", "rng(0,15)" ] }
+ },
+ { "math": [ "n_vitamin('iron')", "+=", "rng(0,10)" ] },
+ { "math": [ "n_vitamin('vitC')", "+=", "rng(0,10)" ] },
+ { "math": [ "n_vitamin('calcium')", "+=", "rng(0,10)" ] }
+ ],
+ "else": {
+ "if": { "u_has_species": "NETHER" },
+ "then": [
+ {
+ "if": { "math": [ "n_calories()", "<=", "118000" ] },
+ "then": { "math": [ "n_calories('dont_affect_weariness': true)", "+=", "rng(-500,500)" ] }
+ },
+ {
+ "if": { "math": [ "n_val('thirst')", ">=", "-60" ] },
+ "then": { "math": [ "n_val('thirst')", "-=", "rng(-25,25)" ] }
+ },
+ { "math": [ "n_vitamin('iron')", "+=", "rng(-30,30)" ] },
+ { "math": [ "n_vitamin('vitC')", "+=", "rng(-30,30)" ] },
+ { "math": [ "n_vitamin('calcium')", "+=", "rng(-30,30)" ] }
+ ],
+ "else": {
+ "if": {
+ "or": [
+ { "u_has_species": "IERDE" },
+ { "u_has_species": "ARVORE" },
+ { "u_has_species": "UNDINE" },
+ { "u_has_species": "SYLPH" },
+ { "u_has_species": "SALAMANDER" },
+ { "u_has_species": "VAMPIRE" }
+ ]
+ },
+ "then": [
+ {
+ "if": { "math": [ "n_calories()", "<=", "118000" ] },
+ "then": { "math": [ "n_calories('dont_affect_weariness': true)", "+=", "rng(65,125)" ] }
+ },
+ {
+ "if": { "math": [ "n_val('thirst')", ">=", "-60" ] },
+ "then": { "math": [ "n_val('thirst')", "-=", "rng(2,6)" ] }
+ },
+ { "math": [ "n_vitamin('iron')", "+=", "rng(1,8)" ] },
+ { "math": [ "n_vitamin('vitC')", "+=", "rng(1,8)" ] },
+ { "math": [ "n_vitamin('calcium')", "+=", "rng(1,8)" ] }
+ ],
+ "else": {
+ "if": {
+ "or": [
+ { "u_has_species": "CYBORG" },
+ { "u_has_species": "MAMMAL" },
+ { "u_has_species": "AMPHIBIAN" },
+ { "u_has_species": "BIRD" },
+ { "u_has_species": "REPTILE" },
+ { "u_has_species": "FISH" },
+ { "u_has_species": "KRAKEN" }
+ ]
+ },
+ "then": [
+ {
+ "if": { "math": [ "n_calories()", "<=", "118000" ] },
+ "then": { "math": [ "n_calories('dont_affect_weariness': true)", "+=", "rng(20,40)" ] }
+ },
+ {
+ "if": { "math": [ "n_val('thirst')", ">=", "-60" ] },
+ "then": { "math": [ "n_val('thirst')", "-=", "rng(1,3)" ] }
+ },
+ { "math": [ "n_vitamin('iron')", "+=", "rng(1,4)" ] },
+ { "math": [ "n_vitamin('vitC')", "+=", "rng(1,4)" ] },
+ { "math": [ "n_vitamin('calcium')", "+=", "rng(1,4)" ] }
+ ]
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
{
"type": "effect_on_condition",
"id": "EOC_LILIN_EVIL_EYE",
- "condition": { "math": [ "n_vitamin('lilin_ruach_vitamin')", ">=", "60" ] },
+ "condition": { "math": [ "n_vitamin('lilin_ruach_vitamin')", ">=", "60 * lilin_has_ruach_efficiency_beta()" ] },
"effect": [
- { "math": [ "n_vitamin('lilin_ruach_vitamin')", "-=", "60" ] },
+ { "math": [ "n_vitamin('lilin_ruach_vitamin')", "-=", "60 * lilin_has_ruach_efficiency_beta()" ] },
{
"npc_message": "You glare balefully at and project all of your malice into your gaze.",
"type": "neutral"
@@ -249,12 +400,158 @@
],
"false_effect": { "npc_message": "You don't have enough ruach for your malice to affect your target.", "type": "bad" }
},
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_LILIN_BLINDING_TARGET",
+ "condition": { "math": [ "n_vitamin('lilin_ruach_vitamin')", ">=", "120 * lilin_has_ruach_efficiency_beta()" ] },
+ "effect": [
+ { "math": [ "n_vitamin('lilin_ruach_vitamin')", "-=", "120 * lilin_has_ruach_efficiency_beta()" ] },
+ {
+ "run_eocs": [
+ {
+ "id": "EOC_LILIN_BLINDING_TARGET_2",
+ "condition": {
+ "and": [
+ { "not": "is_day" },
+ {
+ "or": [ { "and": [ "u_is_outside", { "math": [ "n_lilit_is_in_civilization", "==", "0" ] } ] }, { "not": "u_is_outside" } ]
+ }
+ ]
+ },
+ "effect": [
+ {
+ "u_add_effect": "blind",
+ "duration": {
+ "math": [
+ "rng( ( (n_vitamin('lilin_ruach_vitamin') * 8) * (n_vitamin('lilin_ruach_vitamin') * 0.03) * (n_has_trait('THRESH_LILIN') + 1) ),( (n_vitamin('lilin_ruach_vitamin') * 24) * (n_vitamin('lilin_ruach_vitamin') * 0.075) * (n_has_trait('THRESH_LILIN') + 1) ) )"
+ ]
+ }
+ },
+ { "npc_message": "'s eyes film over with darkness.", "type": "good" }
+ ],
+ "false_effect": [
+ {
+ "if": "is_day",
+ "then": { "npc_message": "You cannot call up the darkness while the sun is in the sky.", "type": "bad" },
+ "else": {
+ "if": { "and": [ "u_is_outside", { "math": [ "n_lilit_is_in_civilization", "==", "1" ] } ] },
+ "then": { "npc_message": "You cannot call up the darkness outdoors in a city.", "type": "bad" },
+ "else": [ ]
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "false_effect": { "npc_message": "You don't have enough ruach to call the darkness on your target.", "type": "bad" }
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_LILIN_MESMERIZE_TARGET",
+ "condition": { "math": [ "n_vitamin('lilin_ruach_vitamin')", ">=", "320 * lilin_has_ruach_efficiency_beta()" ] },
+ "effect": [
+ { "math": [ "n_vitamin('lilin_ruach_vitamin')", "-=", "320 * lilin_has_ruach_efficiency_beta()" ] },
+ {
+ "math": [
+ "u_lilin_mesmerize_duration",
+ "=",
+ "rng( ( 48 + (n_vitamin('lilin_ruach_vitamin') / 13 ) + (n_has_trait('BEAUTIFUL3') * rng(60,180) ) ),( 96 + (n_vitamin('lilin_ruach_vitamin') / 27 ) + (n_has_trait('BEAUTIFUL3') * rng(120,360) ) ) )"
+ ]
+ },
+ {
+ "run_eocs": [
+ {
+ "id": "EOC_LILIN_MESMERIZE_TARGET_2",
+ "condition": "u_is_character",
+ "//": "If you're not totally immune, there's always a chance mesmerism will work",
+ "effect": [
+ {
+ "if": { "not": { "u_has_worn_with_flag": "WARDING_SYMBOL" } },
+ "then": [
+ { "u_add_effect": "stunned", "duration": { "math": [ "u_lilin_mesmerize_duration" ] } },
+ {
+ "u_add_effect": "effect_lilin_mesmerize_tracker",
+ "duration": { "math": [ "u_lilin_mesmerize_duration" ] }
+ },
+ { "npc_message": "You beguile and they stand in a daze.", "type": "good" }
+ ],
+ "else": { "npc_message": "Your target's protective charm means the beguilement fails to take effect!", "type": "bad" }
+ }
+ ],
+ "false_effect": [
+ {
+ "if": { "or": [ { "u_has_species": "FERAL" }, { "u_has_species": "RENFIELD" }, { "u_has_species": "CYBORG" } ] },
+ "then": [
+ { "u_add_effect": "stunned", "duration": { "math": [ "u_lilin_mesmerize_duration" ] } },
+ {
+ "u_add_effect": "effect_lilin_mesmerize_tracker",
+ "duration": { "math": [ "u_lilin_mesmerize_duration" ] }
+ },
+ { "npc_message": "You beguile and they stand in a daze.", "type": "good" }
+ ],
+ "else": {
+ "if": { "or": [ { "u_has_species": "BIRD" } ] },
+ "then": [
+ { "math": [ "u_lilin_mesmerize_duration", "=", "u_lilin_mesmerize_duration * 2" ] },
+ { "u_add_effect": "stunned", "duration": { "math": [ "u_lilin_mesmerize_duration" ] } },
+ {
+ "u_add_effect": "effect_lilin_mesmerize_tracker",
+ "duration": { "math": [ "u_lilin_mesmerize_duration" ] }
+ },
+ { "npc_message": "You beguile and they stand in a daze.", "type": "good" }
+ ],
+ "else": {
+ "if": {
+ "or": [
+ { "u_has_species": "IERDE" },
+ { "u_has_species": "ARVORE" },
+ { "u_has_species": "UNDINE" },
+ { "u_has_species": "SYLPH" },
+ { "u_has_species": "SALAMANDER" },
+ { "u_has_species": "VAMPIRE" }
+ ]
+ },
+ "then": [
+ { "math": [ "u_lilin_mesmerize_duration", "=", "u_lilin_mesmerize_duration * 0.75" ] },
+ { "u_add_effect": "stunned", "duration": { "math": [ "u_lilin_mesmerize_duration" ] } },
+ {
+ "u_add_effect": "effect_lilin_mesmerize_tracker",
+ "duration": { "math": [ "u_lilin_mesmerize_duration" ] }
+ },
+ { "npc_message": "You beguile and they stand in a daze.", "type": "good" }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_LILIN_MESMERISM_REMOVAL_CHARACTER",
+ "eoc_type": "EVENT",
+ "required_event": "character_takes_damage",
+ "condition": { "and": [ { "u_has_effect": "stunned" }, { "u_has_effect": "effect_lilin_mesmerize_tracker" } ] },
+ "effect": [ { "u_lose_effect": "effect_lilin_mesmerize_tracker" }, { "u_lose_effect": "stunned" } ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_LILIN_MESMERISM_REMOVAL_MONSTER",
+ "eoc_type": "EVENT",
+ "required_event": "monster_takes_damage",
+ "condition": { "and": [ { "u_has_effect": "stunned" }, { "u_has_effect": "effect_lilin_mesmerize_tracker" } ] },
+ "effect": [ { "u_lose_effect": "effect_lilin_mesmerize_tracker" }, { "u_lose_effect": "stunned" } ]
+ },
{
"type": "effect_on_condition",
"id": "EOC_LILIN_AOE_DAZE",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "160" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "160 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "160" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "160 * lilin_has_ruach_efficiency()" ] },
{ "u_cast_spell": { "id": "lilin_aoe_daze_spell_real", "hit_self": false } },
{ "u_make_sound": "You let out a piercing cry!", "type": "alert", "volume": 20 },
{ "u_make_sound": "You let out a piercing cry!", "type": "alert", "volume": 20 },
@@ -295,9 +592,9 @@
{
"type": "effect_on_condition",
"id": "EOC_LILIN_DISEASE_ENHANCEMENT_DAMAGE",
- "condition": { "math": [ "n_vitamin('lilin_ruach_vitamin')", ">=", "180" ] },
+ "condition": { "math": [ "n_vitamin('lilin_ruach_vitamin')", ">=", "180 * lilin_has_ruach_efficiency_beta()" ] },
"effect": [
- { "math": [ "n_vitamin('lilin_ruach_vitamin')", "-=", "180" ] },
+ { "math": [ "n_vitamin('lilin_ruach_vitamin')", "-=", "180 * lilin_has_ruach_efficiency_beta()" ] },
{ "npc_message": "You infuse your ruach into the plague-infected .", "type": "neutral" },
{
"u_add_effect": "effect_lilin_supernatural_disease_focused",
@@ -361,9 +658,9 @@
{
"type": "effect_on_condition",
"id": "EOC_LILIN_AVOID_SLEEP",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "300" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "300 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "300" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "300 * lilin_has_ruach_efficiency()" ] },
{ "math": [ "u_val('sleepiness')", "-=", "rng(200,350)" ] },
{
"if": { "math": [ "u_val('sleepiness')", "<", "0" ] },
@@ -383,9 +680,9 @@
"run_eocs": [
{
"id": "EOC_LILIN_CHANGE_WEATHER_DENSE_FOG_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "240" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "240 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "240" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "240 * lilin_has_ruach_efficiency()" ] },
{ "u_message": "A thick fog begins to rise.", "type": "neutral" },
{ "math": [ "magic_weather_dense_fog", "=", "1" ] },
{ "u_add_effect": "effect_controlling_weather_fog", "duration": "6 hours" },
@@ -432,9 +729,9 @@
{
"type": "effect_on_condition",
"id": "EOC_LILIN_SPEED_BOOST",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "360" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "360 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "360" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "360 * lilin_has_ruach_efficiency()" ] },
{
"u_add_effect": "effect_lilin_speed_boost",
"duration": {
@@ -489,9 +786,9 @@
"run_eocs": [
{
"id": "EOC_LILIN_INSTANT_HEAL_2",
- "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1200" ] },
+ "condition": { "math": [ "u_vitamin('lilin_ruach_vitamin')", ">=", "1200 * lilin_has_ruach_efficiency()" ] },
"effect": [
- { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "1200" ] },
+ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "-=", "1200 * lilin_has_ruach_efficiency()" ] },
{ "npc_message": "Your wounded flesh knits together in moments.", "type": "neutral" },
{
"if": { "math": [ "u_hp('torso')", "<", "u_hp_max('torso')" ] },
@@ -518,7 +815,7 @@
"then": { "math": [ "u_hp('leg_r')", "+=", "25 * min( (u_vitamin('lilin_ruach_vitamin') / 4000),1)" ] }
}
],
- "false_effect": { "u_message": "You don't have enough ruach to to heal yourself!", "type": "bad" }
+ "false_effect": { "u_message": "You don't have enough ruach to heal yourself!", "type": "bad" }
}
]
}
diff --git a/data/mods/Xedra_Evolved/spells/lilin_spells.json b/data/mods/Xedra_Evolved/spells/lilin_spells.json
index abf24cca476e4..72ea01723588f 100644
--- a/data/mods/Xedra_Evolved/spells/lilin_spells.json
+++ b/data/mods/Xedra_Evolved/spells/lilin_spells.json
@@ -5,6 +5,7 @@
"name": "Essence Drain",
"description": "Touch your victim and drain away a part of their ruach to fuel you. It only works on living creatures, and animals provide barely any ruach compared to humans.",
"message": "",
+ "teachable": false,
"valid_targets": [ "hostile", "ally" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_FAIL", "SOMATIC" ],
"spell_class": "LILIN_TRAITS",
@@ -26,6 +27,7 @@
"name": "Ruach Drinker",
"description": "Drain the ruach from a target at range. It only works on living creatures, and animals provide barely any ruach compared to humans.",
"message": "",
+ "teachable": false,
"valid_targets": [ "hostile", "ally" ],
"flags": [ "SILENT", "NO_FAIL", "SOMATIC" ],
"spell_class": "LILIN_TRAITS",
@@ -38,7 +40,7 @@
"max_range": 3,
"energy_source": "STAMINA",
"base_energy_cost": 2000,
- "base_casting_time": 150
+ "base_casting_time": 350
},
{
"id": "lilin_drain_ruach_long_ranged_spell",
@@ -46,6 +48,7 @@
"name": "Ruach Drinker",
"description": "Drain the ruach from a target at range. It only works on living creatures, and animals provide barely any ruach compared to humans.",
"message": "",
+ "teachable": false,
"valid_targets": [ "hostile", "ally" ],
"flags": [ "SILENT", "NO_FAIL", "SOMATIC" ],
"spell_class": "LILIN_TRAITS",
@@ -58,7 +61,7 @@
"max_range": 10,
"energy_source": "STAMINA",
"base_energy_cost": 2000,
- "base_casting_time": 150
+ "base_casting_time": 350
},
{
"id": "lilin_evil_eye_spell",
@@ -66,6 +69,7 @@
"name": "The Evil Eye",
"description": "Curse a single nearby target with misfortune.",
"message": "",
+ "teachable": false,
"valid_targets": [ "hostile", "ally" ],
"flags": [ "SILENT", "NO_FAIL", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ],
"spell_class": "LILIN_TRAITS",
@@ -97,6 +101,7 @@
"name": "Cry of the Night-bird",
"description": "Let out a piercing cry, disorienting all nearby enemies and allies. Of necessity, this is a very loud course of action.",
"message": "",
+ "teachable": false,
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_FAIL" ],
"spell_class": "LILIN_TRAITS",
@@ -107,8 +112,8 @@
"shape": "blast",
"min_aoe": { "math": [ "(u_vitamin('lilin_ruach_vitamin') / 500) + 6" ] },
"max_aoe": { "math": [ "(u_vitamin('lilin_ruach_vitamin') / 500) + 6" ] },
- "min_duration": { "math": [ "(u_vitamin('lilin_ruach_vitamin') * 5) * (u_has_trait('THRESH_LILIN') + 1)" ] },
- "max_duration": { "math": [ "(u_vitamin('lilin_ruach_vitamin') * 12) * (u_has_trait('THRESH_LILIN') + 1)" ] },
+ "min_duration": { "math": [ "(u_vitamin('lilin_ruach_vitamin') * 500) * (u_has_trait('THRESH_LILIN') + 1)" ] },
+ "max_duration": { "math": [ "(u_vitamin('lilin_ruach_vitamin') * 1200) * (u_has_trait('THRESH_LILIN') + 1)" ] },
"energy_source": "NONE",
"base_energy_cost": 0,
"base_casting_time": 50
@@ -119,6 +124,7 @@
"name": "Cry of the Night-bird Real",
"description": "The actual Cry of the Night-bird that applies the effect. It's a bug if you have it.",
"message": "",
+ "teachable": false,
"valid_targets": [ "ally", "hostile" ],
"flags": [ "SILENT", "NO_FAIL", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ],
"spell_class": "LILIN_TRAITS",
@@ -129,16 +135,92 @@
"shape": "blast",
"min_aoe": { "math": [ "(u_vitamin('lilin_ruach_vitamin') / 500) + 6" ] },
"max_aoe": { "math": [ "(u_vitamin('lilin_ruach_vitamin') / 500) + 6" ] },
- "min_duration": { "math": [ "(u_vitamin('lilin_ruach_vitamin') * 5) * (u_has_trait('THRESH_LILIN') + 1)" ] },
- "max_duration": { "math": [ "(u_vitamin('lilin_ruach_vitamin') * 12) * (u_has_trait('THRESH_LILIN') + 1)" ] },
+ "min_duration": { "math": [ "(u_vitamin('lilin_ruach_vitamin') * 500) * (u_has_trait('THRESH_LILIN') + 1)" ] },
+ "max_duration": { "math": [ "(u_vitamin('lilin_ruach_vitamin') * 1200) * (u_has_trait('THRESH_LILIN') + 1)" ] },
"ignored_monster_species": [ "ROBOT", "ROBOT_FLYING", "NETHER_EMANATION", "SLIME" ]
},
+ {
+ "id": "lilin_blinding_target_spell",
+ "type": "SPELL",
+ "name": "Dwelling in Deep Darkness",
+ "description": "Cut a single target off from the light. It works only at night, and only either indoors or outside away from the cities.",
+ "//": "Logic for the restrictions is that lilit are supposd to be found in the wilderness or in abandoned buildings",
+ "message": "",
+ "teachable": false,
+ "valid_targets": [ "ally", "hostile" ],
+ "flags": [ "SILENT", "NO_FAIL", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ],
+ "spell_class": "LILIN_TRAITS",
+ "max_level": 1,
+ "skill": "deduction",
+ "effect": "effect_on_condition",
+ "effect_str": "EOC_LILIN_BLINDING_TARGET",
+ "shape": "blast",
+ "min_range": { "math": [ "(u_vitamin('lilin_ruach_vitamin') / 600) + 5" ] },
+ "max_range": { "math": [ "(u_vitamin('lilin_ruach_vitamin') / 600) + 5" ] },
+ "min_duration": {
+ "math": [
+ "(u_vitamin('lilin_ruach_vitamin') * 800) * (u_vitamin('lilin_ruach_vitamin') * 3) * (u_has_trait('THRESH_LILIN') + 1)"
+ ]
+ },
+ "max_duration": {
+ "math": [
+ "(u_vitamin('lilin_ruach_vitamin') * 2400) * (u_vitamin('lilin_ruach_vitamin') * 7.5) * (u_has_trait('THRESH_LILIN') + 1)"
+ ]
+ },
+ "energy_source": "NONE",
+ "base_energy_cost": 0,
+ "base_casting_time": 85,
+ "ignored_monster_species": [ "ROBOT", "ROBOT_FLYING", "NETHER_EMANATION", "SLIME" ]
+ },
+ {
+ "id": "lilin_mesmerize_target_spell",
+ "type": "SPELL",
+ "name": "Senseless and Without Knowledge",
+ "description": "Beguile a single human, fey, or avian target, causing them to stand in a stupor or wander aimlessly. Any damage taken will break the effect.",
+ "message": "",
+ "teachable": false,
+ "valid_targets": [ "hostile", "ally" ],
+ "flags": [ "SILENT", "NO_FAIL", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ],
+ "spell_class": "LILIN_TRAITS",
+ "max_level": 1,
+ "skill": "deduction",
+ "effect": "effect_on_condition",
+ "effect_str": "EOC_LILIN_MESMERIZE_TARGET",
+ "shape": "blast",
+ "min_range": { "math": [ "(u_vitamin('lilin_ruach_vitamin') / 750) + 3" ] },
+ "max_range": { "math": [ "(u_vitamin('lilin_ruach_vitamin') / 750) + 3" ] },
+ "energy_source": "NONE",
+ "base_casting_time": 50,
+ "ignored_monster_species": [
+ "ZOMBIE",
+ "ROBOT",
+ "ROBOT_FLYING",
+ "NETHER_EMANATION",
+ "LEECH_PLANT",
+ "WORM",
+ "FUNGUS",
+ "SLIME",
+ "MAMMAL",
+ "FISH",
+ "KRAKEN",
+ "INSECT",
+ "INSECT_FLYING",
+ "AMPHIBIAN",
+ "REPTILE",
+ "CENTIPEDE",
+ "SPIDER",
+ "MIGO",
+ "PLANT",
+ "NETHER"
+ ]
+ },
{
"id": "lilin_aoe_line_disease_spell",
"type": "SPELL",
"name": "Unleash the Night-Wind",
"description": "Summon a miasma filled with pestilence to infect your enemies. This supernatural disease can even strike zombies or stranger creatures.",
"message": "",
+ "teachable": false,
"valid_targets": [ "hostile", "ally", "ground" ],
"flags": [ "SILENT", "NO_FAIL", "RANDOM_DURATION" ],
"spell_class": "LILIN_TRAITS",
@@ -172,6 +254,7 @@
"name": "Devoured by Pestilence",
"description": "Enhance the power of the miasma from Unleash the Night-Wind, doing serious damage and crippling your target.",
"message": "",
+ "teachable": false,
"valid_targets": [ "hostile", "ally" ],
"flags": [ "SILENT", "NO_FAIL", "RANDOM_DURATION", "RANDOM_DAMAGE", "NO_EXPLOSION_SFX" ],
"spell_class": "LILIN_TRAITS",
@@ -214,6 +297,7 @@
"name": "Neither Sleep Nor Slumber",
"description": "Spend ruach to alleviate your sleepiness.",
"message": "",
+ "teachable": false,
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_FAIL" ],
"spell_class": "LILIN_TRAITS",
@@ -232,6 +316,7 @@
"name": "Thick Clouds A Covering",
"description": "Manipulate the weather, pulling the water from the air and cause a thick fog to form and blanket the countryside. Activate again to release your hold on the weather.",
"message": "",
+ "teachable": false,
"valid_targets": [ "self" ],
"flags": [ "SILENT", "RANDOM_DURATION", "NO_FAIL" ],
"spell_class": "LILIN_TRAITS",
@@ -260,6 +345,7 @@
"name": "Reaping the Whirlwind",
"description": "Spend some ruach to greatly enhance your speed for a short period of time.",
"message": "",
+ "teachable": false,
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_FAIL", "SOMATIC" ],
"spell_class": "LILIN_TRAITS",
@@ -277,8 +363,10 @@
"id": "lilin_strix_leap_spell",
"name": "Strix Leap",
"description": "You squat down, build up tension in your legs, then with a mighty beat of your wings, you leap.",
+ "message": "",
"valid_targets": [ "ground" ],
"flags": [ "SILENT", "NO_LEGS", "NO_HANDS", "NO_EXPLOSION_SFX" ],
+ "teachable": false,
"skill": "deduction",
"effect": "dash",
"shape": "cone",
@@ -295,6 +383,7 @@
"name": "The Moon to Rule the Night",
"description": "At night under the moon, you can greatly speed your healing, knitting together grievous wounds in moments. This requires direct moonlight; clouds, rain, or being indoors will prevent this power from working.",
"message": "",
+ "teachable": false,
"valid_targets": [ "self" ],
"flags": [ "SILENT", "NO_PROJECTILE", "NO_FAIL", "SOMATIC" ],
"spell_class": "LILIN_TRAITS",
diff --git a/data/mods/Xedra_Evolved/ter_transforms/arvore_ter_transforms.json b/data/mods/Xedra_Evolved/ter_transforms/arvore_ter_transforms.json
index ca5bb48f5fd5d..23ab1fb17c93a 100644
--- a/data/mods/Xedra_Evolved/ter_transforms/arvore_ter_transforms.json
+++ b/data/mods/Xedra_Evolved/ter_transforms/arvore_ter_transforms.json
@@ -73,7 +73,7 @@
{
"result": [ "t_triffid_wood_wall" ],
"valid_terrain": [ "t_triffid_bark_wall" ],
- "message": "The wooden wall shudders as as the bark peels off in sheets, eventually becoming a solid expanse of bare wood."
+ "message": "The wooden wall shudders as the bark peels off in sheets, eventually becoming a solid expanse of bare wood."
},
{
"result": [ "t_triffid_bark_wall" ],
diff --git a/data/mods/dda_tutorial/mapgen.json b/data/mods/dda_tutorial/mapgen.json
index 2085950ad0acb..2077c2d5090b1 100644
--- a/data/mods/dda_tutorial/mapgen.json
+++ b/data/mods/dda_tutorial/mapgen.json
@@ -89,7 +89,7 @@
"Ŗ": { "item": "uzimag", "chance": 100 },
"Ř": { "item": "9mm", "chance": 100 },
"$": { "item": "backpack", "chance": 100 },
- "@": [ { "item": "light_battery_cell", "chance": 100 }, { "item": "flashlight", "chance": 100 } ],
+ "@": [ { "item": "flashlight", "chance": 100 } ],
"%": { "item": "helmet_ball", "chance": 100 },
"^": { "item": "mask_dust", "chance": 100 },
"*": { "item": "paint_brush", "chance": 100 },
@@ -97,7 +97,7 @@
"_": { "item": "codeine", "chance": 100 },
"C": [ { "item": "peanutbutter", "chance": 100 }, { "item": "crackers", "chance": 100, "repeat": 2 } ]
},
- "items": { "(": { "item": "paint_tutorial", "chance": 100 } },
+ "items": { "(": { "item": "paint_tutorial", "chance": 100 }, "@": { "item": "fully_loaded_medium_battery", "chance": 100 } },
"monster": { "d": { "monster": "mon_dummy_tutorial" } },
"traps": {
"1": "tr_tutorial_1",
@@ -122,6 +122,11 @@
"id": "fully_loaded_lighter",
"items": [ { "item": "lighter", "prob": 100, "charges": 100 } ]
},
+ {
+ "type": "item_group",
+ "id": "fully_loaded_medium_battery",
+ "items": [ { "item": "medium_battery_cell", "prob": 100, "charges": 56 } ]
+ },
{
"type": "item_group",
"id": "paint_tutorial",
diff --git a/data/mods/dda_tutorial/traps.json b/data/mods/dda_tutorial/traps.json
index f03fd0d37e7ae..fbde1d879a8be 100644
--- a/data/mods/dda_tutorial/traps.json
+++ b/data/mods/dda_tutorial/traps.json
@@ -193,7 +193,7 @@
"id": "EOC_LESSON_FLASHLIGHT",
"effect": [
{
- "u_message": "There is a flashlight and a light disposable battery lying on the rack. Flashlights are very useful tools as they allow you to see in the dark.\n\nTo continue the tutorial, please reload the flashlight by pressing . Take it with you and move to the stairs.",
+ "u_message": "There is a flashlight and a medium battery lying on the rack. Flashlights are very useful tools as they allow you to see in the dark.\n\nTo continue the tutorial, please reload the flashlight by pressing . Take it with you and move to the stairs.",
"popup": true,
"popup_flag": "PF_ON_TOP"
}
diff --git a/doc/MAPGEN.md b/doc/MAPGEN.md
index 9024402d4d1a3..cdb182236fc19 100644
--- a/doc/MAPGEN.md
+++ b/doc/MAPGEN.md
@@ -1525,7 +1525,7 @@ update_mapgen updates an existing overmap tile. These fields provide a way to s
### "assign_mission_target"
assign_mission_target assigns an overmap tile as the target of a mission. Any update_mapgen in the same scope will
-update that overmap tile. The closet overmap terrain with the required terrain ID will be used, and if there is no
+update that overmap tile. The closest overmap terrain with the required terrain ID will be used, and if there is no
matching terrain, an overmap special of om_special type will be created and then the om_terrain within that special will
be used.
diff --git a/lang/update_pot.sh b/lang/update_pot.sh
index 21a47a3d5f999..1a8742fc8ae9c 100755
--- a/lang/update_pot.sh
+++ b/lang/update_pot.sh
@@ -47,6 +47,7 @@ if ! lang/extract_json_strings.py \
-X data/json/npcs/TALK_TEST.json \
-X data/core/sentinels.json \
-X data/raw/color_templates/no_bright_background.json \
+ -X data/mods/Magiclysm/Spells/debug.json \
-D data/mods/BlazeIndustries \
-D data/mods/desert_region \
-n "$package $version" \
diff --git a/src/action.h b/src/action.h
index 595d725d824e8..27abf0e7d7120 100644
--- a/src/action.h
+++ b/src/action.h
@@ -480,7 +480,7 @@ std::optional choose_adjacent_bub( const std::string &message,
std::optional choose_adjacent( const tripoint &pos, const std::string &message,
bool allow_vertical = false );
std::optional choose_adjacent( const tripoint_bub_ms &pos,
- const std::string &message, bool allow_vertical = false, int timeout = -1,
+ const std::string &message, bool allow_vertical = false, int timeout = 50,
const std::function>(
const input_context &ctxt, const std::string &action )> &action_cb = nullptr );
@@ -509,7 +509,7 @@ std::optional choose_adjacent( const tripoint_bub_ms &pos,
std::optional choose_direction( const std::string &message,
bool allow_vertical = false );
std::optional choose_direction_rel_ms( const std::string &message,
- bool allow_vertical = false, bool allow_mouse = false, int timeout = -1,
+ bool allow_vertical = false, bool allow_mouse = false, int timeout = 50,
const std::function>(
const input_context &ctxt, const std::string &action )> &action_cb = nullptr );
diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp
index 15fed643bed0f..af7b7f6c12bcc 100644
--- a/src/activity_actor.cpp
+++ b/src/activity_actor.cpp
@@ -3768,7 +3768,7 @@ void craft_activity_actor::do_turn( player_activity &act, Character &crafter )
const double cur_total_moves = cached_cur_total_moves;
// item_counter represents the percent progress relative to the base batch time
- // stored precise to 5 decimal places ( e.g. 67.32 percent would be stored as 6'732'000 )
+ // stored precise to 5 decimal places ( e.g. 67.32 percent would be stored as 6732000 )
const int old_counter = craft.item_counter;
// Delta progress in moves adjusted for current crafting speed /
@@ -3777,21 +3777,21 @@ void craft_activity_actor::do_turn( player_activity &act, Character &crafter )
exertion_level() );
const double delta_progress = spent_moves * base_total_moves / cur_total_moves;
// Current progress in moves
- const double current_progress = craft.item_counter * base_total_moves / 10'000'000.0 +
+ const double current_progress = craft.item_counter * base_total_moves / 10000000.0 +
delta_progress;
// Current progress as a percent of base_total_moves to 2 decimal places
- craft.item_counter = std::round( current_progress / base_total_moves * 10'000'000.0 );
+ craft.item_counter = std::round( current_progress / base_total_moves * 10000000.0 );
crafter.set_moves( 0 );
// This is to ensure we don't over count skill steps
- craft.item_counter = std::min( craft.item_counter, 10'000'000 );
+ craft.item_counter = std::min( craft.item_counter, 10000000 );
// This nominal craft time is also how many practice ticks to perform
// spread out evenly across the actual duration.
const double total_practice_ticks = rec.time_to_craft_moves( crafter,
recipe_time_flag::ignore_proficiencies ) / 100.0;
- const int ticks_per_practice = 10'000'000.0 / total_practice_ticks;
+ const int ticks_per_practice = 10000000.0 / total_practice_ticks;
int num_practice_ticks = craft.item_counter / ticks_per_practice -
old_counter / ticks_per_practice;
bool level_up = false;
@@ -3799,7 +3799,7 @@ void craft_activity_actor::do_turn( player_activity &act, Character &crafter )
level_up |= crafter.craft_skill_gain( craft, num_practice_ticks );
}
// Proficiencies and tools are gained/consumed after every 5% progress
- int five_percent_steps = craft.item_counter / 500'000 - old_counter / 500'000;
+ int five_percent_steps = craft.item_counter / 500000 - old_counter / 500000;
if( five_percent_steps > 0 ) {
// Divide by 100 for seconds, 20 for 5%
const time_duration pct_time = time_duration::from_seconds( base_total_moves / 2000 );
@@ -3811,14 +3811,14 @@ void craft_activity_actor::do_turn( player_activity &act, Character &crafter )
}
// Unlike skill, tools are consumed once at the start and should not be consumed at the end
- if( craft.item_counter >= 10'000'000 ) {
+ if( craft.item_counter >= 10000000 ) {
--five_percent_steps;
}
if( five_percent_steps > 0 ) {
if( !crafter.craft_consume_tools( craft, five_percent_steps, false ) ) {
// So we don't skip over any tool comsuption
- craft.item_counter -= craft.item_counter % 500'000 + 1;
+ craft.item_counter -= craft.item_counter % 500000 + 1;
craft.erase_var( "crafter" );
crafter.cancel_activity();
return;
@@ -3826,7 +3826,7 @@ void craft_activity_actor::do_turn( player_activity &act, Character &crafter )
}
// if item_counter has reached 100% or more
- if( craft.item_counter >= 10'000'000 ) {
+ if( craft.item_counter >= 10000000 ) {
if( rec.is_practice() && !is_long && craft.get_making_batch_size() == 1 ) {
if( query_yn( _( "Keep practicing until proficiency increases?" ) ) ) {
is_long = true;
@@ -5328,15 +5328,15 @@ void disassemble_activity_actor::do_turn( player_activity &act, Character &who )
}
if( moves_total == 0 ) {
- craft.item_counter = 10'000'000;
+ craft.item_counter = 10000000;
} else {
const int spent_moves = who.get_moves() * who.exertion_adjusted_move_multiplier( exertion_level() );
- craft.item_counter += std::round( spent_moves * crafting_speed * 10'000'000.0 / moves_total );
- craft.item_counter = std::min( craft.item_counter, 10'000'000 );
+ craft.item_counter += std::round( spent_moves * crafting_speed * 10000000.0 / moves_total );
+ craft.item_counter = std::min( craft.item_counter, 10000000 );
who.set_moves( 0 );
}
- if( craft.item_counter >= 10'000'000 ) {
+ if( craft.item_counter >= 10000000 ) {
who.complete_disassemble( target );
}
}
@@ -7372,14 +7372,18 @@ void unload_loot_activity_actor::do_turn( player_activity &act, Character &you )
if( const std::optional ovp = here.veh_at( src_loc ).cargo() ) {
src_veh = &ovp->vehicle();
src_part = ovp->part_index();
- for( item &it : ovp->items() ) {
+ vehicle_stack vp_items = ovp->items();
+ items.reserve( vp_items.size() );
+ for( item &it : vp_items ) {
items.emplace_back( &it, true );
}
} else {
src_veh = nullptr;
src_part = -1;
}
- for( item &it : here.i_at( src_loc ) ) {
+ map_stack map_items = here.i_at( src_loc );
+ items.reserve( items.size() + map_items.size() );
+ for( item &it : map_items ) {
items.emplace_back( &it, false );
}
@@ -7954,11 +7958,13 @@ void wash_activity_actor::finish( player_activity &act, Character &p )
}
std::vector comps;
+ comps.reserve( 2 );
comps.emplace_back( itype_water, requirements.water );
comps.emplace_back( itype_water_clean, requirements.water );
p.consume_items( comps, 1, is_liquid_crafting_component );
std::vector comps1;
+ comps1.reserve( 3 );
comps1.emplace_back( itype_soap, requirements.cleanser );
comps1.emplace_back( itype_detergent, requirements.cleanser );
comps1.emplace_back( itype_liquid_soap, requirements.cleanser );
diff --git a/src/advanced_inv.cpp b/src/advanced_inv.cpp
index bdfa58256d841..1e3b02b755c76 100644
--- a/src/advanced_inv.cpp
+++ b/src/advanced_inv.cpp
@@ -1189,6 +1189,8 @@ bool advanced_inventory::move_all_items()
} else if( dpane.get_area() == AIM_INVENTORY ) {
std::vector target_items;
std::vector quantities;
+ target_items.reserve( pane_items.size() );
+ quantities.reserve( pane_items.size() );
for( const drop_or_stash_item_info &drop : pane_items ) {
target_items.emplace_back( drop.loc() );
// quantity of 0 means move all
@@ -1207,6 +1209,8 @@ bool advanced_inventory::move_all_items()
std::vector target_items;
std::vector quantities;
+ target_items.reserve( pane_items.size() );
+ quantities.reserve( pane_items.size() );
for( const drop_or_stash_item_info &drop : pane_items ) {
target_items.emplace_back( drop.loc() );
// quantity of 0 means move all
diff --git a/src/animation.cpp b/src/animation.cpp
index 29e7a9d22dd18..bae2989e1aeae 100644
--- a/src/animation.cpp
+++ b/src/animation.cpp
@@ -50,7 +50,7 @@ class basic_animation
{
public:
explicit basic_animation( const int scale ) :
- delay( get_option( "ANIMATION_DELAY" ) * scale * 1'000'000L ) {
+ delay( get_option( "ANIMATION_DELAY" ) * scale * 1000000L ) {
}
void draw() const {
@@ -71,7 +71,7 @@ class basic_animation
do {
const auto sleep_for = std::min( sleep_till - std::chrono::steady_clock::now(),
// Pump events every 100 ms
- std::chrono::nanoseconds( 100'000'000 ) );
+ std::chrono::nanoseconds( 100000000 ) );
if( sleep_for > std::chrono::nanoseconds( 0 ) ) {
std::this_thread::sleep_for( sleep_for );
inp_mngr.pump_events();
@@ -771,6 +771,7 @@ void game::draw_line( const tripoint &p, const tripoint ¢er,
}
std::vector temp;
+ temp.reserve( points.size() );
for( const tripoint &it : points ) {
const tripoint_bub_ms tmp = tripoint_bub_ms( it );
temp.push_back( tmp );
diff --git a/src/armor_layers.cpp b/src/armor_layers.cpp
index 328abab2f7c1a..9f7a5a18e950f 100644
--- a/src/armor_layers.cpp
+++ b/src/armor_layers.cpp
@@ -333,6 +333,7 @@ std::vector> collect_protection_subvalues(
const bool display_median, const damage_type_id &type )
{
std::vector> subvalues;
+ subvalues.reserve( 2 + ( display_median ? 1 : 0 ) );
subvalues.emplace_back( _( "Worst:" ), string_format( "%.2f",
worst_res.type_resist( type ) ) );
if( display_median ) {
diff --git a/src/basecamp.cpp b/src/basecamp.cpp
index 6e8abe0506204..36276e18b4428 100644
--- a/src/basecamp.cpp
+++ b/src/basecamp.cpp
@@ -1039,7 +1039,7 @@ void basecamp_action_components::consume_components()
map &target_map = base_.get_camp_map();
avatar &player_character = get_avatar();
std::vector src;
- src.resize( base_.src_set.size() );
+ src.reserve( base_.src_set.size() );
for( const tripoint_abs_ms &p : base_.src_set ) {
src.emplace_back( target_map.bub_from_abs( p ).raw() );
}
diff --git a/src/character.cpp b/src/character.cpp
index 81529b3e238e1..d3def233ed518 100644
--- a/src/character.cpp
+++ b/src/character.cpp
@@ -582,10 +582,10 @@ Character::Character() :
update_type_of_scent( true );
pkill = 0;
// 55 Mcal or 55k kcal
- healthy_calories = 55'000'000;
+ healthy_calories = 55000000;
base_cardio_acc = 1000;
// this makes sure characters start with normal bmi
- stored_calories = healthy_calories - 1'000'000;
+ stored_calories = healthy_calories - 1000000;
initialize_stomach_contents();
name.clear();
@@ -1810,6 +1810,7 @@ void Character::forced_dismount()
mon->mounted_player = nullptr;
}
std::vector valid;
+ valid.reserve( 8 );
for( const tripoint_bub_ms &jk : get_map().points_in_radius( pos_bub(), 1 ) ) {
if( g->is_empty( jk ) ) {
valid.push_back( jk );
@@ -7530,6 +7531,7 @@ void Character::vomit()
tripoint Character::adjacent_tile() const
{
std::vector ret;
+ ret.reserve( 4 );
int dangerous_fields = 0;
map &here = get_map();
creature_tracker &creatures = get_creature_tracker();
diff --git a/src/character_inventory.cpp b/src/character_inventory.cpp
index 197304323e004..c6fc7ec571c56 100644
--- a/src/character_inventory.cpp
+++ b/src/character_inventory.cpp
@@ -525,6 +525,7 @@ std::vector Character::all_items_loc()
std::vector outfit::top_items_loc( Character &guy )
{
std::vector ret;
+ ret.reserve( worn.size() );
for( item &worn_it : worn ) {
item_location worn_loc( guy, &worn_it );
ret.push_back( worn_loc );
@@ -625,6 +626,8 @@ void Character::pick_up( const drop_locations &what )
//todo: refactor pickup_activity_actor to just use drop_locations, also rename drop_locations
std::vector items;
std::vector quantities;
+ items.reserve( what.size() );
+ quantities.reserve( what.size() );
for( const drop_location &dl : what ) {
items.emplace_back( dl.first );
quantities.emplace_back( dl.second );
diff --git a/src/color.cpp b/src/color.cpp
index b7d3cad09f507..f5c5c6347071d 100644
--- a/src/color.cpp
+++ b/src/color.cpp
@@ -841,6 +841,7 @@ void color_manager::show_gui()
point iOffset;
std::vector vLines;
+ vLines.reserve( 2 );
vLines.push_back( -1 );
vLines.push_back( 48 );
diff --git a/src/computer_session.cpp b/src/computer_session.cpp
index 4819d5aa26402..441d6dfc5a3db 100644
--- a/src/computer_session.cpp
+++ b/src/computer_session.cpp
@@ -1634,13 +1634,10 @@ void computer_session::failure_manhacks()
void computer_session::failure_secubots()
{
- int num_robots = 1;
const tripoint_range range =
get_map().points_in_radius( get_player_character().pos(), 3 );
- for( int i = 0; i < num_robots; i++ ) {
- if( g->place_critter_within( mon_secubot, range ) ) {
- add_msg( m_warning, _( "Secubots emerge from compartments in the floor." ) );
- }
+ if( g->place_critter_within( mon_secubot, range ) ) {
+ add_msg( m_warning, _( "A secubot emerges from a compartment in the floor." ) );
}
}
diff --git a/src/crafting_gui.cpp b/src/crafting_gui.cpp
index 64a6e49a08b56..cb6da5041bb1a 100644
--- a/src/crafting_gui.cpp
+++ b/src/crafting_gui.cpp
@@ -1594,7 +1594,12 @@ std::pair select_crafter_and_crafting_recipe( int &
static_popup popup;
std::chrono::steady_clock::time_point last_update = std::chrono::steady_clock::now();
static constexpr std::chrono::milliseconds update_interval( 500 );
-
+ // Get a key description for the cancel button.
+ // Rather than propagating the context, create a new one here as a one-off.
+ // See register_action( "QUIT" ) in recipe_dictionary.cpp (line 289 when this was commited).
+ input_context dummy;
+ dummy.register_action( "QUIT" );
+ std::string cancel_btn = dummy.get_button_text( "QUIT", _( "Cancel" ) );
std::function progress_callback =
[&]( size_t at, size_t out_of ) {
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
@@ -1603,7 +1608,7 @@ std::pair select_crafter_and_crafting_recipe( int &
}
last_update = now;
double percent = 100.0 * at / out_of;
- popup.message( _( "Searching… %3.0f%%\n" ), percent );
+ popup.message( _( "Searching… %3.0f%%\n%s\n" ), percent, cancel_btn );
ui_manager::redraw();
refresh_display();
inp_mngr.pump_events();
diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp
index 3b43c517d0d9b..fb78686cfdc49 100644
--- a/src/debug_menu.cpp
+++ b/src/debug_menu.cpp
@@ -545,6 +545,7 @@ static void monster_ammo_edit( monster &mon )
char hotkey = 'a';
const auto &ammo_map = mon.type->starting_ammo;
std::vector ammos;
+ ammos.reserve( ammo_map.size() );
for( const std::pair &pair : ammo_map ) {
ammos.emplace_back( pair.first );
const itype *display_type = item::find_type( pair.first );
@@ -1068,7 +1069,6 @@ static std::optional debug_menu_uilist( bool display_all_entri
// sense and can be auto–sized.
uilist debug = uilist();
debug.text = msg;
- debug.desired_bounds = { -1.0, -1.0, 0.5, 0.5 };
debug.entries = menu;
debug.query();
const int group = debug.ret;
@@ -3223,7 +3223,6 @@ static void debug_menu_force_temperature()
int ret = pop.title( string_format( _( "Set temperature to? [%s]" ), unit ) )
.width( 20 )
.text( current ? std::to_string( *current ) : "" )
- .only_digits( true )
.query_int();
return pop.canceled() ? current : std::optional( static_cast( ret ) );
diff --git a/src/do_turn.cpp b/src/do_turn.cpp
index a017882f17f2c..744ec116531b9 100644
--- a/src/do_turn.cpp
+++ b/src/do_turn.cpp
@@ -714,7 +714,9 @@ bool do_turn()
// Avoid redrawing the main UI every time due to invalidation
ui_adaptor dummy( ui_adaptor::disable_uis_below {} );
- g->wait_popup = std::make_unique();
+ if( !g->wait_popup ) {
+ g->wait_popup = std::make_unique();
+ }
g->wait_popup->on_top( true ).wait_message( "%s", wait_message );
ui_manager::redraw();
refresh_display();
diff --git a/src/effect.cpp b/src/effect.cpp
index 56d792c769ce7..2a5bf8bc819e5 100644
--- a/src/effect.cpp
+++ b/src/effect.cpp
@@ -891,6 +891,7 @@ std::string effect::disp_desc( bool reduced ) const
std::vector uncommon;
std::vector rare;
std::vector values;
+ values.reserve( 9 ); // Pre-allocate space for each value.
// Add various desc_freq structs to values. If more effects wish to be placed in the descriptions this is the
// place to add them.
int val = 0;
diff --git a/src/faction_camp.cpp b/src/faction_camp.cpp
index 2fa30bd8f0ded..60f03342bbe54 100644
--- a/src/faction_camp.cpp
+++ b/src/faction_camp.cpp
@@ -1613,6 +1613,7 @@ void basecamp::choose_new_leader()
return;
}
std::vector choices;
+ choices.reserve( 3 );
int choice = 0;
choices.emplace_back _( "autocratic" );
choices.emplace_back _( "sortition" );
@@ -4448,6 +4449,7 @@ void basecamp::recruit_return( const mission_id &miss_id, int score )
description += _( "Select an option:" );
std::vector rec_options;
+ rec_options.reserve( 4 );
rec_options.emplace_back( _( "Increase Food" ) );
rec_options.emplace_back( _( "Decrease Food" ) );
rec_options.emplace_back( _( "Make Offer" ) );
@@ -5120,6 +5122,7 @@ void om_range_mark( const tripoint_abs_omt &origin, int range, bool add_notes,
note_pts.emplace_back( pos );
}
} else {
+ note_pts.reserve( range * 4 - 4 );
//North Limit
for( int x = origin.x() - range; x < origin.x() + range + 1; x++ ) {
note_pts.emplace_back( x, origin.y() - range, origin.z() );
diff --git a/src/font_loader.cpp b/src/font_loader.cpp
index 47dea9618e1fb..d70b42638f0f3 100644
--- a/src/font_loader.cpp
+++ b/src/font_loader.cpp
@@ -28,9 +28,6 @@ void font_loader::load_throws( const cata_path &path )
} else {
config.read( "gui_typeface", gui_typeface );
}
- if( gui_typeface.empty() ) {
- gui_typeface.emplace_back( PATH_INFO::fontdir() + "Roboto-Medium.ttf" );
- }
if( config.has_string( "map_typeface" ) ) {
map_typeface.emplace_back( config.get_string( "map_typeface" ) );
} else {
@@ -61,6 +58,7 @@ void font_loader::save( const cata_path &path ) const
JsonOut json( stream, true ); // pretty-print
json.start_object();
json.member( "typeface", typeface );
+ json.member( "gui_typeface", typeface );
json.member( "map_typeface", map_typeface );
json.member( "overmap_typeface", overmap_typeface );
json.end_object();
diff --git a/src/game.cpp b/src/game.cpp
index 960416b44e2b9..281f50c59a667 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -2958,6 +2958,7 @@ void end_screen_ui_impl::draw_controls()
}
if( art.is_valid() ) {
+ cataimgui::PushMonoFont();
int row = 1;
for( const std::string &line : art->picture ) {
cataimgui::draw_colored_text( line );
@@ -2971,10 +2972,12 @@ void end_screen_ui_impl::draw_controls()
}
row++;
}
+ ImGui::PopFont();
}
if( !input_label.empty() ) {
ImGui::NewLine();
+ ImGui::AlignTextToFramePadding();
cataimgui::draw_colored_text( input_label );
ImGui::SameLine( str_width_to_pixels( input_label.size() + 2 ), 0 );
ImGui::InputText( "##LAST_WORD_BOX", text.data(), text.size() );
@@ -4544,7 +4547,8 @@ void game::mon_info_update( )
mon_dist,
u.controlling_vehicle ) == rule_state::BLACKLISTED;
} else {
- need_processing = MATT_ATTACK == matt || MATT_FOLLOW == matt;
+ need_processing = MATT_ATTACK == matt || ( MATT_FOLLOW == matt &&
+ critter.get_dest() == u.get_location() );
}
if( need_processing ) {
if( index < 8 && critter.sees( get_player_character() ) ) {
@@ -5111,7 +5115,9 @@ monster *game::place_critter_within( const mtype_id &id, const tripoint_range( id ), range );
+ shared_ptr_fast mon = make_shared_fast( id );
+ mon->ammo = mon->type->starting_ammo;
+ return place_critter_within( mon, range );
}
monster *game::place_critter_within( const shared_ptr_fast &mon,
@@ -7914,6 +7920,7 @@ std::vector game::find_nearby_items( int iRadius )
}
}
+ ret.reserve( item_order.size() );
for( auto &elem : item_order ) {
ret.push_back( temp_items[elem] );
}
@@ -8170,6 +8177,7 @@ void game::reset_item_list_state( const catacurses::window &window, int height,
shortcut_print( window, point( getmaxx( window ) - letters, 0 ), c_white, c_light_green, sSort );
std::vector tokens;
+ tokens.reserve( 5 + ( !sFilter.empty() ? 1 : 0 ) );
if( !sFilter.empty() ) {
tokens.emplace_back( _( "eset" ) );
}
diff --git a/src/init.cpp b/src/init.cpp
index cffe481635ece..726bb4ffeeb6c 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -558,7 +558,7 @@ void DynamicDataLoader::load_mod_data_from_path( const cata_path &path, const st
// if give path is a directory
if( dir_exist( path.get_unrelative_path() ) ) {
const std::vector dir_files = get_files_from_path_with_path_exclusion( ".json",
- "mod_interactions", path, true, false );
+ "mod_interactions", path, true, true );
files.insert( files.end(), dir_files.begin(), dir_files.end() );
// if given path is an individual file
} else if( file_exist( path.get_unrelative_path() ) ) {
diff --git a/src/inventory.cpp b/src/inventory.cpp
index b58a76d440e20..7dd4ddd1dfe3e 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -133,6 +133,7 @@ inventory::inventory() = default;
invslice inventory::slice()
{
invslice stacks;
+ stacks.reserve( items.size() );
for( auto &elem : items ) {
stacks.push_back( &elem );
}
@@ -142,6 +143,7 @@ invslice inventory::slice()
const_invslice inventory::const_slice() const
{
const_invslice stacks;
+ stacks.reserve( items.size() );
for( const auto &item : items ) {
stacks.push_back( &item );
}
diff --git a/src/item.cpp b/src/item.cpp
index 9b791a9a7e605..d84bf50f1e6cb 100644
--- a/src/item.cpp
+++ b/src/item.cpp
@@ -173,13 +173,9 @@ static const itype_id itype_blood( "blood" );
static const itype_id itype_brass_catcher( "brass_catcher" );
static const itype_id itype_bullet_crossbow( "bullet_crossbow" );
static const itype_id itype_cash_card( "cash_card" );
-static const itype_id itype_cig_butt( "cig_butt" );
-static const itype_id itype_cig_lit( "cig_lit" );
-static const itype_id itype_cigar_butt( "cigar_butt" );
-static const itype_id itype_cigar_lit( "cigar_lit" );
static const itype_id itype_disassembly( "disassembly" );
static const itype_id itype_hand_crossbow( "hand_crossbow" );
-static const itype_id itype_joint_roach( "joint_roach" );
+static const itype_id itype_joint_lit( "joint_lit" );
static const itype_id itype_null( "null" );
static const itype_id itype_power_cord( "power_cord" );
static const itype_id itype_rad_badge( "rad_badge" );
@@ -9750,7 +9746,8 @@ std::string item::get_book_skill() const
bool item::is_map() const
{
- return get_category_shallow().get_id() == item_category_maps;
+ return get_category_shallow().get_id() == item_category_maps ||
+ type->use_methods.count( "reveal_map" );
}
bool item::seal()
@@ -10780,8 +10777,9 @@ int item::gun_range( bool with_ammo ) const
range_multiplier *= mod->type->gunmod->range_multiplier;
}
if( with_ammo && has_ammo() ) {
- ret += ammo_data()->ammo->range;
- range_multiplier *= ammo_data()->ammo->range_multiplier;
+ const itype *ammo_info = ammo_data();
+ ret += ammo_info->ammo->range;
+ range_multiplier *= ammo_info->ammo->range_multiplier;
}
ret *= range_multiplier;
return std::min( std::max( 0, ret ), RANGE_HARD_CAP );
@@ -11207,7 +11205,7 @@ bool item::has_ammo() const
}
if( is_magazine() ) {
- return !contents.empty();
+ return !contents.empty() && contents.first_ammo().has_ammo();
}
auto mods = is_gun() ? gunmods() : toolmods();
@@ -11232,7 +11230,7 @@ bool item::has_ammo_data() const
}
if( is_magazine() ) {
- return !contents.empty();
+ return !contents.empty() && contents.first_ammo().has_ammo_data();
}
auto mods = is_gun() ? gunmods() : toolmods();
@@ -13436,24 +13434,38 @@ bool item::process_litcig( map &here, Character *carrier, const tripoint &pos )
// cig dies out
if( item_counter == 0 ) {
if( carrier != nullptr ) {
- carrier->add_msg_if_player( m_neutral, _( "You finish your %s." ), tname() );
- }
- if( typeId() == itype_cig_lit ) {
- convert( itype_cig_butt, carrier );
- } else if( typeId() == itype_cigar_lit ) {
- convert( itype_cigar_butt, carrier );
- } else { // joint
- convert( itype_joint_roach, carrier );
- if( carrier != nullptr ) {
- carrier->add_effect( effect_weed_high, 1_minutes ); // one last puff
- here.add_field( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), field_type_id( "fd_weedsmoke" ), 2 );
- weed_msg( *carrier );
- }
+ carrier->add_msg_if_player( m_neutral, _( "You finish your %s." ), type_name() );
+ }
+ if( type->revert_to ) {
+ convert( *type->revert_to, carrier );
+ } else {
+ type->invoke( carrier, *this, pos, "transform" );
+ }
+ if( typeId() == itype_joint_lit && carrier != nullptr ) {
+ carrier->add_effect( effect_weed_high, 1_minutes ); // one last puff
+ here.add_field( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), field_type_id( "fd_weedsmoke" ), 2 );
+ weed_msg( *carrier );
}
active = false;
return false;
}
+ if( carrier != nullptr ) {
+ // No lit cigs in inventory, only in hands or in mouth
+ // So if we're taking cig off or unwielding it, extinguish it first
+ if( !carrier->is_worn( *this ) && !carrier->is_wielding( *this ) ) {
+ if( type->revert_to ) {
+ carrier->add_msg_if_player( m_neutral, _( "You extinguish your %s and put it away." ),
+ type_name() );
+ convert( *type->revert_to, carrier );
+ } else {
+ type->invoke( carrier, *this, pos, "transform" );
+ }
+ active = false;
+ return false;
+ }
+ }
+
if( !one_in( 10 ) ) {
return false;
}
@@ -13470,7 +13482,7 @@ bool item::process_litcig( map &here, Character *carrier, const tripoint &pos )
} else if( carrier->has_trait( trait_LIGHTWEIGHT ) ) {
duration = 30_seconds;
}
- carrier->add_msg_if_player( m_neutral, _( "You take a puff of your %s." ), tname() );
+ carrier->add_msg_if_player( m_neutral, _( "You take a puff of your %s." ), type_name() );
if( has_flag( flag_TOBACCO ) ) {
carrier->add_effect( effect_cig, duration );
} else {
@@ -13481,14 +13493,14 @@ bool item::process_litcig( map &here, Character *carrier, const tripoint &pos )
if( ( carrier->has_effect( effect_shakes ) && one_in( 10 ) ) ||
( carrier->has_trait( trait_JITTERY ) && one_in( 200 ) ) ) {
carrier->add_msg_if_player( m_bad, _( "Your shaking hand causes you to drop your %s." ),
- tname() );
+ type_name() );
here.add_item_or_charges( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), *this );
return true; // removes the item that has just been added to the map
}
if( carrier->has_effect( effect_sleep ) ) {
carrier->add_msg_if_player( m_bad, _( "You fall asleep and drop your %s." ),
- tname() );
+ type_name() );
here.add_item_or_charges( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), *this );
return true; // removes the item that has just been added to the map
}
@@ -13569,22 +13581,10 @@ bool item::process_extinguish( map &here, Character *carrier, const tripoint &po
}
}
- // cig dies out
- if( has_flag( flag_LITCIG ) ) {
- if( typeId() == itype_cig_lit ) {
- convert( itype_cig_butt, carrier );
- } else if( typeId() == itype_cigar_lit ) {
- convert( itype_cigar_butt, carrier );
- } else { // joint
- convert( itype_joint_roach, carrier );
- }
- } else { // transform (lit) items
- if( type->revert_to ) {
- convert( *type->revert_to, carrier );
- } else {
- type->invoke( carrier, *this, pos, "transform" );
- }
-
+ if( type->revert_to ) {
+ convert( *type->revert_to, carrier );
+ } else {
+ type->invoke( carrier, *this, pos, "transform" );
}
active = false;
// Item remains
diff --git a/src/iuse.cpp b/src/iuse.cpp
index 2e90c6635e725..d466514d4179c 100644
--- a/src/iuse.cpp
+++ b/src/iuse.cpp
@@ -595,7 +595,7 @@ std::optional iuse::smoking( Character *p, item *it, const tripoint & )
// If we're here, we better have a cig to light.
p->use_charges_if_avail( itype_fire, 1 );
cig.active = true;
- p->inv->add_item( cig, false, true );
+ p->wear_item( cig, false );
p->add_msg_if_player( m_neutral, _( "You light a %s." ), it->tname() );
// Parting messages
@@ -4390,6 +4390,7 @@ std::optional iuse::vibe( Character *p, item *it, const tripoint & )
std::optional iuse::vortex( Character *p, item *it, const tripoint & )
{
std::vector spawn;
+ spawn.reserve( 28 );
for( int i = -3; i <= 3; i++ ) {
spawn.emplace_back( -3, i );
spawn.emplace_back( +3, i );
@@ -5813,6 +5814,7 @@ std::optional iuse::einktabletpc( Character *p, item *it, const tripoint &
return std::nullopt;
}
std::vector targets;
+ targets.reserve( locs.size() );
for( const auto& [item_loc, count] : locs ) {
targets.emplace_back( item_loc );
}
@@ -9144,6 +9146,7 @@ std::optional iuse::ebooksave( Character *p, item *it, const tripoint & )
return std::nullopt;
}
std::vector books;
+ books.reserve( to_scan.size() );
for( const auto &pair : to_scan ) {
books.push_back( pair.first );
}
diff --git a/src/iuse_actor.cpp b/src/iuse_actor.cpp
index bb773fe8587ee..8b8ff6beaf657 100644
--- a/src/iuse_actor.cpp
+++ b/src/iuse_actor.cpp
@@ -3034,7 +3034,7 @@ std::pair repair_item_actor::repair_chance(
break;
default:
// 5 is obsoleted reinforcing, remove after 0.H
- action_difficulty = 1'000'000; // ensure failure
+ action_difficulty = 1000000; // ensure failure
break;
}
diff --git a/src/iuse_software_kitten.cpp b/src/iuse_software_kitten.cpp
index 1bdda570c53f8..d89960bb48d52 100644
--- a/src/iuse_software_kitten.cpp
+++ b/src/iuse_software_kitten.cpp
@@ -288,11 +288,11 @@ void robot_finds_kitten::process_input()
refresh_display();
// Sleep for 1 s
const auto sleep_till = std::chrono::steady_clock::now()
- + std::chrono::nanoseconds( 1'000'000'000 );
+ + std::chrono::nanoseconds( 1000000000 );
do {
const auto sleep_for = std::min( sleep_till - std::chrono::steady_clock::now(),
// Pump events every 100 ms
- std::chrono::nanoseconds( 100'000'000 ) );
+ std::chrono::nanoseconds( 100000000 ) );
if( sleep_for > std::chrono::nanoseconds( 0 ) ) {
std::this_thread::sleep_for( sleep_for );
inp_mngr.pump_events();
diff --git a/src/iuse_software_sokoban.cpp b/src/iuse_software_sokoban.cpp
index 5bb27e425fb04..b658ac610c1f6 100644
--- a/src/iuse_software_sokoban.cpp
+++ b/src/iuse_software_sokoban.cpp
@@ -246,6 +246,7 @@ int sokoban_game::start_game()
draw_border( w_sokoban, BORDER_COLOR, _( "Sokoban" ), hilite( c_white ) );
std::vector shortcuts;
+ shortcuts.reserve( 5 );
shortcuts.emplace_back( _( "<+> next" ) ); // '+': next
shortcuts.emplace_back( _( "<-> prev" ) ); // '-': prev
shortcuts.emplace_back( _( "eset" ) ); // 'r': reset
diff --git a/src/lightmap.cpp b/src/lightmap.cpp
index 905aaefa5435a..f65c48cf09c55 100644
--- a/src/lightmap.cpp
+++ b/src/lightmap.cpp
@@ -227,16 +227,16 @@ bool map::build_vision_transparency_cache( int zlev )
}
}
+ memcpy( &vision_transparency_cache, &transparency_cache, sizeof( transparency_cache ) );
+
// This segment handles blocking vision through TRANSLUCENT flagged terrain.
+ // We don't need to deal with cache dirtying, because that was handled when the terrain was changed.
for( const tripoint_bub_ms &loc : points_in_radius( p, MAX_VIEW_DISTANCE ) ) {
if( map::ter( loc ).obj().has_flag( ter_furn_flag::TFLAG_TRANSLUCENT ) && loc != p ) {
- dirty |= vision_transparency_cache[loc.x()][loc.y()] != LIGHT_TRANSPARENCY_SOLID;
- solid_tiles.emplace_back( loc );
+ vision_transparency_cache[loc.x()][loc.y()] = LIGHT_TRANSPARENCY_SOLID;
}
}
- memcpy( &vision_transparency_cache, &transparency_cache, sizeof( transparency_cache ) );
-
// The tile player is standing on should always be visible
if( inbounds( p ) ) {
vision_transparency_cache[p.x()][p.y()] = LIGHT_TRANSPARENCY_OPEN_AIR;
diff --git a/src/magic.cpp b/src/magic.cpp
index c27c5b2eb9bd3..834c415af6e35 100644
--- a/src/magic.cpp
+++ b/src/magic.cpp
@@ -1826,6 +1826,7 @@ std::string spell::list_targeted_monster_names() const
return "";
}
std::vector all_valid_monster_names;
+ all_valid_monster_names.reserve( type->targeted_monster_ids.size() );
for( const mtype_id &mon_id : type->targeted_monster_ids ) {
all_valid_monster_names.emplace_back( mon_id->nname() );
}
@@ -1842,6 +1843,7 @@ std::string spell::list_targeted_species_names() const
return "";
}
std::vector all_valid_species_names;
+ all_valid_species_names.reserve( type->targeted_species_ids.size() );
for( const species_id &specie_id : type->targeted_species_ids ) {
all_valid_species_names.emplace_back( specie_id.str() );
}
@@ -1858,6 +1860,7 @@ std::string spell::list_ignored_species_names() const
return "";
}
std::vector all_valid_species_names;
+ all_valid_species_names.reserve( type->ignored_species_ids.size() );
for( const species_id &species_id : type->ignored_species_ids ) {
all_valid_species_names.emplace_back( species_id.str() );
}
diff --git a/src/map.cpp b/src/map.cpp
index 8f230528c679e..195ae8bdf9495 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -1848,7 +1848,9 @@ bool map::furn_set( const tripoint_bub_ms &p, const furn_id &new_furniture, cons
if( !new_f.emissions.empty() ) {
field_furn_locs.push_back( p );
}
- if( old_f.transparent != new_f.transparent ) {
+ if( old_f.transparent != new_f.transparent ||
+ old_f.has_flag( ter_furn_flag::TFLAG_TRANSLUCENT ) != new_f.has_flag(
+ ter_furn_flag::TFLAG_TRANSLUCENT ) ) {
set_transparency_cache_dirty( p );
set_seen_cache_dirty( p );
}
@@ -2352,7 +2354,9 @@ bool map::ter_set( const tripoint_bub_ms &p, const ter_id &new_terrain, bool avo
if( !new_t.emissions.empty() ) {
field_ter_locs.push_back( p );
}
- if( old_t.transparent != new_t.transparent ) {
+ if( old_t.transparent != new_t.transparent ||
+ old_t.has_flag( ter_furn_flag::TFLAG_TRANSLUCENT ) != new_t.has_flag(
+ ter_furn_flag::TFLAG_TRANSLUCENT ) ) {
set_transparency_cache_dirty( p );
set_seen_cache_dirty( p );
}
@@ -4332,8 +4336,9 @@ void map::bash_ter_furn( const tripoint_bub_ms &p, bash_params ¶ms )
i_clear( p );
}
- if( ( smash_furn && has_flag_furn( ter_furn_flag::TFLAG_FUNGUS, p ) ) ||
- ( smash_ter && has_flag_ter( ter_furn_flag::TFLAG_FUNGUS, p ) ) ) {
+ if( ( ( smash_furn && has_flag_furn( ter_furn_flag::TFLAG_FUNGUS, p ) ) ||
+ ( smash_ter && has_flag_ter( ter_furn_flag::TFLAG_FUNGUS, p ) ) ) &&
+ field_at( p ).find_field( fd_fire ) == nullptr ) {
fungal_effects().create_spores( p );
}
diff --git a/src/map_extras.cpp b/src/map_extras.cpp
index 4c3a8191beebd..bcdb49a0eb748 100644
--- a/src/map_extras.cpp
+++ b/src/map_extras.cpp
@@ -1349,6 +1349,8 @@ static void burned_ground_parser( map &m, const tripoint &loc )
VehicleList vehs = m.get_vehicles();
std::vector vehicles;
std::vector points;
+ vehicles.reserve( vehs.size() );
+ points.reserve( vehs.size() ); // Each vehicle is at least one point.
for( wrapped_vehicle vehicle : vehs ) {
vehicles.push_back( vehicle.v );
// Important that this loop excludes fake parts, because those can be
@@ -1506,6 +1508,8 @@ static bool mx_burned_ground( map &m, const tripoint &abs_sub )
VehicleList vehs = m.get_vehicles();
std::vector vehicles;
std::vector points;
+ vehicles.reserve( vehs.size() );
+ points.reserve( vehs.size() ); // Each vehicle is at least one point.
for( wrapped_vehicle vehicle : vehs ) {
vehicles.push_back( vehicle.v );
std::set occupied = vehicle.v->get_points();
diff --git a/src/mapbuffer.cpp b/src/mapbuffer.cpp
index 0e73c539ceb90..525212df76637 100644
--- a/src/mapbuffer.cpp
+++ b/src/mapbuffer.cpp
@@ -196,6 +196,8 @@ void mapbuffer::save_quad(
{
std::vector offsets;
std::vector submap_addrs;
+ offsets.reserve( 4 );
+ submap_addrs.reserve( 4 );
offsets.push_back( point_zero );
offsets.push_back( point_south );
offsets.push_back( point_east );
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 50c4c71d820e1..d0e813b8922eb 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -5845,6 +5845,7 @@ void map::draw_lab( mapgendata &dat )
}
if( is_ot_match( "stairs", terrain_type, ot_match_type::contains ) ) { // Stairs going down
std::vector stair_points;
+ stair_points.reserve( 8 );
if( tw != 0 ) {
stair_points.emplace_back( SEEX - 1, 2 );
stair_points.emplace_back( SEEX - 1, 2 );
diff --git a/src/martialarts.cpp b/src/martialarts.cpp
index 38053ad16cfac..08f0e89a9e8e7 100644
--- a/src/martialarts.cpp
+++ b/src/martialarts.cpp
@@ -504,7 +504,9 @@ bool string_id::is_valid() const
std::vector all_martialart_types()
{
std::vector result;
- for( const martialart &ma : martialarts.get_all() ) {
+ std::vector martial_arts = martialarts.get_all();
+ result.reserve( martial_arts.size() );
+ for( const martialart &ma : martial_arts ) {
result.push_back( ma.id );
}
return result;
diff --git a/src/memorial_logger.cpp b/src/memorial_logger.cpp
index 792749ddbaf51..6850385ceea96 100644
--- a/src/memorial_logger.cpp
+++ b/src/memorial_logger.cpp
@@ -126,7 +126,9 @@ void memorial_logger::add( const std::string_view male_msg,
return;
}
- const oter_id &cur_ter = overmap_buffer.ter( player_character.global_omt_location() );
+ const oter_id &cur_ter = overmap_buffer.get_overmap_count() == 0 ?
+ oter_id() :
+ overmap_buffer.ter( player_character.global_omt_location() );
const oter_type_str_id cur_oter_type = cur_ter->get_type_id();
const std::string &oter_name = cur_ter->get_name( om_vision_level::full );
diff --git a/src/mission.cpp b/src/mission.cpp
index 733218b929d8b..6b7f357073c18 100644
--- a/src/mission.cpp
+++ b/src/mission.cpp
@@ -406,6 +406,7 @@ void mission::wrap_up()
items, grp_type, matches,
container, itype_null, specific_container_required );
+ comps.reserve( matches.size() );
for( std::pair &cnt : matches ) {
comps.emplace_back( cnt.first, cnt.second );
diff --git a/src/monmove.cpp b/src/monmove.cpp
index 7766c4ed31600..227f04fe8b6db 100644
--- a/src/monmove.cpp
+++ b/src/monmove.cpp
@@ -1593,6 +1593,7 @@ static std::vector get_bashing_zone( const tripoint &bashee, const tri
int maxdepth )
{
std::vector direction;
+ direction.reserve( 2 );
direction.push_back( bashee );
direction.push_back( basher );
// Draw a line from the target through the attacker.
diff --git a/src/monster.cpp b/src/monster.cpp
index e51c6a2dfd1cb..5afd56f73d69d 100644
--- a/src/monster.cpp
+++ b/src/monster.cpp
@@ -554,6 +554,11 @@ void monster::try_upgrade( bool pin_time )
}
}
+void monster::set_baby_timer( const time_point &time )
+{
+ baby_timer.emplace( time );
+}
+
void monster::try_reproduce()
{
if( !reproduces ) {
@@ -1087,6 +1092,10 @@ void monster::print_info_imgui() const
std::vector monster::extended_description() const
{
std::vector tmp;
+ // Reserve the number of elements we know we will need.
+ // Likely we will need more, but it's best to leave that to
+ // exponential growth.
+ tmp.reserve( 12 );
tmp.emplace_back( get_origin( type->src ) );
tmp.emplace_back( "--" );
diff --git a/src/monster.h b/src/monster.h
index f9be4177a9772..61fcc80b7a510 100644
--- a/src/monster.h
+++ b/src/monster.h
@@ -114,6 +114,7 @@ class monster : public Creature
int get_upgrade_time() const;
void allow_upgrade();
void try_upgrade( bool pin_time );
+ void set_baby_timer( const time_point &time );
void try_reproduce();
void try_biosignature();
void refill_udders();
diff --git a/src/morale.cpp b/src/morale.cpp
index 5c8bb42deb2b9..c7f0195d44e9f 100644
--- a/src/morale.cpp
+++ b/src/morale.cpp
@@ -703,6 +703,7 @@ void player_morale::display( int focus_eq, int pain_penalty, int sleepiness_pena
}
std::vector bottom_lines;
+ bottom_lines.reserve( 3 ); // We need at least 3 lines.
bottom_lines.emplace_back( morale_line::separation_line {} );
bottom_lines.emplace_back(
_( "Total morale:" ), get_level(),
diff --git a/src/mutation.cpp b/src/mutation.cpp
index 1b9440d239f51..e99d54d7cccd3 100644
--- a/src/mutation.cpp
+++ b/src/mutation.cpp
@@ -1493,6 +1493,7 @@ bool Character::mutation_selector( const std::vector &prospective_trai
static std::vector get_all_mutation_prereqs( const trait_id &id )
{
std::vector ret;
+ ret.reserve( id->prereqs.size() + id->prereqs2.size() ); // Lower bound on size.
for( const trait_id &it : id->prereqs ) {
ret.push_back( it );
std::vector these_prereqs = get_all_mutation_prereqs( it );
diff --git a/src/mutation_data.cpp b/src/mutation_data.cpp
index daf6055867aab..36cc9cd5e0ab1 100644
--- a/src/mutation_data.cpp
+++ b/src/mutation_data.cpp
@@ -1150,6 +1150,7 @@ shared_ptr_fast mutation_branch::get_group( const
std::vector mutation_branch::get_all_group_names()
{
std::vector rval;
+ rval.reserve( trait_groups.size() );
for( auto &group : trait_groups ) {
rval.push_back( group.first );
}
diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp
index 6546e968e3049..9a6d0b54601ee 100644
--- a/src/newcharacter.cpp
+++ b/src/newcharacter.cpp
@@ -4001,9 +4001,9 @@ void set_description( tab_manager &tabs, avatar &you, const bool allow_reroll,
const auto init_windows = [&]( ui_adaptor & ui ) {
const int freeWidth = TERMX - FULL_SCREEN_WIDTH;
isWide = freeWidth > 15;
- const int beginx2 = 46;
+ const int beginx2 = 52;
const int ncol2 = 40;
- const int beginx3 = TERMX <= 88 ? TERMX - TERMX / 4 : 86;
+ const int beginx3 = TERMX <= 88 ? TERMX - TERMX / 4 : 90;
const int ncol3 = TERMX - beginx3 - 2;
const int beginx4 = TERMX <= 130 ? TERMX - TERMX / 5 : 128;
const int ncol4 = TERMX - beginx4 - 2;
@@ -4026,7 +4026,7 @@ void set_description( tab_manager &tabs, avatar &you, const bool allow_reroll,
w_hobbies = catacurses::newwin( TERMY - 11 - 11, ncol4, point( beginx4, 10 ) );
w_scenario = catacurses::newwin( 1, ncol2, point( beginx2, 3 ) );
w_profession = catacurses::newwin( 1, ncol3, point( beginx3, 3 ) );
- w_skills = catacurses::newwin( TERMY - 11, 23, point( 22, 10 ) );
+ w_skills = catacurses::newwin( TERMY - 11, 27, point( 22, 10 ) );
w_height = catacurses::newwin( 1, ncol2, point( beginx2, 6 ) );
w_age = catacurses::newwin( 1, ncol2, point( beginx2, 7 ) );
w_blood = catacurses::newwin( 1, ncol2, point( beginx2, 8 ) );
@@ -4143,6 +4143,7 @@ void set_description( tab_manager &tabs, avatar &you, const bool allow_reroll,
werase( w_stats );
std::vector vStatNames;
+ vStatNames.reserve( 4 );
mvwprintz( w_stats, point_zero, COL_HEADER, _( "Stats:" ) );
vStatNames.emplace_back( _( "Strength:" ) );
vStatNames.emplace_back( _( "Dexterity:" ) );
diff --git a/src/npc.cpp b/src/npc.cpp
index c3ff99ea302ed..80a6dfcfb1d33 100644
--- a/src/npc.cpp
+++ b/src/npc.cpp
@@ -880,6 +880,7 @@ void starting_clothes( npc &who, const npc_class_id &type, bool male )
if( item_group::group_is_defined( type->worn_override ) ) {
ret = item_group::items_from( type->worn_override );
} else {
+ ret.reserve( 18 );
ret.push_back( get_clothing_item( type, "pants", male ) );
ret.push_back( get_clothing_item( type, "shirt", male ) );
ret.push_back( get_clothing_item( type, "underwear_top", male ) );
diff --git a/src/npc_attack.cpp b/src/npc_attack.cpp
index 94ad945108672..d8ebec8506928 100644
--- a/src/npc_attack.cpp
+++ b/src/npc_attack.cpp
@@ -32,7 +32,7 @@ static const float kill_modifier = 1.5f;
static const int base_time_penalty = 3;
// we want this out of our hands, pronto.
// give a large buff to the attack value so it prioritizes this
-static const int base_throw_now = 10'000;
+static const int base_throw_now = 10000;
} // namespace npc_attack_constants
// TODO: make a better, more generic "check if this projectile is blocked" function
diff --git a/src/pickup.cpp b/src/pickup.cpp
index d186ee64c957f..d79b95e4c93d5 100644
--- a/src/pickup.cpp
+++ b/src/pickup.cpp
@@ -400,6 +400,7 @@ void Pickup::autopickup( const tripoint &p )
// which items are we grabbing?
std::vector here;
const map_stack mapitems = local.i_at( p );
+ here.reserve( mapitems.size() );
for( item_stack::iterator it = mapitems.begin(); it != mapitems.end(); ++it ) {
here.push_back( it );
}
@@ -432,6 +433,8 @@ void Pickup::autopickup( const tripoint &p )
// At this point we've selected our items, register an activity to pick them up.
std::vector quantities;
std::vector target_items;
+ target_items.reserve( selected_items.size() );
+ quantities.reserve( selected_items.size() );
for( drop_location selected : selected_items ) {
item *it = selected.first.get_item();
target_items.push_back( selected.first );
diff --git a/src/popup.cpp b/src/popup.cpp
index a580efe2ddeaa..d7f36aa2f2c21 100644
--- a/src/popup.cpp
+++ b/src/popup.cpp
@@ -317,16 +317,13 @@ query_popup::result query_popup::query_once()
if( cancel ) {
ctxt.register_action( "QUIT" );
}
-#if defined(WIN32) || defined(TILES)
- ctxt.set_timeout( 50 );
-#endif
result res;
// Assign outside construction of `res` to ensure execution order
res.wait_input = !anykey;
do {
ui_manager::redraw();
- res.action = ctxt.handle_input();
+ res.action = ctxt.handle_input( 50 );
res.evt = ctxt.get_raw_input();
// If we're tracking mouse movement
diff --git a/src/proficiency.cpp b/src/proficiency.cpp
index 046f95576b402..0d2968a646da8 100644
--- a/src/proficiency.cpp
+++ b/src/proficiency.cpp
@@ -509,6 +509,7 @@ time_duration proficiency_set::training_time_needed( const proficiency_id &query
std::vector proficiency_set::known_profs() const
{
std::vector ret;
+ ret.reserve( known.size() );
for( const proficiency_id &knows : known ) {
ret.push_back( knows );
}
diff --git a/src/recipe_dictionary.cpp b/src/recipe_dictionary.cpp
index 7bb1287575c27..0f25c3881de13 100644
--- a/src/recipe_dictionary.cpp
+++ b/src/recipe_dictionary.cpp
@@ -1,6 +1,7 @@
#include "recipe_dictionary.h"
#include
+#include
#include
#include
#include
@@ -285,7 +286,15 @@ std::vector recipe_subset::search(
std::vector res;
size_t i = 0;
+ ctxt.register_action( "QUIT" );
+ std::chrono::steady_clock::time_point next_input_check = std::chrono::steady_clock::now();
for( const recipe *r : recipes ) {
+ if( std::chrono::steady_clock::now() > next_input_check ) {
+ next_input_check = std::chrono::steady_clock::now() + std::chrono::milliseconds( 250 );
+ if( ctxt.handle_input( 1 ) == "QUIT" ) {
+ return res;
+ }
+ }
if( progress_callback ) {
progress_callback( i, recipes.size() );
}
diff --git a/src/recipe_dictionary.h b/src/recipe_dictionary.h
index ffeef002336f1..fc4b4e261c13c 100644
--- a/src/recipe_dictionary.h
+++ b/src/recipe_dictionary.h
@@ -12,6 +12,7 @@
#include
#include
+#include "input_context.h"
#include "recipe.h"
#include "type_id.h"
@@ -205,6 +206,7 @@ class recipe_subset
std::map difficulties;
std::map> category;
std::map> component;
+ mutable input_context ctxt;
};
void serialize( const recipe_subset &value, JsonOut &jsout );
diff --git a/src/requirements.cpp b/src/requirements.cpp
index 7524b97f7aa5b..11b26bdb1db29 100644
--- a/src/requirements.cpp
+++ b/src/requirements.cpp
@@ -836,6 +836,7 @@ std::vector requirement_data::get_folded_tools_list( int width, nc_
const read_only_visitable &crafting_inv, int batch ) const
{
std::vector output_buffer;
+ output_buffer.reserve( 2 );
output_buffer.push_back( colorize( _( "Tools required:" ), col ) );
if( tools.empty() && qualities.empty() ) {
output_buffer.push_back( colorize( "> ", col ) + colorize( _( "NONE" ), c_green ) );
diff --git a/src/scenario.cpp b/src/scenario.cpp
index ae6184c01fdfb..9cb5af2ac756f 100644
--- a/src/scenario.cpp
+++ b/src/scenario.cpp
@@ -373,7 +373,9 @@ void scen_blacklist::load( const JsonObject &jo, const std::string_view )
void scen_blacklist::finalize()
{
std::vector> all_scens;
- for( const scenario &scen : scenario::get_all() ) {
+ std::vector all_scenarios = scenario::get_all();
+ all_scens.reserve( all_scenarios.size() );
+ for( const scenario &scen : all_scenarios ) {
all_scens.emplace_back( scen.ident() );
}
for( const string_id &sc : sc_blacklist.scenarios ) {
diff --git a/src/stomach.h b/src/stomach.h
index 48b83fb18e6f8..0e1993107e9a9 100644
--- a/src/stomach.h
+++ b/src/stomach.h
@@ -20,7 +20,7 @@ using mass = units::quantity;
constexpr mass microgram = units::quantity( 1, {} );
constexpr mass milligram = units::quantity( 1000, {} );
-constexpr mass gram = units::quantity( 1'000'000, {} );
+constexpr mass gram = units::quantity( 1000000, {} );
const std::vector> mass_units = { {
{ "ug", microgram },
{ "μg", microgram },
diff --git a/src/units_utility.cpp b/src/units_utility.cpp
index 06104ec581985..95d6420eafae7 100644
--- a/src/units_utility.cpp
+++ b/src/units_utility.cpp
@@ -171,12 +171,12 @@ int convert_length( const units::length &length )
int ret = to_millimeter( length );
const bool metric = get_option( "DISTANCE_UNITS" ) == "metric";
if( metric ) {
- if( ret % 1'000'000 == 0 ) {
+ if( ret % 1000000 == 0 ) {
// kilometers
- ret /= 1'000'000;
- } else if( ret % 1'000 == 0 ) {
+ ret /= 1000000;
+ } else if( ret % 1000 == 0 ) {
// meters
- ret /= 1'000;
+ ret /= 1000;
} else if( ret % 10 == 0 ) {
// centimeters
ret /= 10;
@@ -201,10 +201,10 @@ std::string length_units( const units::length &length )
int length_mm = to_millimeter( length );
const bool metric = get_option( "DISTANCE_UNITS" ) == "metric";
if( metric ) {
- if( length_mm % 1'000'000 == 0 ) {
+ if( length_mm % 1000000 == 0 ) {
//~ kilometers
return _( "km" );
- } else if( length_mm % 1'000 == 0 ) {
+ } else if( length_mm % 1000 == 0 ) {
//~ meters
return _( "m" );
} else if( length_mm % 10 == 0 ) {
@@ -251,12 +251,12 @@ double convert_length_approx( const units::length &length, bool &display_as_inte
double ret = static_cast( to_millimeter( length ) );
const bool metric = get_option( "DISTANCE_UNITS" ) == "metric";
if( metric ) {
- if( ret > 500'000 ) {
+ if( ret > 500000 ) {
// kilometers
- ret /= 1'000'000.0;
+ ret /= 1000000.0;
} else {
// meters
- ret /= 1'000.0;
+ ret /= 1000.0;
display_as_integer = true;
}
} else {
@@ -279,7 +279,7 @@ std::string length_units_approx( const units::length &length )
int length_mm = to_millimeter( length );
const bool metric = get_option( "DISTANCE_UNITS" ) == "metric";
if( metric ) {
- if( length_mm > 500'000 ) {
+ if( length_mm > 500000 ) {
//~ kilometers
return _( "km" );
} else {
@@ -327,13 +327,13 @@ std::pair weight_to_string( const
units::quantity &weight )
{
using high_res_mass = units::quantity;
- static const high_res_mass gram = high_res_mass( 1'000'000, {} );
- static const high_res_mass milligram = high_res_mass( 1'000, {} );
+ static const high_res_mass gram = high_res_mass( 1000000, {} );
+ static const high_res_mass milligram = high_res_mass( 1000, {} );
if( weight > gram ) {
- return {string_format( "%.0f", weight.value() / 1'000'000.f ), "g"};
+ return {string_format( "%.0f", weight.value() / 1000000.f ), "g"};
} else if( weight > milligram ) {
- return {string_format( "%.0f", weight.value() / 1'000.f ), "mg"};
+ return {string_format( "%.0f", weight.value() / 1000.f ), "mg"};
}
return {string_format( "%d", weight.value() ), "μg"};
}
diff --git a/src/vehicle_autodrive.cpp b/src/vehicle_autodrive.cpp
index 125f4c576683b..e7676466a6824 100644
--- a/src/vehicle_autodrive.cpp
+++ b/src/vehicle_autodrive.cpp
@@ -1266,6 +1266,7 @@ std::vector> vehicle::get_debug_overlay_data
{
static const std::vector debug_what = { "valid_position", "omt" };
std::vector> ret;
+ ret.reserve( collision_check_points.size() );
const tripoint_abs_ms veh_pos = global_square_location();
if( autodrive_local_target != tripoint_abs_ms_zero ) {
diff --git a/src/vehicle_group.cpp b/src/vehicle_group.cpp
index f1a9a1a3f4c79..225a04d57162b 100644
--- a/src/vehicle_group.cpp
+++ b/src/vehicle_group.cpp
@@ -71,6 +71,7 @@ bool string_id::is_valid() const
std::vector VehicleGroup::all_possible_results() const
{
std::vector result;
+ result.reserve( vehicles.size() );
for( const weighted_object &wo : vehicles ) {
result.push_back( wo.obj );
}
diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp
index 047d7da81b91c..93a0d17d67a8c 100644
--- a/src/vehicle_use.cpp
+++ b/src/vehicle_use.cpp
@@ -1118,6 +1118,7 @@ void vehicle::operate_scoop()
sounds::sound( bub_part_pos( scoop ), rng( 20, 35 ), sounds::sound_t::combat,
random_entry_ref( sound_msgs ), false, "vehicle", "scoop" );
std::vector parts_points;
+ parts_points.reserve( 8 );
for( const tripoint_bub_ms ¤t :
here.points_in_radius( bub_part_pos( scoop ), 1 ) ) {
parts_points.push_back( current );
@@ -1727,7 +1728,7 @@ std::pair vehicle::tool_ammo_available( const itype_id &t
return { itype_id::NULL_ID(), 0 };
}
// 2 bil ought to be enough for everyone, and hopefully not overflow int
- const int64_t max = 2'000'000'000;
+ const int64_t max = 2000000000;
if( ft->ammo->type == ammo_battery ) {
return { ft, static_cast( std::min( battery_left(), max ) ) };
} else {
diff --git a/tests/crafting_test.cpp b/tests/crafting_test.cpp
index cac135fec3cfe..989c8e09abed0 100644
--- a/tests/crafting_test.cpp
+++ b/tests/crafting_test.cpp
@@ -555,7 +555,7 @@ TEST_CASE( "proficiency_gain_short_crafts", "[crafting][proficiency]" )
REQUIRE( ch.get_proficiency_practice( proficiency_prof_carving ) == 0.0f );
int turns_taken = 0;
- const int max_turns = 100'000;
+ const int max_turns = 100000;
float time_malus = rec->proficiency_time_maluses( ch );
@@ -594,8 +594,8 @@ TEST_CASE( "proficiency_gain_long_craft", "[crafting][proficiency]" )
// Check exactly one 5% tick has passed
// 500k counter = 5% progress
// If counter is 0, this means the craft finished before we gained the proficiency
- CHECK( craft->item_counter >= 500'000 );
- CHECK( craft->item_counter < 501'000 );
+ CHECK( craft->item_counter >= 500000 );
+ CHECK( craft->item_counter < 501000 );
}
static float craft_aggregate_fail_chance( const recipe_id &rid )
diff --git a/tests/monster_test.cpp b/tests/monster_test.cpp
index b33e3c74ae37c..6bb9916e65fe8 100644
--- a/tests/monster_test.cpp
+++ b/tests/monster_test.cpp
@@ -14,6 +14,7 @@
#include "cata_scope_helpers.h"
#include "character.h"
#include "filesystem.h"
+#include "creature_tracker.h"
#include "game.h"
#include "game_constants.h"
#include "line.h"
@@ -415,3 +416,93 @@ TEST_CASE( "limit_mod_size_bonus", "[monster]" )
test_monster2.mod_size_bonus( 3 );
CHECK( test_monster2.get_size() == creature_size::huge );
}
+
+TEST_CASE( "monsters_spawn_eggs", "[monster][reproduction]" )
+{
+ clear_map();
+ map &here = get_map();
+ tripoint_bub_ms loc = get_avatar().pos_bub() + tripoint_east;
+ monster &test_monster = spawn_test_monster( "mon_dummy_reproducer_eggs", loc );
+ bool test_monster_spawns_eggs = false;
+ int amount_of_iteration = 0;
+ while( amount_of_iteration < 100 ) {
+ test_monster.set_baby_timer( calendar::turn - 2_days );
+ test_monster.try_reproduce();
+ if( here.has_items( loc ) ) {
+ test_monster_spawns_eggs = true;
+ break;
+ } else {
+ amount_of_iteration++;
+ }
+ }
+ CAPTURE( amount_of_iteration );
+ CHECK( test_monster_spawns_eggs );
+}
+
+TEST_CASE( "monsters_spawn_egg_itemgroups", "[monster][reproduction]" )
+{
+ clear_map();
+ map &here = get_map();
+ tripoint_bub_ms loc = get_avatar().pos_bub() + tripoint_east;
+ monster &test_monster = spawn_test_monster( "mon_dummy_reproducer_egg_group", loc );
+ bool test_monster_spawns_egg_group = false;
+ int amount_of_iteration = 0;
+ while( amount_of_iteration < 100 ) {
+ test_monster.set_baby_timer( calendar::turn - 2_days );
+ test_monster.try_reproduce();
+ if( here.has_items( loc ) ) {
+ test_monster_spawns_egg_group = true;
+ break;
+ } else {
+ amount_of_iteration++;
+ }
+ }
+ CAPTURE( amount_of_iteration );
+ CHECK( test_monster_spawns_egg_group );
+}
+
+TEST_CASE( "monsters_spawn_babies", "[monster][reproduction]" )
+{
+ clear_map();
+ creature_tracker &creatures = get_creature_tracker();
+ tripoint_bub_ms loc = get_avatar().pos_bub() + tripoint_east;
+ monster &test_monster = spawn_test_monster( "mon_dummy_reproducer_mon", loc );
+ bool test_monster_spawns_babies = false;
+ int amount_of_iteration = 0;
+ while( amount_of_iteration < 100 ) {
+ test_monster.set_baby_timer( calendar::turn - 2_days );
+ test_monster.try_reproduce();
+ get_map().spawn_monsters( true );
+ if( creatures.get_monsters_list().size() > 1 ) {
+ test_monster_spawns_babies = true;
+ break;
+ } else {
+ amount_of_iteration++;
+ }
+ }
+ CAPTURE( amount_of_iteration );
+ CHECK( test_monster_spawns_babies );
+}
+
+TEST_CASE( "monsters_spawn_baby_groups", "[monster][reproduction]" )
+{
+ clear_map();
+ creature_tracker &creatures = get_creature_tracker();
+ tripoint_bub_ms loc = get_avatar().pos_bub() + tripoint_east;
+ monster &test_monster = spawn_test_monster( "mon_dummy_reproducer_mon_group", loc );
+ bool test_monster_spawns_baby_mongroup = false;
+ int amount_of_iteration = 0;
+ while( amount_of_iteration < 100 ) {
+ test_monster.set_baby_timer( calendar::turn - 2_days );
+ test_monster.try_reproduce();
+ get_map().spawn_monsters( true );
+ if( creatures.get_monsters_list().size() > 1 ) {
+ test_monster_spawns_baby_mongroup = true;
+ break;
+ } else {
+ amount_of_iteration++;
+ }
+ }
+ CAPTURE( amount_of_iteration );
+ CHECK( test_monster_spawns_baby_mongroup );
+}
diff --git a/tests/units_test.cpp b/tests/units_test.cpp
index 84868155129e5..5f66d105ed167 100644
--- a/tests/units_test.cpp
+++ b/tests/units_test.cpp
@@ -404,12 +404,12 @@ TEST_CASE( "Specific_energy", "[temperature]" )
TEST_CASE( "energy_display", "[units][nogame]" )
{
CHECK( units::display( units::from_millijoule( 1 ) ) == "1 mJ" );
- CHECK( units::display( units::from_millijoule( 1'000 ) ) == "1 J" );
- CHECK( units::display( units::from_millijoule( 1'001 ) ) == "1001 mJ" );
- CHECK( units::display( units::from_millijoule( 1'000'000 ) ) == "1 kJ" );
- CHECK( units::display( units::from_millijoule( 1'000'001 ) ) == "1 kJ" );
- CHECK( units::display( units::from_millijoule( 1'001'000 ) ) == "1001 J" );
- CHECK( units::display( units::from_millijoule( 1'001'001 ) ) == "1001001 mJ" );
- CHECK( units::display( units::from_millijoule( 2'147'483'648LL ) ) == "2147483648 mJ" );
- CHECK( units::display( units::from_millijoule( 4'294'967'296LL ) ) == "4294967296 mJ" );
+ CHECK( units::display( units::from_millijoule( 1000 ) ) == "1 J" );
+ CHECK( units::display( units::from_millijoule( 1001 ) ) == "1001 mJ" );
+ CHECK( units::display( units::from_millijoule( 1000000 ) ) == "1 kJ" );
+ CHECK( units::display( units::from_millijoule( 1000001 ) ) == "1 kJ" );
+ CHECK( units::display( units::from_millijoule( 1001000 ) ) == "1001 J" );
+ CHECK( units::display( units::from_millijoule( 1001001 ) ) == "1001001 mJ" );
+ CHECK( units::display( units::from_millijoule( 2147483648LL ) ) == "2147483648 mJ" );
+ CHECK( units::display( units::from_millijoule( 4294967296LL ) ) == "4294967296 mJ" );
}
diff --git a/tools/spell_checker/dictionary.txt b/tools/spell_checker/dictionary.txt
index f4daab708a1b5..813c56ebcbc8a 100644
--- a/tools/spell_checker/dictionary.txt
+++ b/tools/spell_checker/dictionary.txt
@@ -877,6 +877,7 @@ Bulgarian
Bullard
bullpup
bullseye
+bullshit
Buluotuo
Bulwer
Bundahis