From 03da730867894348d1c678b6f7c873841ff09f6d Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:19:19 -0500 Subject: [PATCH 001/154] Added Cause Rot --- data/mods/Magiclysm/Spells/druid.json | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index 62d4e066a270b..c82411a9bd5ff 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -443,5 +443,33 @@ "damage_increment": 4, "//": "The spell can only be permanent without being at maximum level because of how items with charges work", "flags": [ "SOMATIC", "NO_LEGS", "PERMANENT" ] + }, + { + "id": "cause_rot", + "type": "SPELL", + "name": "Cause Rot", + "description": "A spell from a darker sect of druidery, created to forciably begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indescrimiate, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", + "effect": "attack", + "shape": "blast", + "valid_targets": [ "self" ], + "flags": [ "SOMATIC", "NO_PROJECTILE", "CONCENTRATE", "VERBAL" ], + "max_level": 30, + "spell_class": "ANIMIST", + "energy_source": "MANA", + "difficulty": 8, + "damage_type": "pure" + "base_casting_time": 10000, + "base_energy_cost": 1000, + "min_aoe": 4, + "max_aoe": 25, + "aoe_increment": 0.7, + "min_damage": 2, + "max_damage": 2, + "min_dot": 1, + "max_dot": 10, + "dot_increment": 0.3, + "min_duration": 5000, + "max_duration": 20000, + "duration_increment": 500 } ] From 8a8e6afbe05305ba98a1e05dc7cc9b144869f14d Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:21:36 -0500 Subject: [PATCH 002/154] Added Rupture --- data/mods/Magiclysm/Spells/animist.json | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index 473809d682151..831e583003dd4 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -381,5 +381,32 @@ "base_energy_cost": 6, "energy_source": "HP", "difficulty": 6 + }, + { + "id": "rupture", + "type": "SPELL", + "name": "Rupture", + "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemoraging, and leylines to become muddled. Immensely gruesome, crude, and was once illeagal world-wide, not that it matters now.", + "effect": "attack", + "shape": "blast", + "valid_targets": [ "hostile" ], + "flags": [ "SOMATIC", "NO_PROJECTILE", "LOUD" ], + "max_level": 30, + "min_range": 1, + "max_range": 1, + "min_damage": 2, + "max_damage": 2, + "base_casting_time": 50, + "base_energy_cost": 500, + "damage_type": "pure", + "spell_class": "ANIMIST", + "min_duration": 100, + "max_duration": 1600, + "duration_increment": 50, + "min_dot": 10, + "max_dot": 100, + "dot_increment": 9 + "energy_source": "MANA", + "difficulty": 1 } ] From c35473eaf8067c9c16523e878706c27f2a4737c2 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:22:24 -0500 Subject: [PATCH 003/154] Added Focused bolt --- data/mods/Magiclysm/Spells/magus.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/data/mods/Magiclysm/Spells/magus.json b/data/mods/Magiclysm/Spells/magus.json index fe524b5b77dcd..aa3065e7d8bee 100644 --- a/data/mods/Magiclysm/Spells/magus.json +++ b/data/mods/Magiclysm/Spells/magus.json @@ -409,4 +409,30 @@ "energy_source": "MANA", "difficulty": 4 } + { + "id": "focused_bolt", + "type": "SPELL", + "name": "Focused Bolt", + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble, passed on only through direct decendants over the ages; until you.", + "effect": "attack", + "shape": "line", + "valid_targets": [ "hostile", "ground" ], + "flags": [ "SOMATIC", "NO_LEGS", "CONCENTRATE", "SILENT", "NO_PROJECTILE" ], + "max_level": 30, + "min_damage": 4, + "max_damage": 124, + "damage_increment": 4.0, + "damage_type": "pure", + "min_range": 5, + "max_range": 75, + "range_increment": 2.5, + "min_aoe": 5, + "max_aoe": 0, + "aoe_increment": -0.5, + "spell_class": "MAGUS", + "base_casting_time": 500, + "base_energy_cost": 400, + "energy_source": "MANA", + "difficulty": 6 + } ] From 3d4bc2593c2df3428fa153541cbaea6b799c2356 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:28:41 -0500 Subject: [PATCH 004/154] Added Scrolls and the Book for Focused Bolt, Rupture, Cause rot --- data/mods/Magiclysm/itemgroups/spellbooks.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/mods/Magiclysm/itemgroups/spellbooks.json b/data/mods/Magiclysm/itemgroups/spellbooks.json index 46b508bb2a11d..dc28048e4e587 100644 --- a/data/mods/Magiclysm/itemgroups/spellbooks.json +++ b/data/mods/Magiclysm/itemgroups/spellbooks.json @@ -140,6 +140,9 @@ [ "spell_scroll_banishment_lesser", 30 ], [ "spell_scroll_nova_flare", 25 ], [ "spell_scroll_freezing_touch", 40 ] + [ "spell_scroll_focused_bolt", 1 ], + [ "spell_scroll_rupture", 1 ], + [ "spell_scroll_cause_rot", 1 ], ] }, { @@ -173,6 +176,7 @@ "type": "item_group", "items": [ [ "animist_shadows", 5 ], + [ "forbidden_tome", 1 ], [ "magus_spellbook", 15 ], [ "magus_spellbook_move", 30 ], [ "translocate_spellbook", 20 ], From 59cbba1b632162cb7ffd610559b26c355b45fd42 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:36:55 -0500 Subject: [PATCH 005/154] Added Forbidden Tome --- data/mods/Magiclysm/items/spellbooks.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index ac19610144d4f..03524ea7e448a 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -408,6 +408,20 @@ "color": "light_blue", "use_action": { "type": "learn_spell", "spells": [ "translocate_self" ] } }, + { + "id": "forbbiden_tome", + "type": "BOOK", + "name": { "str": "Forbbiden Tome", "str_pl": "Forbidden Tomes" }, + "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", + "description": "A very, very old and heavy tome containing various compiled spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", + "weight": "2400 g", + "volume": "5000 ml", + "price": 7500, + "material": [ "paper" ], + "symbol": "?", + "color": "brown", + "use_action": { "type": "learn_spell", "spells": [ "focused_bolt, rupture, cause_rot" ] } + }, { "id": "stat_up_spellbook", "type": "BOOK", From 60744451775622afaecbda3ec20c73b8758e3537 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:40:16 -0500 Subject: [PATCH 006/154] Added Scrolls for Rupture, Focused Bolt, and Cause Rot --- data/mods/Magiclysm/items/spell_scrolls.json | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json index 96588e673bd1f..ece6c65f28018 100644 --- a/data/mods/Magiclysm/items/spell_scrolls.json +++ b/data/mods/Magiclysm/items/spell_scrolls.json @@ -109,6 +109,15 @@ "description": "A ghostly skeleton rises from the depths of the earth to fight for you. You may be able to summon more with a higher level in this spell.", "use_action": { "type": "learn_spell", "spells": [ "summon_skeleton" ] } }, + { + "type": "BOOK", + "copy-from": "spell_scroll", + "id": "spell_scroll_rupture", + "//": "Animist spell", + "name": { "str": "Scroll of Rupture", "str_pl": "Scrolls of Rupture" }, + "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemoraging, and leylines to become muddled. Immensely gruesome, crude, and was once illeagal world-wide, not that it matters now.", + "use_action": { "type": "learn_spell", "spells": [ "rupture" ] } + }, { "type": "BOOK", "copy-from": "spell_scroll", @@ -297,6 +306,15 @@ "description": "Call to the wild for aid from some wolves.", "use_action": { "type": "learn_spell", "spells": [ "summon_wolf_druid" ] } }, + { + "type": "BOOK", + "copy-from": "spell_scroll", + "id": "spell_scroll_cause_rot", + "//": "Druid spell", + "name": { "str": "Scroll of Cause Rot", "str_pl": "Scrolls of Cause Rot" }, + "description": "A spell from a darker sect of druidery, created to forciably begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indescrimiate, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", + "use_action": { "type": "learn_spell", "spells": [ "cause_rot" ] } + }, { "type": "BOOK", "copy-from": "spell_scroll", @@ -585,6 +603,15 @@ "description": "You become wily like a fox.", "use_action": { "type": "learn_spell", "spells": [ "foxs_cunning" ] } }, + { + "type": "BOOK", + "copy-from": "spell_scroll", + "id": "spell_scroll_focused_bolt", + "//": "Magus spell", + "name": { "str": "Scroll of Focused Bolt", "str_pl": "Scrolls of Focused Bolt" }, + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble, passed on only through direct decendants over the ages; until you.", + "use_action": { "type": "learn_spell", "spells": [ "focused_bolt" ] } + }, { "type": "BOOK", "copy-from": "spell_scroll", From 8b99f8254be366c10e36095381230487168c07da Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:50:10 -0500 Subject: [PATCH 007/154] Added missing " --- data/mods/Magiclysm/items/spellbooks.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 03524ea7e448a..ad523f0c9f44f 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -413,14 +413,14 @@ "type": "BOOK", "name": { "str": "Forbbiden Tome", "str_pl": "Forbidden Tomes" }, "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", - "description": "A very, very old and heavy tome containing various compiled spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", + "description": "A very, very old and heavy tome of various spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", "weight": "2400 g", "volume": "5000 ml", "price": 7500, "material": [ "paper" ], "symbol": "?", "color": "brown", - "use_action": { "type": "learn_spell", "spells": [ "focused_bolt, rupture, cause_rot" ] } + "use_action": { "type": "learn_spell", "spells": [ "focused_bolt", "rupture", "cause_rot" ] } }, { "id": "stat_up_spellbook", From 7b363a7c87f17dfe7c4b0cfa9d6efeb3a8128934 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:57:50 -0500 Subject: [PATCH 008/154] Added missing comma --- data/mods/Magiclysm/Spells/animist.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index 831e583003dd4..ba035e2e2e778 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -405,7 +405,7 @@ "duration_increment": 50, "min_dot": 10, "max_dot": 100, - "dot_increment": 9 + "dot_increment": 9, "energy_source": "MANA", "difficulty": 1 } From 494595dce99dc09e8ca42187f73f9847d8e09e7e Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:58:58 -0500 Subject: [PATCH 009/154] Added missing comma --- data/mods/Magiclysm/Spells/druid.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index c82411a9bd5ff..7e07eba7db57a 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -457,7 +457,7 @@ "spell_class": "ANIMIST", "energy_source": "MANA", "difficulty": 8, - "damage_type": "pure" + "damage_type": "pure", "base_casting_time": 10000, "base_energy_cost": 1000, "min_aoe": 4, From 251629ffdc86b1eb73b708b73411a31085c1b06c Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 23:01:21 -0500 Subject: [PATCH 010/154] Fixed comma --- data/mods/Magiclysm/itemgroups/spellbooks.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/mods/Magiclysm/itemgroups/spellbooks.json b/data/mods/Magiclysm/itemgroups/spellbooks.json index dc28048e4e587..98b7d9b4cfe5a 100644 --- a/data/mods/Magiclysm/itemgroups/spellbooks.json +++ b/data/mods/Magiclysm/itemgroups/spellbooks.json @@ -139,10 +139,10 @@ [ "bio_sneeze_beam", 50 ], [ "spell_scroll_banishment_lesser", 30 ], [ "spell_scroll_nova_flare", 25 ], - [ "spell_scroll_freezing_touch", 40 ] + [ "spell_scroll_freezing_touch", 40 ], [ "spell_scroll_focused_bolt", 1 ], [ "spell_scroll_rupture", 1 ], - [ "spell_scroll_cause_rot", 1 ], + [ "spell_scroll_cause_rot", 1 ] ] }, { From ef0d61c8943063c63213fb69b79ed87861b17b99 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 23:05:25 -0500 Subject: [PATCH 011/154] Corrected spelling --- data/mods/Magiclysm/items/spellbooks.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index ad523f0c9f44f..4fca2adfb9257 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -409,7 +409,7 @@ "use_action": { "type": "learn_spell", "spells": [ "translocate_self" ] } }, { - "id": "forbbiden_tome", + "id": "forbidden_tome", "type": "BOOK", "name": { "str": "Forbbiden Tome", "str_pl": "Forbidden Tomes" }, "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", From 0f5428678d0a375e56f7a03e7e8f517aabf2b9da Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 23:08:22 -0500 Subject: [PATCH 012/154] Fixed Cause Rot class --- data/mods/Magiclysm/Spells/druid.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index 7e07eba7db57a..ab7e6b7e0cfd5 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -454,7 +454,7 @@ "valid_targets": [ "self" ], "flags": [ "SOMATIC", "NO_PROJECTILE", "CONCENTRATE", "VERBAL" ], "max_level": 30, - "spell_class": "ANIMIST", + "spell_class": "DRUID", "energy_source": "MANA", "difficulty": 8, "damage_type": "pure", From 1cc4cdc7602e70acec612fcaa89cc67cf1593fed Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 23:13:38 -0500 Subject: [PATCH 013/154] Update druid.json --- data/mods/Magiclysm/Spells/druid.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index ab7e6b7e0cfd5..9a04a8edd3ecd 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -451,7 +451,7 @@ "description": "A spell from a darker sect of druidery, created to forciably begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indescrimiate, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", "effect": "attack", "shape": "blast", - "valid_targets": [ "self" ], + "valid_targets": [ "hostile", "ground" ], "flags": [ "SOMATIC", "NO_PROJECTILE", "CONCENTRATE", "VERBAL" ], "max_level": 30, "spell_class": "DRUID", From ea628f4ffc4bf22b06539ae775f3c9806e5f8e10 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Wed, 25 Aug 2021 23:59:56 -0500 Subject: [PATCH 014/154] Balance and spelling pass on cause rot --- data/mods/Magiclysm/Spells/druid.json | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index 9a04a8edd3ecd..c8e6d85f6c9a9 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -448,7 +448,7 @@ "id": "cause_rot", "type": "SPELL", "name": "Cause Rot", - "description": "A spell from a darker sect of druidery, created to forciably begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indescrimiate, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", + "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile", "ground" ], @@ -460,14 +460,13 @@ "damage_type": "pure", "base_casting_time": 10000, "base_energy_cost": 1000, - "min_aoe": 4, - "max_aoe": 25, - "aoe_increment": 0.7, - "min_damage": 2, - "max_damage": 2, + "min_aoe": 5, + "max_aoe": 50, + "aoe_increment": 1.5, + "min_damage": 1, + "max_damage": 1, "min_dot": 1, - "max_dot": 10, - "dot_increment": 0.3, + "max_dot": 1, "min_duration": 5000, "max_duration": 20000, "duration_increment": 500 From 51453f1e85bc7948eab6ce4dc5e38094f0e9d7b6 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Thu, 26 Aug 2021 00:01:50 -0500 Subject: [PATCH 015/154] Balance and Spelling pass on focused bolt --- data/mods/Magiclysm/Spells/magus.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/mods/Magiclysm/Spells/magus.json b/data/mods/Magiclysm/Spells/magus.json index aa3065e7d8bee..6e679dacba81f 100644 --- a/data/mods/Magiclysm/Spells/magus.json +++ b/data/mods/Magiclysm/Spells/magus.json @@ -408,12 +408,12 @@ "base_energy_cost": 350, "energy_source": "MANA", "difficulty": 4 - } + }, { "id": "focused_bolt", "type": "SPELL", "name": "Focused Bolt", - "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble, passed on only through direct decendants over the ages; until you.", + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble. Passed on only through direct decendants over the ages, though occasionally shared by them to others.", "effect": "attack", "shape": "line", "valid_targets": [ "hostile", "ground" ], From 4e9f71a8b43281101dbd01e5dce590981d9d68d2 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Thu, 26 Aug 2021 00:03:04 -0500 Subject: [PATCH 016/154] Balance and spelling pass on rupture --- data/mods/Magiclysm/Spells/animist.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index ba035e2e2e778..72a820dd15fd9 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -386,7 +386,7 @@ "id": "rupture", "type": "SPELL", "name": "Rupture", - "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemoraging, and leylines to become muddled. Immensely gruesome, crude, and was once illeagal world-wide, not that it matters now.", + "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, leylines to become muddled, and electronics to overcharge. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile" ], @@ -398,15 +398,15 @@ "max_damage": 2, "base_casting_time": 50, "base_energy_cost": 500, - "damage_type": "pure", "spell_class": "ANIMIST", "min_duration": 100, - "max_duration": 1600, - "duration_increment": 50, + "max_duration": 500, + "duration_increment": 15, "min_dot": 10, "max_dot": 100, - "dot_increment": 9, + "dot_increment": 3, "energy_source": "MANA", - "difficulty": 1 + "difficulty": 1, + "damage_type": "pure" } ] From 525f09d82d0551bdc7658b9ba96ca0ca897d6e29 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Thu, 26 Aug 2021 00:09:51 -0500 Subject: [PATCH 017/154] Description Changes --- data/mods/Magiclysm/items/spell_scrolls.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json index ece6c65f28018..06f052b7d4927 100644 --- a/data/mods/Magiclysm/items/spell_scrolls.json +++ b/data/mods/Magiclysm/items/spell_scrolls.json @@ -115,7 +115,7 @@ "id": "spell_scroll_rupture", "//": "Animist spell", "name": { "str": "Scroll of Rupture", "str_pl": "Scrolls of Rupture" }, - "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemoraging, and leylines to become muddled. Immensely gruesome, crude, and was once illeagal world-wide, not that it matters now.", + "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, leylines to become muddled, and electronics to overcharge. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", "use_action": { "type": "learn_spell", "spells": [ "rupture" ] } }, { @@ -312,7 +312,7 @@ "id": "spell_scroll_cause_rot", "//": "Druid spell", "name": { "str": "Scroll of Cause Rot", "str_pl": "Scrolls of Cause Rot" }, - "description": "A spell from a darker sect of druidery, created to forciably begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indescrimiate, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", + "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", "use_action": { "type": "learn_spell", "spells": [ "cause_rot" ] } }, { @@ -609,7 +609,7 @@ "id": "spell_scroll_focused_bolt", "//": "Magus spell", "name": { "str": "Scroll of Focused Bolt", "str_pl": "Scrolls of Focused Bolt" }, - "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble, passed on only through direct decendants over the ages; until you.", + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble. Passed on only through direct decendants over the ages, though occasionally shared by them to others.", "use_action": { "type": "learn_spell", "spells": [ "focused_bolt" ] } }, { From b657d964cf54562dd6f5e919911aceaebd68f8f8 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Fri, 27 Aug 2021 01:02:57 -0500 Subject: [PATCH 018/154] Linted Rupture as requested From 444257568bfed0a596beb42c56975ea49302af92 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Fri, 27 Aug 2021 01:04:10 -0500 Subject: [PATCH 019/154] Linted forbidden tome as requested --- data/mods/Magiclysm/items/spellbooks.json | 657 ++++++++-------------- 1 file changed, 222 insertions(+), 435 deletions(-) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 4fca2adfb9257..98b7d9b4cfe5a 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -1,439 +1,226 @@ [ { - "id": "DEBUG_spellbook", - "type": "BOOK", - "name": { "str": "A Technomancer's Guide to Debugging C:DDA", "str_pl": "copies of A Technomancer's Guide to Debugging C:DDA" }, - "description": "static std::string description( spell sp ) const;", - "weight": "1 g", - "volume": "1 ml", - "material": [ "paper" ], - "symbol": "?", - "color": "magenta", - "use_action": { - "type": "learn_spell", - "spells": [ - "debug_hp", - "debug_stamina", - "debug_teleport_to", - "example_template", - "debug_bionic", - "pain_split", - "fireball", - "gravity_well", - "cone_cold", - "megablast", - "test_area_push", - "test_area_pull_field", - "test_area_pull_all" - ] - } - }, - { - "id": "wizard_beginner", - "type": "BOOK", - "name": { "str": "A Beginner's Guide to Magic", "str_pl": "copies of A Beginner's Guide to Magic" }, - "//": "2 Magus, 1 classless spell", - "description": "You would describe this as more like a pamphlet than a spellbook, but it seems to have at least one interesting spell you can use.", - "weight": "585 g", - "volume": "250 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_red", - "use_action": { "type": "learn_spell", "spells": [ "magic_missile", "phase_door", "create_atomic_light" ] } - }, - { - "id": "novice_stormshaper_book", - "type": "BOOK", - "name": { "str": "An Introduction to Applied Meteorology", "str_pl": "copies of An Introduction to Applied Meteorology" }, - "//": "2 stormshaper", - "description": "A professional-looking book on stormshaping, structured after many college textbooks. It has less to apply than one might expect from its size.", - "weight": "900 g", - "volume": "1200 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { "type": "learn_spell", "spells": [ "shocking_lash", "windrun" ] } - }, - { - "id": "wizard_utility", - "type": "BOOK", - "name": { "str": "Wizarding Guide to Backpacking", "str_pl": "copies of Wizarding Guide to Backpacking" }, - "//": "2 Magus, 1 Biomancer, 1, Kelvinist, 1 classless spell", - "description": "This appears to be the spell version of a guide for what things to take with you when backpacking. It's a little bulky, but will certainly prove useful.", - "weight": "1 kg", - "volume": "1250 ml", - "price": 35000, - "material": [ "paper" ], - "symbol": "?", - "color": "red", - "use_action": { - "type": "learn_spell", - "spells": [ "phase_door", "create_lighter", "pain_split", "protection_aura", "magus_force_jar" ] - } - }, - { - "id": "pyro", - "type": "BOOK", - "name": { "str": "Pyromancy for Heretics", "str_pl": "copies of Pyromancy for Heretics" }, - "//": "4 Kelvinist spells", - "description": "This charred husk of a book still contains many ways to light things aflame.", - "weight": "450 g", - "volume": "1 L", - "price": 1904, - "material": [ "paper" ], - "symbol": "?", - "color": "light_red", - "use_action": { - "type": "learn_spell", - "spells": [ "point_flare", "fireball", "burning_hands", "create_lighter", "kelvinist_summon_flamesword" ] - } - }, - { - "id": "wizard_advanced", - "type": "BOOK", - "//": "1 Magus, 1 biomancer, 2 kelvinist spells", - "name": { "str": "A Treatise on Magical Elements", "str_pl": "copies of A Treatise on Magical Elements" }, - "description": "This details complex diagrams, rituals, and choreography that describes various spells.", - "weight": "920 g", - "volume": "750 ml", - "price": 30000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_red", - "use_action": { "type": "learn_spell", "spells": [ "point_flare", "ice_spike", "gravity_well", "pain_split" ] } - }, - { - "id": "priest_beginner", - "type": "BOOK", - "name": { "str": "Introduction to the Divine", "str_pl": "copies of Introduction to the Divine" }, - "//": "1 technomancer, 1 biomancer, 1 classless spells", - "description": "This appears to mostly be a religious text, but it does have some notes on healing.", - "weight": "585 g", - "volume": "500 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_green", - "use_action": { "type": "learn_spell", "spells": [ "light_healing", "blinding_flash", "bless" ] } - }, - { - "id": "priest_advanced", - "type": "BOOK", - "name": { - "str": "The Paladin's Guide to Modern Spellcasting", - "str_pl": "copies of The Paladin's Guide to Modern Spellcasting" - }, - "//": "2 technomancer, 1 animist spells", - "description": "Despite the title, this seems to be written in Middle English. A little obtuse, but you can make out most of the words well enough.", - "weight": "830 g", - "volume": "750 ml", - "price": 30000, - "material": [ "paper" ], - "symbol": "?", - "color": "green", - "use_action": { "type": "learn_spell", "spells": [ "smite", "holy_blade", "spirit_armor" ] } - }, - { - "id": "winter_grasp", - "type": "BOOK", - "name": { "str": "Winter's Eternal Grasp", "str_pl": "copies of Winter's Eternal Grasp" }, - "//": "5 Kelvinist spells", - "description": "This slim book almost seems to be made from ice, it's cold to the touch.", - "weight": "450 g", - "volume": "1 L", - "price": 1904, - "material": [ "paper" ], - "symbol": "?", - "color": "light_blue", - "use_action": { "type": "learn_spell", "spells": [ "cone_cold", "ice_spike", "hoary_blast", "chilling_touch", "frost_spray" ] } - }, - { - "id": "tome_of_storms", - "type": "BOOK", - "//": "6 Stormshaper spells", - "name": { "str": "The Tome of The Oncoming Storm", "str_pl": "copies of The Tome of The Oncoming Storm" }, - "description": "A large book embossed with crossed lightning bolts and storm clouds, it tingles to the touch.", - "weight": "430 g", - "volume": "750 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { - "type": "learn_spell", - "spells": [ "jolt", "windstrike", "windrun", "storm_hammer", "lightning_bolt", "lightning_blast" ] - } - }, - { - "id": "generic_spellbook", - "type": "BOOK", - "name": { "str": "Nondescript Spellbook", "str_pl": "copies of Nondescript Spellbook" }, - "//": "1 technomancer, 1 earthshaper, 1 classless spell", - "description": "A small book, containing spells created by a novice magician.", - "weight": "355 g", - "volume": "500 ml", - "material": [ "paper" ], - "symbol": "?", - "color": "magenta", - "use_action": { "type": "learn_spell", "spells": [ "seismic_stomp", "create_atomic_lamp", "ethereal_grasp" ] } - }, - { - "id": "light_manipulation_spellbook", - "type": "BOOK", - "name": { "str": "Of Light and Falsehoods", "str_pl": "copies of Of Light and Falsehoods" }, - "//": "3 technomancer, 4 classless spell", - "description": "A small white book, it subtly amplifies the ambient light around it.", - "weight": "430 g", - "volume": "750 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { - "type": "learn_spell", - "spells": [ - "dark_sight", - "blinding_flash", - "obfuscated_body", - "create_atomic_light", - "mirror_image", - "invisibility", - "holographic_transposition", - "shadow_field" - ] - } - }, - { - "id": "biomancer_spellbook", - "type": "BOOK", - "name": { "str": "The Tome of Flesh", "str_pl": "copies of The Tome of Flesh" }, - "//": "5 Biomancer spells", - "description": "A small tome, seemingly covered in tanned human skin.", - "weight": "355 g", - "volume": "500 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "red", - "use_action": { - "type": "learn_spell", - "spells": [ "vicious_tentacle", "bio_grotesque", "bio_acidicspray", "bio_fleshpouch", "bio_bonespear" ] - } - }, - { - "id": "druid_spellbook", - "type": "BOOK", - "name": { "str": "The Book of Trees", "str_pl": "copies of The Book of Trees" }, - "//": "5 Druid spells", - "description": "A bark covered book.", - "weight": "355 g", - "volume": "500 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "green", - "use_action": { - "type": "learn_spell", - "spells": [ "druid_woodshaft", "druid_veggrasp", "druid_rootstrike", "druid_naturebow1", "druid_natures_commune" ] - } - }, - { - "id": "recovery_spellbook", - "type": "BOOK", - "name": { "str": "The Utility of Mana as an Energy Source", "str_pl": "copies of The Utility of Mana as an Energy Source" }, - "description": "This book details spells that use your mana to recover various physiological effects.", - "//": "1 technomancer, 2 animist, 1 druid, 1 earthshaper spell", - "weight": "728 g", - "volume": "3 L", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_blue", - "use_action": { - "type": "learn_spell", - "spells": [ "recover_mana", "recover_bionic_power", "recover_pain", "recover_fatigue", "recover_stamina" ] - } - }, - { - "id": "magus_spellbook", - "type": "BOOK", - "name": { "str": "The Tome of The Battle Mage", "str_pl": "copies of The Tome of The Battle Mage" }, - "//": "4 Magus spells", - "description": "Your standard wizardy looking spellbook, filled with Magus combat spells. You sure lucked out!", - "weight": "434 g", - "volume": "750 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { - "type": "learn_spell", - "spells": [ "magus_mana_beam", "magus_mana_bolt", "magus_mana_blast", "magus_summon_impact_sling" ] - } - }, - { - "id": "eshaper_spellbook", - "type": "BOOK", - "name": { "str": "The Tome of the Hollow Earth", "str_pl": "copies of The Tome of the Hollow Earth" }, - "//": "4 earthshaper spells", - "description": "This large dusty spellbook seems perpetually, well, dusty. It contains the power of the earth.", - "weight": "483 g", - "volume": "825 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "brown", - "use_action": { - "type": "learn_spell", - "spells": [ "eshaper_rockbolt", "eshaper_shardspray", "eshaper_piercing_bolt", "eshaper_shardstorm" ] - } - }, - { - "id": "magus_spellbook_move", - "type": "BOOK", - "name": { "str": "The Tome of Magical Movement", "str_pl": "copies of The Tome of Magical Movement" }, - "//": "3 Magus spells", - "description": "This small lightweight book seems to almost not entirely exist, let's say it 97% does. It contains Magus spells focused on movement.", - "weight": "231 g", - "volume": "500 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { "type": "learn_spell", "spells": [ "phase_door", "magus_escape", "magus_haste" ] } - }, - { - "id": "summon_scroll_smudged", - "type": "BOOK", - "name": { "str": "Smudged Scroll" }, - "//": "Druid spell", - "description": "This looks like someone was designing a new spell, but spilled a mug of coffee on it and crumpled it up in anger. You can tell that it will definitely cast something, but you can't be sure that it will work very well.", - "weight": "129 g", - "volume": "100 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { "type": "learn_spell", "spells": [ "summon_bear" ] } - }, - { - "id": "summon_undead_spellbook", - "type": "BOOK", - "name": { "str": "Necromantic Minions for Dummies", "str_pl": "copies of Necromantic Minions for Dummies" }, - "//": "3 Animist spells", - "description": "This book details various ways of summoning an undead minion to fight for you. They all appear to disappear after a short time, crumbling to dust.", - "weight": "788 g", - "volume": "2250 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { "type": "learn_spell", "spells": [ "summon_zombie", "summon_skeleton", "summon_decayed_pouncer" ] } - }, - { - "id": "techno_fundamentals", - "type": "BOOK", - "name": { "str": "Fundamentals of Technomancy", "str_pl": "copies of Fundamentals of Technomancy" }, - "//": "4 Technomancer spells", - "description": "This thick manual instructs the spellcaster on manipulating and empowering various forms of matter and energy.", - "weight": "258 g", - "volume": "750 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { - "type": "learn_spell", - "spells": [ "synaptic_stimulation", "animated_blade", "mirror_image", "technomancer_knifeshot" ] - } - }, - { - "id": "techno_idiots", - "type": "BOOK", - "name": { "str": "Complete Idiot's Guide to Technomancy", "str_pl": "copies of Complete Idiot's Guide to Technomancy" }, - "description": "This colorful guide, full of diagrams and cartoons, teaches a couple of very basic Technomancy spells for the not-so-bright pupils.", - "//": "2 Technomancer spells", - "weight": "211 g", - "volume": "500 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { "type": "learn_spell", "spells": [ "taze", "quantum_tunnel_lesser" ] } - }, - { - "id": "techno_em", - "type": "BOOK", - "name": { - "str": "Technomancy and the Electromagnetic Spectrum", - "str_pl": "copies of Technomancy and the Electromagnetic Spectrum" - }, - "//": "3 Technomancer spells", - "description": "This lab reference material book is thick and overflowing with information on combining magic with EM radiation.", - "weight": "284 g", - "volume": "1 L", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_gray", - "use_action": { "type": "learn_spell", "spells": [ "taze", "laze", "technomancer_knifeshot" ] } - }, - { - "id": "animist_shadows", - "type": "BOOK", - "name": { "str": "Runic Tablet shard" }, - "//": "1 classless spell", - "description": "A small tablet of blackened stone, apparently cut from a much larger slab. Golden runes glow over its surface, and slowly shift into intelligible sentences when you stare at them.", - "weight": "4000 g", - "volume": "2500 ml", - "price": 5000, - "material": [ "stone" ], - "symbol": "?", - "color": "light_gray", - "use_action": { "type": "learn_spell", "spells": [ "soulrend" ] } - }, - { - "id": "translocate_spellbook", - "type": "BOOK", - "name": { "str": "Geospatial Systems: The Lie Of Linearity", "str_pl": "copies of Geospatial Systems: The Lie Of Linearity" }, - "//": "1 classless spell", - "description": "This book outlines in great detail how time and space are wibbly-wobbly and non-Euclidean. It also appears to have a dozen different coordinate systems that it uses nearly interchangeably, which makes it hard to follow. There's lots of jargon, but with intense study you can probably learn a thing or two about portals.", - "weight": "1200 g", - "volume": "2500 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "light_blue", - "use_action": { "type": "learn_spell", "spells": [ "translocate_self" ] } - }, - { - "id": "forbidden_tome", - "type": "BOOK", - "name": { "str": "Forbbiden Tome", "str_pl": "Forbidden Tomes" }, - "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", - "description": "A very, very old and heavy tome of various spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", - "weight": "2400 g", - "volume": "5000 ml", - "price": 7500, - "material": [ "paper" ], - "symbol": "?", - "color": "brown", - "use_action": { "type": "learn_spell", "spells": [ "focused_bolt", "rupture", "cause_rot" ] } - }, - { - "id": "stat_up_spellbook", - "type": "BOOK", - "name": { "str": "Transcendence of the Human Condition", "str_pl": "copies of Transcendence of the Human Condition" }, - "//": "4 Magus spells", - "description": "The Human is the only creature that seeks to improve himself. This study examines different spells that can heighten various senses temporarily, in hopes to discover a more permanent solution.", - "weight": "1300 g", - "volume": "2500 ml", - "price": 5000, - "material": [ "paper" ], - "symbol": "?", - "color": "yellow", - "use_action": { "type": "learn_spell", "spells": [ "cats_grace", "ogres_strength", "foxs_cunning", "eagles_sight" ] } + "id": "spell_scroll_tier_0", + "type": "item_group", + "items": [ + [ "summon_scroll_smudged", 10 ], + [ "spell_scroll_tornskin", 10 ], + [ "spell_scroll_smite", 40 ], + [ "spell_scroll_summon_zombie", 25 ], + [ "spell_scroll_light_healing", 50 ], + [ "spell_scroll_bio_acidicspray", 35 ], + [ "spell_scroll_create_atomic_light", 50 ], + [ "spell_scroll_blinding_flash", 50 ], + [ "spell_scroll_ethereal_grasp", 50 ], + [ "spell_scroll_druid_woodshaft", 50 ], + [ "spell_scroll_seed_of_growth", 35 ], + [ "spell_scroll_summon_cats", 65 ], + [ "spell_scroll_stonefist", 20 ], + [ "spell_scroll_eshaper_piercing_bolt", 40 ], + [ "spell_scroll_eshaper_rockbolt", 50 ], + [ "spell_scroll_create_lighter", 50 ], + [ "spell_scroll_chilling_touch", 50 ], + [ "spell_scroll_magic_missile", 50 ], + [ "spell_scroll_bleed", 50 ], + [ "spell_scroll_shocking_lash", 50 ], + [ "spell_scroll_bless", 25 ], + [ "spell_scroll_create_atomic_lamp", 25 ], + [ "spell_scroll_taze", 25 ], + [ "spell_scroll_laze", 25 ], + [ "spell_scroll_lightning_blast", 20 ], + [ "spell_scroll_x-ray", 30 ], + [ "spell_scroll_necrotic_gaze", 50 ], + [ "spell_scroll_crystallize_mana", 20 ], + [ "spell_scroll_biomancer_paralytic_dart", 40 ], + [ "spell_scroll_biomancer_visceral_projection", 40 ], + [ "spell_scroll_summon_wisps", 30 ], + [ "spell_scroll_stormshaper_wall_of_fog", 35 ], + [ "spell_scroll_shadow_field", 20 ] + ] + }, + { + "id": "spell_scroll_tier_1", + "type": "item_group", + "items": [ + [ "spell_scroll_summon_skeleton", 35 ], + [ "spell_scroll_pain_split", 25 ], + [ "spell_scroll_bio_grotesque", 40 ], + [ "spell_scroll_bio_fleshpouch", 30 ], + [ "spell_scroll_protection_aura", 50 ], + [ "spell_scroll_druid_veggrasp", 35 ], + [ "spell_scroll_druid_rootstrike", 40 ], + [ "spell_scroll_druid_naturebow1", 20 ], + [ "spell_scroll_seismic_stomp", 20 ], + [ "spell_scroll_eshaper_shardspray", 25 ], + [ "spell_scroll_clairvoyance", 30 ], + [ "spell_scroll_point_flare", 50 ], + [ "spell_scroll_ice_spike", 50 ], + [ "spell_scroll_burning_hands", 50 ], + [ "spell_scroll_frost_spray", 50 ], + [ "spell_scroll_glide_ice", 25 ], + [ "spell_scroll_ice_shield", 25 ], + [ "spell_scroll_frost_armor", 35 ], + [ "spell_scroll_phase_door", 50 ], + [ "spell_scroll_jolt", 50 ], + [ "spell_scroll_lightning_bolt", 35 ], + [ "spell_scroll_windstrike", 50 ], + [ "spell_scroll_windrun", 35 ], + [ "spell_scroll_holy_blade", 25 ], + [ "spell_scroll_spirit_armor", 25 ], + [ "spell_scroll_quantum_tunnel_lesser", 50 ], + [ "spell_scroll_synaptic_stimulation", 20 ], + [ "spell_scroll_purification_seed", 40 ], + [ "spell_scroll_crystallize_mana", 50 ], + [ "spell_scroll_earthshaper_stoneskin", 30 ], + [ "spell_scroll_earthshaper_pillar", 35 ], + [ "spell_scroll_biomancer_coagulant_weave", 30 ], + [ "spell_scroll_repelling_arc", 30 ], + [ "spell_scroll_knock", 35 ], + [ "spell_scroll_caustic_aura", 30 ], + [ "spell_scroll_impactsling", 20 ], + [ "spell_scroll_boneclub", 20 ], + [ "spell_scroll_flamesword", 35 ], + [ "spell_scroll_force_jar", 30 ], + [ "spell_scroll_flamebreath", 30 ] + ] + }, + { + "id": "spell_scroll_tier_2", + "type": "item_group", + "items": [ + [ "spell_scroll_recover_mana", 25 ], + [ "spell_scroll_recover_pain", 25 ], + [ "spell_scroll_recover_fatigue", 25 ], + [ "spell_scroll_recover_stamina", 25 ], + [ "spell_scroll_recover_bionic_power", 25 ], + [ "spell_scroll_summon_decayed_pouncer", 35 ], + [ "spell_scroll_summon_floating_disk", 25 ], + [ "spell_scroll_vicious_tentacle", 40 ], + [ "spell_scroll_bio_bonespear", 20 ], + [ "spell_scroll_megablast", 10 ], + [ "spell_scroll_baleful_polymorph", 20 ], + [ "spell_scroll_eshaper_shardstorm", 50 ], + [ "spell_scroll_fireball", 50 ], + [ "spell_scroll_cone_cold", 50 ], + [ "spell_scroll_hoary_blast", 50 ], + [ "spell_scroll_gravity_well", 35 ], + [ "spell_scroll_magus_mana_bolt", 35 ], + [ "spell_scroll_magus_haste", 50 ], + [ "spell_scroll_magus_mana_beam", 35 ], + [ "spell_scroll_magus_escape", 50 ], + [ "spell_scroll_cats_grace", 50 ], + [ "spell_scroll_eagles_sight", 50 ], + [ "spell_scroll_ogres_strength", 50 ], + [ "spell_scroll_foxs_cunning", 50 ], + [ "spell_scroll_storm_hammer", 35 ], + [ "spell_scroll_animated_blade", 35 ], + [ "spell_scroll_mirror_image", 15 ], + [ "spell_scroll_holographic_transposition", 15 ], + [ "spell_scroll_dark_sight", 30 ], + [ "spell_scroll_druidic_regrowth", 20 ], + [ "spell_scroll_stormshaper_ionization", 40 ], + [ "spell_scroll_improved_knock", 35 ], + [ "spell_scroll_knifeshot", 35 ], + [ "spell_scroll_feralform", 30 ], + [ "spell_scroll_summon_wolf", 30 ], + [ "spell_scroll_natures_commune", 30 ] + ] + }, + { + "id": "spell_scroll_tier_3", + "type": "item_group", + "items": [ + [ "spell_scroll_magus_mana_blast", 50 ], + [ "lightning_storm_scroll", 50 ], + [ "spell_scroll_invisibility", 10 ], + [ "spell_scroll_obfuscated_body", 10 ], + [ "spell_scroll_druidic_healing", 20 ], + [ "spell_scroll_summon_magic_motorcycle", 5 ], + [ "bio_sneeze_beam", 50 ], + [ "spell_scroll_banishment_lesser", 30 ], + [ "spell_scroll_nova_flare", 25 ], + [ "spell_scroll_freezing_touch", 40 ], + [ "spell_scroll_focused_bolt", 1 ], + [ "spell_scroll_rupture", 1 ], + [ "spell_scroll_cause_rot", 1 ] + ] + }, + { + "id": "spellbook_tier_0", + "type": "item_group", + "//": "These are spellbooks that a beginner would have, or scrolls that would have this tier or one tier higher of spells.", + "items": [ [ "wizard_beginner", 30 ], [ "priest_beginner", 30 ], [ "techno_idiots", 30 ], [ "novice_stormshaper_book", 30 ] ] + }, + { + "id": "spellbook_tier_1", + "type": "item_group", + "items": [ [ "wizard_utility", 50 ], [ "priest_advanced", 50 ], [ "techno_fundamentals", 50 ], [ "stat_up_spellbook", 45 ] ] + }, + { + "id": "spellbook_tier_2", + "type": "item_group", + "items": [ + [ "winter_grasp", 60 ], + [ "tome_of_storms", 60 ], + [ "biomancer_spellbook", 60 ], + [ "druid_spellbook", 60 ], + [ "pyro", 60 ], + [ "eshaper_spellbook", 60 ], + [ "techno_em", 60 ], + [ "wizard_advanced", 60 ], + [ "stat_up_spellbook", 45 ] + ] + }, + { + "id": "spellbook_tier_3", + "type": "item_group", + "items": [ + [ "animist_shadows", 5 ], + [ "forbidden_tome", 1 ], + [ "magus_spellbook", 15 ], + [ "magus_spellbook_move", 30 ], + [ "translocate_spellbook", 20 ], + [ "light_manipulation_spellbook", 5 ], + [ "recovery_spellbook", 30 ] + ] + }, + { + "id": "spellbook_loot_0", + "type": "item_group", + "//": "the difference between tiers and loot are that loot should be easy to", + "//2": "drop into an itemgroup or mapgen without having multiple entries for higher tier spellbooks.", + "//3": "and loot tiers will not always have the lower tier spellbook tiers.", + "items": [ + { "group": "spellbook_tier_0", "prob": 60 }, + { "group": "spellbook_tier_1", "prob": 30 }, + { "group": "spellbook_tier_2", "prob": 9 }, + { "group": "spellbook_tier_3", "prob": 1 }, + { "group": "spell_scroll_tier_0", "prob": 300 }, + { "group": "spell_scroll_tier_1", "prob": 100 } + ] + }, + { + "id": "spellbook_loot_1", + "type": "item_group", + "items": [ + { "group": "spellbook_tier_0", "prob": 30 }, + { "group": "spellbook_tier_1", "prob": 50 }, + { "group": "spellbook_tier_2", "prob": 18 }, + { "group": "spellbook_tier_3", "prob": 2 }, + { "group": "spell_scroll_tier_1", "prob": 300 }, + { "group": "spell_scroll_tier_2", "prob": 100 } + ] + }, + { + "id": "spellbook_loot_2", + "type": "item_group", + "items": [ + { "group": "spellbook_tier_0", "prob": 5 }, + { "group": "spellbook_tier_1", "prob": 30 }, + { "group": "spellbook_tier_2", "prob": 50 }, + { "group": "spellbook_tier_3", "prob": 15 }, + { "group": "spell_scroll_tier_2", "prob": 300 }, + { "group": "spell_scroll_tier_3", "prob": 100 } + ] } ] From e299f44290d7ce50a94ffec27715085c27d0b5f1 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Fri, 27 Aug 2021 01:07:06 -0500 Subject: [PATCH 020/154] Pasted in the actual proper lint --- data/mods/Magiclysm/items/spellbooks.json | 658 ++++++++++++++-------- 1 file changed, 436 insertions(+), 222 deletions(-) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 98b7d9b4cfe5a..d50db0b43e796 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -1,226 +1,440 @@ [ { - "id": "spell_scroll_tier_0", - "type": "item_group", - "items": [ - [ "summon_scroll_smudged", 10 ], - [ "spell_scroll_tornskin", 10 ], - [ "spell_scroll_smite", 40 ], - [ "spell_scroll_summon_zombie", 25 ], - [ "spell_scroll_light_healing", 50 ], - [ "spell_scroll_bio_acidicspray", 35 ], - [ "spell_scroll_create_atomic_light", 50 ], - [ "spell_scroll_blinding_flash", 50 ], - [ "spell_scroll_ethereal_grasp", 50 ], - [ "spell_scroll_druid_woodshaft", 50 ], - [ "spell_scroll_seed_of_growth", 35 ], - [ "spell_scroll_summon_cats", 65 ], - [ "spell_scroll_stonefist", 20 ], - [ "spell_scroll_eshaper_piercing_bolt", 40 ], - [ "spell_scroll_eshaper_rockbolt", 50 ], - [ "spell_scroll_create_lighter", 50 ], - [ "spell_scroll_chilling_touch", 50 ], - [ "spell_scroll_magic_missile", 50 ], - [ "spell_scroll_bleed", 50 ], - [ "spell_scroll_shocking_lash", 50 ], - [ "spell_scroll_bless", 25 ], - [ "spell_scroll_create_atomic_lamp", 25 ], - [ "spell_scroll_taze", 25 ], - [ "spell_scroll_laze", 25 ], - [ "spell_scroll_lightning_blast", 20 ], - [ "spell_scroll_x-ray", 30 ], - [ "spell_scroll_necrotic_gaze", 50 ], - [ "spell_scroll_crystallize_mana", 20 ], - [ "spell_scroll_biomancer_paralytic_dart", 40 ], - [ "spell_scroll_biomancer_visceral_projection", 40 ], - [ "spell_scroll_summon_wisps", 30 ], - [ "spell_scroll_stormshaper_wall_of_fog", 35 ], - [ "spell_scroll_shadow_field", 20 ] - ] - }, - { - "id": "spell_scroll_tier_1", - "type": "item_group", - "items": [ - [ "spell_scroll_summon_skeleton", 35 ], - [ "spell_scroll_pain_split", 25 ], - [ "spell_scroll_bio_grotesque", 40 ], - [ "spell_scroll_bio_fleshpouch", 30 ], - [ "spell_scroll_protection_aura", 50 ], - [ "spell_scroll_druid_veggrasp", 35 ], - [ "spell_scroll_druid_rootstrike", 40 ], - [ "spell_scroll_druid_naturebow1", 20 ], - [ "spell_scroll_seismic_stomp", 20 ], - [ "spell_scroll_eshaper_shardspray", 25 ], - [ "spell_scroll_clairvoyance", 30 ], - [ "spell_scroll_point_flare", 50 ], - [ "spell_scroll_ice_spike", 50 ], - [ "spell_scroll_burning_hands", 50 ], - [ "spell_scroll_frost_spray", 50 ], - [ "spell_scroll_glide_ice", 25 ], - [ "spell_scroll_ice_shield", 25 ], - [ "spell_scroll_frost_armor", 35 ], - [ "spell_scroll_phase_door", 50 ], - [ "spell_scroll_jolt", 50 ], - [ "spell_scroll_lightning_bolt", 35 ], - [ "spell_scroll_windstrike", 50 ], - [ "spell_scroll_windrun", 35 ], - [ "spell_scroll_holy_blade", 25 ], - [ "spell_scroll_spirit_armor", 25 ], - [ "spell_scroll_quantum_tunnel_lesser", 50 ], - [ "spell_scroll_synaptic_stimulation", 20 ], - [ "spell_scroll_purification_seed", 40 ], - [ "spell_scroll_crystallize_mana", 50 ], - [ "spell_scroll_earthshaper_stoneskin", 30 ], - [ "spell_scroll_earthshaper_pillar", 35 ], - [ "spell_scroll_biomancer_coagulant_weave", 30 ], - [ "spell_scroll_repelling_arc", 30 ], - [ "spell_scroll_knock", 35 ], - [ "spell_scroll_caustic_aura", 30 ], - [ "spell_scroll_impactsling", 20 ], - [ "spell_scroll_boneclub", 20 ], - [ "spell_scroll_flamesword", 35 ], - [ "spell_scroll_force_jar", 30 ], - [ "spell_scroll_flamebreath", 30 ] - ] - }, - { - "id": "spell_scroll_tier_2", - "type": "item_group", - "items": [ - [ "spell_scroll_recover_mana", 25 ], - [ "spell_scroll_recover_pain", 25 ], - [ "spell_scroll_recover_fatigue", 25 ], - [ "spell_scroll_recover_stamina", 25 ], - [ "spell_scroll_recover_bionic_power", 25 ], - [ "spell_scroll_summon_decayed_pouncer", 35 ], - [ "spell_scroll_summon_floating_disk", 25 ], - [ "spell_scroll_vicious_tentacle", 40 ], - [ "spell_scroll_bio_bonespear", 20 ], - [ "spell_scroll_megablast", 10 ], - [ "spell_scroll_baleful_polymorph", 20 ], - [ "spell_scroll_eshaper_shardstorm", 50 ], - [ "spell_scroll_fireball", 50 ], - [ "spell_scroll_cone_cold", 50 ], - [ "spell_scroll_hoary_blast", 50 ], - [ "spell_scroll_gravity_well", 35 ], - [ "spell_scroll_magus_mana_bolt", 35 ], - [ "spell_scroll_magus_haste", 50 ], - [ "spell_scroll_magus_mana_beam", 35 ], - [ "spell_scroll_magus_escape", 50 ], - [ "spell_scroll_cats_grace", 50 ], - [ "spell_scroll_eagles_sight", 50 ], - [ "spell_scroll_ogres_strength", 50 ], - [ "spell_scroll_foxs_cunning", 50 ], - [ "spell_scroll_storm_hammer", 35 ], - [ "spell_scroll_animated_blade", 35 ], - [ "spell_scroll_mirror_image", 15 ], - [ "spell_scroll_holographic_transposition", 15 ], - [ "spell_scroll_dark_sight", 30 ], - [ "spell_scroll_druidic_regrowth", 20 ], - [ "spell_scroll_stormshaper_ionization", 40 ], - [ "spell_scroll_improved_knock", 35 ], - [ "spell_scroll_knifeshot", 35 ], - [ "spell_scroll_feralform", 30 ], - [ "spell_scroll_summon_wolf", 30 ], - [ "spell_scroll_natures_commune", 30 ] - ] - }, - { - "id": "spell_scroll_tier_3", - "type": "item_group", - "items": [ - [ "spell_scroll_magus_mana_blast", 50 ], - [ "lightning_storm_scroll", 50 ], - [ "spell_scroll_invisibility", 10 ], - [ "spell_scroll_obfuscated_body", 10 ], - [ "spell_scroll_druidic_healing", 20 ], - [ "spell_scroll_summon_magic_motorcycle", 5 ], - [ "bio_sneeze_beam", 50 ], - [ "spell_scroll_banishment_lesser", 30 ], - [ "spell_scroll_nova_flare", 25 ], - [ "spell_scroll_freezing_touch", 40 ], - [ "spell_scroll_focused_bolt", 1 ], - [ "spell_scroll_rupture", 1 ], - [ "spell_scroll_cause_rot", 1 ] - ] - }, - { - "id": "spellbook_tier_0", - "type": "item_group", - "//": "These are spellbooks that a beginner would have, or scrolls that would have this tier or one tier higher of spells.", - "items": [ [ "wizard_beginner", 30 ], [ "priest_beginner", 30 ], [ "techno_idiots", 30 ], [ "novice_stormshaper_book", 30 ] ] - }, - { - "id": "spellbook_tier_1", - "type": "item_group", - "items": [ [ "wizard_utility", 50 ], [ "priest_advanced", 50 ], [ "techno_fundamentals", 50 ], [ "stat_up_spellbook", 45 ] ] - }, - { - "id": "spellbook_tier_2", - "type": "item_group", - "items": [ - [ "winter_grasp", 60 ], - [ "tome_of_storms", 60 ], - [ "biomancer_spellbook", 60 ], - [ "druid_spellbook", 60 ], - [ "pyro", 60 ], - [ "eshaper_spellbook", 60 ], - [ "techno_em", 60 ], - [ "wizard_advanced", 60 ], - [ "stat_up_spellbook", 45 ] - ] - }, - { - "id": "spellbook_tier_3", - "type": "item_group", - "items": [ - [ "animist_shadows", 5 ], - [ "forbidden_tome", 1 ], - [ "magus_spellbook", 15 ], - [ "magus_spellbook_move", 30 ], - [ "translocate_spellbook", 20 ], - [ "light_manipulation_spellbook", 5 ], - [ "recovery_spellbook", 30 ] - ] - }, - { - "id": "spellbook_loot_0", - "type": "item_group", - "//": "the difference between tiers and loot are that loot should be easy to", - "//2": "drop into an itemgroup or mapgen without having multiple entries for higher tier spellbooks.", - "//3": "and loot tiers will not always have the lower tier spellbook tiers.", - "items": [ - { "group": "spellbook_tier_0", "prob": 60 }, - { "group": "spellbook_tier_1", "prob": 30 }, - { "group": "spellbook_tier_2", "prob": 9 }, - { "group": "spellbook_tier_3", "prob": 1 }, - { "group": "spell_scroll_tier_0", "prob": 300 }, - { "group": "spell_scroll_tier_1", "prob": 100 } - ] - }, - { - "id": "spellbook_loot_1", - "type": "item_group", - "items": [ - { "group": "spellbook_tier_0", "prob": 30 }, - { "group": "spellbook_tier_1", "prob": 50 }, - { "group": "spellbook_tier_2", "prob": 18 }, - { "group": "spellbook_tier_3", "prob": 2 }, - { "group": "spell_scroll_tier_1", "prob": 300 }, - { "group": "spell_scroll_tier_2", "prob": 100 } - ] - }, - { - "id": "spellbook_loot_2", - "type": "item_group", - "items": [ - { "group": "spellbook_tier_0", "prob": 5 }, - { "group": "spellbook_tier_1", "prob": 30 }, - { "group": "spellbook_tier_2", "prob": 50 }, - { "group": "spellbook_tier_3", "prob": 15 }, - { "group": "spell_scroll_tier_2", "prob": 300 }, - { "group": "spell_scroll_tier_3", "prob": 100 } - ] + "id": "DEBUG_spellbook", + "type": "BOOK", + "name": { "str": "A Technomancer's Guide to Debugging C:DDA", "str_pl": "copies of A Technomancer's Guide to Debugging C:DDA" }, + "description": "static std::string description( spell sp ) const;", + "weight": "1 g", + "volume": "1 ml", + "material": [ "paper" ], + "symbol": "?", + "color": "magenta", + "use_action": { + "type": "learn_spell", + "spells": [ + "debug_hp", + "debug_stamina", + "debug_teleport_to", + "example_template", + "debug_bionic", + "pain_split", + "fireball", + "gravity_well", + "cone_cold", + "megablast", + "test_area_push", + "test_area_pull_field", + "test_area_pull_all" + ] + } + }, + { + "id": "wizard_beginner", + "type": "BOOK", + "name": { "str": "A Beginner's Guide to Magic", "str_pl": "copies of A Beginner's Guide to Magic" }, + "//": "2 Magus, 1 classless spell", + "description": "You would describe this as more like a pamphlet than a spellbook, but it seems to have at least one interesting spell you can use.", + "weight": "585 g", + "volume": "250 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_red", + "use_action": { "type": "learn_spell", "spells": [ "magic_missile", "phase_door", "create_atomic_light" ] } + }, + { + "id": "novice_stormshaper_book", + "type": "BOOK", + "name": { "str": "An Introduction to Applied Meteorology", "str_pl": "copies of An Introduction to Applied Meteorology" }, + "//": "2 stormshaper", + "description": "A professional-looking book on stormshaping, structured after many college textbooks. It has less to apply than one might expect from its size.", + "weight": "900 g", + "volume": "1200 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { "type": "learn_spell", "spells": [ "shocking_lash", "windrun" ] } + }, + { + "id": "wizard_utility", + "type": "BOOK", + "name": { "str": "Wizarding Guide to Backpacking", "str_pl": "copies of Wizarding Guide to Backpacking" }, + "//": "2 Magus, 1 Biomancer, 1, Kelvinist, 1 classless spell", + "description": "This appears to be the spell version of a guide for what things to take with you when backpacking. It's a little bulky, but will certainly prove useful.", + "weight": "1 kg", + "volume": "1250 ml", + "price": 35000, + "material": [ "paper" ], + "symbol": "?", + "color": "red", + "use_action": { + "type": "learn_spell", + "spells": [ "phase_door", "create_lighter", "pain_split", "protection_aura", "magus_force_jar" ] + } + }, + { + "id": "pyro", + "type": "BOOK", + "name": { "str": "Pyromancy for Heretics", "str_pl": "copies of Pyromancy for Heretics" }, + "//": "4 Kelvinist spells", + "description": "This charred husk of a book still contains many ways to light things aflame.", + "weight": "450 g", + "volume": "1 L", + "price": 1904, + "material": [ "paper" ], + "symbol": "?", + "color": "light_red", + "use_action": { + "type": "learn_spell", + "spells": [ "point_flare", "fireball", "burning_hands", "create_lighter", "kelvinist_summon_flamesword" ] + } + }, + { + "id": "wizard_advanced", + "type": "BOOK", + "//": "1 Magus, 1 biomancer, 2 kelvinist spells", + "name": { "str": "A Treatise on Magical Elements", "str_pl": "copies of A Treatise on Magical Elements" }, + "description": "This details complex diagrams, rituals, and choreography that describes various spells.", + "weight": "920 g", + "volume": "750 ml", + "price": 30000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_red", + "use_action": { "type": "learn_spell", "spells": [ "point_flare", "ice_spike", "gravity_well", "pain_split" ] } + }, + { + "id": "priest_beginner", + "type": "BOOK", + "name": { "str": "Introduction to the Divine", "str_pl": "copies of Introduction to the Divine" }, + "//": "1 technomancer, 1 biomancer, 1 classless spells", + "description": "This appears to mostly be a religious text, but it does have some notes on healing.", + "weight": "585 g", + "volume": "500 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_green", + "use_action": { "type": "learn_spell", "spells": [ "light_healing", "blinding_flash", "bless" ] } + }, + { + "id": "priest_advanced", + "type": "BOOK", + "name": { + "str": "The Paladin's Guide to Modern Spellcasting", + "str_pl": "copies of The Paladin's Guide to Modern Spellcasting" + }, + "//": "2 technomancer, 1 animist spells", + "description": "Despite the title, this seems to be written in Middle English. A little obtuse, but you can make out most of the words well enough.", + "weight": "830 g", + "volume": "750 ml", + "price": 30000, + "material": [ "paper" ], + "symbol": "?", + "color": "green", + "use_action": { "type": "learn_spell", "spells": [ "smite", "holy_blade", "spirit_armor" ] } + }, + { + "id": "winter_grasp", + "type": "BOOK", + "name": { "str": "Winter's Eternal Grasp", "str_pl": "copies of Winter's Eternal Grasp" }, + "//": "5 Kelvinist spells", + "description": "This slim book almost seems to be made from ice, it's cold to the touch.", + "weight": "450 g", + "volume": "1 L", + "price": 1904, + "material": [ "paper" ], + "symbol": "?", + "color": "light_blue", + "use_action": { "type": "learn_spell", "spells": [ "cone_cold", "ice_spike", "hoary_blast", "chilling_touch", "frost_spray" ] } + }, + { + "id": "tome_of_storms", + "type": "BOOK", + "//": "6 Stormshaper spells", + "name": { "str": "The Tome of The Oncoming Storm", "str_pl": "copies of The Tome of The Oncoming Storm" }, + "description": "A large book embossed with crossed lightning bolts and storm clouds, it tingles to the touch.", + "weight": "430 g", + "volume": "750 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { + "type": "learn_spell", + "spells": [ "jolt", "windstrike", "windrun", "storm_hammer", "lightning_bolt", "lightning_blast" ] + } + }, + { + "id": "generic_spellbook", + "type": "BOOK", + "name": { "str": "Nondescript Spellbook", "str_pl": "copies of Nondescript Spellbook" }, + "//": "1 technomancer, 1 earthshaper, 1 classless spell", + "description": "A small book, containing spells created by a novice magician.", + "weight": "355 g", + "volume": "500 ml", + "material": [ "paper" ], + "symbol": "?", + "color": "magenta", + "use_action": { "type": "learn_spell", "spells": [ "seismic_stomp", "create_atomic_lamp", "ethereal_grasp" ] } + }, + { + "id": "light_manipulation_spellbook", + "type": "BOOK", + "name": { "str": "Of Light and Falsehoods", "str_pl": "copies of Of Light and Falsehoods" }, + "//": "3 technomancer, 4 classless spell", + "description": "A small white book, it subtly amplifies the ambient light around it.", + "weight": "430 g", + "volume": "750 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { + "type": "learn_spell", + "spells": [ + "dark_sight", + "blinding_flash", + "obfuscated_body", + "create_atomic_light", + "mirror_image", + "invisibility", + "holographic_transposition", + "shadow_field" + ] + } + }, + { + "id": "biomancer_spellbook", + "type": "BOOK", + "name": { "str": "The Tome of Flesh", "str_pl": "copies of The Tome of Flesh" }, + "//": "5 Biomancer spells", + "description": "A small tome, seemingly covered in tanned human skin.", + "weight": "355 g", + "volume": "500 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "red", + "use_action": { + "type": "learn_spell", + "spells": [ "vicious_tentacle", "bio_grotesque", "bio_acidicspray", "bio_fleshpouch", "bio_bonespear" ] + } + }, + { + "id": "druid_spellbook", + "type": "BOOK", + "name": { "str": "The Book of Trees", "str_pl": "copies of The Book of Trees" }, + "//": "5 Druid spells", + "description": "A bark covered book.", + "weight": "355 g", + "volume": "500 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "green", + "use_action": { + "type": "learn_spell", + "spells": [ "druid_woodshaft", "druid_veggrasp", "druid_rootstrike", "druid_naturebow1", "druid_natures_commune" ] + } + }, + { + "id": "recovery_spellbook", + "type": "BOOK", + "name": { "str": "The Utility of Mana as an Energy Source", "str_pl": "copies of The Utility of Mana as an Energy Source" }, + "description": "This book details spells that use your mana to recover various physiological effects.", + "//": "1 technomancer, 2 animist, 1 druid, 1 earthshaper spell", + "weight": "728 g", + "volume": "3 L", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_blue", + "use_action": { + "type": "learn_spell", + "spells": [ "recover_mana", "recover_bionic_power", "recover_pain", "recover_fatigue", "recover_stamina" ] + } + }, + { + "id": "magus_spellbook", + "type": "BOOK", + "name": { "str": "The Tome of The Battle Mage", "str_pl": "copies of The Tome of The Battle Mage" }, + "//": "4 Magus spells", + "description": "Your standard wizardy looking spellbook, filled with Magus combat spells. You sure lucked out!", + "weight": "434 g", + "volume": "750 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { + "type": "learn_spell", + "spells": [ "magus_mana_beam", "magus_mana_bolt", "magus_mana_blast", "magus_summon_impact_sling" ] + } + }, + { + "id": "eshaper_spellbook", + "type": "BOOK", + "name": { "str": "The Tome of the Hollow Earth", "str_pl": "copies of The Tome of the Hollow Earth" }, + "//": "4 earthshaper spells", + "description": "This large dusty spellbook seems perpetually, well, dusty. It contains the power of the earth.", + "weight": "483 g", + "volume": "825 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "brown", + "use_action": { + "type": "learn_spell", + "spells": [ "eshaper_rockbolt", "eshaper_shardspray", "eshaper_piercing_bolt", "eshaper_shardstorm" ] + } + }, + { + "id": "magus_spellbook_move", + "type": "BOOK", + "name": { "str": "The Tome of Magical Movement", "str_pl": "copies of The Tome of Magical Movement" }, + "//": "3 Magus spells", + "description": "This small lightweight book seems to almost not entirely exist, let's say it 97% does. It contains Magus spells focused on movement.", + "weight": "231 g", + "volume": "500 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { "type": "learn_spell", "spells": [ "phase_door", "magus_escape", "magus_haste" ] } + }, + { + "id": "summon_scroll_smudged", + "type": "BOOK", + "name": { "str": "Smudged Scroll" }, + "//": "Druid spell", + "description": "This looks like someone was designing a new spell, but spilled a mug of coffee on it and crumpled it up in anger. You can tell that it will definitely cast something, but you can't be sure that it will work very well.", + "weight": "129 g", + "volume": "100 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { "type": "learn_spell", "spells": [ "summon_bear" ] } + }, + { + "id": "summon_undead_spellbook", + "type": "BOOK", + "name": { "str": "Necromantic Minions for Dummies", "str_pl": "copies of Necromantic Minions for Dummies" }, + "//": "3 Animist spells", + "description": "This book details various ways of summoning an undead minion to fight for you. They all appear to disappear after a short time, crumbling to dust.", + "weight": "788 g", + "volume": "2250 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { "type": "learn_spell", "spells": [ "summon_zombie", "summon_skeleton", "summon_decayed_pouncer" ] } + }, + { + "id": "techno_fundamentals", + "type": "BOOK", + "name": { "str": "Fundamentals of Technomancy", "str_pl": "copies of Fundamentals of Technomancy" }, + "//": "4 Technomancer spells", + "description": "This thick manual instructs the spellcaster on manipulating and empowering various forms of matter and energy.", + "weight": "258 g", + "volume": "750 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { + "type": "learn_spell", + "spells": [ "synaptic_stimulation", "animated_blade", "mirror_image", "technomancer_knifeshot" ] + } + }, + { + "id": "techno_idiots", + "type": "BOOK", + "name": { "str": "Complete Idiot's Guide to Technomancy", "str_pl": "copies of Complete Idiot's Guide to Technomancy" }, + "description": "This colorful guide, full of diagrams and cartoons, teaches a couple of very basic Technomancy spells for the not-so-bright pupils.", + "//": "2 Technomancer spells", + "weight": "211 g", + "volume": "500 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { "type": "learn_spell", "spells": [ "taze", "quantum_tunnel_lesser" ] } + }, + { + "id": "techno_em", + "type": "BOOK", + "name": { + "str": "Technomancy and the Electromagnetic Spectrum", + "str_pl": "copies of Technomancy and the Electromagnetic Spectrum" + }, + "//": "3 Technomancer spells", + "description": "This lab reference material book is thick and overflowing with information on combining magic with EM radiation.", + "weight": "284 g", + "volume": "1 L", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_gray", + "use_action": { "type": "learn_spell", "spells": [ "taze", "laze", "technomancer_knifeshot" ] } + }, + { + "id": "animist_shadows", + "type": "BOOK", + "name": { "str": "Runic Tablet shard" }, + "//": "1 classless spell", + "description": "A small tablet of blackened stone, apparently cut from a much larger slab. Golden runes glow over its surface, and slowly shift into intelligible sentences when you stare at them.", + "weight": "4000 g", + "volume": "2500 ml", + "price": 5000, + "material": [ "stone" ], + "symbol": "?", + "color": "light_gray", + "use_action": { "type": "learn_spell", "spells": [ "soulrend" ] } + }, + { + "id": "translocate_spellbook", + "type": "BOOK", + "name": { "str": "Geospatial Systems: The Lie Of Linearity", "str_pl": "copies of Geospatial Systems: The Lie Of Linearity" }, + "//": "1 classless spell", + "description": "This book outlines in great detail how time and space are wibbly-wobbly and non-Euclidean. It also appears to have a dozen different coordinate systems that it uses nearly interchangeably, which makes it hard to follow. There's lots of jargon, but with intense study you can probably learn a thing or two about portals.", + "weight": "1200 g", + "volume": "2500 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "light_blue", + "use_action": { "type": "learn_spell", "spells": [ "translocate_self" ] } + }, + { + "id": "forbbiden_tome", + "id": "forbidden_tome", + "type": "BOOK", + "name": { "str": "Forbbiden Tome", "str_pl": "Forbidden Tomes" }, + "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", + "description": "A very, very old and heavy tome of various spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", + "weight": "2400 g", + "volume": "5000 ml", + "price": 7500, + "material": [ "paper" ], + "symbol": "?", + "color": "brown", + "use_action": { "type": "learn_spell", "spells": [ "focused_bolt", "rupture", "cause_rot" ] } + }, + { + "id": "stat_up_spellbook", + "type": "BOOK", + "name": { "str": "Transcendence of the Human Condition", "str_pl": "copies of Transcendence of the Human Condition" }, + "//": "4 Magus spells", + "description": "The Human is the only creature that seeks to improve himself. This study examines different spells that can heighten various senses temporarily, in hopes to discover a more permanent solution.", + "weight": "1300 g", + "volume": "2500 ml", + "price": 5000, + "material": [ "paper" ], + "symbol": "?", + "color": "yellow", + "use_action": { "type": "learn_spell", "spells": [ "cats_grace", "ogres_strength", "foxs_cunning", "eagles_sight" ] } } ] From 1d55a91ea2907a9da101bf0a8e0069d49a8d7bbd Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Fri, 27 Aug 2021 01:07:44 -0500 Subject: [PATCH 021/154] Linted as requested From d3d9f8f3781eaeb8231f6fc4ae0e5c0ca8e9452c Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Fri, 27 Aug 2021 01:09:52 -0500 Subject: [PATCH 022/154] Linted focused bolt --- data/mods/Magiclysm/Spells/magus.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/magus.json b/data/mods/Magiclysm/Spells/magus.json index 6e679dacba81f..258c12be729f4 100644 --- a/data/mods/Magiclysm/Spells/magus.json +++ b/data/mods/Magiclysm/Spells/magus.json @@ -413,7 +413,7 @@ "id": "focused_bolt", "type": "SPELL", "name": "Focused Bolt", - "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble. Passed on only through direct decendants over the ages, though occasionally shared by them to others.", + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slain many a king and noble. Passed on only through direct descendants over the ages, though occasionally shared by them to others.", "effect": "attack", "shape": "line", "valid_targets": [ "hostile", "ground" ], From 907fd3a4339eccdd6bb0f1af31958731273dcdd1 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Fri, 27 Aug 2021 01:12:32 -0500 Subject: [PATCH 023/154] Linted, and added more lore to cause rot --- data/mods/Magiclysm/Spells/druid.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index c8e6d85f6c9a9..3059e9102e21f 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -448,11 +448,11 @@ "id": "cause_rot", "type": "SPELL", "name": "Cause Rot", - "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", + "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate; even rusting machines into nothing but dust, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile", "ground" ], - "flags": [ "SOMATIC", "NO_PROJECTILE", "CONCENTRATE", "VERBAL" ], + "flags": [ "SOMATIC", "NO_PROJECTILE", "CONCENTRATE", "VERBAL" ], "max_level": 30, "spell_class": "DRUID", "energy_source": "MANA", From 5eb4f288418a50ffeba21308b116b9931e2304d4 Mon Sep 17 00:00:00 2001 From: Wyrdean <43324177+Wyrdean@users.noreply.github.com> Date: Fri, 27 Aug 2021 01:13:40 -0500 Subject: [PATCH 024/154] Linted added Scrolls From dce0b3c208eb17e5c1b4929b57749cf845f76a28 Mon Sep 17 00:00:00 2001 From: Drew4484 <57647637+Drew4484@users.noreply.github.com> Date: Tue, 28 Dec 2021 12:40:07 -0800 Subject: [PATCH 025/154] Update suits_protection.json --- data/json/items/armor/suits_protection.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index 0f9a0e87a6bf9..5c87c9ae87a0e 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -208,7 +208,10 @@ "price_postapoc": 12000, "to_hit": -5, "bashing": 8, - "material": [ "steel", "leather" ], + "material": [ + { "type": "steel", "portion": 9 }, + { "type": "leather", "portion": 1 } + ], "symbol": "[", "looks_like": "armor_larmor", "color": "light_gray", @@ -303,7 +306,10 @@ "price_postapoc": 6000, "to_hit": -5, "bashing": 8, - "material": [ "steel", "leather" ], + "material": [ + { "type": "steel", "portion": 9 }, + { "type": "leather", "portion": 1 } + ], "symbol": "[", "looks_like": "armor_lightplate", "color": "light_gray", From 6fb3586a1e1860af83723d6af7083d911501000c Mon Sep 17 00:00:00 2001 From: Drew4484 <57647637+Drew4484@users.noreply.github.com> Date: Tue, 28 Dec 2021 12:44:06 -0800 Subject: [PATCH 026/154] Update suits_protection.json --- data/json/items/armor/suits_protection.json | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index 5c87c9ae87a0e..705496bd48c72 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -208,10 +208,7 @@ "price_postapoc": 12000, "to_hit": -5, "bashing": 8, - "material": [ - { "type": "steel", "portion": 9 }, - { "type": "leather", "portion": 1 } - ], + "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], "symbol": "[", "looks_like": "armor_larmor", "color": "light_gray", @@ -306,10 +303,7 @@ "price_postapoc": 6000, "to_hit": -5, "bashing": 8, - "material": [ - { "type": "steel", "portion": 9 }, - { "type": "leather", "portion": 1 } - ], + "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], "symbol": "[", "looks_like": "armor_lightplate", "color": "light_gray", From 3765384dd63bf9404d69205e6d35fd5ee9de3df8 Mon Sep 17 00:00:00 2001 From: Drew4484 <57647637+Drew4484@users.noreply.github.com> Date: Tue, 28 Dec 2021 14:43:11 -0800 Subject: [PATCH 027/154] Update suits_protection.json --- data/json/items/armor/suits_protection.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index 705496bd48c72..5c87c9ae87a0e 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -208,7 +208,10 @@ "price_postapoc": 12000, "to_hit": -5, "bashing": 8, - "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], + "material": [ + { "type": "steel", "portion": 9 }, + { "type": "leather", "portion": 1 } + ], "symbol": "[", "looks_like": "armor_larmor", "color": "light_gray", @@ -303,7 +306,10 @@ "price_postapoc": 6000, "to_hit": -5, "bashing": 8, - "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], + "material": [ + { "type": "steel", "portion": 9 }, + { "type": "leather", "portion": 1 } + ], "symbol": "[", "looks_like": "armor_lightplate", "color": "light_gray", From 1be7d443a85561b1858bd9b6ef3d6c68cbd1890e Mon Sep 17 00:00:00 2001 From: Drew4484 <57647637+Drew4484@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:35:47 -0800 Subject: [PATCH 028/154] Update suits_protection.json --- data/json/items/armor/suits_protection.json | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index 5c87c9ae87a0e..37fb7f84d5768 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -208,10 +208,7 @@ "price_postapoc": 12000, "to_hit": -5, "bashing": 8, - "material": [ - { "type": "steel", "portion": 9 }, - { "type": "leather", "portion": 1 } - ], + "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], "symbol": "[", "looks_like": "armor_larmor", "color": "light_gray", @@ -306,10 +303,7 @@ "price_postapoc": 6000, "to_hit": -5, "bashing": 8, - "material": [ - { "type": "steel", "portion": 9 }, - { "type": "leather", "portion": 1 } - ], + "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], "symbol": "[", "looks_like": "armor_lightplate", "color": "light_gray", From d7d5de9c1e229b467396903fb13e6b3cefabf137 Mon Sep 17 00:00:00 2001 From: Drew4484 <57647637+Drew4484@users.noreply.github.com> Date: Tue, 28 Dec 2021 16:05:51 -0800 Subject: [PATCH 029/154] Update suits_protection.json --- data/json/items/armor/suits_protection.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index 37fb7f84d5768..705496bd48c72 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -208,7 +208,7 @@ "price_postapoc": 12000, "to_hit": -5, "bashing": 8, - "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], + "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], "symbol": "[", "looks_like": "armor_larmor", "color": "light_gray", @@ -303,7 +303,7 @@ "price_postapoc": 6000, "to_hit": -5, "bashing": 8, - "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], + "material": [ { "type": "steel", "portion": 9 }, { "type": "leather", "portion": 1 } ], "symbol": "[", "looks_like": "armor_lightplate", "color": "light_gray", From 09abe69c1cbaa17d12ab96cba7847b00f8f54336 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Sun, 19 Dec 2021 19:58:18 -0500 Subject: [PATCH 030/154] Re-enable exhaustive mapgen test --- tests/overmap_test.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/overmap_test.cpp b/tests/overmap_test.cpp index 57b0c7f91be98..ab2c58f1377c1 100644 --- a/tests/overmap_test.cpp +++ b/tests/overmap_test.cpp @@ -385,11 +385,9 @@ TEST_CASE( "overmap_terrain_coverage", "[overmap][slow]" ) // The second phase of this test is to perform the tile-level mapgen once // for each oter_type, in hopes of triggering any errors that might arise // with that. - /* Temporarally disabled until we fix https://github.com/CleverRaven/Cataclysm-DDA/issues/52345 for( const std::pair &p : stats ) { const tripoint_abs_omt pos = p.second.first_observed; tinymap tm; tm.load( project_to( pos ), false ); } - */ } From 83467d9f37d0cf7cecb87151dbbb9e45c0034169 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 15:09:15 +0100 Subject: [PATCH 031/154] space 1 --- data/mods/Magiclysm/Spells/animist.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index 72a820dd15fd9..18fc05d860667 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -386,7 +386,7 @@ "id": "rupture", "type": "SPELL", "name": "Rupture", - "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, leylines to become muddled, and electronics to overcharge. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", + "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, leylines to become muddled, and electronics to overcharge. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile" ], From c035721bb532fc122644cb37461ec548dccfc3f5 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 15:10:32 +0100 Subject: [PATCH 032/154] space 2 --- data/mods/Magiclysm/Spells/druid.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index 3059e9102e21f..f413a93676e6d 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -448,7 +448,7 @@ "id": "cause_rot", "type": "SPELL", "name": "Cause Rot", - "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate; even rusting machines into nothing but dust, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", + "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate; even rusting machines into nothing but dust, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile", "ground" ], From 2150d2b9c30952c0b8084f287b33850f2607b891 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 15:11:28 +0100 Subject: [PATCH 033/154] space 3 --- data/mods/Magiclysm/Spells/magus.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/magus.json b/data/mods/Magiclysm/Spells/magus.json index 258c12be729f4..e104b9e10205f 100644 --- a/data/mods/Magiclysm/Spells/magus.json +++ b/data/mods/Magiclysm/Spells/magus.json @@ -413,7 +413,7 @@ "id": "focused_bolt", "type": "SPELL", "name": "Focused Bolt", - "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slain many a king and noble. Passed on only through direct descendants over the ages, though occasionally shared by them to others.", + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slain many a king and noble. Passed on only through direct descendants over the ages, though occasionally shared by them to others.", "effect": "attack", "shape": "line", "valid_targets": [ "hostile", "ground" ], From 9b2402506872bda26229c81882d517aae329ac93 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 16:22:23 +0100 Subject: [PATCH 034/154] fixed id duplication --- data/mods/Magiclysm/items/spellbooks.json | 1 - 1 file changed, 1 deletion(-) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 9dc781e14b477..68ae55a0d0ccd 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -434,7 +434,6 @@ }, { "id": "forbbiden_tome", - "id": "forbidden_tome", "type": "BOOK", "name": { "str": "Forbbiden Tome", "str_pl": "Forbidden Tomes" }, "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", From 0ebe895bb89f6d6b62490c0b1fbe7fac9f565d6b Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 16:27:21 +0100 Subject: [PATCH 035/154] Another space fixes --- data/mods/Magiclysm/items/spell_scrolls.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json index fb8b03ee75d7f..6018c04d41d90 100644 --- a/data/mods/Magiclysm/items/spell_scrolls.json +++ b/data/mods/Magiclysm/items/spell_scrolls.json @@ -116,7 +116,7 @@ "id": "spell_scroll_rupture", "//": "Animist spell", "name": { "str": "Scroll of Rupture", "str_pl": "Scrolls of Rupture" }, - "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, leylines to become muddled, and electronics to overcharge. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", + "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, leylines to become muddled, and electronics to overcharge. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", "use_action": { "type": "learn_spell", "spells": [ "rupture" ] } }, { @@ -313,7 +313,7 @@ "id": "spell_scroll_cause_rot", "//": "Druid spell", "name": { "str": "Scroll of Cause Rot", "str_pl": "Scrolls of Cause Rot" }, - "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", + "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", "use_action": { "type": "learn_spell", "spells": [ "cause_rot" ] } }, { @@ -610,7 +610,7 @@ "id": "spell_scroll_focused_bolt", "//": "Magus spell", "name": { "str": "Scroll of Focused Bolt", "str_pl": "Scrolls of Focused Bolt" }, - "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble. Passed on only through direct decendants over the ages, though occasionally shared by them to others.", + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble. Passed on only through direct decendants over the ages, though occasionally shared by them to others.", "use_action": { "type": "learn_spell", "spells": [ "focused_bolt" ] } }, { From e9e31c5dd848bca7ba417487b0c8dab790242a4e Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 16:27:58 +0100 Subject: [PATCH 036/154] even more space fixes --- data/mods/Magiclysm/items/spellbooks.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 68ae55a0d0ccd..3d50fac2f9c32 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -437,7 +437,7 @@ "type": "BOOK", "name": { "str": "Forbbiden Tome", "str_pl": "Forbidden Tomes" }, "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", - "description": "A very, very old and heavy tome of various spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", + "description": "A very, very old and heavy tome of various spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", "weight": "2400 g", "volume": "5000 ml", "price": 7500, From ed7ffbdd3752928a9ebfd5da89b54f17dc82eae0 Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Sun, 2 Jan 2022 01:29:33 +0800 Subject: [PATCH 037/154] Pluralize a message in vehicle::thrust() --- src/vehicle_move.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vehicle_move.cpp b/src/vehicle_move.cpp index 1af7e97ded3a7..0fa8fa0844cf4 100644 --- a/src/vehicle_move.cpp +++ b/src/vehicle_move.cpp @@ -439,7 +439,9 @@ void vehicle::thrust( int thd, int z ) if( has_engine_type( fuel_type_muscle, true ) ) { add_msg( _( "The %s is too heavy to move!" ), name ); } else { - add_msg( _( "The %s is too heavy for its engine(s)!" ), name ); + add_msg( n_gettext( "The %s is too heavy for its engine!", + "The %s is too heavy for its engines!", + engines.size() ), name ); } } return; From c024aca4f2495a99768e14893d1cef8f11f093ca Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Sun, 2 Jan 2022 01:37:19 +0800 Subject: [PATCH 038/154] Fix letter casing of "3D" and "Nomex" --- .../terrain-manufactured.json | 2 +- data/json/items/armor/boots.json | 2 +- data/json/items/armor/robofac_armor.json | 40 +++++++++---------- data/json/items/tool/science.json | 2 +- data/json/requirements/materials.json | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/data/json/furniture_and_terrain/terrain-manufactured.json b/data/json/furniture_and_terrain/terrain-manufactured.json index 358e75a3b6374..ec3f0e264791e 100644 --- a/data/json/furniture_and_terrain/terrain-manufactured.json +++ b/data/json/furniture_and_terrain/terrain-manufactured.json @@ -550,7 +550,7 @@ "id": "t_nanofab_body", "name": "nanofabricator", "symbol": "%", - "description": "A great column of advanced machinery. Within this self-contained, miniaturized factory, several 3d printers work in tandem with a robotic assembler to manufacture nearly any inorganic object.", + "description": "A great column of advanced machinery. Within this self-contained, miniaturized factory, several 3D printers work in tandem with a robotic assembler to manufacture nearly any inorganic object.", "color": "dark_gray", "move_cost": 0, "coverage": 65, diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index 0a918da19b16b..40b6b866ae6b4 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -166,7 +166,7 @@ "type": "ARMOR", "category": "armor", "name": { "str": "pair of EOD foot protectors", "str_pl": "pairs of EOD foot protectors" }, - "description": "Armored foot protectors constructed from steel and nomex for use by explosive ordnance disposal technicians.", + "description": "Armored foot protectors constructed from steel and Nomex for use by explosive ordnance disposal technicians.", "weight": "1220 g", "volume": "3 L", "price": 50000, diff --git a/data/json/items/armor/robofac_armor.json b/data/json/items/armor/robofac_armor.json index fb5d8683bee78..a5c1e733523bd 100644 --- a/data/json/items/armor/robofac_armor.json +++ b/data/json/items/armor/robofac_armor.json @@ -227,7 +227,7 @@ "type": "ARMOR", "copy-from": "robofac_mantle", "name": "Hub 01 prototype mantle", - "description": "3d printed upper body armor, despite its rough finish it's still lightweight and it seems a lot of thought went into the ergonomics. This is made of 3d printed plastic with an unhardened metal core to give some reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed upper body armor, despite its rough finish it's still lightweight and it seems a lot of thought went into the ergonomics. This is made of 3D printed plastic with an unhardened metal core to give some reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "plastic", "portion": 3 }, { "type": "aluminum", "portion": 1 } ] }, { @@ -236,7 +236,7 @@ "type": "ARMOR", "copy-from": "robofac_mantle", "name": "Hub 01 kinetic mantle", - "description": "3d printed upper body armor, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3d printed plastic combined with printed rubber and a hardened metal core to give significant reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed upper body armor, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3D printed plastic combined with printed rubber and a hardened metal core to give significant reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "rubber", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -246,7 +246,7 @@ "type": "ARMOR", "copy-from": "robofac_mantle", "name": "Hub 01 turnout mantle", - "description": "3d printed upper body armor, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3d printed plastic combined with printed nomex and a hardened metal core to give significant reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed upper body armor, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3D printed plastic combined with printed Nomex and a hardened metal core to give significant reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "nomex", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -256,7 +256,7 @@ "type": "ARMOR", "copy-from": "robofac_mantle", "name": "Hub 01 ballistic mantle", - "description": "3d printed upper body armor, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3d printed plastic combined with aramid fabric and a hardened metal core to give significant reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed upper body armor, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3D printed plastic combined with aramid fabric and a hardened metal core to give significant reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "kevlar", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -266,7 +266,7 @@ "type": "ARMOR", "copy-from": "robofac_mantle", "name": "Hub 01 soldier mantle", - "description": "3d printed upper body armor, it has a professional finish, is lightweight and it seems perfectly designed to move with your body. This is made of UHMWPE combined with hardened and treated aramid and a hardened metal core to give significant reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed upper body armor, it has a professional finish, is lightweight and it seems perfectly designed to move with your body. This is made of UHMWPE combined with hardened and treated aramid and a hardened metal core to give significant reinforcement. Designed to clip to the chest and shoulders the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "thermo_resin", "portion": 1 }, { "type": "steel", "portion": 1 }, @@ -281,7 +281,7 @@ "type": "ARMOR", "copy-from": "robofac_skirt", "name": "Hub 01 prototype skirt", - "description": "3d printed segmented armored skirt, despite its rough finish it's still lightweight and it seems a lot of thought went into the ergonomics. This is made of 3d printed plastic with an unhardened metal core to give some reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed segmented armored skirt, despite its rough finish it's still lightweight and it seems a lot of thought went into the ergonomics. This is made of 3D printed plastic with an unhardened metal core to give some reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "plastic", "portion": 3 }, { "type": "aluminum", "portion": 1 } ] }, { @@ -290,7 +290,7 @@ "type": "ARMOR", "copy-from": "robofac_skirt", "name": "Hub 01 kinetic skirt", - "description": "3d printed segmented armored skirt, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3d printed plastic combined with printed rubber and a hardened metal core to give significant reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed segmented armored skirt, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3D printed plastic combined with printed rubber and a hardened metal core to give significant reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "rubber", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -300,7 +300,7 @@ "type": "ARMOR", "copy-from": "robofac_skirt", "name": "Hub 01 turnout skirt", - "description": "3d printed segmented armored skirt, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3d printed plastic combined with printed nomex and a hardened metal core to give significant reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed segmented armored skirt, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3D printed plastic combined with printed Nomex and a hardened metal core to give significant reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "nomex", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -310,7 +310,7 @@ "type": "ARMOR", "copy-from": "robofac_skirt", "name": "Hub 01 ballistic skirt", - "description": "3d printed segmented armored skirt, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3d printed plastic combined with aramid fabric and a hardened metal core to give significant reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed segmented armored skirt, it is well finished, lightweight and it seems a lot of thought went into the ergonomics. This is made of 3D printed plastic combined with aramid fabric and a hardened metal core to give significant reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "kevlar", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -320,7 +320,7 @@ "type": "ARMOR", "copy-from": "robofac_skirt", "name": "Hub 01 soldier skirt", - "description": "3d printed segmented armored skirt, it has a professional finish, is lightweight and it seems perfectly designed to move with your body. This is made of UHMWPE combined with hardened and treated aramid and a hardened metal core to give significant reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", + "description": "3D printed segmented armored skirt, it has a professional finish, is lightweight and it seems perfectly designed to move with your body. This is made of UHMWPE combined with hardened and treated aramid and a hardened metal core to give significant reinforcement. Designed to clip to the waist and near the knees the interior side reads ATTACH TO MODULAR DEFENSE SYSTEM.", "material": [ { "type": "thermo_resin", "portion": 1 }, { "type": "steel", "portion": 1 }, @@ -335,7 +335,7 @@ "type": "ARMOR", "copy-from": "robofac_vambraces", "name": { "str_sp": "Hub 01 prototype vambraces" }, - "description": "3d printed arm guards, despite its rough finish it's still lightweight and secure. This is made of 3d printed plastic with an unhardened metal core to give some reinforcement.", + "description": "3D printed arm guards, despite its rough finish it's still lightweight and secure. This is made of 3D printed plastic with an unhardened metal core to give some reinforcement.", "material": [ { "type": "plastic", "portion": 3 }, { "type": "aluminum", "portion": 1 } ] }, { @@ -344,7 +344,7 @@ "type": "ARMOR", "copy-from": "robofac_vambraces", "name": { "str_sp": "Hub 01 kinetic vambraces" }, - "description": "3d printed arm guards, it is well finished, lightweight and secure. This is made of 3d printed plastic combined with printed rubber and a hardened metal core to give significant reinforcement.", + "description": "3D printed arm guards, it is well finished, lightweight and secure. This is made of 3D printed plastic combined with printed rubber and a hardened metal core to give significant reinforcement.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "rubber", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -354,7 +354,7 @@ "type": "ARMOR", "copy-from": "robofac_vambraces", "name": { "str_sp": "Hub 01 turnout vambraces" }, - "description": "3d printed arm guards, it is well finished, lightweight and secure. This is made of 3d printed plastic combined with printed nomex and a hardened metal core to give significant reinforcement.", + "description": "3D printed arm guards, it is well finished, lightweight and secure. This is made of 3D printed plastic combined with printed Nomex and a hardened metal core to give significant reinforcement.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "nomex", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -364,7 +364,7 @@ "type": "ARMOR", "copy-from": "robofac_vambraces", "name": { "str_sp": "Hub 01 ballistic vambraces" }, - "description": "3d printed arm guards, it is well finished, lightweight and secure. This is made of 3d printed plastic combined with aramid fabric and a hardened metal core to give significant reinforcement.", + "description": "3D printed arm guards, it is well finished, lightweight and secure. This is made of 3D printed plastic combined with aramid fabric and a hardened metal core to give significant reinforcement.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "kevlar", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -374,7 +374,7 @@ "type": "ARMOR", "copy-from": "robofac_vambraces", "name": { "str_sp": "Hub 01 soldier vambraces" }, - "description": "3d printed arm guards, it has a professional finish, is lightweight and is perfectly balanced. This is made of UHMWPE combined with hardened and treated aramid and a hardened metal core to give significant reinforcement.", + "description": "3D printed arm guards, it has a professional finish, is lightweight and is perfectly balanced. This is made of UHMWPE combined with hardened and treated aramid and a hardened metal core to give significant reinforcement.", "material": [ { "type": "thermo_resin", "portion": 1 }, { "type": "steel", "portion": 1 }, @@ -389,7 +389,7 @@ "type": "ARMOR", "copy-from": "robofac_greaves", "name": { "str_sp": "Hub 01 prototype greaves" }, - "description": "3d printed leg guards, despite its rough finish it's still lightweight and secure. This is made of 3d printed plastic with an unhardened metal core to give some reinforcement.", + "description": "3D printed leg guards, despite its rough finish it's still lightweight and secure. This is made of 3D printed plastic with an unhardened metal core to give some reinforcement.", "material": [ { "type": "plastic", "portion": 3 }, { "type": "aluminum", "portion": 1 } ] }, { @@ -398,7 +398,7 @@ "type": "ARMOR", "copy-from": "robofac_greaves", "name": { "str_sp": "Hub 01 kinetic greaves" }, - "description": "3d printed leg guards, it is well finished, lightweight and secure. This is made of 3d printed plastic combined with printed rubber and a hardened metal core to give significant reinforcement.", + "description": "3D printed leg guards, it is well finished, lightweight and secure. This is made of 3D printed plastic combined with printed rubber and a hardened metal core to give significant reinforcement.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "rubber", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -408,7 +408,7 @@ "type": "ARMOR", "copy-from": "robofac_greaves", "name": { "str_sp": "Hub 01 turnout greaves" }, - "description": "3d printed leg guards, it is well finished, lightweight and secure. This is made of 3d printed plastic combined with printed nomex and a hardened metal core to give significant reinforcement.", + "description": "3D printed leg guards, it is well finished, lightweight and secure. This is made of 3D printed plastic combined with printed Nomex and a hardened metal core to give significant reinforcement.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "nomex", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -418,7 +418,7 @@ "type": "ARMOR", "copy-from": "robofac_greaves", "name": { "str_sp": "Hub 01 ballistic greaves" }, - "description": "3d printed leg guards, it is well finished, lightweight and secure. This is made of 3d printed plastic combined with aramid fabric and a hardened metal core to give significant reinforcement.", + "description": "3D printed leg guards, it is well finished, lightweight and secure. This is made of 3D printed plastic combined with aramid fabric and a hardened metal core to give significant reinforcement.", "material": [ { "type": "plastic", "portion": 1 }, { "type": "steel", "portion": 1 }, { "type": "kevlar", "portion": 2 } ], "proportional": { "weight": 2.5 } }, @@ -428,7 +428,7 @@ "type": "ARMOR", "copy-from": "robofac_greaves", "name": { "str_sp": "Hub 01 soldier greaves" }, - "description": "3d printed leg guards, it has a professional finish, is lightweight and is perfectly balanced. This is made of UHMWPE combined with hardened and treated aramid and a hardened metal core to give significant reinforcement.", + "description": "3D printed leg guards, it has a professional finish, is lightweight and is perfectly balanced. This is made of UHMWPE combined with hardened and treated aramid and a hardened metal core to give significant reinforcement.", "material": [ { "type": "thermo_resin", "portion": 1 }, { "type": "steel", "portion": 1 }, diff --git a/data/json/items/tool/science.json b/data/json/items/tool/science.json index 6ae20c3f295d4..cdbb65bc18860 100644 --- a/data/json/items/tool/science.json +++ b/data/json/items/tool/science.json @@ -1052,7 +1052,7 @@ "type": "TOOL", "category": "tools", "name": { "str": "dissecting microscope" }, - "description": "This microscope has less magnification than a standard one. It's also stereoscopic and produces a neat 3d image of the surface. It was typically used for doing dissections and other fine detail work on small creatures. It still works pretty well with an added light source, but what would you do with it?", + "description": "This microscope has less magnification than a standard one. It's also stereoscopic and produces a neat 3D image of the surface. It was typically used for doing dissections and other fine detail work on small creatures. It still works pretty well with an added light source, but what would you do with it?", "weight": "2200 g", "volume": "4000ml", "price": 3000, diff --git a/data/json/requirements/materials.json b/data/json/requirements/materials.json index d08702937bf02..03fdf480b0c6a 100644 --- a/data/json/requirements/materials.json +++ b/data/json/requirements/materials.json @@ -195,7 +195,7 @@ { "id": "fabric_nomex", "type": "requirement", - "//": "Materials used for crafting nomex clothing", + "//": "Materials used for crafting Nomex clothing", "components": [ [ [ "nomex", 1 ], [ "sheet_nomex_patchwork", 1 ], [ "sheet_nomex", 1 ] ] ] }, { From fe36a1c0b374ffce116ee92293ec4a68f8d76a5a Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 18:48:20 +0100 Subject: [PATCH 039/154] fix --- data/mods/Magiclysm/items/spell_scrolls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json index 6018c04d41d90..7b28d65b1cb13 100644 --- a/data/mods/Magiclysm/items/spell_scrolls.json +++ b/data/mods/Magiclysm/items/spell_scrolls.json @@ -610,7 +610,7 @@ "id": "spell_scroll_focused_bolt", "//": "Magus spell", "name": { "str": "Scroll of Focused Bolt", "str_pl": "Scrolls of Focused Bolt" }, - "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble. Passed on only through direct decendants over the ages, though occasionally shared by them to others.", + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slayed many a king and noble. Passed on only through direct descendants over the ages, though occasionally shared by them to others.", "use_action": { "type": "learn_spell", "spells": [ "focused_bolt" ] } }, { From a20c8a6a6fef63c5f8c7bb8eb72d3bb63a75bc19 Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Sun, 2 Jan 2022 02:01:13 +0800 Subject: [PATCH 040/154] Update spell checker dictionary --- tools/spell_checker/dictionary.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/spell_checker/dictionary.txt b/tools/spell_checker/dictionary.txt index f8b73a41edea6..48010fee6e197 100644 --- a/tools/spell_checker/dictionary.txt +++ b/tools/spell_checker/dictionary.txt @@ -35,6 +35,7 @@ alembic alexandrites alienis alient +alkahest alkalis alkyl alleghaniensis @@ -392,7 +393,6 @@ cyberdog cyberterror cybug cyphers -cysts d dagnabbit dambreaker @@ -826,6 +826,7 @@ isable isassembled issions itemname +iterating ixed j jabberwock @@ -1456,6 +1457,7 @@ sealable secubot segmentata seguiram +semiaquatic sendin sendo serendipitously @@ -1748,6 +1750,7 @@ unfermented unflavored unfoldable ungraspable +unhardened unharvested unhidden unhomogenized From 27d8061f366f39dc7821eea6ae75414f0a19d268 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Tue, 28 Dec 2021 20:18:16 -0500 Subject: [PATCH 041/154] Add ALLOW_ON_OPEN_AIR furniture flag This is intended to flag furnitures which are expected to spawn on open air terrain tiles. Most furnitures are not, and we want to exploit this for sanity checking. --- data/json/furniture_and_terrain/furniture-roof.json | 2 +- doc/JSON_FLAGS.md | 2 ++ src/mapdata.cpp | 1 + src/mapdata.h | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/data/json/furniture_and_terrain/furniture-roof.json b/data/json/furniture_and_terrain/furniture-roof.json index 78ade711a13b1..863db58eac6fb 100644 --- a/data/json/furniture_and_terrain/furniture-roof.json +++ b/data/json/furniture_and_terrain/furniture-roof.json @@ -8,7 +8,7 @@ "color": "white", "move_cost_mod": -2, "required_str": 10, - "flags": [ "TRANSPARENT", "PLACE_ITEM" ], + "flags": [ "TRANSPARENT", "PLACE_ITEM", "ALLOW_ON_OPEN_AIR" ], "bash": { "str_min": 6, "str_max": 10, diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index d3d7a6a72a75f..97dfadcb2081e 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -550,6 +550,8 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```ALARMED``` Sets off an alarm if smashed. - ```ALIGN_WORKBENCH``` (only for furniture) A hint to the tiles display that the sprite for this furniture should face toward any adjacent tile with a workbench quality. - ```ALLOW_FIELD_EFFECT``` Apply field effects to items inside ```SEALED``` terrain/furniture. +- ```ALLOW_ON_OPEN_AIR``` Don't warn when this furniture is placed on + `t_open_air` or similar 'open air' terrains which lack a floor. - ```AUTO_WALL_SYMBOL``` (only for terrain) The symbol of this terrain will be one of the line drawings (corner, T-intersection, straight line etc.) depending on the adjacent terrains. Example: `-` and `|` are both terrain with the `CONNECT_TO_WALL` flag. `O` does not have the flag, while `X` and `Y` have the `AUTO_WALL_SYMBOL` flag. diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 5f551086e1a9c..5db70b4bfa3c1 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -179,6 +179,7 @@ std::string enum_to_string( ter_furn_flag data ) case ter_furn_flag::TFLAG_GOES_DOWN: return "GOES_DOWN"; case ter_furn_flag::TFLAG_GOES_UP: return "GOES_UP"; case ter_furn_flag::TFLAG_NO_FLOOR: return "NO_FLOOR"; + case ter_furn_flag::TFLAG_ALLOW_ON_OPEN_AIR: return "ALLOW_ON_OPEN_AIR"; case ter_furn_flag::TFLAG_SEEN_FROM_ABOVE: return "SEEN_FROM_ABOVE"; case ter_furn_flag::TFLAG_RAMP_DOWN: return "RAMP_DOWN"; case ter_furn_flag::TFLAG_RAMP_UP: return "RAMP_UP"; diff --git a/src/mapdata.h b/src/mapdata.h index abf0bbc534b46..1881396389f7e 100644 --- a/src/mapdata.h +++ b/src/mapdata.h @@ -223,6 +223,7 @@ enum class ter_furn_flag : int { TFLAG_GOES_DOWN, TFLAG_GOES_UP, TFLAG_NO_FLOOR, + TFLAG_ALLOW_ON_OPEN_AIR, TFLAG_SEEN_FROM_ABOVE, TFLAG_RAMP_DOWN, TFLAG_RAMP_UP, From 60d8eca5d7ec17733e977ebae2a8658088bfd9bc Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Tue, 28 Dec 2021 08:27:46 -0500 Subject: [PATCH 042/154] Furniture on open air sanity check Add a check in map::furn_set that prints a debugmsg if furniture is placed on open air, unless that furniture has the ALLOW_ON_OPEN_AIR flag. This helps reveal certain mapgen issues (like inappropriately placed map extras) in the unit tests, without the need for a player to happen upon them. --- src/map.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/map.cpp b/src/map.cpp index 1dc8cdd14f6cb..652bc5f22bcdb 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1397,6 +1397,14 @@ void map::furn_set( const tripoint &p, const furn_id &new_furniture, const bool const furn_t &old_f = old_id.obj(); const furn_t &new_f = new_target_furniture.obj(); + if( current_submap->is_open_air( l ) && + !new_f.has_flag( ter_furn_flag::TFLAG_ALLOW_ON_OPEN_AIR ) ) { + const ter_id current_ter = current_submap->get_ter( l ); + debugmsg( "Setting furniture %s at %s where terrain is %s (which is_open_air)\n" + "If this is intentional, set the ALLOW_ON_OPEN_AIR flag on the furniture", + new_target_furniture.id().str(), p.to_string(), current_ter.id().str() ); + } + avatar &player_character = get_avatar(); // If player has grabbed this furniture and it's no longer grabbable, release the grab. if( player_character.get_grab_type() == object_type::FURNITURE && From a3098e44a947d800f3012d03e7a9594632837bf2 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Wed, 20 Oct 2021 19:12:10 -0400 Subject: [PATCH 043/154] Add context to mapgen apply functions This is needed for useful error messages. --- src/mapgen.cpp | 166 +++++++++++++++++++++++++------------------------ src/mapgen.h | 9 +-- 2 files changed, 90 insertions(+), 85 deletions(-) diff --git a/src/mapgen.cpp b/src/mapgen.cpp index e6160c28c4eec..fe190c7a02014 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1597,10 +1597,10 @@ class jmapgen_alternatively : public jmapgen_piece piece.merge_parameters_into( params, outer_context ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &context ) const override { if( const auto chosen = random_entry_opt( alternatives ) ) { - chosen->get().apply( dat, x, y ); + chosen->get().apply( dat, x, y, context ); } } bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { @@ -1632,15 +1632,15 @@ class jmapgen_constrained : public jmapgen_piece ) const override { underlying_piece->merge_parameters_into( params, outer_context ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &context ) const override { for( const mapgen_constraint &constraint : constraints ) { Value param_value = dat.get_arg( constraint.parameter_name ); if( param_value != constraint.value ) { return; } } - underlying_piece->apply( dat, x, y ); + underlying_piece->apply( dat, x, y, context ); } }; @@ -1663,8 +1663,8 @@ class jmapgen_field : public jmapgen_piece , age( time_duration::from_turns( jsi.get_int( "age", 0 ) ) ) , remove( jsi.get_bool( "remove", false ) ) { } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { field_type_id chosen_id = ftype.get( dat ); if( chosen_id.id().is_null() ) { return; @@ -1703,8 +1703,8 @@ class jmapgen_npc : public jmapgen_piece jsi.read( "add_trait", traits ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { string_id chosen_id = npc_class.get( dat ); if( chosen_id.is_null() ) { return; @@ -1739,8 +1739,8 @@ class jmapgen_faction : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::faction_ownership; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { faction_id chosen_id = id.get( dat ); if( chosen_id.is_null() ) { return; @@ -1770,8 +1770,8 @@ class jmapgen_sign : public jmapgen_piece jsi.throw_error( "jmapgen_sign: needs either signage or snippet" ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const point r( x.get(), y.get() ); dat.m.furn_set( r, f_null ); dat.m.furn_set( r, furn_f_sign ); @@ -1823,8 +1823,8 @@ class jmapgen_graffiti : public jmapgen_piece jsi.throw_error( "jmapgen_graffiti: needs either text or snippet" ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const point r( x.get(), y.get() ); std::string graffiti; @@ -1873,8 +1873,8 @@ class jmapgen_vending_machine : public jmapgen_piece group_id = mapgen_value( "default_vending_machine" ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const point r( x.get(), y.get() ); dat.m.furn_set( r, f_null ); item_group_id chosen_id = group_id.get( dat ); @@ -1906,8 +1906,8 @@ class jmapgen_toilet : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::furniture; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const point r( x.get(), y.get() ); const int charges = amount.get(); dat.m.furn_set( r, f_null ); @@ -1951,8 +1951,8 @@ class jmapgen_gaspump : public jmapgen_piece } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const point r( x.get(), y.get() ); int charges = amount.get(); dat.m.furn_set( r, f_null ); @@ -1988,8 +1988,8 @@ class jmapgen_liquid_item : public jmapgen_piece , liquid( jsi.get_member( "liquid" ) ) , chance( jsi, "chance", 1, 1 ) { } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { if( one_in( chance.get() ) ) { itype_id chosen_id = liquid.get( dat ); if( chosen_id.is_null() ) { @@ -2025,10 +2025,10 @@ class jmapgen_corpse : public jmapgen_piece group( jsi.get_member( "group" ) ) { } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { - const std::vector monster_group = MonsterGroupManager::GetMonstersFromGroup( group, - true ); + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { + const std::vector monster_group = + MonsterGroupManager::GetMonstersFromGroup( group, true ); const mtype_id &corpse_type = random_entry_ref( monster_group ); item corpse = item::make_corpse( corpse_type, calendar::start_of_cataclysm ); dat.m.add_item_or_charges( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ), corpse ); @@ -2058,8 +2058,8 @@ class jmapgen_item_group : public jmapgen_piece debugmsg( "Invalid item_group_id \"%s\" in %s", group_id.str(), context ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { dat.m.place_items( group_id, chance.get(), point( x.val, y.val ), point( x.valmax, y.valmax ), true, calendar::start_of_cataclysm ); } @@ -2103,8 +2103,8 @@ class jmapgen_loot : public jmapgen_piece } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { if( rng( 0, 99 ) < chance ) { const Item_spawn_data *const isd = &result_group; const std::vector spawn = isd->create( calendar::start_of_cataclysm, @@ -2136,8 +2136,8 @@ class jmapgen_monster_group : public jmapgen_piece , density( jsi.get_float( "density", -1.0f ) ) , chance( jsi, "chance", 1, 1 ) { } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { mongroup_id chosen_id = id.get( dat ); if( chosen_id.is_null() ) { return; @@ -2222,8 +2222,8 @@ class jmapgen_monster : public jmapgen_piece m_id.check( oter_name, parameters ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { int raw_odds = chance.get(); @@ -2308,8 +2308,8 @@ class jmapgen_vehicle : public jmapgen_piece rotation.push_back( units::from_degrees( jsi.get_int( "rotation", 0 ) ) ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { if( !x_in_y( chance.get(), 100 ) ) { return; } @@ -2354,8 +2354,8 @@ class jmapgen_spawn_item : public jmapgen_piece } repeat = jmapgen_int( jsi, "repeat", 1, 1 ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { itype_id chosen_id = type.get( dat ); if( chosen_id.is_null() ) { return; @@ -2406,9 +2406,8 @@ class jmapgen_trap : public jmapgen_piece } init( tid ); } - - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { trap_id chosen_id = id.get( dat ); if( chosen_id.id().is_null() ) { return; @@ -2447,8 +2446,8 @@ class jmapgen_furniture : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::furniture; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { furn_id chosen_id = id.get( dat ); if( chosen_id.id().is_null() ) { return; @@ -2483,19 +2482,20 @@ class jmapgen_terrain : public jmapgen_piece return mapgen_phase::terrain; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { ter_id chosen_id = id.get( dat ); if( chosen_id.id().is_null() ) { return; } - dat.m.ter_set( point( x.get(), y.get() ), chosen_id ); + point p( x.get(), y.get() ); + dat.m.ter_set( p, chosen_id ); // Delete furniture if a wall was just placed over it. TODO: need to do anything for fluid, monsters? - if( dat.m.has_flag_ter( ter_furn_flag::TFLAG_WALL, point( x.get(), y.get() ) ) ) { - dat.m.furn_clear( point( x.get(), y.get() ) ); + if( dat.m.has_flag_ter( ter_furn_flag::TFLAG_WALL, p ) ) { + dat.m.furn_clear( p ); // and items, unless the wall has PLACE_ITEM flag indicating it stores things. - if( !dat.m.has_flag_ter( ter_furn_flag::TFLAG_PLACE_ITEM, point( x.get(), y.get() ) ) ) { - dat.m.i_clear( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ) ); + if( !dat.m.has_flag_ter( ter_furn_flag::TFLAG_PLACE_ITEM, p ) ) { + dat.m.i_clear( tripoint( p, dat.m.get_abs_sub().z ) ); } } } @@ -2519,8 +2519,8 @@ class jmapgen_ter_furn_transform: public jmapgen_piece jmapgen_ter_furn_transform( const JsonObject &jsi, const std::string &/*context*/ ) : id( jsi.get_member( "transform" ) ) {} - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { ter_furn_transform_id chosen_id = id.get( dat ); if( chosen_id.is_null() ) { return; @@ -2554,8 +2554,8 @@ class jmapgen_make_rubble : public jmapgen_piece } jsi.read( "overwrite", overwrite ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { furn_id chosen_rubble_type = rubble_type.get( dat ); ter_id chosen_floor_type = floor_type.get( dat ); if( chosen_rubble_type.id().is_null() ) { @@ -2618,8 +2618,8 @@ class jmapgen_computer : public jmapgen_piece } } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const point r( x.get(), y.get() ); dat.m.furn_set( r, furn_f_console ); computer *cpu = dat.m.add_computer( tripoint( r, dat.m.get_abs_sub().z ), name.translated(), @@ -2758,8 +2758,8 @@ class jmapgen_sealed_item : public jmapgen_piece } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &context ) const override { const int c = chance.get(); // 100% chance = always generate, otherwise scale by item spawn rate. @@ -2771,10 +2771,10 @@ class jmapgen_sealed_item : public jmapgen_piece dat.m.furn_set( point( x.get(), y.get() ), f_null ); if( item_spawner ) { - item_spawner->apply( dat, x, y ); + item_spawner->apply( dat, x, y, context ); } if( item_group_spawner ) { - item_group_spawner->apply( dat, x, y ); + item_group_spawner->apply( dat, x, y, context ); } furn_id chosen_furn = furniture.get( dat ); dat.m.furn_set( point( x.get(), y.get() ), chosen_furn ); @@ -2801,8 +2801,8 @@ class jmapgen_translate : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::transform; } - void apply( const mapgendata &dat, const jmapgen_int &/*x*/, - const jmapgen_int &/*y*/ ) const override { + void apply( const mapgendata &dat, const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, + const std::string &/*context*/ ) const override { ter_id chosen_from = from.get( dat ); ter_id chosen_to = to.get( dat ); dat.m.translate( chosen_from, chosen_to ); @@ -2831,8 +2831,8 @@ class jmapgen_zone : public jmapgen_piece name = jsi.get_string( "name" ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { zone_type_id chosen_zone_type = zone_type.get( dat ); faction_id chosen_faction = faction.get( dat ); zone_manager &mgr = zone_manager::get_manager(); @@ -2860,8 +2860,8 @@ class jmapgen_remove_items : public jmapgen_piece items_to_remove.emplace_back( itype_id( item_id ) ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const tripoint start = dat.m.getabs( tripoint( x.val, y.val, dat.zlevel() ) ); const tripoint end = dat.m.getabs( tripoint( x.valmax, y.valmax, dat.zlevel() ) ); std::vector items_to_remove_local = items_to_remove; @@ -2902,8 +2902,8 @@ class jmapgen_remove_vehicles : public jmapgen_piece vehicles_to_remove.emplace_back( vproto_id( item_id ) ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const tripoint start = dat.m.getabs( tripoint( x.val, y.val, dat.zlevel() ) ); const tripoint end = dat.m.getabs( tripoint( x.valmax, y.valmax, dat.zlevel() ) ); @@ -3095,8 +3095,8 @@ class jmapgen_nested : public jmapgen_piece return else_entries; } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const override { + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &/*context*/ ) const override { const mapgen_value *val = get_entries( dat ).pick(); if( val == nullptr ) { return; @@ -4179,7 +4179,8 @@ bool mapgen_function_json_base::has_vehicle_collision( static bool apply_mapgen_in_phases( const mapgendata &md, const std::vector &setmap_points, - const jmapgen_objects &objects, const point &offset, bool verify = false ) + const jmapgen_objects &objects, const point &offset, const std::string &context, + bool verify = false ) { if( verify && objects.has_vehicle_collision( md, offset ) ) { return false; @@ -4201,7 +4202,7 @@ static bool apply_mapgen_in_phases( elem.apply( md, offset ); } - objects.apply( md, phase, offset ); + objects.apply( md, phase, offset, context ); } cata_assert( setmap_point == setmap_points.end() ); @@ -4260,7 +4261,7 @@ void mapgen_function_json::generate( mapgendata &md ) mapgendata md_with_params( md, get_args( md, mapgen_parameter_scope::omt ) ); - apply_mapgen_in_phases( md_with_params, setmap_points, objects, point_zero ); + apply_mapgen_in_phases( md_with_params, setmap_points, objects, point_zero, context_ ); m->rotate( rotation.get() ); @@ -4286,18 +4287,20 @@ void mapgen_function_json_nested::nest( const mapgendata &md, const point &offse mapgendata md_with_params( md, get_args( md, mapgen_parameter_scope::nest ) ); - apply_mapgen_in_phases( md_with_params, setmap_points, objects, offset ); + apply_mapgen_in_phases( md_with_params, setmap_points, objects, offset, context_ ); } /* * Apply mapgen as per a derived-from-json recipe; in theory fast, but not very versatile */ -void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase ) const +void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, + const std::string &context ) const { - apply( dat, phase, point_zero ); + apply( dat, phase, point_zero, context ); } -void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, const point &offset ) const +void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, const point &offset, + const std::string &context ) const { bool terrain_resolved = false; @@ -4324,7 +4327,7 @@ void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, const po // into the what and where in some cases--we just need the greater value of the two. const int repeat = std::max( where.repeat.get(), what.repeat.get() ); for( int i = 0; i < repeat; i++ ) { - what.apply( dat, where.x, where.y ); + what.apply( dat, where.x, where.y, context ); } } } @@ -7397,7 +7400,8 @@ bool update_mapgen_function_json::update_map( const mapgendata &md, const point }; rotation_guard rot( md_with_params ); - return apply_mapgen_in_phases( md_with_params, setmap_points, objects, offset, verify ); + return apply_mapgen_in_phases( md_with_params, setmap_points, objects, offset, context_, + verify ); } mapgen_update_func add_mapgen_update_func( const JsonObject &jo, bool &defer ) diff --git a/src/mapgen.h b/src/mapgen.h index f1d9ff5983730..b8cfec49cc646 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -210,8 +210,8 @@ class jmapgen_piece const std::string &/*outer_context*/ ) const {} /** Place something on the map from mapgendata &dat, at (x,y). */ - virtual void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y - ) const = 0; + virtual void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const std::string &context ) const = 0; virtual ~jmapgen_piece() = default; jmapgen_int repeat; virtual bool has_vehicle_collision( const mapgendata &, const point &/*offset*/ ) const { @@ -383,8 +383,9 @@ struct jmapgen_objects { void merge_parameters_into( mapgen_parameters &, const std::string &outer_context ) const; - void apply( const mapgendata &dat, mapgen_phase ) const; - void apply( const mapgendata &dat, mapgen_phase, const point &offset ) const; + void apply( const mapgendata &dat, mapgen_phase, const std::string &context ) const; + void apply( const mapgendata &dat, mapgen_phase, const point &offset, + const std::string &context ) const; /** * checks if applying these objects to data would cause cause a collision with vehicles From 70a4fd54da9c1d02248394e7c108dafa8b1ca381 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Sat, 1 Jan 2022 13:58:33 -0500 Subject: [PATCH 044/154] Don't use ternary operator for control flow Necessary refactoring before I change the return type of furn_set. --- src/activity_actor.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index d857ea1aceeea..245e499120a90 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -2313,9 +2313,11 @@ void lockpick_activity_actor::finish( player_activity &act, Character &who ) // Increase your XP if you successfully pick the lock, unless you were using a Perfect Lockpick. xp_gain = xp_gain * 2; } - here.has_furn( target ) ? - here.furn_set( target, new_furn_type ) : - static_cast( here.ter_set( target, new_ter_type ) ); + if( here.has_furn( target ) ) { + here.furn_set( target, new_furn_type ); + } else { + here.ter_set( target, new_ter_type ); + } who.add_msg_if_player( m_good, open_message ); } else if( furn_type == f_gunsafe_ml && lock_roll > ( 3 * pick_roll ) ) { who.add_msg_if_player( m_bad, _( "Your clumsy attempt jams the lock!" ) ); From 3aed9507ed0ee1a8749af5503a6e84d553788075 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Sat, 1 Jan 2022 14:00:02 -0500 Subject: [PATCH 045/154] Have furn_set return bool and improve errors Now jmapgen_furniture will check the return value and report an error with more useful context. Also, nested mapgen provides extra context about the map within which they were a nest. --- src/debug_menu.cpp | 2 +- src/map.cpp | 14 ++++++++++---- src/map.h | 6 +++--- src/mapgen.cpp | 18 ++++++++++++------ src/mapgen.h | 3 ++- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index a870e4011aa63..bee2c43f670f0 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -1155,7 +1155,7 @@ static void spawn_nested_mapgen() if( ptr == nullptr ) { return; } - ( *ptr )->nest( md, local_ms.xy() ); + ( *ptr )->nest( md, local_ms.xy(), "debug menu" ); target_map.save(); g->load_npcs(); here.invalidate_map_cache( here.get_abs_sub().z ); diff --git a/src/map.cpp b/src/map.cpp index 652bc5f22bcdb..0ed533becb547 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1372,23 +1372,24 @@ furn_id map::furn( const tripoint &p ) const return current_submap->get_furn( l ); } -void map::furn_set( const tripoint &p, const furn_id &new_furniture, const bool furn_reset ) +bool map::furn_set( const tripoint &p, const furn_id &new_furniture, const bool furn_reset ) { if( !inbounds( p ) ) { - return; + debugmsg( "map::furn_set %s out of bounds", p.to_string() ); + return false; } point l; submap *const current_submap = unsafe_get_submap_at( p, l ); if( current_submap == nullptr ) { debugmsg( "Tried to set furniture at (%d,%d) but the submap is not loaded", l.x, l.y ); - return; + return false; } const furn_id new_target_furniture = new_furniture == f_clear ? f_null : new_furniture; const furn_id old_id = current_submap->get_furn( l ); if( old_id == new_target_furniture ) { // Nothing changed - return; + return true; } current_submap->set_furn( l, new_target_furniture ); @@ -1397,12 +1398,15 @@ void map::furn_set( const tripoint &p, const furn_id &new_furniture, const bool const furn_t &old_f = old_id.obj(); const furn_t &new_f = new_target_furniture.obj(); + bool result = true; + if( current_submap->is_open_air( l ) && !new_f.has_flag( ter_furn_flag::TFLAG_ALLOW_ON_OPEN_AIR ) ) { const ter_id current_ter = current_submap->get_ter( l ); debugmsg( "Setting furniture %s at %s where terrain is %s (which is_open_air)\n" "If this is intentional, set the ALLOW_ON_OPEN_AIR flag on the furniture", new_target_furniture.id().str(), p.to_string(), current_ter.id().str() ); + result = false; } avatar &player_character = get_avatar(); @@ -1456,6 +1460,8 @@ void map::furn_set( const tripoint &p, const furn_id &new_furniture, const bool tripoint above( p.xy(), p.z + 1 ); // Make sure that if we supported something and no longer do so, it falls down support_dirty( above ); + + return result; } bool map::can_move_furniture( const tripoint &pos, Character *you ) diff --git a/src/map.h b/src/map.h index 2593409cf86dd..b640301014ef2 100644 --- a/src/map.h +++ b/src/map.h @@ -810,9 +810,9 @@ class map * furn_reset should be true if new_furniture is being set to f_null * when the player is grab-moving furniture */ - void furn_set( const tripoint &p, const furn_id &new_furniture, bool furn_reset = false ); - void furn_set( const point &p, const furn_id &new_furniture ) { - furn_set( tripoint( p, abs_sub.z ), new_furniture ); + bool furn_set( const tripoint &p, const furn_id &new_furniture, bool furn_reset = false ); + bool furn_set( const point &p, const furn_id &new_furniture ) { + return furn_set( tripoint( p, abs_sub.z ), new_furniture ); } void furn_clear( const tripoint &p ) { furn_set( p, f_clear ); diff --git a/src/mapgen.cpp b/src/mapgen.cpp index fe190c7a02014..3ee45d635833e 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -2447,12 +2447,14 @@ class jmapgen_furniture : public jmapgen_piece return mapgen_phase::furniture; } void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, - const std::string &/*context*/ ) const override { + const std::string &context ) const override { furn_id chosen_id = id.get( dat ); if( chosen_id.id().is_null() ) { return; } - dat.m.furn_set( point( x.get(), y.get() ), chosen_id ); + if( !dat.m.furn_set( point( x.get(), y.get() ), chosen_id ) ) { + debugmsg( "Problem setting furniture in %s", context ); + } } bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); @@ -3096,7 +3098,7 @@ class jmapgen_nested : public jmapgen_piece } } void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, - const std::string &/*context*/ ) const override { + const std::string &context ) const override { const mapgen_value *val = get_entries( dat ).pick(); if( val == nullptr ) { return; @@ -3120,7 +3122,7 @@ class jmapgen_nested : public jmapgen_piece return; } - ( *ptr )->nest( dat, point( x.get(), y.get() ) ); + ( *ptr )->nest( dat, point( x.get(), y.get() ), context ); } void check( const std::string &oter_name, const mapgen_parameters ¶meters ) const override { @@ -4280,14 +4282,18 @@ mapgen_parameters mapgen_function_json::get_mapgen_params( mapgen_parameter_scop return parameters.params_for_scope( scope ); } -void mapgen_function_json_nested::nest( const mapgendata &md, const point &offset ) const +void mapgen_function_json_nested::nest( const mapgendata &md, const point &offset, + const std::string &outer_context ) const { // TODO: Make rotation work for submaps, then pass this value into elem & objects apply. //int chosen_rotation = rotation.get() % 4; mapgendata md_with_params( md, get_args( md, mapgen_parameter_scope::nest ) ); - apply_mapgen_in_phases( md_with_params, setmap_points, objects, offset, context_ ); + std::string context = context_; + context += " in "; + context += outer_context; + apply_mapgen_in_phases( md_with_params, setmap_points, objects, offset, context ); } /* diff --git a/src/mapgen.h b/src/mapgen.h index b8cfec49cc646..ed8ee965539ec 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -499,7 +499,8 @@ class mapgen_function_json_nested : public mapgen_function_json_base mapgen_function_json_nested( const json_source_location &jsrcloc, const std::string &context ); ~mapgen_function_json_nested() override = default; - void nest( const mapgendata &md, const point &offset ) const; + void nest( const mapgendata &md, const point &offset, + const std::string &outer_context ) const; protected: bool setup_internal( const JsonObject &jo ) override; From 985b7bb735914c94a76c258c68a3fd36b1b33360 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Sat, 1 Jan 2022 12:59:35 -0700 Subject: [PATCH 046/154] src: Eliminate randomness from sprinting distance Stamina regen: Use std::ceil instead of roll_remainder in update_stamina. This ensures that the floating-point value is always rounded up (instead of only randomly being rounded up), and should give at most 1 extra point of stamina regen. Getting winded: Before, there was a random chance to become winded below 20% of maximum stamina, meaning total running distance could be cut short by 8-12 steps or more (effectively capping maximum stamina at 80%, at random). Now, becoming winded is more predictable, occurring only upon reaching 0 stamina. --- src/character.cpp | 2 +- src/game.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/character.cpp b/src/character.cpp index 3ccd22bcf2c80..bb3476f1f2709 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -6315,7 +6315,7 @@ void Character::update_stamina( int turns ) } // Roll to determine actual stamina recovery over this period - int recover_amount = roll_remainder( stamina_recovery * turns ); + int recover_amount = std::ceil( stamina_recovery * turns ); mod_stamina( recover_amount ); add_msg_debug( debugmode::DF_CHARACTER, "Stamina recovery: %d", recover_amount ); diff --git a/src/game.cpp b/src/game.cpp index 5587069cf16e1..2893c5152e076 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -10216,7 +10216,7 @@ void game::on_move_effects() if( !u.can_run() ) { u.toggle_run_mode(); } - if( u.get_stamina() < u.get_stamina_max() / 5 && one_in( u.get_stamina() ) ) { + if( u.get_stamina() <= 0 ) { u.add_effect( effect_winded, 10_turns ); } } From 0c664ab32f8a7611f9015c213a5e4046c4bb9720 Mon Sep 17 00:00:00 2001 From: Kevin Granade Date: Sat, 1 Jan 2022 14:05:35 -0800 Subject: [PATCH 047/154] Skip expensive drop_invalid_inventory() calls in pickup activity --- src/activity_actor.cpp | 1 + src/activity_actor.h | 10 ++++++++++ src/activity_actor_definitions.h | 4 ++++ src/character.cpp | 2 +- src/player_activity.h | 4 ++++ 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index d857ea1aceeea..3518296d20993 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -1962,6 +1962,7 @@ static void cancel_pickup( Character &who ) if( who.is_hauling() && !get_map().has_haulable_items( who.pos() ) ) { who.stop_hauling(); } + who.drop_invalid_inventory(); } void pickup_activity_actor::do_turn( player_activity &, Character &who ) diff --git a/src/activity_actor.h b/src/activity_actor.h index 1fb09a0c2f552..ca3caf071fc97 100644 --- a/src/activity_actor.h +++ b/src/activity_actor.h @@ -96,6 +96,16 @@ class activity_actor return get_type()->exertion_level(); } + /** + * Override to false in actors that are slow because they frequently + * invalidate the inventory and trigger excessive + * drop_invalid_inventory() calls, and can guarantee that it is called + * appropriately themselves. + */ + virtual bool do_drop_invalid_inventory() const { + return true; + } + /** * Returns a deep copy of this object. Example implementation: * \code diff --git a/src/activity_actor_definitions.h b/src/activity_actor_definitions.h index 45b12d33392ac..17d45bac8255b 100644 --- a/src/activity_actor_definitions.h +++ b/src/activity_actor_definitions.h @@ -596,6 +596,10 @@ class pickup_activity_actor : public activity_actor return std::string(); } + bool do_drop_invalid_inventory() const override { + return false; + } + void serialize( JsonOut &jsout ) const override; static std::unique_ptr deserialize( JsonValue &jsin ); }; diff --git a/src/character.cpp b/src/character.cpp index 3ccd22bcf2c80..e102486f27264 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -2014,7 +2014,7 @@ void Character::process_turn() // If we're actively handling something we can't just drop it on the ground // in the middle of handling it - if( activity.targets.empty() ) { + if( activity.targets.empty() && activity.do_drop_invalid_inventory() ) { drop_invalid_inventory(); } process_items(); diff --git a/src/player_activity.h b/src/player_activity.h index 1a07d2703ee6c..d986ac4c7c898 100644 --- a/src/player_activity.h +++ b/src/player_activity.h @@ -173,6 +173,10 @@ class player_activity void inherit_distractions( const player_activity & ); float exertion_level() const; + + bool do_drop_invalid_inventory() const { + return !actor || actor->do_drop_invalid_inventory(); + } }; #endif // CATA_SRC_PLAYER_ACTIVITY_H From 7ed5fd89e6d7bfbccfa449b633aca3623498df5e Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 23:42:48 +0100 Subject: [PATCH 048/154] Apply suggestions from code review Co-authored-by: Curtis Merrill --- data/mods/Magiclysm/Spells/animist.json | 2 +- data/mods/Magiclysm/Spells/druid.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index 18fc05d860667..cfecce4e70e7c 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -386,7 +386,7 @@ "id": "rupture", "type": "SPELL", "name": "Rupture", - "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, leylines to become muddled, and electronics to overcharge. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", + "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, ley lines becoming muddled, and electronics overcharging. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile" ], diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index f413a93676e6d..4d899f4914522 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -448,7 +448,7 @@ "id": "cause_rot", "type": "SPELL", "name": "Cause Rot", - "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate; even rusting machines into nothing but dust, and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", + "description": "A spell from a darker sect of druidry, created to forcibly begin the circle of life anew. For without rot, you cannot have growth. Affects a huge area, but is indiscriminate; even rusting machines into nothing but dust and slow both in casting and effect. Once lost entirely to the passage of time, this spell was thought to be no more than a myth, the stuff of fairy tales, albeit grim ones.", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile", "ground" ], From a96278c4d105313c513f8a526087303c380f5118 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sat, 1 Jan 2022 23:59:52 +0100 Subject: [PATCH 049/154] rupture rewrited --- data/mods/Magiclysm/Spells/animist.json | 26 ++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index cfecce4e70e7c..cd52045585bcb 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -387,26 +387,30 @@ "type": "SPELL", "name": "Rupture", "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, ley lines becoming muddled, and electronics overcharging. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", + "//": "rewrited it, so now it low-damage dot spell that transform to high-damage without dot" "effect": "attack", "shape": "blast", "valid_targets": [ "hostile" ], "flags": [ "SOMATIC", "NO_PROJECTILE", "LOUD" ], - "max_level": 30, + "max_level": 25, "min_range": 1, - "max_range": 1, - "min_damage": 2, - "max_damage": 2, + "range_increment": 0.1, + "max_range": 3, + "min_damage": 0, + "max_damage": 90, + "damage_increment": 3.6, "base_casting_time": 50, "base_energy_cost": 500, + "final_energy_cost": 250, + "energy_increment": -10, "spell_class": "ANIMIST", - "min_duration": 100, - "max_duration": 500, - "duration_increment": 15, - "min_dot": 10, - "max_dot": 100, - "dot_increment": 3, + "min_duration": 1500, + "max_duration": 0, + "duration_increment": -60, + "min_dot": 6, + "max_dot": 6, "energy_source": "MANA", - "difficulty": 1, + "difficulty": 3, "damage_type": "pure" } ] From 2828b3543e0247d77a97dbc860e4430883f0af17 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sun, 2 Jan 2022 00:07:22 +0100 Subject: [PATCH 050/154] Rewrited cause_rot --- data/mods/Magiclysm/Spells/druid.json | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index 4d899f4914522..5600e0ecf81fb 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -453,22 +453,27 @@ "shape": "blast", "valid_targets": [ "hostile", "ground" ], "flags": [ "SOMATIC", "NO_PROJECTILE", "CONCENTRATE", "VERBAL" ], - "max_level": 30, + "max_level": 25, "spell_class": "DRUID", "energy_source": "MANA", "difficulty": 8, "damage_type": "pure", "base_casting_time": 10000, + "final_casting_time": 500, + "casting_time_increment": -380, "base_energy_cost": 1000, - "min_aoe": 5, - "max_aoe": 50, + "final_energy_cost": 400, + "energy_increment": -24, + "min_aoe": 15, + "max_aoe": 60, "aoe_increment": 1.5, "min_damage": 1, "max_damage": 1, "min_dot": 1, - "max_dot": 1, - "min_duration": 5000, - "max_duration": 20000, - "duration_increment": 500 + "max_dot": 5, + "dot_increment": 0.2, + "min_duration": 500, + "max_duration": 5000, + "duration_increment": 180 } ] From 3d306a5d4ee245e3ba52a7d3a81a0cd9425b2200 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sun, 2 Jan 2022 00:08:27 +0100 Subject: [PATCH 051/154] lint+error --- data/mods/Magiclysm/Spells/animist.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index cd52045585bcb..d3fb245dfea1f 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -387,7 +387,7 @@ "type": "SPELL", "name": "Rupture", "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, ley lines becoming muddled, and electronics overcharging. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", - "//": "rewrited it, so now it low-damage dot spell that transform to high-damage without dot" + "//": "rewrited it, so now it low-damage dot spell that transform to high-damage without dot", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile" ], From de150459c3bc37105940b408dea9a12b47eef63c Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sun, 2 Jan 2022 00:17:33 +0100 Subject: [PATCH 052/154] changed the range --- data/mods/Magiclysm/Spells/druid.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index 5600e0ecf81fb..aea48ed2fd3aa 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -464,9 +464,9 @@ "base_energy_cost": 1000, "final_energy_cost": 400, "energy_increment": -24, - "min_aoe": 15, - "max_aoe": 60, - "aoe_increment": 1.5, + "min_aoe": 5, + "max_aoe": 50, + "aoe_increment": 1.8, "min_damage": 1, "max_damage": 1, "min_dot": 1, From 2ab0cf87b955ed6e6ca1051c6a43c791cdfc2c7c Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sun, 2 Jan 2022 00:17:44 +0100 Subject: [PATCH 053/154] Update data/mods/Magiclysm/Spells/magus.json Co-authored-by: Curtis Merrill --- data/mods/Magiclysm/Spells/magus.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/magus.json b/data/mods/Magiclysm/Spells/magus.json index e104b9e10205f..bba0519a7b596 100644 --- a/data/mods/Magiclysm/Spells/magus.json +++ b/data/mods/Magiclysm/Spells/magus.json @@ -413,7 +413,7 @@ "id": "focused_bolt", "type": "SPELL", "name": "Focused Bolt", - "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slain many a king and noble. Passed on only through direct descendants over the ages, though occasionally shared by them to others.", + "description": "You focus your mana into a microscopically thin pulsed beam of pure energy, capable of extreme range and precision; as well as unparalleled penetration, provided proper skill. Once the invention of a notorious assassin, this spell has slain many a king and noble. Passed on only through direct descendants over the ages, though occasionally shared by them to others.", "effect": "attack", "shape": "line", "valid_targets": [ "hostile", "ground" ], From d32da1f844b1460faeaf5d640353f05c28a1fda9 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sun, 2 Jan 2022 00:25:44 +0100 Subject: [PATCH 054/154] Increased the focused_bolt difficulty --- data/mods/Magiclysm/Spells/magus.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/mods/Magiclysm/Spells/magus.json b/data/mods/Magiclysm/Spells/magus.json index bba0519a7b596..e6e85f4fffc9c 100644 --- a/data/mods/Magiclysm/Spells/magus.json +++ b/data/mods/Magiclysm/Spells/magus.json @@ -424,8 +424,8 @@ "damage_increment": 4.0, "damage_type": "pure", "min_range": 5, - "max_range": 75, - "range_increment": 2.5, + "max_range": 50, + "range_increment": 1.5, "min_aoe": 5, "max_aoe": 0, "aoe_increment": -0.5, @@ -433,6 +433,6 @@ "base_casting_time": 500, "base_energy_cost": 400, "energy_source": "MANA", - "difficulty": 6 + "difficulty": 8 } ] From 74042f01610e08b76524ec9d4f1c8d2b8b82340f Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sun, 2 Jan 2022 00:27:04 +0100 Subject: [PATCH 055/154] changing rarity of new books to 4 --- data/mods/Magiclysm/itemgroups/spellbooks.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/mods/Magiclysm/itemgroups/spellbooks.json b/data/mods/Magiclysm/itemgroups/spellbooks.json index 98b7d9b4cfe5a..cfe138566537b 100644 --- a/data/mods/Magiclysm/itemgroups/spellbooks.json +++ b/data/mods/Magiclysm/itemgroups/spellbooks.json @@ -140,9 +140,9 @@ [ "spell_scroll_banishment_lesser", 30 ], [ "spell_scroll_nova_flare", 25 ], [ "spell_scroll_freezing_touch", 40 ], - [ "spell_scroll_focused_bolt", 1 ], - [ "spell_scroll_rupture", 1 ], - [ "spell_scroll_cause_rot", 1 ] + [ "spell_scroll_focused_bolt", 4 ], + [ "spell_scroll_rupture", 4 ], + [ "spell_scroll_cause_rot", 4 ] ] }, { From 03be6f0d3cfe6a8a2e5fd26f6f7bdead8269078d Mon Sep 17 00:00:00 2001 From: Anton Burmistrov Date: Sun, 2 Jan 2022 03:31:05 +0400 Subject: [PATCH 056/154] Mainline "More Structures" mod (#53938) --- .../mapgen/bunker_shop.json} | 92 ++++++++++++++++++- .../json/mapgen/{ => gas_stations}/s_gas.json | 0 data/json/mapgen/gas_stations/s_gas_b11.json | 81 ++++++++++++++++ .../mapgen/gas_stations}/s_gas_b20.json | 31 ++++--- .../mapgen/gas_stations}/s_gas_b21.json | 27 +++--- .../mapgen/gas_stations}/s_gas_g0.json | 3 +- .../mapgen/gas_stations}/s_gas_g1.json | 20 ++-- data/json/monstergroups/misc.json | 18 ++++ .../npcs/bunker_shop}/NC_BUNKER_MERCHANT.json | 0 .../bunker_shop}/TALK_BUNKER_MERCHANT.json | 0 .../npcs/bunker_shop}/classes.json | 0 .../npc => json/npcs/bunker_shop}/npc.json | 0 .../overmap/overmap_special/specials.json | 30 ++++++ .../overmap_terrain_commercial.json | 29 ++++++ .../overmap_terrain_residential.json | 20 ++++ data/mods/More_Structures/modinfo.json | 11 --- .../monsters/monstergroups.json | 20 ---- .../More_Structures/starts/professions.json | 61 ------------ .../More_Structures/starts/scenarios.json | 13 --- .../starts/start_locations.json | 8 -- .../worldgen/bunker_shop/s_bunker_shop_g.json | 90 ------------------ .../worldgen/gas/s_gas_b11.json | 72 --------------- .../worldgen/overmap_specials.json | 33 ------- .../worldgen/overmap_terrain.json | 78 ---------------- 24 files changed, 306 insertions(+), 431 deletions(-) rename data/{mods/More_Structures/worldgen/bunker_shop/s_bunker_shop_b.json => json/mapgen/bunker_shop.json} (52%) rename data/json/mapgen/{ => gas_stations}/s_gas.json (100%) create mode 100644 data/json/mapgen/gas_stations/s_gas_b11.json rename data/{mods/More_Structures/worldgen/gas => json/mapgen/gas_stations}/s_gas_b20.json (91%) rename data/{mods/More_Structures/worldgen/gas => json/mapgen/gas_stations}/s_gas_b21.json (92%) rename data/{mods/More_Structures/worldgen/gas => json/mapgen/gas_stations}/s_gas_g0.json (89%) rename data/{mods/More_Structures/worldgen/gas => json/mapgen/gas_stations}/s_gas_g1.json (87%) rename data/{mods/More_Structures/npc => json/npcs/bunker_shop}/NC_BUNKER_MERCHANT.json (100%) rename data/{mods/More_Structures/npc => json/npcs/bunker_shop}/TALK_BUNKER_MERCHANT.json (100%) rename data/{mods/More_Structures/npc => json/npcs/bunker_shop}/classes.json (100%) rename data/{mods/More_Structures/npc => json/npcs/bunker_shop}/npc.json (100%) delete mode 100644 data/mods/More_Structures/modinfo.json delete mode 100644 data/mods/More_Structures/monsters/monstergroups.json delete mode 100644 data/mods/More_Structures/starts/professions.json delete mode 100644 data/mods/More_Structures/starts/scenarios.json delete mode 100644 data/mods/More_Structures/starts/start_locations.json delete mode 100644 data/mods/More_Structures/worldgen/bunker_shop/s_bunker_shop_g.json delete mode 100644 data/mods/More_Structures/worldgen/gas/s_gas_b11.json delete mode 100644 data/mods/More_Structures/worldgen/overmap_specials.json delete mode 100644 data/mods/More_Structures/worldgen/overmap_terrain.json diff --git a/data/mods/More_Structures/worldgen/bunker_shop/s_bunker_shop_b.json b/data/json/mapgen/bunker_shop.json similarity index 52% rename from data/mods/More_Structures/worldgen/bunker_shop/s_bunker_shop_b.json rename to data/json/mapgen/bunker_shop.json index 7509ddfbeb7b4..878bfa38897d2 100644 --- a/data/mods/More_Structures/worldgen/bunker_shop/s_bunker_shop_b.json +++ b/data/json/mapgen/bunker_shop.json @@ -2,9 +2,97 @@ { "type": "mapgen", "method": "json", - "om_terrain": [ "s_bunker_shop_b" ], + "om_terrain": [ "bunker_shop_g" ], "object": { - "fill_ter": "t_rock", + "fill_ter": "t_floor", + "rows": [ + "kkkkkkkkkkkkkkkkkkkkkkkk", + "kkkkkkkkkkkkkkkkkkkkkkkk", + "kkkkkkkkkkkkkkkkkkkkkkkk", + "kkaasaaGnnGnnGnnGnnoookk", + "kkaEDDakkkkkkkkkkkkoqokk", + "GnaEDDakkkkzkkkkkkkopokk", + "nkaaCaakkkkkkkkAkkkktnkk", + "nkkktttttttttttttttttnkk", + "GkkktkkkiicjaraaaajktGkk", + "nkkktkkkjkkkwwyakkjktnkk", + "nttttttkjkkkww a krktnkk", + "Gttttttkakk a jktGkk", + "nttttttkaaagaaaaagaagaak", + "nttttttka lj akkkak", + "Gttttttka ljvv gkk sk", + "nttttttbbd i akk ak", + "nttttttbedk iia a sk", + "Gttttttbbdkk a ak", + "nttttttkakkkk iijjak", + "nttttttFjkkkkkk jkkkkk", + "GBBBBBBGiijrcjgjjijkkkkk", + "kttttttFkf kkkkgkkkAkkk", + "kttttttkkj kkkjkkkkkkk", + "kttttttkkjjrrcrjjkkkkkkk" + ], + "terrain": { + "a": "t_wall_wood", + "b": "t_rock", + "c": "t_window_empty", + "d": "t_rock_floor", + "e": "t_rock_floor", + "f": "t_door_b", + "g": "t_door_frame", + "h": "t_door_c", + "i": "t_wall_wood_broken", + "j": "t_wall_wood_chipped", + "k": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "m": "t_dirt", + "n": "t_chainfence_h", + "o": "t_concrete_wall", + "p": "t_door_metal_c", + "q": "t_stairs_down", + "r": "t_window_frame", + "s": "t_window_boarded", + "t": "t_dirt", + "l": "t_floor", + "u": "t_floor", + "v": "t_floor", + "w": "t_floor", + "x": "t_wall_wood_chipped", + "y": "t_floor", + "z": "t_tree_plum", + "A": "t_tree_apple", + "B": "t_door_metal_locked", + "C": "t_door_c", + "D": "t_dirtfloor", + "E": "t_dirtfloor", + "F": "t_gates_mech_control", + "G": "t_wall" + }, + "furniture": { + "e": "f_brazier", + "m": "f_rubble", + "l": "f_crate_o", + "u": "f_woodstove", + "v": "f_table", + "w": "f_bed", + "y": "f_dresser", + "E": "f_locker" + }, + "place_loot": [ + { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 9, 12 ], "y": [ 13, 19 ] }, + { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 13, 17 ], "y": [ 17, 19 ] }, + { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 14, 17 ], "y": [ 13, 15 ] }, + { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 9, 14 ], "y": [ 9, 11 ] }, + { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 19, 21 ], "y": [ 13, 17 ] }, + { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 10, 15 ], "y": [ 21, 22 ] }, + { "group": "floor_trash", "chance": 90, "repeat": 3, "x": [ 16, 17 ], "y": [ 9, 11 ] } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "bunker_shop_b" ], + "object": { + "fill_ter": "t_soil", "rows": [ " fff ", " fvffffff ", diff --git a/data/json/mapgen/s_gas.json b/data/json/mapgen/gas_stations/s_gas.json similarity index 100% rename from data/json/mapgen/s_gas.json rename to data/json/mapgen/gas_stations/s_gas.json diff --git a/data/json/mapgen/gas_stations/s_gas_b11.json b/data/json/mapgen/gas_stations/s_gas_b11.json new file mode 100644 index 0000000000000..1784fb97d00f7 --- /dev/null +++ b/data/json/mapgen/gas_stations/s_gas_b11.json @@ -0,0 +1,81 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gas_b11" ], + "object": { + "fill_ter": "t_soil", + "rows": [ + " ", + " eeeee ", + " ehghe ", + " ehhhe ", + " eeeeeeeeAee ", + " eadaapeebee ", + " eacAjjeaaae ", + " eaeeeeeaaae ", + " eeeeeadarpecfcee ", + " ePAPeacAjjeaaaqe ", + " ePaPeaeeeeeaAaee ", + " eefeeadaapeaAaee ", + " eaaaeacAjjeaaaqe ", + " eaAicaeeeeeebeee ", + " ealicadaapeeAee ", + " eeeeaaaeacAjjeebee ", + " eaaeebeebeeeeeaaae ", + " eoAbaaaaAaaaafaake ", + " eaaeeeeeaeeceeAake ", + " eeeeenAeaeaAicaake ", + " emababalicaaae ", + " eeeeeeeeeeeeee ", + " ", + " " + ], + "terrain": { + "a": "t_thconc_floor", + "A": "t_thconc_floor_olight", + "b": "t_door_metal_c", + "c": "t_reinforced_glass", + "d": "t_reinforced_door_glass_c", + "e": "t_strconc_wall", + "f": "t_door_metal_locked", + "g": "t_ladder_up", + "h": "t_metal_floor", + "i": "t_thconc_floor", + "j": "t_thconc_floor", + "k": "t_thconc_floor", + "l": "t_thconc_floor", + "m": "t_thconc_floor", + "n": "t_thconc_floor", + "o": "t_stairs_down", + "p": "t_thconc_floor", + "P": "t_thconc_floor", + "q": "t_thconc_floor", + "r": "t_thconc_floor" + }, + "furniture": { + "i": "f_table", + "j": "f_bed", + "k": "f_bench", + "l": "f_chair", + "m": "f_toilet", + "n": "f_sink", + "p": "f_locker", + "P": "f_locker" + }, + "items": { + "j": { "item": "bed", "chance": 80 }, + "k": { "item": "snacks", "chance": 60 }, + "i": { "item": "SUS_office_desk", "chance": 70 }, + "p": { "item": "clothing_male", "chance": 70, "repeat": 3 }, + "P": [ + { "item": "guns_pistol_milspec", "chance": 60, "repeat": 3 }, + { "item": "ammo_pistol_milspec", "chance": 60, "repeat": 3 }, + { "item": "prison_armor", "chance": 60, "repeat": 3 } + ], + "n": { "item": "SUS_bathroom_sink", "chance": 90 } + }, + "monster": { "q": { "monster": "mon_turret_rifle" }, "r": { "monster": "mon_zombie_soldier" } } + } + } +] diff --git a/data/mods/More_Structures/worldgen/gas/s_gas_b20.json b/data/json/mapgen/gas_stations/s_gas_b20.json similarity index 91% rename from data/mods/More_Structures/worldgen/gas/s_gas_b20.json rename to data/json/mapgen/gas_stations/s_gas_b20.json index 6890005004728..faf38181cc92a 100644 --- a/data/mods/More_Structures/worldgen/gas/s_gas_b20.json +++ b/data/json/mapgen/gas_stations/s_gas_b20.json @@ -8,24 +8,24 @@ "rows": [ "bqqaaabaiadFFFFFFFHFFFHb", "braaaadaiabGHGFGHGbFFFFb", - "baaaaqdaiabGHGFGHGbIIIIb", + "baaAaqdaiabGHGFGHGbIIIIb", "bararqdaiabbbbbbbbbbbbbb", - "bqqaaabaianbEaEb ", + "bqqaaabAianbEAEb ", "bbbgbbbaianbEaEbbbbbbbbb", - "bBaaaBbaiabbbebbaxyHvaab", - "bBaCaBbaiabqqaadaaaaaawb", - "bBaCaBbaiaKaaaaKaawAaaub", - "bBaCaBbaiabqaaqdaaaaaavb", - "bBaaaBbaiadqarqbazHzaaab", - "bbbbbbbaiadqaasbbbbbbbbb", + "bBaAaBbaiabbbebbaxyqvaab", + "bBaCaBbaiabqqAadaaaaaawb", + "bBaCaBbaiaKaaaaKaawĂaaub", + "bBaCaBbAiabqaaqdaAaaaAvb", + "bBaAaBbaiadqarqbazqzaaab", + "bbbbbbbaiadqaAsbbbbbbbbb", "bEaqDDdaiabsaatb bbbbbbb", - "barqaaKaiadqaaqbbbEaaabb", - "baaaaadaiadqraaeaeaarabb", - "bbbdKdbaiabqaaabbbqqJqbb", + "barqAaKaiadqaaqbbbEaAabb", + "baaaaadAiadqraaeaeaarabb", + "bbbdKdbaiabqaAabbbqqJqbb", "booaaabahabbbebbcccffccc", "bqaaaEbaiab baCbcllLLLLc", - "bbbaaEbahab baaacLllLLkc", - "booaaabaihb baaagLljjLnc", + "bbbaAEbahab baAacLllLLkc", + "booaaabAihb baaagLljjLnc", "bqaaaabhiab bEEmcLLjjlnc", "bbbboabhhhb bbbbcLLlllkc", " bMpb hhb cLLLllLc", @@ -33,6 +33,7 @@ ], "terrain": { "a": "t_thconc_floor", + "A": "t_thconc_floor_olight", "b": "t_strconc_wall", "c": "t_wall_metal", "d": "t_wall_glass", @@ -58,7 +59,7 @@ "x": "t_thconc_floor", "y": "t_machinery_heavy", "z": "t_thconc_floor", - "A": "t_thconc_floor", + "Ă": "t_thconc_floor", "B": "t_thconc_floor", "C": "t_thconc_floor", "D": "t_thconc_floor", @@ -83,7 +84,7 @@ "u": "f_heavy_lathe", "x": "f_drill_press", "z": "f_arcfurnace_empty", - "A": "f_drill_press", + "Ă": "f_drill_press", "B": "f_rack", "C": "f_bench", "D": "f_bookcase", diff --git a/data/mods/More_Structures/worldgen/gas/s_gas_b21.json b/data/json/mapgen/gas_stations/s_gas_b21.json similarity index 92% rename from data/mods/More_Structures/worldgen/gas/s_gas_b21.json rename to data/json/mapgen/gas_stations/s_gas_b21.json index 54490a593ad95..8537287496834 100644 --- a/data/mods/More_Structures/worldgen/gas/s_gas_b21.json +++ b/data/json/mapgen/gas_stations/s_gas_b21.json @@ -8,31 +8,32 @@ "rows": [ "bbbbbbbbbbbbbbbbb ", "bggbhhcaaachhbggb bbbb", - "bfffffdazadffaffbbbbbAAb", - "bggbiicazaciibggbaaaaaab", + "bfffffdĂzĂdffaffbbbbbAAb", + "bggbiicazaciibggbĂaaaaĂb", "bbbbbbbazabbbbbbballllab", "bggbhhcazachhbggbaaaaaab", - "bfffffdazadfffffballllab", - "bggbiicazaciibggbaaaaaab", + "bfffffdĂzĂdfffffballllab", + "bggbiicazaciibggbĂaaaaĂb", "bbbbbbbazabbbbbbbbbbcdcb", "bggbhhcazabpppppbmmbaaab", - "bfffffdazaeaaaaaaaabkajb", - "bggbiicazabobobobmmbkajb", + "bfffffdĂzĂeĂaaaaaĂabkajb", + "bggbiicazabobobobmmbkĂjb", "bbbbbbbazabnbnbnbbbbkajb", - " baaeazabbbbbbbkkbkajb", - " bkabaaabqqqqqbaabaaab", + " baĂeazabbbbbbbkkbkajb", + " bkabaĂabqqqqqbĂabaaab", " bbbbbcdcbaaaaabebbcdcb", - " baabaaaaaaaaaaaaaaaaab", - " bBaeazzzzzzzzzzzzzzzab", - " baabaaaaaaaaaaaaaaaaab", + " baabaaĂaaaaaaaaaaaaaab", + " bBĂeazzzzzzzzzzzzzzzab", + " baabaaĂaaaĂaaaaĂaaaaĂb", "bbbbbbbcdcbbcbbbcbbbbebb", - "bayxaacaaabtutstutbwwsub", - "baaxaadazabtutstutbsssub", + "bayxaacaĂabtutstutbwwsub", + "baĂxaadazabtutstutbsssub", "bkaaaacazacsssssssususvb", "bcccdcbazadsssssssususvb" ], "terrain": { "a": "t_thconc_floor", + "Ă": "t_thconc_floor_olight", "b": "t_strconc_wall", "c": "t_wall_glass", "d": "t_door_glass_c", diff --git a/data/mods/More_Structures/worldgen/gas/s_gas_g0.json b/data/json/mapgen/gas_stations/s_gas_g0.json similarity index 89% rename from data/mods/More_Structures/worldgen/gas/s_gas_g0.json rename to data/json/mapgen/gas_stations/s_gas_g0.json index cbad333927a9f..05c0909fb6e19 100644 --- a/data/mods/More_Structures/worldgen/gas/s_gas_g0.json +++ b/data/json/mapgen/gas_stations/s_gas_g0.json @@ -37,10 +37,9 @@ "c": "t_gas_pump", "d": "t_wall", "e": "t_shrub", - "f": [ "t_dirt", "t_dirt", "t_dirt", "t_dirt", "t_shrub", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass" ], + "f": [ [ "t_region_groundcover", 4 ], [ "t_region_shrub", 2 ], [ "t_region_tree", 1 ] ], "g": "t_thconc_floor" }, - "furniture": { }, "place_loot": [ { "group": "road", "chance": 60, "repeat": [ 10 ], "x": [ 1, 22 ], "y": [ 1, 20 ] } ] } } diff --git a/data/mods/More_Structures/worldgen/gas/s_gas_g1.json b/data/json/mapgen/gas_stations/s_gas_g1.json similarity index 87% rename from data/mods/More_Structures/worldgen/gas/s_gas_g1.json rename to data/json/mapgen/gas_stations/s_gas_g1.json index 7d8bd857da096..b4e0b0273a0e4 100644 --- a/data/mods/More_Structures/worldgen/gas/s_gas_g1.json +++ b/data/json/mapgen/gas_stations/s_gas_g1.json @@ -16,9 +16,9 @@ "pppppCpppppppppilllippCp", "pppppCpppppppppiiiiippCp", "pppppCppppppppppppppppCp", - "pppppaaaaaaeaaaaapppppCp", - "pppppaxxsasmmmuuapnpppCp", - "pppppay asmmmuuapppppCp", + "pppppaafaaaeaaaaapppppCp", + "pppppaxxsaSmmmuuapnpppCp", + "pppppay aSmmmuuapppppCp", "pppaaaadaammmmmuaaaaCCCp", "ppparrr dmmmmmmavwapppp", "pppf acccccca apppp", @@ -47,25 +47,19 @@ "f": "t_reinforced_glass", "n": "t_water_pump", "o": "t_sewage_pipe", - "p": [ "t_dirt", "t_dirt", "t_dirt", "t_dirt", "t_shrub", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass" ], + "p": [ [ "t_region_groundcover", 4 ], [ "t_region_shrub", 2 ], [ "t_region_tree", 1 ] ], "q": "t_window_boarded", - "r": "t_linoleum_gray", - "s": "t_linoleum_gray", - "t": "t_linoleum_gray", "u": "t_thconc_floor", - "v": "t_linoleum_gray", - "w": "t_linoleum_gray", - "x": "t_linoleum_gray", - "y": "t_linoleum_gray", - "z": "t_linoleum_gray", "A": "t_dirt", "B": "t_ladder_down", "C": "t_chainfence_h", - "D": "t_sidewalk" + "D": "t_sidewalk", + "S": "t_thconc_floor" }, "furniture": { "r": "f_rack", "s": "f_locker", + "S": "f_locker", "t": "f_glass_fridge", "u": "f_crate_c", "v": "f_toilet", diff --git a/data/json/monstergroups/misc.json b/data/json/monstergroups/misc.json index 527332899d1c4..adb162ab36294 100644 --- a/data/json/monstergroups/misc.json +++ b/data/json/monstergroups/misc.json @@ -360,5 +360,23 @@ { "monster": "mon_dog", "weight": 10, "cost_multiplier": 0 }, { "monster": "mon_tiger", "weight": 1, "cost_multiplier": 30 } ] + }, + { + "type": "monstergroup", + "name": "GROUP_BUNKER", + "monsters": [ + { "monster": "mon_irradiated_wanderer_1", "weight": 575, "cost_multiplier": 0 }, + { "monster": "mon_irradiated_wanderer_2", "weight": 100, "cost_multiplier": 0, "pack_size": [ 1, 5 ] }, + { "monster": "mon_irradiated_wanderer_3", "weight": 10, "cost_multiplier": 5, "pack_size": [ 1, 3 ] }, + { "monster": "mon_irradiated_wanderer_4", "weight": 40, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zombie_armored", "weight": 25, "cost_multiplier": 20, "pack_size": [ 2, 6 ] }, + { "monster": "mon_zombie_bio_op", "weight": 50, "cost_multiplier": 10 }, + { "monster": "mon_zombie_soldier", "weight": 200, "cost_multiplier": 3 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_SCI", + "monsters": [ { "monster": "mon_zombie_scientist", "cost_multiplier": 0 } ] } ] diff --git a/data/mods/More_Structures/npc/NC_BUNKER_MERCHANT.json b/data/json/npcs/bunker_shop/NC_BUNKER_MERCHANT.json similarity index 100% rename from data/mods/More_Structures/npc/NC_BUNKER_MERCHANT.json rename to data/json/npcs/bunker_shop/NC_BUNKER_MERCHANT.json diff --git a/data/mods/More_Structures/npc/TALK_BUNKER_MERCHANT.json b/data/json/npcs/bunker_shop/TALK_BUNKER_MERCHANT.json similarity index 100% rename from data/mods/More_Structures/npc/TALK_BUNKER_MERCHANT.json rename to data/json/npcs/bunker_shop/TALK_BUNKER_MERCHANT.json diff --git a/data/mods/More_Structures/npc/classes.json b/data/json/npcs/bunker_shop/classes.json similarity index 100% rename from data/mods/More_Structures/npc/classes.json rename to data/json/npcs/bunker_shop/classes.json diff --git a/data/mods/More_Structures/npc/npc.json b/data/json/npcs/bunker_shop/npc.json similarity index 100% rename from data/mods/More_Structures/npc/npc.json rename to data/json/npcs/bunker_shop/npc.json diff --git a/data/json/overmap/overmap_special/specials.json b/data/json/overmap/overmap_special/specials.json index b9d2195cf05a0..f73abaf883960 100644 --- a/data/json/overmap/overmap_special/specials.json +++ b/data/json/overmap/overmap_special/specials.json @@ -7570,5 +7570,35 @@ "city_sizes": [ 3, 20 ], "occurrences": [ 0, 1 ], "flags": [ "UNIQUE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "bunker shop", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "bunker_shop_g_south" }, + { "point": [ 0, 0, -1 ], "overmap": "bunker_shop_b_south" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true, "connection": "local_road", "from": [ 0, 0, 0 ] } ], + "locations": [ "wilderness" ], + "city_distance": [ 10, -1 ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 5, 100 ], + "flags": [ "CLASSIC", "UNIQUE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "gas station bunker", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_gas_g0_south" }, + { "point": [ 0, 1, 0 ], "overmap": "s_gas_g1_south" }, + { "point": [ 0, 1, -1 ], "overmap": "s_gas_b11_south" }, + { "point": [ 0, 0, -2 ], "overmap": "s_gas_b20_south" }, + { "point": [ 0, 1, -2 ], "overmap": "s_gas_b21_south" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true, "connection": "local_road", "from": [ 0, 0, 0 ] } ], + "locations": [ "wilderness" ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 5, 100 ], + "flags": [ "CLASSIC", "UNIQUE" ] } ] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json index 9007d7460b806..79e9da659d0b8 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json @@ -1571,5 +1571,34 @@ "id": "s_games_roof", "name": "gaming store roof", "copy-from": "s_games" + }, + { + "type": "overmap_terrain", + "id": [ "s_gas_g1", "s_gas_g0" ], + "name": "gas station", + "sym": "g", + "color": "light_blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "land_use_code": "commercial" + }, + { + "type": "overmap_terrain", + "id": "s_gas_b11", + "name": "reception", + "sym": "R", + "color": "red", + "see_cost": 5, + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": [ "s_gas_b20", "s_gas_b21" ], + "name": "bunker", + "sym": "B", + "color": "red", + "see_cost": 5, + "mondensity": 2 } ] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json index 2fd6b9fd79cfe..766c853c4dd02 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json @@ -590,5 +590,25 @@ "name": "derelict property", "sym": "X", "color": "i_brown" + }, + { + "type": "overmap_terrain", + "id": "bunker_shop_g", + "name": "derelict property", + "sym": "X", + "color": "i_brown", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "bunker_shop_b", + "name": "scavenger bunker", + "sym": "B", + "color": "light_green", + "see_cost": 5, + "extras": "build", + "mondensity": 2 } ] diff --git a/data/mods/More_Structures/modinfo.json b/data/mods/More_Structures/modinfo.json deleted file mode 100644 index 0f08b2b10038c..0000000000000 --- a/data/mods/More_Structures/modinfo.json +++ /dev/null @@ -1,11 +0,0 @@ -[ - { - "type": "MOD_INFO", - "id": "more_buildings", - "name": "More Buildings", - "description": "Adds more buildings and more variations to existing buildings. (Requires More Locations)", - "category": "buildings", - "dependencies": [ "dda", "more_locations" ], - "obsolete": true - } -] diff --git a/data/mods/More_Structures/monsters/monstergroups.json b/data/mods/More_Structures/monsters/monstergroups.json deleted file mode 100644 index e39999fca18ee..0000000000000 --- a/data/mods/More_Structures/monsters/monstergroups.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "type": "monstergroup", - "name": "GROUP_BUNKER", - "monsters": [ - { "monster": "mon_irradiated_wanderer_1", "weight": 575, "cost_multiplier": 0 }, - { "monster": "mon_irradiated_wanderer_2", "weight": 100, "cost_multiplier": 0, "pack_size": [ 1, 5 ] }, - { "monster": "mon_irradiated_wanderer_3", "weight": 10, "cost_multiplier": 5, "pack_size": [ 1, 3 ] }, - { "monster": "mon_irradiated_wanderer_4", "weight": 40, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, - { "monster": "mon_zombie_armored", "weight": 25, "cost_multiplier": 20, "pack_size": [ 2, 6 ] }, - { "monster": "mon_zombie_bio_op", "weight": 50, "cost_multiplier": 10 }, - { "monster": "mon_zombie_soldier", "weight": 200, "cost_multiplier": 3 } - ] - }, - { - "type": "monstergroup", - "name": "GROUP_SCI", - "monsters": [ { "monster": "mon_zombie_scientist", "cost_multiplier": 0 } ] - } -] diff --git a/data/mods/More_Structures/starts/professions.json b/data/mods/More_Structures/starts/professions.json deleted file mode 100644 index fac4a2529d39c..0000000000000 --- a/data/mods/More_Structures/starts/professions.json +++ /dev/null @@ -1,61 +0,0 @@ -[ - { - "type": "profession", - "id": "rookie", - "name": "Rookie", - "description": "It's been months since the Cataclysm and somehow you're still greener than a tree. Maybe you're just a slow learner, who knows.", - "points": 0, - "skills": [ { "level": 1, "name": "survival" }, { "level": 1, "name": "gun" } ], - "items": { - "both": { - "items": [ "undershirt", "jacket_leather", "pants", "boots", "sockmitts", "socks_wool", "backpack", "shot_slug" ], - "entries": [ - { "item": "shotgun_d", "ammo-item": "shot_00", "charges": 2 }, - { "item": "shot_00", "charges": 12, "container-item": "bandolier_shotgun" }, - { "item": "knife_combat", "container-item": "sheath" } - ] - }, - "male": [ "boxer_shorts" ], - "female": [ "boxer_shorts" ] - }, - "flags": [ "SCEN_ONLY" ] - }, - { - "type": "profession", - "id": "novice", - "name": "Novice", - "description": "You're a merely competent survivor so far. Let's change that, yeah?", - "points": 1, - "skills": [ - { "level": 2, "name": "survival" }, - { "level": 1, "name": "gun" }, - { "level": 1, "name": "mechanics" }, - { "level": 1, "name": "electronics" }, - { "level": 1, "name": "tailor" } - ], - "items": { - "both": { - "items": [ - "hood_rain", - "undershirt", - "kevlar", - "jacket_army", - "pants_cargo", - "boots_bunker", - "gloves_fingerless", - "socks_wool", - "backpack", - "e_tool" - ], - "entries": [ - { "item": "hk_mp5", "ammo-item": "9mmfmj", "charges": 30, "contents-item": "folding_stock" }, - { "item": "mp5mag", "ammo-item": "9mmfmj", "charges": 30, "container-item": "tacvest" }, - { "item": "knife_combat", "container-item": "sheath" } - ] - }, - "male": [ "boxer_shorts" ], - "female": [ "boxer_shorts" ] - }, - "flags": [ "SCEN_ONLY" ] - } -] diff --git a/data/mods/More_Structures/starts/scenarios.json b/data/mods/More_Structures/starts/scenarios.json deleted file mode 100644 index 2764c2c6e3f47..0000000000000 --- a/data/mods/More_Structures/starts/scenarios.json +++ /dev/null @@ -1,13 +0,0 @@ -[ - { - "type": "scenario", - "name": "Scavenger", - "description": "You're a seasoned scavenger, or at least it's been a season since you've become a scavenger. Either way, you found a bunker with a fellow scav in it. Turns out they were a lot better at it than you were.", - "id": "scav", - "points": 1, - "start_name": "Scavenger Bunker", - "allowed_locs": [ "sloc_scavenger_bunker" ], - "custom_initial_date": { "season": "summer" }, - "professions": [ "rookie", "novice" ] - } -] diff --git a/data/mods/More_Structures/starts/start_locations.json b/data/mods/More_Structures/starts/start_locations.json deleted file mode 100644 index 9aae4d90b103d..0000000000000 --- a/data/mods/More_Structures/starts/start_locations.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "type": "start_location", - "id": "sloc_scavenger_bunker", - "name": "Scavenger Bunker", - "terrain": [ "s_bunker_shop_g" ] - } -] diff --git a/data/mods/More_Structures/worldgen/bunker_shop/s_bunker_shop_g.json b/data/mods/More_Structures/worldgen/bunker_shop/s_bunker_shop_g.json deleted file mode 100644 index 95146c819e6a1..0000000000000 --- a/data/mods/More_Structures/worldgen/bunker_shop/s_bunker_shop_g.json +++ /dev/null @@ -1,90 +0,0 @@ -[ - { - "type": "mapgen", - "method": "json", - "om_terrain": [ "s_bunker_shop_g" ], - "object": { - "fill_ter": "t_floor", - "rows": [ - "kkkkkkkkkkkkkkkkkkkkkkkk", - "kkkkkkkkkkkkkkkkkkkkkkkk", - "kkkkkkkkkkkkkkkkkkkkkkkk", - "kkaasaaGnnGnnGnnGnnoookk", - "kkaEDDakkkkkkkkkkkkoqokk", - "GnaEDDakkkkzkkkkkkkopokk", - "nkaaCaakkkkkkkkAkkkktnkk", - "nkkktttttttttttttttttnkk", - "GkkktkkkiicjaraaaajktGkk", - "nkkktkkkjkkkwwyakkjktnkk", - "nttttttkjkkkww a krktnkk", - "Gttttttkakk a jktGkk", - "nttttttkaaagaaaaagaagaak", - "nttttttka lj akkkak", - "Gttttttka ljvv gkk sk", - "nttttttbbd i akk ak", - "nttttttbedk iia a sk", - "Gttttttbbdkk a ak", - "nttttttkakkkk iijjak", - "nttttttFjkkkkkk jkkkkk", - "GBBBBBBGiijrcjgjjijkkkkk", - "kttttttFkf kkkkgkkkAkkk", - "kttttttkkj kkkjkkkkkkk", - "kttttttkkjjrrcrjjkkkkkkk" - ], - "terrain": { - "a": "t_wall_wood", - "b": "t_rock", - "c": "t_window_empty", - "d": "t_rock_floor", - "e": "t_rock_floor", - "f": "t_door_b", - "g": "t_door_frame", - "h": "t_door_c", - "i": "t_wall_wood_broken", - "j": "t_wall_wood_chipped", - "k": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "m": "t_dirt", - "n": "t_chainfence_h", - "o": "t_concrete_wall", - "p": "t_door_metal_c", - "q": "t_stairs_down", - "r": "t_window_frame", - "s": "t_window_boarded", - "t": "t_dirt", - "l": "t_floor", - "u": "t_floor", - "v": "t_floor", - "w": "t_floor", - "x": "t_wall_wood_chipped", - "y": "t_floor", - "z": "t_tree_plum", - "A": "t_tree_apple", - "B": "t_door_metal_locked", - "C": "t_door_c", - "D": "t_dirtfloor", - "E": "t_dirtfloor", - "F": "t_gates_mech_control", - "G": "t_wall" - }, - "furniture": { - "e": "f_brazier", - "m": "f_rubble", - "l": "f_crate_o", - "u": "f_woodstove", - "v": "f_table", - "w": "f_bed", - "y": "f_dresser", - "E": "f_locker" - }, - "place_loot": [ - { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 9, 12 ], "y": [ 13, 19 ] }, - { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 13, 17 ], "y": [ 17, 19 ] }, - { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 14, 17 ], "y": [ 13, 15 ] }, - { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 9, 14 ], "y": [ 9, 11 ] }, - { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 19, 21 ], "y": [ 13, 17 ] }, - { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 10, 15 ], "y": [ 21, 22 ] }, - { "group": "floor_trash", "chance": 90, "repeat": [ 3 ], "x": [ 16, 17 ], "y": [ 9, 11 ] } - ] - } - } -] diff --git a/data/mods/More_Structures/worldgen/gas/s_gas_b11.json b/data/mods/More_Structures/worldgen/gas/s_gas_b11.json deleted file mode 100644 index eec2c15849a9c..0000000000000 --- a/data/mods/More_Structures/worldgen/gas/s_gas_b11.json +++ /dev/null @@ -1,72 +0,0 @@ -[ - { - "type": "mapgen", - "method": "json", - "om_terrain": [ "s_gas_b11" ], - "object": { - "fill_ter": "t_rock", - "rows": [ - " ", - " eeeee ", - " ehghe ", - " ehhhe ", - " eeeeeeeeaee ", - " eadaapeebee ", - " eacajjeaaae ", - " eaeeeeeaaae ", - " eeeeeadarpecfcee ", - " epapeacajjeaaaqe ", - " epapeaeeeeeahaee ", - " eefeeadaapeahaee ", - " eaaaeacajjeaaaqe ", - " eaaicaeeeeeebeee ", - " ealicadaapeeaee ", - " eeeeaaaeacajjeebee ", - " eaaeebeebeeeeeaaae ", - " eoabaaaaaaaaafaake ", - " eaaeeeeeaeeceeaake ", - " eeeeenaeaeaaicaake ", - " emababalicaaae ", - " eeeeeeeeeeeeee ", - " ", - " " - ], - "terrain": { - "a": "t_thconc_floor", - "b": "t_door_metal_c", - "c": "t_reinforced_glass", - "d": "t_reinforced_door_glass_c", - "e": "t_strconc_wall", - "f": "t_door_metal_locked", - "g": "t_ladder_up", - "h": "t_metal_floor", - "i": "t_thconc_floor", - "j": "t_thconc_floor", - "k": "t_thconc_floor", - "l": "t_thconc_floor", - "m": "t_thconc_floor", - "n": "t_thconc_floor", - "o": "t_stairs_down", - "p": "t_thconc_floor", - "q": "t_thconc_floor", - "r": "t_thconc_floor" - }, - "furniture": { "i": "f_table", "j": "f_bed", "k": "f_bench", "l": "f_chair", "m": "f_toilet", "n": "f_sink", "p": "f_locker" }, - "place_loot": [ - { "group": "snacks", "chance": 60, "repeat": [ 2 ], "x": [ 16, 18 ], "y": [ 16, 20 ] }, - { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 12, 14 ], "y": [ 19, 20 ] }, - { "group": "office", "chance": 60, "repeat": [ 3 ], "x": [ 6, 8 ], "y": [ 12, 15 ] }, - { "group": "guns_pistol_milspec", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 9, 10 ] }, - { "group": "ammo_pistol_milspec", "chance": 60, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 10, 10 ] }, - { "group": "prison_armor", "chance": 60, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 9, 9 ] }, - { "group": "clothing_male", "chance": 60, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 14, 14 ] }, - { "group": "clothing_male", "chance": 60, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 11, 11 ] }, - { "group": "clothing_male", "chance": 60, "repeat": [ 4 ], "x": [ 12, 14 ], "y": [ 8, 9 ] }, - { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 6, 6 ] }, - { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 12, 12 ] }, - { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 15, 15 ] } - ], - "monster": { "q": { "monster": "mon_turret_rifle" }, "r": { "monster": "mon_zombie_soldier" } } - } - } -] diff --git a/data/mods/More_Structures/worldgen/overmap_specials.json b/data/mods/More_Structures/worldgen/overmap_specials.json deleted file mode 100644 index c4b852cf5d976..0000000000000 --- a/data/mods/More_Structures/worldgen/overmap_specials.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - { - "type": "overmap_special", - "id": "o_gas_spc", - "overmaps": [ - { "point": [ 0, 0, 0 ], "overmap": "s_gas_g0_south" }, - { "point": [ 0, 1, 0 ], "overmap": "s_gas_g1_south" }, - { "point": [ 0, 1, -1 ], "overmap": "s_gas_b11_south" }, - { "point": [ 0, 0, -2 ], "overmap": "s_gas_b20_south" }, - { "point": [ 0, 1, -2 ], "overmap": "s_gas_b21_south" } - ], - "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true } ], - "locations": [ "land", "swamp" ], - "city_distance": [ 0, -1 ], - "city_sizes": [ 1, 12 ], - "occurrences": [ 1, 1 ], - "flags": [ "CLASSIC" ] - }, - { - "type": "overmap_special", - "id": "o_bunker_shop", - "overmaps": [ - { "point": [ 0, 0, 0 ], "overmap": "s_bunker_shop_g_south" }, - { "point": [ 0, 0, -1 ], "overmap": "s_bunker_shop_b_south" } - ], - "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true } ], - "locations": [ "land", "swamp" ], - "city_distance": [ 10, -1 ], - "city_sizes": [ 1, 12 ], - "occurrences": [ 1, 1 ], - "flags": [ "CLASSIC" ] - } -] diff --git a/data/mods/More_Structures/worldgen/overmap_terrain.json b/data/mods/More_Structures/worldgen/overmap_terrain.json deleted file mode 100644 index 3fcded6cca25c..0000000000000 --- a/data/mods/More_Structures/worldgen/overmap_terrain.json +++ /dev/null @@ -1,78 +0,0 @@ -[ - { - "type": "overmap_terrain", - "id": "s_gas_g1", - "name": "gas station", - "sym": "g", - "color": "light_blue", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "land_use_code": "commercial" - }, - { - "type": "overmap_terrain", - "id": "s_gas_g0", - "name": "gas station", - "sym": "g", - "color": "light_blue", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ], - "land_use_code": "commercial" - }, - { - "type": "overmap_terrain", - "id": "s_gas_b11", - "name": "reception", - "sym": "R", - "color": "red", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] - }, - { - "type": "overmap_terrain", - "id": "s_gas_b20", - "name": "bunker", - "sym": "B", - "color": "red", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] - }, - { - "type": "overmap_terrain", - "id": "s_gas_b21", - "name": "bunker", - "sym": "B", - "color": "red", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] - }, - { - "type": "overmap_terrain", - "id": "s_bunker_shop_g", - "name": "derelict property", - "sym": "^", - "color": "white", - "see_cost": 5, - "extras": "build", - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "s_bunker_shop_b", - "name": "scavenger bunker", - "sym": "B", - "color": "light_green", - "see_cost": 5, - "extras": "build", - "mondensity": 2 - } -] From 774f6b29556244e6e99ef0f82117ed822b894a24 Mon Sep 17 00:00:00 2001 From: Inglonias <2125926+Inglonias@users.noreply.github.com> Date: Sat, 1 Jan 2022 18:33:20 -0500 Subject: [PATCH 057/154] Fix some minor issues with Rubik's conversation (#53948) --- data/json/npcs/exodii/exodii_merchant_talk.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data/json/npcs/exodii/exodii_merchant_talk.json b/data/json/npcs/exodii/exodii_merchant_talk.json index c9e75eaabb0ff..84319310ad0af 100644 --- a/data/json/npcs/exodii/exodii_merchant_talk.json +++ b/data/json/npcs/exodii/exodii_merchant_talk.json @@ -747,7 +747,7 @@ ] }, { - "id": "TALK_EXODII_MERCHANT_Talk_Exodus3", + "id": "TALK_EXODII_MERCHANT_Exodus3", "type": "talk_topic", "dynamic_line": "Just so, aye. Again an' again, this'n has seen it. Too many times.", "responses": [ @@ -851,7 +851,6 @@ "text": "Who is benzete?", "topic": "TALK_EXODII_MERCHANT_Talk_IntroBenzete1" }, - { "text": ".", "topic": "TALK_EXODII_MERCHANT_Talk_CataclysmTimeline2" }, { "text": "So travelling off-world is definitely an option. Or getting to the ISS, maybe stepping off from there.", "topic": "TALK_EXODII_MERCHANT_Talk_CataclysmTimeline3" From 6ec8d8cc3437b59c1de564bce0b2003a28d10c91 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Sat, 1 Jan 2022 14:27:48 -0700 Subject: [PATCH 058/154] tests: Fine-tune cardio test for determinism - Adjust step expectations to match new deterministic stamina regen - Separate [base] test case so it can be easily run by itself - Capture turns as well as steps in running_steps - Use can_run() for the loop condition --- tests/cardio_test.cpp | 67 +++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/tests/cardio_test.cpp b/tests/cardio_test.cpp index 5dec82ad19a17..de9a512af22da 100644 --- a/tests/cardio_test.cpp +++ b/tests/cardio_test.cpp @@ -33,8 +33,6 @@ // - Character::set_cardio_acc // - avatar::update_cardio_acc <-- Critical -static const efftype_id effect_winded( "winded" ); - static const move_mode_id move_mode_run( "run" ); static const skill_id skill_swimming( "swimming" ); @@ -72,17 +70,17 @@ static int running_steps( Character &they, const ter_id &terrain = t_pavement ) REQUIRE( here.ter( right ) == terrain ); // Count how many steps (1-tile moves) it takes to become winded int steps = 0; + int turns = 0; const int STOP_STEPS = 1000; // Safe exit in case of Superman // Track changes to moves and stamina int last_moves = they.get_speed(); int last_stamina = they.get_stamina_max(); - // Take a deep breath and start running they.moves = last_moves; they.set_stamina( last_stamina ); they.set_movement_mode( move_mode_run ); - // Run until out of stamina or winded (should happen at the same time) - while( they.get_stamina() > 0 && !they.has_effect( effect_winded ) && steps < STOP_STEPS ) { + // Run as long as possible + while( they.can_run() && steps < STOP_STEPS ) { // Step right on even steps, left on odd steps if( steps % 2 == 0 ) { REQUIRE( they.pos() == left ); @@ -101,18 +99,20 @@ static int running_steps( Character &they, const ter_id &terrain = t_pavement ) // Get "speed" moves back each turn they.moves += they.get_speed(); calendar::turn += 1_turns; + turns += 1; + + // Update body for stamina regen + they.update_body(); + const int stamina_cost = last_stamina - they.get_stamina(); + // Total stamina must also be decreasing; if not, quit + CAPTURE( turns ); + CAPTURE( steps ); + CAPTURE( move_cost ); + CAPTURE( stamina_cost ); + REQUIRE( they.get_stamina() < last_stamina ); + last_stamina = they.get_stamina(); } last_moves = they.moves; - - // Update body for stamina regen - they.update_body(); - // NOTE: Stamina cost is always 100, 101, 120, or 121 ?? - const int stamina_cost = last_stamina - they.get_stamina(); - // Total stamina must also be decreasing; if not, quit - CAPTURE( move_cost ); - CAPTURE( stamina_cost ); - REQUIRE( they.get_stamina() < last_stamina ); - last_stamina = they.get_stamina(); } // Reset to starting position they.setpos( left ); @@ -138,6 +138,31 @@ static void check_trait_cardio_stamina_run( Character &they, std::string trait_n } +// Baseline character with default attributes and no traits +TEST_CASE( "base cardio", "[cardio][base]" ) +{ + verify_default_cardio_options(); + Character &they = get_player_character(); + + clear_map(); + clear_avatar(); + + // Ensure no initial effects that would affect cardio + REQUIRE( they.get_healthy() == 0 ); + REQUIRE( they.get_skill_level( skill_swimming ) == 0 ); + // Ensure base_bmr and starting cardio are what we expect + REQUIRE( they.base_bmr() == base_bmr ); + REQUIRE( they.get_cardiofit() == base_cardio ); + REQUIRE( 2 * they.get_cardio_acc() == base_bmr ); + + SECTION( "Base character with no traits" ) { + // pre-Cardio, could run 96 steps + // post-Cardio, can run 84 steps in-game, test case reached 87 + // correctly counting moves/steps instead of turns, test case reaches 83 + check_trait_cardio_stamina_run( they, "", base_cardio, base_stamina, 83 ); + } +} + // Trait Modifiers // --------------- // Mutations/traits can influence cardio fitness level in a few ways: @@ -184,8 +209,6 @@ TEST_CASE( "cardio is affected by certain traits", "[cardio][traits]" ) SECTION( "Base character with no traits" ) { // pre-Cardio, could run 96 steps - // post-Cardio, can run 84 steps in-game, test case reached 87 - // correctly counting moves/steps instead of turns, test case reaches 83 check_trait_cardio_stamina_run( they, "", base_cardio, base_stamina, 83 ); //96 } @@ -193,10 +216,10 @@ TEST_CASE( "cardio is affected by certain traits", "[cardio][traits]" ) SECTION( "Traits affecting body size" ) { // Body size determines BMR, which affects base cardio fitness // Pre-Cardio, body size did not affect how many steps you could run - check_trait_cardio_stamina_run( they, "SMALL2", 1088, 6764, 83 ); //97 + check_trait_cardio_stamina_run( they, "SMALL2", 1088, 6764, 84 ); //97 // FIXME: But why the heck can SMALL2 run further than SMALL? - check_trait_cardio_stamina_run( they, "SMALL", 1376, 7628, 77 ); //97 - check_trait_cardio_stamina_run( they, "LARGE", 2162, 9986, 92 ); //97 + check_trait_cardio_stamina_run( they, "SMALL", 1376, 7628, 78 ); //97 + check_trait_cardio_stamina_run( they, "LARGE", 2162, 9986, 93 ); //97 check_trait_cardio_stamina_run( they, "HUGE", 2663, 11489, 106 ); //97 } @@ -205,7 +228,7 @@ TEST_CASE( "cardio is affected by certain traits", "[cardio][traits]" ) // maximum stamina. Now that cardio fitness is actually implemented, these traits // directly affect total cardio fitness, and thus maximum stamina (and running distance). // Languorous - check_trait_cardio_stamina_run( they, "BADCARDIO", 0.7 * base_cardio, 7148, 67 ); //70 + check_trait_cardio_stamina_run( they, "BADCARDIO", 0.7 * base_cardio, 7148, 66 ); //70 // Indefatigable check_trait_cardio_stamina_run( they, "GOODCARDIO", 1.3 * base_cardio, 10277, 103 ); //126 // Hyperactive @@ -219,7 +242,7 @@ TEST_CASE( "cardio is affected by certain traits", "[cardio][traits]" ) // Very Fast Metabolism check_trait_cardio_stamina_run( they, "HUNGER2", 2608, 11324, 108 ); //87 // Extreme Metabolism - check_trait_cardio_stamina_run( they, "HUNGER3", 3477, 13931, 132 ); //107 + check_trait_cardio_stamina_run( they, "HUNGER3", 3477, 13931, 133 ); //107 } // FIXME: These traits need a significant nerf (-20) to reach their pre-Cardio balance From cfd070aa9e6702f0517957feaa123712189dfbb6 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Sat, 1 Jan 2022 19:08:57 -0500 Subject: [PATCH 059/154] map::bash_ter_furn clear furn before setting ter This could set terrain to t_open_air on tiles with furniture. Clear the furniture first when that happens. --- src/map.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/map.cpp b/src/map.cpp index 0ed533becb547..3a697f789de90 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -3547,6 +3547,7 @@ void map::bash_ter_furn( const tripoint &p, bash_params ¶ms ) bash_ter_furn( below, params_below ); } + furn_set( p, f_null ); ter_set( p, t_open_air ); } From e5f176be806a3ee97f4fc0ae4df46b4cb3810a45 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Sat, 1 Jan 2022 19:09:49 -0500 Subject: [PATCH 060/154] Sanity check for removing terrain under furniture We have a check for putting furniture on open-air terrain; this is the symmetrical check for removing terrain out from under furniture. --- src/map.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/map.cpp b/src/map.cpp index 3a697f789de90..9749226fd2d7f 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1733,6 +1733,16 @@ bool map::ter_set( const tripoint &p, const ter_id &new_terrain ) const ter_t &old_t = old_id.obj(); const ter_t &new_t = new_terrain.obj(); + if( current_submap->is_open_air( l ) ) { + const furn_id ¤t_furn = current_submap->get_furn( l ); + if( current_furn != f_null && + !current_furn->has_flag( ter_furn_flag::TFLAG_ALLOW_ON_OPEN_AIR ) ) { + debugmsg( "Setting terrain %s at %s where furniture is %s. Terrain is_open_air\n" + "If this is intentional, set the ALLOW_ON_OPEN_AIR flag on the furniture", + new_terrain.id().str(), p.to_string(), current_furn.id().str() ); + } + } + // HACK: Hack around ledges in traplocs or else it gets NASTY in z-level mode if( old_t.trap != tr_null && old_t.trap != tr_ledge ) { auto &traps = traplocs[old_t.trap.to_i()]; From 81a61c3cc06c0021061a05b028ebe76d750d83db Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Sat, 1 Jan 2022 14:03:02 -0500 Subject: [PATCH 061/154] Misc mapgen fixes Fix lots of issues that led to out-of-bounds or on-open-air furniture placement. Mostly related to overly generous nest coordinate ranges. --- data/json/mapgen/bank.json | 2 +- data/json/mapgen/fire_station.json | 2 +- data/json/mapgen/house/urban_6_house.json | 26 ++++++++++---------- data/json/mapgen/irradiator_1.json | 4 +-- data/json/mapgen/lake_buildings/islands.json | 20 +++++++-------- data/json/mapgen/megastore.json | 26 ++++++++++---------- data/json/mapgen/pawn_shop.json | 4 +-- data/json/mapgen/s_gun.json | 4 +-- 8 files changed, 44 insertions(+), 44 deletions(-) diff --git a/data/json/mapgen/bank.json b/data/json/mapgen/bank.json index 80c470f7ddafa..bb4e33582fc7b 100644 --- a/data/json/mapgen/bank.json +++ b/data/json/mapgen/bank.json @@ -129,7 +129,7 @@ { "chunks": [ [ "null", 20 ], [ "roof_2x2_utilities_b", 15 ], [ "roof_2x2_utilities_c", 5 ], [ "roof_2x2_utilities_d", 40 ] ], "x": [ 4, 16 ], - "y": [ 4, 14 ] + "y": [ 5, 14 ] } ] } diff --git a/data/json/mapgen/fire_station.json b/data/json/mapgen/fire_station.json index 6826d0d479ff5..52756c5910d31 100644 --- a/data/json/mapgen/fire_station.json +++ b/data/json/mapgen/fire_station.json @@ -128,7 +128,7 @@ [ "roof_4x4_utility", 40 ] ], "x": [ 4, 18 ], - "y": [ 10, 17 ] + "y": [ 10, 13 ] } ] } diff --git a/data/json/mapgen/house/urban_6_house.json b/data/json/mapgen/house/urban_6_house.json index 91cf883b1bf01..77123f0c53721 100644 --- a/data/json/mapgen/house/urban_6_house.json +++ b/data/json/mapgen/house/urban_6_house.json @@ -174,19 +174,19 @@ " ", " ", " |||| ", - " ||||||..||||||||||||||||||||||||| ", - " |1........UUzzA|~~~~~~~~~~~~~~~~| ", - " |...............~~~|~~~|~~~|v~~~| ", - " |..........||+||~~~~~~~~~~~~~~~~| ", - " |.........<|t.9|||||||||||||||||| ", - " |..........|8S8| ", - " |..........||||| ", - " |.........2....| ", - " |..............| ", - " |.z............| ", - " |.z.z..........| ", - " |..z...........| ", - " |||Fg||||||..||| ", + " |||||||..||||||||||||||||||||||||| ", + " |1.........UUzzA|~~~~~~~~~~~~~~~~| ", + " |................~~~|~~~|~~~|v~~~| ", + " |...........||+||~~~~~~~~~~~~~~~~| ", + " |..........<|t.9|||||||||||||||||| ", + " |...........|8S8| ", + " |...........||||| ", + " |........2......| ", + " |...............| ", + " |.z.............| ", + " |.z.z...........| ", + " |..z............| ", + " ||||Fg||||||..||| ", " |||| |||| ", " ", " ", diff --git a/data/json/mapgen/irradiator_1.json b/data/json/mapgen/irradiator_1.json index 1a991e28328a9..d41372764bda4 100644 --- a/data/json/mapgen/irradiator_1.json +++ b/data/json/mapgen/irradiator_1.json @@ -470,8 +470,8 @@ [ "roof_6x6_utility", 45 ], [ "roof_5x5_coop", 5 ] ], - "x": [ 11, 23 ], - "y": [ 5, 23 ] + "x": [ 11, 18 ], + "y": [ 5, 18 ] } ] } diff --git a/data/json/mapgen/lake_buildings/islands.json b/data/json/mapgen/lake_buildings/islands.json index 2eac10213a9ad..91a3f0aa9592b 100644 --- a/data/json/mapgen/lake_buildings/islands.json +++ b/data/json/mapgen/lake_buildings/islands.json @@ -48,8 +48,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } @@ -70,8 +70,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } @@ -92,8 +92,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } @@ -114,8 +114,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } @@ -136,8 +136,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } diff --git a/data/json/mapgen/megastore.json b/data/json/mapgen/megastore.json index 73610490cbb8d..219dd8baf4d60 100644 --- a/data/json/mapgen/megastore.json +++ b/data/json/mapgen/megastore.json @@ -2267,8 +2267,8 @@ [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 7, 22 ], - "y": [ 6, 22 ] + "x": [ 7, 18 ], + "y": [ 6, 18 ] } ] } @@ -2320,8 +2320,8 @@ [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 1, 22 ], - "y": [ 6, 22 ] + "x": [ 1, 18 ], + "y": [ 6, 18 ] } ] } @@ -2429,8 +2429,8 @@ [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 1, 22 ], - "y": [ 18, 22 ] + "x": [ 1, 18 ], + "y": [ 16, 18 ] } ] } @@ -2475,8 +2475,8 @@ "place_nested": [ { "chunks": [ [ "null", 5 ], [ "roof_2x2_infrastructure", 20 ], [ "roof_2x2_infrastructure_2", 20 ], [ "roof_2x2_utilities", 20 ] ], - "x": [ 1, 22 ], - "y": [ 1, 6 ] + "x": [ 1, 18 ], + "y": [ 0, 2 ] } ] } @@ -2527,8 +2527,8 @@ [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 1, 22 ], - "y": [ 18, 22 ] + "x": [ 1, 18 ], + "y": [ 16, 18 ] } ] } @@ -2573,7 +2573,7 @@ "place_nested": [ { "chunks": [ [ "null", 5 ], [ "roof_2x2_infrastructure", 80 ], [ "roof_2x2_infrastructure_2", 40 ], [ "roof_2x2_utilities", 40 ] ], - "x": [ 1, 22 ], + "x": [ 5, 22 ], "y": [ 18, 22 ] } ] @@ -2625,8 +2625,8 @@ [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 1, 22 ], - "y": [ 7, 22 ] + "x": [ 1, 18 ], + "y": [ 7, 18 ] } ] } diff --git a/data/json/mapgen/pawn_shop.json b/data/json/mapgen/pawn_shop.json index 9e1028bdbcb8c..637477690ce47 100644 --- a/data/json/mapgen/pawn_shop.json +++ b/data/json/mapgen/pawn_shop.json @@ -501,8 +501,8 @@ [ "roof_6x6_survivor", 20 ], [ "roof_6x6_utility", 20 ] ], - "x": [ 6, 15 ], - "y": [ 10, 13 ] + "x": [ 6, 13 ], + "y": [ 10, 12 ] } ] } diff --git a/data/json/mapgen/s_gun.json b/data/json/mapgen/s_gun.json index 2db9c4e2d826a..1d490fce9c476 100644 --- a/data/json/mapgen/s_gun.json +++ b/data/json/mapgen/s_gun.json @@ -95,8 +95,8 @@ [ "roof_6x6_survivor", 20 ], [ "roof_6x6_utility", 20 ] ], - "x": [ 4, 13 ], - "y": [ 11, 16 ] + "x": [ 4, 11 ], + "y": [ 12, 16 ] } ] } From 8c30174a5517b86071d67a9872b08ff28720dc7a Mon Sep 17 00:00:00 2001 From: casswedson <58050969+casswedson@users.noreply.github.com> Date: Sat, 1 Jan 2022 22:52:28 -0500 Subject: [PATCH 062/154] [Magiclysm] Fix ring of blades flags Having its flags redefined caused it to lose the ones inherited from the magic ring templates, most notably 'skintight' and 'one per layer'. Since no specified layer means normal layer is assigned this ring conflicts with gloves and similar items, it can also be used along side other magic rings Extend flags --- data/mods/Magiclysm/items/enchanted_rings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/items/enchanted_rings.json b/data/mods/Magiclysm/items/enchanted_rings.json index d48e37c8a8056..d7b2803ff8876 100644 --- a/data/mods/Magiclysm/items/enchanted_rings.json +++ b/data/mods/Magiclysm/items/enchanted_rings.json @@ -111,7 +111,7 @@ "price_postapoc": "300 USD", "description": "An ornate silver ring engraved with daggers that conjures three mundane throwing knives on activation.", "use_action": { "type": "cast_spell", "spell_id": "conj_throwing_blade3", "no_fail": true, "level": 1, "need_worn": true }, - "flags": [ "NO_UNLOAD", "NO_RELOAD" ], + "extend": { "flags": [ "NO_UNLOAD", "NO_RELOAD" ] }, "charges_per_use": 1, "relic_data": { "charge_info": { "recharge_type": "periodic", "time": "1 h", "regenerate_ammo": true } }, "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "crystallized_mana": 5 } } ] From 7e4f85aa8b21db86823724c8e8776e3346e9e89c Mon Sep 17 00:00:00 2001 From: anothersimulacrum Date: Sat, 11 Sep 2021 14:02:03 -0400 Subject: [PATCH 063/154] Revert changing currency to be count_by_charges --- data/json/items/generic/currency.json | 40 +++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/data/json/items/generic/currency.json b/data/json/items/generic/currency.json index d288d0e7bf833..5d6bab6e656a8 100644 --- a/data/json/items/generic/currency.json +++ b/data/json/items/generic/currency.json @@ -1,6 +1,6 @@ [ { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "FMCNote", "name": { "str": "Merch" }, @@ -18,7 +18,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "RobofacCoin", "name": { "str": "Hub 01 Gold Coin" }, @@ -36,7 +36,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "FlatCoin", "name": { "str": "FlatCoin" }, @@ -53,7 +53,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "signed_chit", "name": { "str": "chit" }, @@ -70,7 +70,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "icon", "name": { "str": "icon" }, @@ -87,7 +87,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "coin_penny", "name": { "str": "penny", "str_pl": "pennies" }, @@ -105,7 +105,7 @@ "ammo_type": "coin_penny" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "coin_nickel", "name": { "str": "nickel" }, @@ -123,7 +123,7 @@ "ammo_type": "coin_nickel" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "coin_dime", "name": { "str": "dime" }, @@ -141,7 +141,7 @@ "ammo_type": "coin_dime" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "coin_quarter", "name": { "str": "quarter" }, @@ -159,7 +159,7 @@ "ammo_type": "coin_quarter" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "coin_half_dollar", "name": { "str": "half-dollar coin" }, @@ -177,7 +177,7 @@ "ammo_type": "coin_half_dollar" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "coin_dollar", "name": { "str": "dollar coin" }, @@ -195,7 +195,7 @@ "ammo_type": "coin_dollar" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "coin_silver", "name": { "str": "Silver Eagle coin" }, @@ -212,7 +212,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "coin_gold", "name": { "str": "American Buffalo coin" }, @@ -253,7 +253,7 @@ ] }, { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "money_one", "name": { "str": "one-dollar bill" }, @@ -270,7 +270,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "id": "money_two", "name": { "str": "two-dollar bill" }, "description": "A two-dollar bill, featuring a portrait of Thomas Jefferson.", @@ -284,7 +284,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "id": "money_five", "name": { "str": "five-dollar bill" }, "description": "A five-dollar bill, featuring a portrait of Abraham Lincoln.", @@ -298,7 +298,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "id": "money_ten", "name": { "str": "ten-dollar bill" }, "description": "A ten-dollar bill, featuring a depiction of Alexander Hamilton.", @@ -312,7 +312,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "id": "money_twenty", "name": { "str": "twenty-dollar bill" }, "description": "A twenty-dollar bill, featuring a portrait of Andrew Jackson.", @@ -326,7 +326,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "id": "money_fifty", "name": { "str": "fifty-dollar bill" }, "description": "A fifty-dollar bill, featuring a portrait of Ulysses S Grant.", @@ -340,7 +340,7 @@ "ammo_type": "currency" }, { - "type": "AMMO", + "type": "GENERIC", "id": "money_hundred", "name": { "str": "hundred-dollar bill" }, "description": "A hundred-dollar bill, featuring a portrait of Benjamin Franklin.", From 98cbd23c6893998c4517e641b35bc372862a9c57 Mon Sep 17 00:00:00 2001 From: Kevin Granade Date: Sat, 1 Jan 2022 15:49:00 -0800 Subject: [PATCH 064/154] Fix consistency errors triggered by returning currency to GENERIC type. --- data/json/items/ammo_types.json | 42 ----------- data/json/items/generic/currency.json | 83 +++++++--------------- data/json/obsoletion/charge_removal.json | 11 +++ data/mods/Magiclysm/items/currency.json | 6 +- tools/json_tools/generic_guns_validator.py | 9 +-- 5 files changed, 38 insertions(+), 113 deletions(-) diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json index 1ee812f3ad784..605d206814e89 100644 --- a/data/json/items/ammo_types.json +++ b/data/json/items/ammo_types.json @@ -730,47 +730,5 @@ "id": "green_pen_ink", "name": "green pen ink", "default": "green_pen_ink" - }, - { - "type": "ammunition_type", - "id": "currency", - "name": "currency", - "default": "coin_penny" - }, - { - "type": "ammunition_type", - "id": "coin_penny", - "name": "pennies", - "default": "coin_penny" - }, - { - "type": "ammunition_type", - "id": "coin_nickel", - "name": "nickels", - "default": "coin_nickel" - }, - { - "type": "ammunition_type", - "id": "coin_dime", - "name": "dimes", - "default": "coin_dime" - }, - { - "type": "ammunition_type", - "id": "coin_quarter", - "name": "quarters", - "default": "coin_quarter" - }, - { - "type": "ammunition_type", - "id": "coin_half_dollar", - "name": "half-dollars", - "default": "coin_half_dollar" - }, - { - "type": "ammunition_type", - "id": "coin_dollar", - "name": "dollar coins", - "default": "coin_dollar" } ] diff --git a/data/json/items/generic/currency.json b/data/json/items/generic/currency.json index 5d6bab6e656a8..98d341775ca89 100644 --- a/data/json/items/generic/currency.json +++ b/data/json/items/generic/currency.json @@ -11,11 +11,9 @@ "weight": "1 g", "volume": "1 ml", "to_hit": -3, - "stack_size": 1, "color": "white", "symbol": "$", - "material": [ "paper" ], - "ammo_type": "currency" + "material": [ "paper" ] }, { "type": "GENERIC", @@ -29,11 +27,9 @@ "weight": "28 g", "volume": "2ml", "to_hit": -3, - "stack_size": 1, "color": "yellow", "symbol": "$", - "material": [ "gold" ], - "ammo_type": "currency" + "material": [ "gold" ] }, { "type": "GENERIC", @@ -46,11 +42,9 @@ "weight": "18 g", "volume": "1 ml", "to_hit": -3, - "stack_size": 1, "color": "brown", "symbol": "$", - "material": [ "copper" ], - "ammo_type": "currency" + "material": [ "copper" ] }, { "type": "GENERIC", @@ -63,11 +57,9 @@ "weight": "1 g", "volume": "1 ml", "to_hit": -3, - "stack_size": 1, "color": "white", "symbol": "$", - "material": [ "paper" ], - "ammo_type": "currency" + "material": [ "paper" ] }, { "type": "GENERIC", @@ -80,11 +72,9 @@ "weight": "1 g", "volume": "2 ml", "to_hit": -3, - "stack_size": 1, "color": "white", "symbol": "$", - "material": [ "paper" ], - "ammo_type": "currency" + "material": [ "paper" ] }, { "type": "GENERIC", @@ -96,13 +86,11 @@ "volume": "1 ml", "price": 1, "price_postapoc": 1, - "stack_size": 1, "material": [ "copper" ], "symbol": "o", "color": "brown", "flags": [ "OLD_CURRENCY" ], - "use_action": [ "COIN_FLIP" ], - "ammo_type": "coin_penny" + "use_action": [ "COIN_FLIP" ] }, { "type": "GENERIC", @@ -114,13 +102,11 @@ "volume": "1 ml", "price": 5, "price_postapoc": 1, - "stack_size": 1, "material": [ "copper" ], "symbol": "o", "color": "light_gray", "flags": [ "OLD_CURRENCY" ], - "use_action": [ "COIN_FLIP" ], - "ammo_type": "coin_nickel" + "use_action": [ "COIN_FLIP" ] }, { "type": "GENERIC", @@ -132,13 +118,11 @@ "volume": "1 ml", "price": 10, "price_postapoc": 1, - "stack_size": 1, "material": [ "copper" ], "symbol": "o", "color": "light_gray", "flags": [ "OLD_CURRENCY" ], - "use_action": [ "COIN_FLIP" ], - "ammo_type": "coin_dime" + "use_action": [ "COIN_FLIP" ] }, { "type": "GENERIC", @@ -150,13 +134,11 @@ "volume": "1 ml", "price": 25, "price_postapoc": 1, - "stack_size": 1, "material": [ "copper" ], "symbol": "o", "color": "light_gray", "flags": [ "OLD_CURRENCY" ], - "use_action": [ "COIN_FLIP" ], - "ammo_type": "coin_quarter" + "use_action": [ "COIN_FLIP" ] }, { "type": "GENERIC", @@ -168,13 +150,11 @@ "volume": "1 ml", "price": 25, "price_postapoc": 1, - "stack_size": 1, "material": [ "copper" ], "symbol": "o", "color": "light_gray", "flags": [ "OLD_CURRENCY" ], - "use_action": [ "COIN_FLIP" ], - "ammo_type": "coin_half_dollar" + "use_action": [ "COIN_FLIP" ] }, { "type": "GENERIC", @@ -186,13 +166,11 @@ "volume": "1 ml", "price": 100, "price_postapoc": 1, - "stack_size": 1, "material": [ "copper" ], "symbol": "o", "color": "light_gray", "flags": [ "OLD_CURRENCY" ], - "use_action": [ "COIN_FLIP" ], - "ammo_type": "coin_dollar" + "use_action": [ "COIN_FLIP" ] }, { "type": "GENERIC", @@ -204,12 +182,10 @@ "volume": "1 ml", "price": 2300, "price_postapoc": 310, - "stack_size": 1, "material": [ "silver" ], "symbol": "o", "color": "light_gray", - "use_action": [ "COIN_FLIP" ], - "ammo_type": "currency" + "use_action": [ "COIN_FLIP" ] }, { "type": "GENERIC", @@ -221,16 +197,14 @@ "volume": "1 ml", "price": 175000, "price_postapoc": 600, - "stack_size": 1, "material": [ "gold" ], "symbol": "o", "color": "yellow", - "use_action": [ "COIN_FLIP" ], - "ammo_type": "currency" + "use_action": [ "COIN_FLIP" ] }, { "id": "coin_wrapper", - "type": "MAGAZINE", + "type": "GENERIC", "category": "currency", "name": { "str": "coin wrapper" }, "description": "A coin wrapper capable of holding between twenty and fifty coins, depending on denomination, in accordance with American Banking Standards.", @@ -238,17 +212,15 @@ "volume": "1 ml", "price": 1, "price_postapoc": 0, - "reload_time": 120, "material": [ "paper" ], "symbol": "$", "color": "dark_gray", - "ammo_type": [ "coin_penny", "coin_nickel", "coin_dime", "coin_quarter", "coin_half_dollar", "coin_dollar" ], "pocket_data": [ { - "pocket_type": "MAGAZINE", "rigid": false, - "magazine_well": "0 ml", - "ammo_restriction": { "coin_penny": 50, "coin_nickel": 40, "coin_dime": 50, "coin_quarter": 40, "coin_half_dollar": 20, "coin_dollar": 25 } + "max_contains_volume": "50 ml", + "max_contains_weight": "200 g", + "item_restriction": [ "coin_penny", "coin_nickel", "coin_dime", "coin_quarter", "coin_half_dollar", "coin_dollar" ] } ] }, @@ -266,8 +238,7 @@ "symbol": "$", "color": "green", "to_hit": -3, - "flags": [ "OLD_CURRENCY" ], - "ammo_type": "currency" + "flags": [ "OLD_CURRENCY" ] }, { "type": "GENERIC", @@ -280,8 +251,7 @@ "symbol": "$", "price": 200, "price_postapoc": 0, - "flags": [ "OLD_CURRENCY" ], - "ammo_type": "currency" + "flags": [ "OLD_CURRENCY" ] }, { "type": "GENERIC", @@ -294,8 +264,7 @@ "symbol": "$", "price": 500, "price_postapoc": 0, - "flags": [ "OLD_CURRENCY" ], - "ammo_type": "currency" + "flags": [ "OLD_CURRENCY" ] }, { "type": "GENERIC", @@ -308,8 +277,7 @@ "symbol": "$", "price": 1000, "price_postapoc": 0, - "flags": [ "OLD_CURRENCY" ], - "ammo_type": "currency" + "flags": [ "OLD_CURRENCY" ] }, { "type": "GENERIC", @@ -322,8 +290,7 @@ "symbol": "$", "price": 2000, "price_postapoc": 0, - "flags": [ "OLD_CURRENCY" ], - "ammo_type": "currency" + "flags": [ "OLD_CURRENCY" ] }, { "type": "GENERIC", @@ -336,8 +303,7 @@ "symbol": "$", "price": 5000, "price_postapoc": 1, - "flags": [ "OLD_CURRENCY" ], - "ammo_type": "currency" + "flags": [ "OLD_CURRENCY" ] }, { "type": "GENERIC", @@ -350,8 +316,7 @@ "symbol": "$", "price": 10000, "price_postapoc": 1, - "flags": [ "OLD_CURRENCY" ], - "ammo_type": "currency" + "flags": [ "OLD_CURRENCY" ] }, { "type": "GENERIC", diff --git a/data/json/obsoletion/charge_removal.json b/data/json/obsoletion/charge_removal.json index 1d1b793828a2a..f343e122e5b62 100644 --- a/data/json/obsoletion/charge_removal.json +++ b/data/json/obsoletion/charge_removal.json @@ -34,6 +34,12 @@ "chitin_piece", "circsaw_off", "clarinet", + "coin_penny", + "coin_nickel", + "coin_dime", + "coin_quarter", + "coin_half_dollar", + "coin_dollar", "combatsaw_off", "combatsaw_on", "con_mix", @@ -55,6 +61,8 @@ "flashlight", "flashlight_on", "flute", + "FlatCoin", + "FMCNote", "food_processor", "forge", "frisbee", @@ -82,6 +90,7 @@ "heavy_minus_battery_cell", "heavy_plus_battery_cell", "hotplate", + "icon", "inhaler", "jackhammer", "jackolantern", @@ -161,12 +170,14 @@ "ref_lighter_on", "reloaded_10mm", "remotevehcontrol", + "RobofacCoin", "rx11_stimpack", "rx12_injector", "saxophone", "scuba_tank", "sewing_kit", "shavingkit", + "signed_chit", "sm_extinguisher", "small_repairkit", "small_scuba_tank", diff --git a/data/mods/Magiclysm/items/currency.json b/data/mods/Magiclysm/items/currency.json index 4bdbf6e32cfe4..4ee4de96e5fea 100644 --- a/data/mods/Magiclysm/items/currency.json +++ b/data/mods/Magiclysm/items/currency.json @@ -1,6 +1,6 @@ [ { - "type": "AMMO", + "type": "GENERIC", "category": "currency", "id": "denarius", "name": { "str": "denarius", "str_pl": "denarii" }, @@ -10,10 +10,8 @@ "weight": "1 g", "volume": "1 ml", "to_hit": -3, - "stack_size": 1, "color": "light_gray", "symbol": "$", - "material": [ "mithril_metal" ], - "ammo_type": "currency" + "material": [ "mithril_metal" ] } ] diff --git a/tools/json_tools/generic_guns_validator.py b/tools/json_tools/generic_guns_validator.py index 9dd115b44c9d9..a14051c50d478 100755 --- a/tools/json_tools/generic_guns_validator.py +++ b/tools/json_tools/generic_guns_validator.py @@ -31,14 +31,7 @@ 'plasma', 'rock', 'signal_flare', - 'weldgas', - 'currency', - 'coin_penny', - 'coin_nickel', - 'coin_dime', - 'coin_quarter', - 'coin_half_dollar', - 'coin_dollar', + 'weldgas' } SKILL_WHITELIST = { 'archery', From 6e07ff61d6e2a1977d2e552568f43546895b3892 Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Sun, 2 Jan 2022 14:03:29 +0800 Subject: [PATCH 065/154] C++ typo fix (#53944) --- src/debug_menu.cpp | 2 +- src/options.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index a870e4011aa63..d902474570ef8 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -264,7 +264,7 @@ static int player_uilist() std::vector uilist_initializer = { { uilist_entry( debug_menu_index::MUTATE, true, 'M', _( "Mutate" ) ) }, { uilist_entry( debug_menu_index::CHANGE_SKILLS, true, 's', _( "Change all skills" ) ) }, - { uilist_entry( debug_menu_index::CHANGE_THEORY, true, 'T', _( "Change all skills theorical knowledge" ) ) }, + { uilist_entry( debug_menu_index::CHANGE_THEORY, true, 'T', _( "Change all skills theoretical knowledge" ) ) }, { uilist_entry( debug_menu_index::LEARN_MA, true, 'l', _( "Learn all melee styles" ) ) }, { uilist_entry( debug_menu_index::UNLOCK_RECIPES, true, 'r', _( "Unlock all recipes" ) ) }, { uilist_entry( debug_menu_index::EDIT_PLAYER, true, 'p', _( "Edit player/NPC" ) ) }, diff --git a/src/options.cpp b/src/options.cpp index df287cf96fd66..1f3736bf0f189 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1219,7 +1219,7 @@ void options_manager::add_options_general() get_option( "AUTO_MINING" ).setPrerequisite( "AUTO_FEATURES" ); add( "AUTO_MOPPING", "general", to_translation( "Auto mopping" ), - to_translation( "If true, enables automatic use of wielded mops to clean surronding terrain." ), + to_translation( "If true, enables automatic use of wielded mops to clean surrounding terrain." ), false ); @@ -1440,7 +1440,7 @@ void options_manager::add_options_interface() add_empty_line(); add( "SHOW_GUN_VARIANTS", "interface", to_translation( "Show gun brand names" ), - to_translation( "Show brand names for guns, intead of generic functional names - 'm4a1' or 'h&k416a5' instead of 'NATO assault rifle'." ), + to_translation( "Show brand names for guns, instead of generic functional names - 'm4a1' or 'h&k416a5' instead of 'NATO assault rifle'." ), false ); add( "AMMO_IN_NAMES", "interface", to_translation( "Add ammo to weapon/magazine names" ), to_translation( "If true, the default ammo is added to weapon and magazine names. For example \"Mosin-Nagant M44 (4/5)\" becomes \"Mosin-Nagant M44 (4/5 7.62x54mm)\"." ), From b92606aff63e0b6ba98a19845d90aa9f9d2e8b26 Mon Sep 17 00:00:00 2001 From: Hirmuolio <22011552+Hirmuolio@users.noreply.github.com> Date: Sun, 2 Jan 2022 08:34:23 +0200 Subject: [PATCH 066/154] unus (#53949) --- src/item_pocket.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/item_pocket.cpp b/src/item_pocket.cpp index 9648bd1369081..33b51594ecd99 100644 --- a/src/item_pocket.cpp +++ b/src/item_pocket.cpp @@ -1424,7 +1424,10 @@ bool item_pocket::can_reload_with( const item &ammo, const bool now ) const if( loaded->has_flag( flag_CASING ) ) { continue; } - if( !loaded->can_combine( ammo ) ) { + // This is a *very* cut down version of item::stacks_with() + bool cant_combine = loaded->type != ammo.type || loaded->active != ammo.active || + loaded->made_of( phase_id::LIQUID ) != ammo.made_of( phase_id::LIQUID ); + if( cant_combine ) { return false; } } From 2c938dfaa98518937b40c4724c93e17b777ba2c5 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Sat, 1 Jan 2022 23:34:39 -0700 Subject: [PATCH 067/154] src: Show storage capacity in armor layering menu (#53946) --- src/armor_layers.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/armor_layers.cpp b/src/armor_layers.cpp index fb3eefc38998e..b4de2fe77fecc 100644 --- a/src/armor_layers.cpp +++ b/src/armor_layers.cpp @@ -669,12 +669,23 @@ void Character::sort_armor() } std::string worn_armor_name = tmp_worn[itemindex]->tname(); + // Get storage capacity in user's preferred units + units::volume worn_armor_capacity = tmp_worn[itemindex]->get_total_capacity(); + double worn_armor_storage = convert_volume( units::to_milliliter( worn_armor_capacity ) ); + item_penalties const penalties = get_item_penalties( tmp_worn[itemindex], *this, bp ); const int offset_x = ( itemindex == selected ) ? 3 : 2; + // Show armor name and storage capacity (if any) trim_and_print( w_sort_left, point( offset_x, drawindex + 1 ), left_w - offset_x - 3, penalties.color_for_stacking_badness(), worn_armor_name ); + if( worn_armor_storage > 0 ) { + // two digits, accurate to 1% of preferred storage unit + right_print( w_sort_left, drawindex + 1, 0, c_light_gray, + string_format( "%.2f", worn_armor_storage ) ); + } + if( tmp_worn[itemindex]->has_flag( json_flag_HIDDEN ) ) { //~ Hint: Letter to show which piece of armor is Hidden in the layering menu wprintz( w_sort_left, c_cyan, _( " H" ) ); From e53cf9c14510c5769f47bc6f6ae37025ac25ea45 Mon Sep 17 00:00:00 2001 From: George Karfakis Date: Sun, 2 Jan 2022 08:54:56 +0200 Subject: [PATCH 068/154] Add a rare spooky popup during portal storms that urges the player to go outside (#53748) --- .../portal_storm_effect_on_condition.json | 18 ++++- data/json/snippets/effect_on_conditions.json | 14 ++++ data/raw/keybindings.json | 33 +++++++++ src/enums.h | 1 + src/game.cpp | 71 +++++++++++++++++++ src/game.h | 1 + src/npctalk.cpp | 17 +++++ 7 files changed, 154 insertions(+), 1 deletion(-) diff --git a/data/json/portal_storm_effect_on_condition.json b/data/json/portal_storm_effect_on_condition.json index f2da2ad4a7de6..5bec8d479d242 100644 --- a/data/json/portal_storm_effect_on_condition.json +++ b/data/json/portal_storm_effect_on_condition.json @@ -342,7 +342,9 @@ [ "EOC_PORTAL_MESSAGE", 5 ] ] }, - "false_effect": { "set_weighted_list_eocs": [ [ "EOC_PORTAL_STORM_VOICES_3", 1 ], [ "EOC_PORTAL_STORM_INDOOR_MESSAGES_3", 1 ] ] } + "false_effect": { + "set_weighted_list_eocs": [ [ "EOC_PORTAL_STORM_VOICES_3", 1 ], [ "EOC_PORTAL_STORM_INDOOR_MESSAGES_3", 1 ], [ "EOC_PORTAL_STORM_POPUP", 1 ] ] + } } ] } @@ -722,6 +724,20 @@ } ] }, + { + "type": "effect_on_condition", + "id": "EOC_PORTAL_STORM_POPUP", + "global": true, + "condition": { "and": [ { "not": { "u_has_effect": "sleep" } }, { "x_in_y_chance": { "x": 1, "y": 120 } } ] }, + "effect": [ + { + "u_message": "PORTAL_STORM_POPUP", + "popup_w_interrupt_query": true, + "interrupt_type": "portal_storm_popup", + "snippet": true + } + ] + }, { "type": "effect_on_condition", "id": "EOC_PORTAL_STORM_INDOOR_MESSAGES_1", diff --git a/data/json/snippets/effect_on_conditions.json b/data/json/snippets/effect_on_conditions.json index 073dd5a8a8fcc..d1705abeb296d 100644 --- a/data/json/snippets/effect_on_conditions.json +++ b/data/json/snippets/effect_on_conditions.json @@ -255,6 +255,20 @@ "a confident deep voice saying \"You call this the end? The Cataclysm? Open your eyes an look around. It's never been so teeming with life. Or is it not being on top of the chain that bothers you?\"" ] }, + { + "type": "snippet", + "category": "PORTAL_STORM_POPUP", + "//": "These are just proof of concept popups, would definitely prefer to get some more sophisticated ideas", + "text": [ + "Your legs move on their own accord. You need to go outside. NOW.", + "This foolishness has lasted too long. It's time to leave and embrace the cosmos.", + "Monsters spotted! You need to leave, fast!", + "Heard footsteps! Run outdoors to escape your fate.", + "Heard crash! Your shelter is compromised, vacate it immediately!", + "The kevlar hulk is dangerously close! Run outside, it's right behind you!", + "Ouch, somethings hurts! You must leave the dreaded indoors to find reprieve." + ] + }, { "type": "snippet", "category": "PORTAL_DEPENDENT_MESSAGES_VARIED_GOOD", diff --git a/data/raw/keybindings.json b/data/raw/keybindings.json index 9caf83ec159bf..ec5cf501361a7 100644 --- a/data/raw/keybindings.json +++ b/data/raw/keybindings.json @@ -3551,6 +3551,39 @@ { "input_method": "keyboard_any", "key": "i" } ] }, + { + "type": "keybinding", + "id": "YES0", + "category": "YES_QUERY", + "name": "Yes, I will!", + "bindings": [ + { "input_method": "keyboard_char", "key": "Y" }, + { "input_method": "keyboard_code", "key": "y", "mod": [ "shift" ] }, + { "input_method": "keyboard_any", "key": "y" } + ] + }, + { + "type": "keybinding", + "id": "YES1", + "category": "YES_QUERY", + "name": "Yes, I must!", + "bindings": [ + { "input_method": "keyboard_char", "key": "Y" }, + { "input_method": "keyboard_code", "key": "y", "mod": [ "shift" ] }, + { "input_method": "keyboard_any", "key": "y" } + ] + }, + { + "type": "keybinding", + "id": "YES2", + "category": "YES_QUERY", + "name": "Yes, I shall!", + "bindings": [ + { "input_method": "keyboard_char", "key": "Y" }, + { "input_method": "keyboard_code", "key": "y", "mod": [ "shift" ] }, + { "input_method": "keyboard_any", "key": "y" } + ] + }, { "type": "keybinding", "id": "YES", diff --git a/src/enums.h b/src/enums.h index 793afc1e3010f..e02978bbd1ac7 100644 --- a/src/enums.h +++ b/src/enums.h @@ -325,6 +325,7 @@ enum class distraction_type : int { asthma, motion_alarm, weather_change, + portal_storm_popup }; enum game_message_type : int { diff --git a/src/game.cpp b/src/game.cpp index 2893c5152e076..61b1c30bda98b 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1307,6 +1307,77 @@ bool game::cancel_activity_or_ignore_query( const distraction_type type, const s return false; } +bool game::portal_storm_query( const distraction_type type, const std::string &text ) +{ + if( u.has_distant_destination() ) { + if( cancel_auto_move( u, text ) ) { + return true; + } else { + u.set_destination( u.get_auto_move_route(), player_activity( ACT_TRAVELLING ) ); + return false; + } + } + if( !u.activity || u.activity.is_distraction_ignored( type ) ) { + return false; + } + const bool force_uc = get_option( "FORCE_CAPITAL_YN" ); + const auto &allow_key = force_uc ? input_context::disallow_lower_case_or_non_modified_letters + : input_context::allow_all_keys; + + const int color_num = rng( 0, 6 ); + std::string color; + switch( color_num ) { + case 0: + color = "light_red"; + break; + case 1: + color = "red"; + break; + case 2: + color = "green"; + break; + case 3: + color = "light_green"; + break; + case 4: + color = "blue"; + break; + case 5: + color = "light_blue"; + break; + case 6: + color = "yellow"; + break; + } + + std::string color_string = force_uc && !is_keycode_mode_supported() + ? " %s (Case Sensitive)" + : " %s"; + + query_popup() + .preferred_keyboard_mode( keyboard_mode::keycode ) + .context( "YES_QUERY" ) + .message( + pgettext( "yes_query", + color_string.c_str() ), + text ) + .option( "YES0", allow_key ) + .option( "YES1", allow_key ) + .option( "YES2", allow_key ) + .query(); + + // ensure it never happens again during this activity - shouldn't be an issue anyway + u.activity.ignore_distraction( type ); + for( auto &activity : u.backlog ) { + activity.ignore_distraction( type ); + } + + ui_manager::redraw(); + refresh_display(); + + return false; +} + bool game::cancel_activity_query( const std::string &text ) { if( u.has_destination() ) { diff --git a/src/game.h b/src/game.h index a849dbee1d444..5a414e6f3bc69 100644 --- a/src/game.h +++ b/src/game.h @@ -483,6 +483,7 @@ class game /** Asks if the player wants to cancel their activity and if so cancels it. Additionally checks * if the player wants to ignore further distractions. */ bool cancel_activity_or_ignore_query( distraction_type type, const std::string &text ); + bool portal_storm_query( const distraction_type type, const std::string &text ); /** Handles players exiting from moving vehicles. */ void moving_vehicle_dismount( const tripoint &dest_loc ); diff --git a/src/npctalk.cpp b/src/npctalk.cpp index a9f541c02d570..a172e5f6194d6 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -2552,6 +2552,8 @@ void talk_effect_fun_t::set_message( const JsonObject &jo, const std::string &me const bool outdoor_only = jo.get_bool( "outdoor_only", false ); const bool sound = jo.get_bool( "sound", false ); const bool popup_msg = jo.get_bool( "popup", false ); + const bool popup_w_interrupt_query_msg = jo.get_bool( "popup_w_interrupt_query", false ); + std::string interrupt_type = jo.get_string( "interrupt_type", "default" ); game_message_type type = m_neutral; std::string type_string = jo.get_string( "type", "neutral" ); if( type_string == "good" ) { @@ -2579,6 +2581,7 @@ void talk_effect_fun_t::set_message( const JsonObject &jo, const std::string &me } function = [message, outdoor_only, sound, snippet, same_snippet, type, popup_msg, + popup_w_interrupt_query_msg, interrupt_type, is_npc]( const dialogue & d ) { Character *target = d.actor( is_npc )->get_character(); if( !target || target->is_npc() ) { @@ -2623,6 +2626,20 @@ void talk_effect_fun_t::set_message( const JsonObject &jo, const std::string &me return pop.get_window(); }; scrollable_text( new_win, "", replace_colors( translated_message ) ); + } + if( popup_w_interrupt_query_msg ) { + if( interrupt_type == "portal_storm_popup" ) { + g->portal_storm_query( distraction_type::portal_storm_popup, + translated_message ); + } else if( interrupt_type == "default" ) { + debugmsg( "Interrupt query called in json without proper interrupt type." ); + } + // Would probably need an else-if for every possible distraction type, like this: + //else if (interrupt_type == "hostile_spotted_near"){ + // g->cancel_activity_or_ignore_query(distraction_type::hostile_spotted_near, "sample message"); + //} + // I leave this to contributors who might actually wish to implement such interrupts, + // so as to not overcomplicate the code. } else { target->add_msg_if_player( type, translated_message ); } From 2eb35875e0375e4ccb3174d63782678d49de2866 Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Sun, 2 Jan 2022 15:00:49 +0800 Subject: [PATCH 069/154] Pluralize messages (#53961) --- src/activity_handlers.cpp | 6 ++++-- src/iuse.cpp | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index ee674b4b4936a..9ee7ef8de068a 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -3621,11 +3621,13 @@ void activity_handlers::chop_planks_finish( player_activity *act, Character *you map &here = get_map(); if( planks > 0 ) { here.spawn_item( here.getlocal( act->placement ), itype_2x4, planks, 0, calendar::turn ); - you->add_msg_if_player( m_good, _( "You produce %d planks." ), planks ); + you->add_msg_if_player( m_good, n_gettext( "You produce %d plank.", "You produce %d planks.", + planks ), planks ); } if( scraps > 0 ) { here.spawn_item( here.getlocal( act->placement ), itype_splinter, scraps, 0, calendar::turn ); - you->add_msg_if_player( m_good, _( "You produce %d splinters." ), scraps ); + you->add_msg_if_player( m_good, n_gettext( "You produce %d splinter.", "You produce %d splinters.", + scraps ), scraps ); } if( planks < max_planks / 2 ) { you->add_msg_if_player( m_bad, _( "You waste a lot of the wood." ) ); diff --git a/src/iuse.cpp b/src/iuse.cpp index 4d630493ff8aa..64f93fa3d8d2c 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -9568,7 +9568,8 @@ cata::optional iuse::play_game( Character *p, item *it, bool, const tripoin .query().action; if( res == "FRIENDS" ) { if( fcount > 1 ) { - add_msg( _( "You and your %d friends start playing." ), fcount ); + add_msg( n_gettext( "You and your %d friend start playing.", + "You and your %d friends start playing.", fcount ), fcount ); } else { add_msg( _( "You and your friend start playing." ) ); } From d5a83c387750e6e014b678b82ee8ac42205d701b Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Sun, 2 Jan 2022 12:12:39 +0100 Subject: [PATCH 070/154] Update data/mods/Magiclysm/Spells/animist.json Co-authored-by: Curtis Merrill --- data/mods/Magiclysm/Spells/animist.json | 1 - 1 file changed, 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index d3fb245dfea1f..6f125624b15cd 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -387,7 +387,6 @@ "type": "SPELL", "name": "Rupture", "description": "You pour mana into an unwilling and unprepared vessel, causing cellular break-down, internal hemorrhaging, ley lines becoming muddled, and electronics overcharging. Immensely gruesome, crude, and was once illegal world-wide, not that it matters now.", - "//": "rewrited it, so now it low-damage dot spell that transform to high-damage without dot", "effect": "attack", "shape": "blast", "valid_targets": [ "hostile" ], From 8bb6b955a4ed7fe2b57a868e1af2573d33bc12c7 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Sun, 5 Sep 2021 13:57:43 -0600 Subject: [PATCH 071/154] src,data: Add window panel generator for widget - Add widget::get_window_panel to build a window_panel - Add root_layout with some labeled panels that can be reordered - Move panel init from load_static_data to create_or_get_main_ui_adaptor - Document window_panel, panel_layout, and panel_manager Basic concept is coded, but does not work because widget data is not yet loaded at sidebar initialization time (before game menu is displayed). To allow panels access to widget JSON data on initialization, move the panel_manager initialization to later in the game startup process. --- data/json/ui/sidebar.json | 20 +++++++++++++++++ src/game.cpp | 4 +++- src/panels.cpp | 17 +++++++++++++++ src/panels.h | 8 +++++++ src/widget.cpp | 45 +++++++++++++++++++++++++++++++++++++++ src/widget.h | 3 +++ 6 files changed, 96 insertions(+), 1 deletion(-) diff --git a/data/json/ui/sidebar.json b/data/json/ui/sidebar.json index d3bc1fe126ed4..84dab9b6b769f 100644 --- a/data/json/ui/sidebar.json +++ b/data/json/ui/sidebar.json @@ -424,6 +424,7 @@ { "id": "hitpoint_graphs_top_layout", "type": "widget", + "label": "HP Top", "style": "layout", "arrange": "columns", "widgets": [ "hp_left_arm_graph", "hp_head_graph", "hp_right_arm_graph" ] @@ -431,10 +432,19 @@ { "id": "hitpoint_graphs_bottom_layout", "type": "widget", + "label": "HP Bottom", "style": "layout", "arrange": "columns", "widgets": [ "hp_left_leg_graph", "hp_torso_graph", "hp_right_leg_graph" ] }, + { + "id": "hitpoints_all_graphs_layout", + "type": "widget", + "label": "Hit Points", + "style": "layout", + "arrange": "rows", + "widgets": [ "hitpoints_top_layout", "hitpoints_bottom_layout" ] + }, { "id": "hitpoints_head_torso", "type": "widget", @@ -559,6 +569,7 @@ { "id": "sound_fatigue_focus_layout", "type": "widget", + "label": "Sound Fatigue Focus", "style": "layout", "arrange": "columns", "widgets": [ "sound_num", "fatigue_graph", "focus_num" ] @@ -566,6 +577,7 @@ { "id": "stamina_speed_move_layout", "type": "widget", + "label": "Stamina Speed Move", "style": "layout", "arrange": "columns", "widgets": [ "stamina_graph_classic", "speed_num", "move_num" ] @@ -580,6 +592,7 @@ { "id": "stats_layout", "type": "widget", + "label": "Stats", "style": "layout", "arrange": "columns", "widgets": [ "str_num", "dex_num", "int_num", "per_num" ] @@ -792,5 +805,12 @@ "str_dex_layout", "int_per_layout" ] + }, + { + "id": "root_layout", + "type": "widget", + "style": "layout", + "arrange": "rows", + "widgets": [ "hitpoints_all_graphs_layout", "sound_fatigue_focus_layout", "stamina_speed_move_layout", "stats_layout" ] } ] diff --git a/src/game.cpp b/src/game.cpp index 61b1c30bda98b..9676b69e571c8 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -429,7 +429,6 @@ void game::load_static_data() fullscreen = false; was_fullscreen = false; show_panel_adm = false; - panel_manager::get_manager().init(); // These functions do not load stuff from json. // The content they load/initialize is hardcoded into the program. @@ -3147,6 +3146,7 @@ shared_ptr_fast game::create_or_get_main_ui_adaptor() { shared_ptr_fast ui = main_ui_adaptor.lock(); if( !ui ) { + panel_manager::get_manager().init(); main_ui_adaptor = ui = make_shared_fast(); ui->on_redraw( []( const ui_adaptor & ) { g->draw(); @@ -3362,6 +3362,7 @@ void game::draw_panels( bool force_draw ) int y = 0; const bool sidebar_right = get_option( "SIDEBAR_POSITION" ) == "right"; int spacer = get_option( "SIDEBAR_SPACERS" ) ? 1 : 0; + // Total up height used by all panels, and see what is left over for log int log_height = 0; for( const window_panel &panel : mgr.get_current_layout().panels() ) { if( panel.get_height() != -2 && panel.toggle && panel.render() ) { @@ -3369,6 +3370,7 @@ void game::draw_panels( bool force_draw ) } } log_height = std::max( TERMY - log_height, 3 ); + // Draw each panel having render() true for( const window_panel &panel : mgr.get_current_layout().panels() ) { if( panel.render() ) { // height clamped to window height. diff --git a/src/panels.cpp b/src/panels.cpp index 9024e7525d2a2..48ee598b10587 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -2990,6 +2990,21 @@ static std::vector initialize_default_label_panels() return ret; } +static std::vector initialize_default_custom_panels() +{ + const int panel_width = 44; + + std::vector ret; + + widget root = widget_id( "root_layout" ).obj(); + for( const widget_id &row_wid : root._widgets ) { + widget row_widget = row_wid.obj(); + ret.emplace_back( row_widget.get_window_panel( panel_width ) ); + } + + return ret; +} + static std::map initialize_default_panel_layouts() { std::map ret; @@ -3002,6 +3017,8 @@ static std::map initialize_default_panel_layouts() initialize_default_label_narrow_panels() ) ); ret.emplace( "labels", panel_layout( to_translation( "labels" ), initialize_default_label_panels() ) ); + ret.emplace( "custom", panel_layout( to_translation( "custom" ), + initialize_default_custom_panels() ) ); return ret; } diff --git a/src/panels.h b/src/panels.h index 0847fbd557b20..806c299f515e5 100644 --- a/src/panels.h +++ b/src/panels.h @@ -129,6 +129,9 @@ void draw_overmap_chunk( const catacurses::window &w_minimap, const avatar &you, bool default_render(); +// A window_panel is a rectangular region or panel within the sidebar window. +// It is associated with a draw function (taking avatar and window), along with id and name. +// The height, width, and default toggle state must be provided to the constructor as well. class window_panel { public: @@ -153,6 +156,8 @@ class window_panel translation name; }; +// A panel_layout is a collection of window_panels drawn in order from top to bottom. +// It is associated with the user-selectable layouts named "classic", "compact", "labels", etc. class panel_layout { public: @@ -167,6 +172,9 @@ class panel_layout std::vector _panels; }; +// The panel_manager allows the player choose their current panel layout and window panels. +// The player's selected panel_layout, and which window_panels are toggled on or off, are +// saved to the PATH_INFO::panel_options() file, typically config/panel_options.json. class panel_manager { public: diff --git a/src/widget.cpp b/src/widget.cpp index 537d5e23a08bb..04495fa7f3d95 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -329,6 +329,51 @@ std::string widget::show( const avatar &ava ) } } +window_panel widget::get_window_panel( const int width, const int req_height ) +{ + // Width is fixed, but height may vary depending on child widgets + int height = req_height; + + // For layout with rows, height will be number of rows + // (assuming each row is only 1 line) + if( _style == "layout" && _arrange == "rows" ) { + height = _widgets.size(); + } + // Minimap and log do not have a predetermined height + // (or they should allow caller to customize height) + + // If this widget is not a layout, use its label for the window panel id and name + // FIXME: Support label for layout widgets too! + auto draw_func = [this, width]( const avatar & u, const catacurses::window & w ) { + werase( w ); + if( _style == "layout" ) { + if( _arrange == "rows" ) { + // Layout widgets in rows + // FIXME: Be able to handle rows that are themselves more than one line! + // Could this be done in the layout() function somehow (by returning newlines?) + int row_num = 0; + for( const widget_id &row_wid : _widgets ) { + widget row_widget = row_wid.obj(); + trim_and_print( w, point( 1, row_num ), width - 1, c_light_gray, _( row_widget.layout( u, + width - 1 ) ) ); + row_num++; + } + } else { + // Layout widgets in columns + // For now, this is the default when calling layout() + // So, just layout self + trim_and_print( w, point( 1, 1 ), width - 1, c_light_gray, _( layout( u, width - 1 ) ) ); + } + } else { + // Just layout self + trim_and_print( w, point( 1, 1 ), width - 1, c_light_gray, _( layout( u, width - 1 ) ) ); + } + wnoutrefresh( w ); + }; + + return window_panel( draw_func, _label.translated(), _label, height, width, false ); +} + bool widget::uses_text_function() { switch( _var ) { diff --git a/src/widget.h b/src/widget.h index 57e097ec427d8..8eacace9a059e 100644 --- a/src/widget.h +++ b/src/widget.h @@ -9,6 +9,7 @@ //#include "cata_variant.h" #include "enum_traits.h" #include "generic_factory.h" +#include "panels.h" #include "string_id.h" #include "translations.h" #include "type_id.h" @@ -134,6 +135,8 @@ class widget std::string layout( const avatar &ava, unsigned int max_width = 0 ); // Display labeled widget, with value (number, graph, or string) from an avatar std::string show( const avatar &ava ); + // Return a window_panel for rendering this widget at given width (and possibly height) + window_panel get_window_panel( const int width, const int req_height = 1 ); // Return a colorized string for a _var associated with a description function std::string color_text_function_string( const avatar &ava ); // Return true if the current _var is one which uses a description function From 090e04982bfb3b6b8961343c9179f352e792ee23 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Wed, 22 Dec 2021 14:18:44 -0500 Subject: [PATCH 072/154] src: Defer loading root_layout until widgets are loaded Co-author: David Seguin src: Move lambda to a static function src: Fix width underflow (It works!) src: Comment on what -2 means here src,data: Make room for longer labels in panel options src,data: Use root_layout width=50, add log/map src: Add hint for editing moddable sidebar JSON src: Make custom layout at least 32 width --- data/json/ui/sidebar.json | 1 + src/game.cpp | 5 +- src/init.cpp | 2 + src/panels.cpp | 187 ++++++++++++++++++++++++-------------- src/panels.h | 16 +++- src/widget.cpp | 83 ++++++++++------- src/widget.h | 3 + 7 files changed, 193 insertions(+), 104 deletions(-) diff --git a/data/json/ui/sidebar.json b/data/json/ui/sidebar.json index 84dab9b6b769f..a61c8cb598f9e 100644 --- a/data/json/ui/sidebar.json +++ b/data/json/ui/sidebar.json @@ -810,6 +810,7 @@ "id": "root_layout", "type": "widget", "style": "layout", + "width": 50, "arrange": "rows", "widgets": [ "hitpoints_all_graphs_layout", "sound_fatigue_focus_layout", "stamina_speed_move_layout", "stats_layout" ] } diff --git a/src/game.cpp b/src/game.cpp index 9676b69e571c8..b94c570d6c1e9 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3365,6 +3365,7 @@ void game::draw_panels( bool force_draw ) // Total up height used by all panels, and see what is left over for log int log_height = 0; for( const window_panel &panel : mgr.get_current_layout().panels() ) { + // The panel with height -2 is the message log panel if( panel.get_height() != -2 && panel.toggle && panel.render() ) { log_height += panel.get_height() + spacer; } @@ -3375,14 +3376,16 @@ void game::draw_panels( bool force_draw ) if( panel.render() ) { // height clamped to window height. int h = std::min( panel.get_height(), TERMY - y ); + // The panel with height -2 is the message log panel if( h == -2 ) { h = log_height; } h += spacer; if( panel.toggle && panel.render() && h > 0 ) { if( panel.always_draw || draw_this_turn ) { + widget *wgt = panel.get_widget(); panel.draw( u, catacurses::newwin( h, panel.get_width(), - point( sidebar_right ? TERMX - panel.get_width() : 0, y ) ) ); + point( sidebar_right ? TERMX - panel.get_width() : 0, y ) ), wgt ); } if( show_panel_adm ) { const std::string panel_name = panel.get_name(); diff --git a/src/init.cpp b/src/init.cpp index 4b57451a76a55..ae6777233b799 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -624,6 +624,7 @@ void DynamicDataLoader::unload_data() vpart_category::reset(); weakpoints::reset(); weather_types::reset(); + widget::reset(); } void DynamicDataLoader::finalize_loaded_data() @@ -703,6 +704,7 @@ void DynamicDataLoader::finalize_loaded_data( loading_ui &ui ) { _( "Anatomies" ), &anatomy::finalize_all }, { _( "Mutations" ), &mutation_branch::finalize }, { _( "Achievements" ), &achievement::finalize }, + { _( "Widgets" ), &widget::finalize }, #if defined(TILES) { _( "Tileset" ), &load_tileset }, #endif diff --git a/src/panels.cpp b/src/panels.cpp index 48ee598b10587..8238df4fac602 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -85,7 +85,7 @@ static const trait_id trait_NOPAIN( "NOPAIN" ); // constructor window_panel::window_panel( - const std::function &draw_func, + const std::function &draw_func, const std::string &id, const translation &nm, const int ht, const int wd, const bool default_toggle_, const std::function &render_func, const bool force_draw ) @@ -232,9 +232,20 @@ std::string window_panel::get_name() const return name.translated(); } +void window_panel::set_widget( const widget *w ) +{ + wgt = const_cast( w ); +} + +widget *window_panel::get_widget() const +{ + return wgt; +} + panel_layout::panel_layout( const translation &_name, - const std::vector &_panels ) - : _name( _name ), _panels( _panels ) + const std::vector &_panels, + std::vector( *_load_fn )( void ) ) + : _name( _name ), _panels( _panels ), _load_fn( _load_fn ) { } @@ -253,6 +264,14 @@ std::vector &panel_layout::panels() return _panels; } +void panel_layout::deferred_load() +{ + if( _load_fn == nullptr ) { + return; + } + _panels = ( *this->_load_fn )(); +} + void overmap_ui::draw_overmap_chunk( const catacurses::window &w_minimap, const avatar &you, const tripoint_abs_omt &global_omt, const point &start_input, const int width, const int height ) @@ -912,7 +931,7 @@ static void draw_limb_health( avatar &u, const catacurses::window &w, bodypart_i } } -static void draw_limb2( avatar &u, const catacurses::window &w ) +static void draw_limb2( avatar &u, const catacurses::window &w, widget * ) { werase( w ); // print bodypart health @@ -1440,7 +1459,7 @@ std::pair display::rad_badge_text_color( const Character return std::make_pair( rad_text, rad_color ); } -static void draw_stats( avatar &u, const catacurses::window &w ) +static void draw_stats( avatar &u, const catacurses::window &w, widget * ) { werase( w ); nc_color stat_clr = display::str_text_color( u ).second; @@ -1489,7 +1508,7 @@ std::pair display::move_mode_text_color( const Character return std::make_pair( mm_text, mm_color ); } -static void draw_stealth( avatar &u, const catacurses::window &w ) +static void draw_stealth( avatar &u, const catacurses::window &w, widget * ) { werase( w ); mvwprintz( w, point_zero, c_light_gray, _( "Speed" ) ); @@ -1553,7 +1572,7 @@ static void draw_time_graphic( const catacurses::window &w ) wprintz( w, c_white, "]" ); } -static void draw_time( const avatar &u, const catacurses::window &w ) +static void draw_time( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); // display date @@ -1578,7 +1597,7 @@ static void draw_time( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_needs_compact( const avatar &u, const catacurses::window &w ) +static void draw_needs_compact( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -1603,7 +1622,7 @@ static void draw_needs_compact( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_limb_narrow( avatar &u, const catacurses::window &w ) +static void draw_limb_narrow( avatar &u, const catacurses::window &w, widget * ) { werase( w ); int ny2 = 0; @@ -1648,7 +1667,7 @@ static void draw_limb_narrow( avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_limb_wide( avatar &u, const catacurses::window &w ) +static void draw_limb_wide( avatar &u, const catacurses::window &w, widget * ) { werase( w ); int i = 0; @@ -1667,7 +1686,7 @@ static void draw_limb_wide( avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_char_narrow( avatar &u, const catacurses::window &w ) +static void draw_char_narrow( avatar &u, const catacurses::window &w, widget * ) { werase( w ); std::pair morale_pair = display::morale_face_color( u ); @@ -1708,7 +1727,7 @@ static void draw_char_narrow( avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_char_wide( avatar &u, const catacurses::window &w ) +static void draw_char_wide( avatar &u, const catacurses::window &w, widget * ) { werase( w ); std::pair morale_pair = display::morale_face_color( u ); @@ -1744,7 +1763,7 @@ static void draw_char_wide( avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_stat_narrow( avatar &u, const catacurses::window &w ) +static void draw_stat_narrow( avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -1789,7 +1808,7 @@ static void draw_stat_narrow( avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_stat_wide( avatar &u, const catacurses::window &w ) +static void draw_stat_wide( avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -1870,22 +1889,22 @@ static void draw_loc_labels( const avatar &u, const catacurses::window &w, bool wnoutrefresh( w ); } -static void draw_loc_narrow( const avatar &u, const catacurses::window &w ) +static void draw_loc_narrow( const avatar &u, const catacurses::window &w, widget * ) { draw_loc_labels( u, w, false ); } -static void draw_loc_wide( const avatar &u, const catacurses::window &w ) +static void draw_loc_wide( const avatar &u, const catacurses::window &w, widget * ) { draw_loc_labels( u, w, false ); } -static void draw_loc_wide_map( const avatar &u, const catacurses::window &w ) +static void draw_loc_wide_map( const avatar &u, const catacurses::window &w, widget * ) { draw_loc_labels( u, w, true ); } -static void draw_moon_narrow( const avatar &u, const catacurses::window &w ) +static void draw_moon_narrow( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -1895,7 +1914,7 @@ static void draw_moon_narrow( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_moon_wide( const avatar &u, const catacurses::window &w ) +static void draw_moon_wide( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -1904,7 +1923,7 @@ static void draw_moon_wide( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_weapon_labels( const avatar &u, const catacurses::window &w ) +static void draw_weapon_labels( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -1916,7 +1935,7 @@ static void draw_weapon_labels( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_needs_narrow( const avatar &u, const catacurses::window &w ) +static void draw_needs_narrow( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); std::pair hunger_pair = display::hunger_text_color( u ); @@ -1939,7 +1958,7 @@ static void draw_needs_narrow( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_needs_labels( const avatar &u, const catacurses::window &w ) +static void draw_needs_labels( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); std::pair hunger_pair = display::hunger_text_color( u ); @@ -1966,7 +1985,7 @@ static void draw_needs_labels( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_needs_labels_alt( const avatar &u, const catacurses::window &w ) +static void draw_needs_labels_alt( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); std::pair hunger_pair = display::hunger_text_color( u ); @@ -1991,7 +2010,7 @@ static void draw_needs_labels_alt( const avatar &u, const catacurses::window &w wnoutrefresh( w ); } -static void draw_sound_labels( const avatar &u, const catacurses::window &w ) +static void draw_sound_labels( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -2004,7 +2023,7 @@ static void draw_sound_labels( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_sound_narrow( const avatar &u, const catacurses::window &w ) +static void draw_sound_narrow( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -2017,7 +2036,7 @@ static void draw_sound_narrow( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_env_compact( avatar &u, const catacurses::window &w ) +static void draw_env_compact( avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -2089,17 +2108,17 @@ static void render_wind( avatar &u, const catacurses::window &w, const std::stri wnoutrefresh( w ); } -static void draw_wind( avatar &u, const catacurses::window &w ) +static void draw_wind( avatar &u, const catacurses::window &w, widget * ) { render_wind( u, w, "%s: " ); } -static void draw_wind_padding( avatar &u, const catacurses::window &w ) +static void draw_wind_padding( avatar &u, const catacurses::window &w, widget * ) { render_wind( u, w, " %s: " ); } -static void draw_health_classic( avatar &u, const catacurses::window &w ) +static void draw_health_classic( avatar &u, const catacurses::window &w, widget * ) { vehicle *veh = g->remoteveh(); if( veh == nullptr && u.in_vehicle ) { @@ -2195,7 +2214,7 @@ static void draw_health_classic( avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_armor_padding( const avatar &u, const catacurses::window &w ) +static void draw_armor_padding( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); nc_color color = c_light_gray; @@ -2222,7 +2241,7 @@ static void draw_armor_padding( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_armor( const avatar &u, const catacurses::window &w ) +static void draw_armor( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); nc_color color = c_light_gray; @@ -2248,7 +2267,7 @@ static void draw_armor( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_messages( avatar &, const catacurses::window &w ) +static void draw_messages( avatar &, const catacurses::window &w, widget * ) { werase( w ); int line = getmaxy( w ) - 2; @@ -2257,7 +2276,7 @@ static void draw_messages( avatar &, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_messages_classic( avatar &, const catacurses::window &w ) +static void draw_messages_classic( avatar &, const catacurses::window &w, widget * ) { werase( w ); int line = getmaxy( w ) - 2; @@ -2267,7 +2286,7 @@ static void draw_messages_classic( avatar &, const catacurses::window &w ) } #if defined(TILES) -static void draw_mminimap( avatar &, const catacurses::window &w ) +static void draw_mminimap( avatar &, const catacurses::window &w, widget * ) { werase( w ); g->draw_pixel_minimap( w ); @@ -2435,35 +2454,35 @@ void display::print_mon_info( avatar &u, const catacurses::window &w, int hor_pa } } -static void draw_compass( avatar &u, const catacurses::window &w ) +static void draw_compass( avatar &u, const catacurses::window &w, widget * ) { werase( w ); display::print_mon_info( u, w ); wnoutrefresh( w ); } -static void draw_compass_compact( avatar &u, const catacurses::window &w ) +static void draw_compass_compact( avatar &u, const catacurses::window &w, widget * ) { werase( w ); display::print_mon_info( u, w, 0, true ); wnoutrefresh( w ); } -static void draw_compass_padding( avatar &u, const catacurses::window &w ) +static void draw_compass_padding( avatar &u, const catacurses::window &w, widget * ) { werase( w ); display::print_mon_info( u, w, 1 ); wnoutrefresh( w ); } -static void draw_compass_padding_compact( avatar &u, const catacurses::window &w ) +static void draw_compass_padding_compact( avatar &u, const catacurses::window &w, widget * ) { werase( w ); display::print_mon_info( u, w, 1, true ); wnoutrefresh( w ); } -static void draw_overmap_narrow( avatar &u, const catacurses::window &w ) +static void draw_overmap_narrow( avatar &u, const catacurses::window &w, widget * ) { werase( w ); const tripoint_abs_omt curs = u.global_omt_location(); @@ -2473,7 +2492,7 @@ static void draw_overmap_narrow( avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_overmap_wide( avatar &u, const catacurses::window &w ) +static void draw_overmap_wide( avatar &u, const catacurses::window &w, widget * ) { werase( w ); const tripoint_abs_omt curs = u.global_omt_location(); @@ -2502,17 +2521,17 @@ static void draw_mod_sidebar( avatar &u, const catacurses::window &w, const std: wnoutrefresh( w ); } -static void draw_mod_sidebar_narrow( avatar &u, const catacurses::window &w ) +static void draw_mod_sidebar_narrow( avatar &u, const catacurses::window &w, widget * ) { draw_mod_sidebar( u, w, "root_layout_narrow", 31 ); } -static void draw_mod_sidebar_wide( avatar &u, const catacurses::window &w ) +static void draw_mod_sidebar_wide( avatar &u, const catacurses::window &w, widget * ) { draw_mod_sidebar( u, w, "root_layout_wide", 43 ); } -static void draw_veh_compact( const avatar &u, const catacurses::window &w ) +static void draw_veh_compact( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -2530,7 +2549,7 @@ static void draw_veh_compact( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_veh_padding( const avatar &u, const catacurses::window &w ) +static void draw_veh_padding( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -2548,7 +2567,7 @@ static void draw_veh_padding( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_ai_goal( const avatar &u, const catacurses::window &w ) +static void draw_ai_goal( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); behavior::tree needs; @@ -2560,7 +2579,7 @@ static void draw_ai_goal( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_location_classic( const avatar &u, const catacurses::window &w ) +static void draw_location_classic( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -2571,7 +2590,7 @@ static void draw_location_classic( const avatar &u, const catacurses::window &w wnoutrefresh( w ); } -static void draw_weather_classic( avatar &, const catacurses::window &w ) +static void draw_weather_classic( avatar &, const catacurses::window &w, widget * ) { werase( w ); @@ -2589,7 +2608,7 @@ static void draw_weather_classic( avatar &, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_lighting_classic( const avatar &u, const catacurses::window &w ) +static void draw_lighting_classic( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -2608,7 +2627,7 @@ static void draw_lighting_classic( const avatar &u, const catacurses::window &w wnoutrefresh( w ); } -static void draw_weapon_classic( const avatar &u, const catacurses::window &w ) +static void draw_weapon_classic( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -2626,7 +2645,7 @@ static void draw_weapon_classic( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_time_classic( const avatar &u, const catacurses::window &w ) +static void draw_time_classic( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -2652,7 +2671,7 @@ static void draw_time_classic( const avatar &u, const catacurses::window &w ) wnoutrefresh( w ); } -static void draw_hint( const avatar &, const catacurses::window &w ) +static void draw_hint( const avatar &, const catacurses::window &w, widget * ) { werase( w ); std::string press = press_x( ACTION_TOGGLE_PANEL_ADM ); @@ -2692,28 +2711,28 @@ static void draw_weariness_partial( const avatar &u, const catacurses::window &w wnoutrefresh( w ); } -static void draw_weariness( const avatar &u, const catacurses::window &w ) +static void draw_weariness( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); draw_weariness_partial( u, w, point_zero, false ); wnoutrefresh( w ); } -static void draw_weariness_narrow( const avatar &u, const catacurses::window &w ) +static void draw_weariness_narrow( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); draw_weariness_partial( u, w, point_east, false ); wnoutrefresh( w ); } -static void draw_weariness_wide( const avatar &u, const catacurses::window &w ) +static void draw_weariness_wide( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); draw_weariness_partial( u, w, point_east, true ); wnoutrefresh( w ); } -static void draw_weariness_classic( const avatar &u, const catacurses::window &w ) +static void draw_weariness_classic( const avatar &u, const catacurses::window &w, widget * ) { werase( w ); @@ -2757,22 +2776,22 @@ static void print_mana( const Character &you, const catacurses::window &w, wnoutrefresh( w ); } -static void draw_mana_classic( const Character &you, const catacurses::window &w ) +static void draw_mana_classic( const Character &you, const catacurses::window &w, widget * ) { print_mana( you, w, "%s: %s %s: %s", -8, -5, 20, -5 ); } -static void draw_mana_compact( const Character &you, const catacurses::window &w ) +static void draw_mana_compact( const Character &you, const catacurses::window &w, widget * ) { print_mana( you, w, "%s %s %s %s", 4, -5, 12, -5 ); } -static void draw_mana_narrow( const Character &you, const catacurses::window &w ) +static void draw_mana_narrow( const Character &you, const catacurses::window &w, widget * ) { print_mana( you, w, " %s: %s %s : %s", -5, -5, 9, -5 ); } -static void draw_mana_wide( const Character &you, const catacurses::window &w ) +static void draw_mana_wide( const Character &you, const catacurses::window &w, widget * ) { print_mana( you, w, " %s: %s %s : %s", -5, -5, 13, -5 ); } @@ -2990,17 +3009,47 @@ static std::vector initialize_default_label_panels() return ret; } -static std::vector initialize_default_custom_panels() +// Message on how to use the custom sidebar panel and edit its JSON +static void draw_custom_hint( const avatar &, const catacurses::window &w, widget * ) { - const int panel_width = 44; + werase( w ); + // NOLINTNEXTLINE(cata-use-named-point-constants) + mvwprintz( w, point( 1, 0 ), c_white, _( "Custom moddable sidebar" ) ); + mvwprintz( w, point( 1, 1 ), c_light_gray, + _( "Edit data/json/ui/sidebar.json to customize" ) ); + mvwprintz( w, point( 1, 2 ), c_light_gray, + _( "See doc/SIDEBAR_MOD.md for help" ) ); + + wnoutrefresh( w ); +} +// Initialize custom panels from the "root_layout" widget +static std::vector initialize_default_custom_panels() +{ std::vector ret; + // Get the root layout widget widget root = widget_id( "root_layout" ).obj(); + // Use its defined width, or at least 32 + const int width = std::max( root._width, 32 ); + + // Show hint on configuration + ret.emplace_back( window_panel( draw_custom_hint, "Hint", to_translation( "Hint" ), + 3, width, true ) ); + + // Add each widget from the root layout for( const widget_id &row_wid : root._widgets ) { widget row_widget = row_wid.obj(); - ret.emplace_back( row_widget.get_window_panel( panel_width ) ); + ret.emplace_back( row_widget.get_window_panel( width ) ); } + // Add message log and map to fill remaining space + // TODO: Make these into proper widgets + ret.emplace_back( window_panel( draw_messages, "Log", to_translation( "Log" ), + -2, width, true ) ); +#if defined(TILES) + ret.emplace_back( window_panel( draw_mminimap, "Map", to_translation( "Map" ), + -1, width, true, default_render, true ) ); +#endif // TILES return ret; } @@ -3010,15 +3059,15 @@ static std::map initialize_default_panel_layouts() std::map ret; ret.emplace( "classic", panel_layout( to_translation( "classic" ), - initialize_default_classic_panels() ) ); + initialize_default_classic_panels(), nullptr ) ); ret.emplace( "compact", panel_layout( to_translation( "compact" ), - initialize_default_compact_panels() ) ); + initialize_default_compact_panels(), nullptr ) ); ret.emplace( "labels-narrow", panel_layout( to_translation( "labels narrow" ), - initialize_default_label_narrow_panels() ) ); + initialize_default_label_narrow_panels(), nullptr ) ); ret.emplace( "labels", panel_layout( to_translation( "labels" ), - initialize_default_label_panels() ) ); + initialize_default_label_panels(), nullptr ) ); ret.emplace( "custom", panel_layout( to_translation( "custom" ), - initialize_default_custom_panels() ) ); + std::vector(), &initialize_default_custom_panels ) ); return ret; } @@ -3169,7 +3218,7 @@ void panel_manager::show_adm() ctxt.register_action( "MOVE_PANEL" ); ctxt.register_action( "TOGGLE_PANEL" ); - const std::vector column_widths = { 17, 37, 17 }; + const std::vector column_widths = { 25, 37, 17 }; size_t current_col = 0; size_t current_row = 0; @@ -3191,7 +3240,7 @@ void panel_manager::show_adm() const int popup_height = 24; ui_adaptor ui; ui.on_screen_resize( [&]( ui_adaptor & ui ) { - w = catacurses::newwin( popup_height, 75, + w = catacurses::newwin( popup_height, 83, point( ( TERMX / 2 ) - 38, ( TERMY / 2 ) - 10 ) ); ui.position_from_window( w ); diff --git a/src/panels.h b/src/panels.h index 806c299f515e5..ba80cf2ba6dc4 100644 --- a/src/panels.h +++ b/src/panels.h @@ -135,23 +135,27 @@ bool default_render(); class window_panel { public: - window_panel( const std::function &draw_func, + window_panel( const std::function + &draw_func, const std::string &id, const translation &nm, int ht, int wd, bool default_toggle_, const std::function &render_func = default_render, bool force_draw = false ); - std::function draw; + std::function draw; std::function render; int get_height() const; int get_width() const; const std::string &get_id() const; std::string get_name() const; + void set_widget( const widget *w ); + widget *get_widget() const; bool toggle; bool always_draw; private: int height; int width; + widget *wgt = nullptr; std::string id; translation name; }; @@ -162,14 +166,19 @@ class panel_layout { public: panel_layout( const translation &_name, - const std::vector &_panels ); + const std::vector &_panels, + std::vector( *_load_fn )() ); std::string name() const; const std::vector &panels() const; std::vector &panels(); + // Do deferred loading of panel layout with _load_fn, if defined (otherwise do nothing) + void deferred_load(); private: translation _name; std::vector _panels; + // Optional callback function to generate window_panel list with deferred load + std::vector( *_load_fn )(); }; // The panel_manager allows the player choose their current panel layout and window panels. @@ -213,6 +222,7 @@ class panel_manager std::string current_layout_id; std::map layouts; + friend widget; }; #endif // CATA_SRC_PANELS_H diff --git a/src/widget.cpp b/src/widget.cpp index 04495fa7f3d95..fa87c652d91e7 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -183,6 +183,15 @@ void widget::load( const JsonObject &jo, const std::string & ) } } +void widget::finalize() +{ + // If any layouts have been deferred for loading... + for( auto &l : panel_manager::get_manager().layouts ) { + l.second.deferred_load(); + } + panel_manager::get_manager().init(); +} + int widget::get_var_max( const avatar &ava ) { // Some vars (like HP) have an inherent maximum, used unless the widget overrides it @@ -329,6 +338,45 @@ std::string widget::show( const avatar &ava ) } } +// If this widget is not a layout, use its label for the window panel id and name +// FIXME: Support label for layout widgets too! +static void custom_draw_func( avatar &u, const catacurses::window &w, widget *wgt ) +{ + const int width = catacurses::getmaxx( w ); + const int widt = width - 1; // For margin + + if( wgt == nullptr || width <= 0 ) { + return; + } + + werase( w ); + if( wgt->_style == "layout" ) { + if( wgt->_arrange == "rows" ) { + // Layout widgets in rows + // FIXME: Be able to handle rows that are themselves more than one line! + // Could this be done in the layout() function somehow (by returning newlines?) + int row_num = 0; + for( const widget_id &row_wid : wgt->_widgets ) { + widget row_widget = row_wid.obj(); + trim_and_print( w, point( 1, row_num ), widt, c_light_gray, row_widget.layout( u, + widt ) ); + row_num++; + } + } else { + // Layout widgets in columns + // For now, this is the default when calling layout() + // So, just layout self + // NOLINTNEXTLINE(cata-use-named-point-constants) + trim_and_print( w, point( 1, 1 ), widt, c_light_gray, _( wgt->layout( u, widt ) ) ); + } + } else { + // Just layout self + // NOLINTNEXTLINE(cata-use-named-point-constants) + trim_and_print( w, point( 1, 1 ), widt, c_light_gray, _( wgt->layout( u, widt ) ) ); + } + wnoutrefresh( w ); +} + window_panel widget::get_window_panel( const int width, const int req_height ) { // Width is fixed, but height may vary depending on child widgets @@ -342,36 +390,9 @@ window_panel widget::get_window_panel( const int width, const int req_height ) // Minimap and log do not have a predetermined height // (or they should allow caller to customize height) - // If this widget is not a layout, use its label for the window panel id and name - // FIXME: Support label for layout widgets too! - auto draw_func = [this, width]( const avatar & u, const catacurses::window & w ) { - werase( w ); - if( _style == "layout" ) { - if( _arrange == "rows" ) { - // Layout widgets in rows - // FIXME: Be able to handle rows that are themselves more than one line! - // Could this be done in the layout() function somehow (by returning newlines?) - int row_num = 0; - for( const widget_id &row_wid : _widgets ) { - widget row_widget = row_wid.obj(); - trim_and_print( w, point( 1, row_num ), width - 1, c_light_gray, _( row_widget.layout( u, - width - 1 ) ) ); - row_num++; - } - } else { - // Layout widgets in columns - // For now, this is the default when calling layout() - // So, just layout self - trim_and_print( w, point( 1, 1 ), width - 1, c_light_gray, _( layout( u, width - 1 ) ) ); - } - } else { - // Just layout self - trim_and_print( w, point( 1, 1 ), width - 1, c_light_gray, _( layout( u, width - 1 ) ) ); - } - wnoutrefresh( w ); - }; - - return window_panel( draw_func, _label.translated(), _label, height, width, false ); + window_panel win( custom_draw_func, _label.translated(), _label, height, width, true ); + win.set_widget( &this->id.obj() ); + return win; } bool widget::uses_text_function() @@ -633,7 +654,7 @@ std::string widget::layout( const avatar &ava, const unsigned int max_width ) } // Allow 2 spaces of padding after each column, except last column (full-justified) if( wid != _widgets.back() ) { - ret += string_format( "%s ", cur_child.layout( ava, cur_width - 2 ) ); + ret += string_format( "%s ", cur_child.layout( ava, cur_width == 0 ? cur_width : cur_width - 2 ) ); } else { ret += string_format( "%s", cur_child.layout( ava, cur_width ) ); } diff --git a/src/widget.h b/src/widget.h index 8eacace9a059e..a4e1c0dde30cd 100644 --- a/src/widget.h +++ b/src/widget.h @@ -86,6 +86,7 @@ class widget { private: friend class generic_factory; + friend void custom_draw_fn( avatar &u, const catacurses::window &w, const widget &wgt ); widget_id id; bool was_loaded = false; @@ -126,6 +127,8 @@ class widget // Load JSON data for a widget (uses generic factory widget_factory) static void load_widget( const JsonObject &jo, const std::string &src ); void load( const JsonObject &jo, const std::string &src ); + // Finalize anything that must wait until all widgets are loaded + static void finalize(); // Reset to defaults using generic widget_factory static void reset(); From ed6c39702dd0fd0c1df83b48b1e9c6f479ab4484 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Sat, 25 Dec 2021 15:25:57 -0500 Subject: [PATCH 073/154] src: Consolidate drawing arguments, constify remaining args Co-author: David Seguin --- src/avatar.h | 4 + src/game.cpp | 7 +- src/panels.cpp | 317 ++++++++++++++++++++++++++++--------- src/panels.h | 30 +++- src/string_id_null_ids.cpp | 2 +- src/widget.cpp | 12 +- 6 files changed, 277 insertions(+), 95 deletions(-) diff --git a/src/avatar.h b/src/avatar.h index ce91fcf48f5ee..5a4973b7e7672 100644 --- a/src/avatar.h +++ b/src/avatar.h @@ -279,6 +279,10 @@ class avatar : public Character return mon_visible; } + const monster_visible_info &get_mon_visible() const { + return mon_visible; + } + struct daily_calories { int spent = 0; int gained = 0; diff --git a/src/game.cpp b/src/game.cpp index b94c570d6c1e9..e2285fc3b1ca6 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3146,7 +3146,6 @@ shared_ptr_fast game::create_or_get_main_ui_adaptor() { shared_ptr_fast ui = main_ui_adaptor.lock(); if( !ui ) { - panel_manager::get_manager().init(); main_ui_adaptor = ui = make_shared_fast(); ui->on_redraw( []( const ui_adaptor & ) { g->draw(); @@ -3383,9 +3382,9 @@ void game::draw_panels( bool force_draw ) h += spacer; if( panel.toggle && panel.render() && h > 0 ) { if( panel.always_draw || draw_this_turn ) { - widget *wgt = panel.get_widget(); - panel.draw( u, catacurses::newwin( h, panel.get_width(), - point( sidebar_right ? TERMX - panel.get_width() : 0, y ) ), wgt ); + catacurses::window w = catacurses::newwin( h, panel.get_width(), + point( sidebar_right ? TERMX - panel.get_width() : 0, y ) ); + panel.draw( { u, w, panel.get_widget() } ); } if( show_panel_adm ) { const std::string panel_name = panel.get_name(); diff --git a/src/panels.cpp b/src/panels.cpp index 8238df4fac602..ee618b45c5a72 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -83,15 +83,18 @@ static const string_id behavior__node_t_npc_needs( "npc_needs" static const trait_id trait_NOPAIN( "NOPAIN" ); +static const widget_id widget_root_layout( "root_layout" ); + // constructor window_panel::window_panel( - const std::function &draw_func, + const std::function &draw_func, const std::string &id, const translation &nm, const int ht, const int wd, const bool default_toggle_, const std::function &render_func, const bool force_draw ) : draw( draw_func ), render( render_func ), toggle( default_toggle_ ), always_draw( force_draw ), height( ht ), width( wd ), id( id ), name( nm ) { + wgt = widget_id::NULL_ID(); } // ==================================== @@ -232,19 +235,19 @@ std::string window_panel::get_name() const return name.translated(); } -void window_panel::set_widget( const widget *w ) +void window_panel::set_widget( const widget_id &w ) { - wgt = const_cast( w ); + wgt = w; } -widget *window_panel::get_widget() const +const widget_id &window_panel::get_widget() const { return wgt; } panel_layout::panel_layout( const translation &_name, const std::vector &_panels, - std::vector( *_load_fn )( void ) ) + std::vector( *_load_fn )() ) : _name( _name ), _panels( _panels ), _load_fn( _load_fn ) { } @@ -874,7 +877,7 @@ std::pair display::safe_mode_text_color( const bool class // panels code // =============================== -static void draw_limb_health( avatar &u, const catacurses::window &w, bodypart_id bp ) +static void draw_limb_health( const avatar &u, const catacurses::window &w, bodypart_id bp ) { const bool no_feeling = u.has_trait( trait_NOPAIN ); static auto print_symbol_num = []( const catacurses::window & w, int num, const std::string & sym, @@ -931,8 +934,11 @@ static void draw_limb_health( avatar &u, const catacurses::window &w, bodypart_i } } -static void draw_limb2( avatar &u, const catacurses::window &w, widget * ) +static void draw_limb2( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // print bodypart health int i = 0; @@ -1459,8 +1465,11 @@ std::pair display::rad_badge_text_color( const Character return std::make_pair( rad_text, rad_color ); } -static void draw_stats( avatar &u, const catacurses::window &w, widget * ) +static void draw_stats( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); nc_color stat_clr = display::str_text_color( u ).second; mvwprintz( w, point_zero, c_light_gray, _( "STR" ) ); @@ -1508,8 +1517,11 @@ std::pair display::move_mode_text_color( const Character return std::make_pair( mm_text, mm_color ); } -static void draw_stealth( avatar &u, const catacurses::window &w, widget * ) +static void draw_stealth( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); mvwprintz( w, point_zero, c_light_gray, _( "Speed" ) ); mvwprintz( w, point( 7, 0 ), value_color( u.get_speed() ), "%s", u.get_speed() ); @@ -1572,8 +1584,11 @@ static void draw_time_graphic( const catacurses::window &w ) wprintz( w, c_white, "]" ); } -static void draw_time( const avatar &u, const catacurses::window &w, widget * ) +static void draw_time( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // display date mvwprintz( w, point_zero, c_light_gray, calendar::name_season( season_of_year( calendar::turn ) ) ); @@ -1597,8 +1612,11 @@ static void draw_time( const avatar &u, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_needs_compact( const avatar &u, const catacurses::window &w, widget * ) +static void draw_needs_compact( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); auto hunger_pair = display::hunger_text_color( u ); @@ -1622,8 +1640,11 @@ static void draw_needs_compact( const avatar &u, const catacurses::window &w, wi wnoutrefresh( w ); } -static void draw_limb_narrow( avatar &u, const catacurses::window &w, widget * ) +static void draw_limb_narrow( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); int ny2 = 0; int i = 0; @@ -1667,8 +1688,11 @@ static void draw_limb_narrow( avatar &u, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_limb_wide( avatar &u, const catacurses::window &w, widget * ) +static void draw_limb_wide( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); int i = 0; for( const bodypart_id &bp : @@ -1686,8 +1710,11 @@ static void draw_limb_wide( avatar &u, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_char_narrow( avatar &u, const catacurses::window &w, widget * ) +static void draw_char_narrow( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); std::pair morale_pair = display::morale_face_color( u ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -1727,8 +1754,12 @@ static void draw_char_narrow( avatar &u, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_char_wide( avatar &u, const catacurses::window &w, widget * ) +static void draw_char_wide( const draw_args &args ) { + + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); std::pair morale_pair = display::morale_face_color( u ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -1763,8 +1794,11 @@ static void draw_char_wide( avatar &u, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_stat_narrow( avatar &u, const catacurses::window &w, widget * ) +static void draw_stat_narrow( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -1808,8 +1842,12 @@ static void draw_stat_narrow( avatar &u, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_stat_wide( avatar &u, const catacurses::window &w, widget * ) +static void draw_stat_wide( const draw_args &args ) { + + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); mvwprintz( w, point_east, c_light_gray, _( "Str :" ) ); @@ -1851,8 +1889,11 @@ static void draw_stat_wide( avatar &u, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_loc_labels( const avatar &u, const catacurses::window &w, bool minimap ) +static void draw_loc_labels( const draw_args &args, bool minimap ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // display location const oter_id &cur_ter = overmap_buffer.ter( u.global_omt_location() ); @@ -1889,23 +1930,26 @@ static void draw_loc_labels( const avatar &u, const catacurses::window &w, bool wnoutrefresh( w ); } -static void draw_loc_narrow( const avatar &u, const catacurses::window &w, widget * ) +static void draw_loc_narrow( const draw_args &args ) { - draw_loc_labels( u, w, false ); + draw_loc_labels( args, false ); } -static void draw_loc_wide( const avatar &u, const catacurses::window &w, widget * ) +static void draw_loc_wide( const draw_args &args ) { - draw_loc_labels( u, w, false ); + draw_loc_labels( args, false ); } -static void draw_loc_wide_map( const avatar &u, const catacurses::window &w, widget * ) +static void draw_loc_wide_map( const draw_args &args ) { - draw_loc_labels( u, w, true ); + draw_loc_labels( args, true ); } -static void draw_moon_narrow( const avatar &u, const catacurses::window &w, widget * ) +static void draw_moon_narrow( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Moon : %s" ), display::get_moon() ); @@ -1914,8 +1958,11 @@ static void draw_moon_narrow( const avatar &u, const catacurses::window &w, widg wnoutrefresh( w ); } -static void draw_moon_wide( const avatar &u, const catacurses::window &w, widget * ) +static void draw_moon_wide( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Moon : %s" ), display::get_moon() ); @@ -1923,8 +1970,11 @@ static void draw_moon_wide( const avatar &u, const catacurses::window &w, widget wnoutrefresh( w ); } -static void draw_weapon_labels( const avatar &u, const catacurses::window &w, widget * ) +static void draw_weapon_labels( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Wield:" ) ); @@ -1935,8 +1985,11 @@ static void draw_weapon_labels( const avatar &u, const catacurses::window &w, wi wnoutrefresh( w ); } -static void draw_needs_narrow( const avatar &u, const catacurses::window &w, widget * ) +static void draw_needs_narrow( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); std::pair hunger_pair = display::hunger_text_color( u ); std::pair thirst_pair = display::thirst_text_color( u ); @@ -1958,8 +2011,11 @@ static void draw_needs_narrow( const avatar &u, const catacurses::window &w, wid wnoutrefresh( w ); } -static void draw_needs_labels( const avatar &u, const catacurses::window &w, widget * ) +static void draw_needs_labels( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); std::pair hunger_pair = display::hunger_text_color( u ); std::pair thirst_pair = display::thirst_text_color( u ); @@ -1985,8 +2041,11 @@ static void draw_needs_labels( const avatar &u, const catacurses::window &w, wid wnoutrefresh( w ); } -static void draw_needs_labels_alt( const avatar &u, const catacurses::window &w, widget * ) +static void draw_needs_labels_alt( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); std::pair hunger_pair = display::hunger_text_color( u ); std::pair thirst_pair = display::thirst_text_color( u ); @@ -2010,8 +2069,11 @@ static void draw_needs_labels_alt( const avatar &u, const catacurses::window &w, wnoutrefresh( w ); } -static void draw_sound_labels( const avatar &u, const catacurses::window &w, widget * ) +static void draw_sound_labels( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Sound:" ) ); @@ -2023,8 +2085,11 @@ static void draw_sound_labels( const avatar &u, const catacurses::window &w, wid wnoutrefresh( w ); } -static void draw_sound_narrow( const avatar &u, const catacurses::window &w, widget * ) +static void draw_sound_narrow( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Sound:" ) ); @@ -2036,8 +2101,11 @@ static void draw_sound_narrow( const avatar &u, const catacurses::window &w, wid wnoutrefresh( w ); } -static void draw_env_compact( avatar &u, const catacurses::window &w, widget * ) +static void draw_env_compact( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // Minimap to the left of text labels @@ -2096,8 +2164,11 @@ std::pair display::wind_text_color( const Character &u ) return std::make_pair( wind_text, get_wind_color( windpower ) ); } -static void render_wind( avatar &u, const catacurses::window &w, const std::string &formatstr ) +static void render_wind( const draw_args &args, const std::string &formatstr ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); mvwprintz( w, point_zero, c_light_gray, //~ translation should not exceed 5 console cells @@ -2108,18 +2179,21 @@ static void render_wind( avatar &u, const catacurses::window &w, const std::stri wnoutrefresh( w ); } -static void draw_wind( avatar &u, const catacurses::window &w, widget * ) +static void draw_wind( const draw_args &args ) { - render_wind( u, w, "%s: " ); + render_wind( args, "%s: " ); } -static void draw_wind_padding( avatar &u, const catacurses::window &w, widget * ) +static void draw_wind_padding( const draw_args &args ) { - render_wind( u, w, " %s: " ); + render_wind( args, " %s: " ); } -static void draw_health_classic( avatar &u, const catacurses::window &w, widget * ) +static void draw_health_classic( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + vehicle *veh = g->remoteveh(); if( veh == nullptr && u.in_vehicle ) { veh = veh_pointer_or_null( get_map().veh_at( u.pos() ) ); @@ -2214,8 +2288,11 @@ static void draw_health_classic( avatar &u, const catacurses::window &w, widget wnoutrefresh( w ); } -static void draw_armor_padding( const avatar &u, const catacurses::window &w, widget * ) +static void draw_armor_padding( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); nc_color color = c_light_gray; // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -2241,8 +2318,11 @@ static void draw_armor_padding( const avatar &u, const catacurses::window &w, wi wnoutrefresh( w ); } -static void draw_armor( const avatar &u, const catacurses::window &w, widget * ) +static void draw_armor( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); nc_color color = c_light_gray; mvwprintz( w, point_zero, color, _( "Head :" ) ); @@ -2267,8 +2347,10 @@ static void draw_armor( const avatar &u, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_messages( avatar &, const catacurses::window &w, widget * ) +static void draw_messages( const draw_args &args ) { + const catacurses::window &w = args._win; + werase( w ); int line = getmaxy( w ) - 2; int maxlength = getmaxx( w ); @@ -2276,8 +2358,10 @@ static void draw_messages( avatar &, const catacurses::window &w, widget * ) wnoutrefresh( w ); } -static void draw_messages_classic( avatar &, const catacurses::window &w, widget * ) +static void draw_messages_classic( const draw_args &args ) { + const catacurses::window &w = args._win; + werase( w ); int line = getmaxy( w ) - 2; int maxlength = getmaxx( w ); @@ -2286,8 +2370,10 @@ static void draw_messages_classic( avatar &, const catacurses::window &w, widget } #if defined(TILES) -static void draw_mminimap( avatar &, const catacurses::window &w, widget * ) +static void draw_mminimap( const draw_args &args ) { + const catacurses::window &w = args._win; + werase( w ); g->draw_pixel_minimap( w ); wnoutrefresh( w ); @@ -2295,7 +2381,7 @@ static void draw_mminimap( avatar &, const catacurses::window &w, widget * ) #endif // Print monster info to the given window -void display::print_mon_info( avatar &u, const catacurses::window &w, int hor_padding, +void display::print_mon_info( const avatar &u, const catacurses::window &w, int hor_padding, bool compact ) { const monster_visible_info &mon_visible = u.get_mon_visible(); @@ -2454,36 +2540,51 @@ void display::print_mon_info( avatar &u, const catacurses::window &w, int hor_pa } } -static void draw_compass( avatar &u, const catacurses::window &w, widget * ) +static void draw_compass( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); display::print_mon_info( u, w ); wnoutrefresh( w ); } -static void draw_compass_compact( avatar &u, const catacurses::window &w, widget * ) +static void draw_compass_compact( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); display::print_mon_info( u, w, 0, true ); wnoutrefresh( w ); } -static void draw_compass_padding( avatar &u, const catacurses::window &w, widget * ) +static void draw_compass_padding( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); display::print_mon_info( u, w, 1 ); wnoutrefresh( w ); } -static void draw_compass_padding_compact( avatar &u, const catacurses::window &w, widget * ) +static void draw_compass_padding_compact( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); display::print_mon_info( u, w, 1, true ); wnoutrefresh( w ); } -static void draw_overmap_narrow( avatar &u, const catacurses::window &w, widget * ) +static void draw_overmap_narrow( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); const tripoint_abs_omt curs = u.global_omt_location(); draw_rectangle( w, c_light_gray, point_zero, point( 31, 13 ) ); @@ -2492,8 +2593,11 @@ static void draw_overmap_narrow( avatar &u, const catacurses::window &w, widget wnoutrefresh( w ); } -static void draw_overmap_wide( avatar &u, const catacurses::window &w, widget * ) +static void draw_overmap_wide( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); const tripoint_abs_omt curs = u.global_omt_location(); draw_rectangle( w, c_light_gray, point_zero, point( 43, 19 ) ); @@ -2503,9 +2607,12 @@ static void draw_overmap_wide( avatar &u, const catacurses::window &w, widget * } // Custom moddable sidebar -static void draw_mod_sidebar( avatar &u, const catacurses::window &w, const std::string layout_name, +static void draw_mod_sidebar( const draw_args &args, const std::string layout_name, const int width ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // Render each row of the root layout widget @@ -2521,18 +2628,21 @@ static void draw_mod_sidebar( avatar &u, const catacurses::window &w, const std: wnoutrefresh( w ); } -static void draw_mod_sidebar_narrow( avatar &u, const catacurses::window &w, widget * ) +static void draw_mod_sidebar_narrow( const draw_args &args ) { - draw_mod_sidebar( u, w, "root_layout_narrow", 31 ); + draw_mod_sidebar( args, "root_layout_narrow", 31 ); } -static void draw_mod_sidebar_wide( avatar &u, const catacurses::window &w, widget * ) +static void draw_mod_sidebar_wide( const draw_args &args ) { - draw_mod_sidebar( u, w, "root_layout_wide", 43 ); + draw_mod_sidebar( args, "root_layout_wide", 43 ); } -static void draw_veh_compact( const avatar &u, const catacurses::window &w, widget * ) +static void draw_veh_compact( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // vehicle display @@ -2549,8 +2659,11 @@ static void draw_veh_compact( const avatar &u, const catacurses::window &w, widg wnoutrefresh( w ); } -static void draw_veh_padding( const avatar &u, const catacurses::window &w, widget * ) +static void draw_veh_padding( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // vehicle display @@ -2567,8 +2680,11 @@ static void draw_veh_padding( const avatar &u, const catacurses::window &w, widg wnoutrefresh( w ); } -static void draw_ai_goal( const avatar &u, const catacurses::window &w, widget * ) +static void draw_ai_goal( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); behavior::tree needs; needs.add( &behavior__node_t_npc_needs.obj() ); @@ -2579,8 +2695,11 @@ static void draw_ai_goal( const avatar &u, const catacurses::window &w, widget * wnoutrefresh( w ); } -static void draw_location_classic( const avatar &u, const catacurses::window &w, widget * ) +static void draw_location_classic( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); mvwprintz( w, point_zero, c_light_gray, _( "Location:" ) ); @@ -2590,8 +2709,10 @@ static void draw_location_classic( const avatar &u, const catacurses::window &w, wnoutrefresh( w ); } -static void draw_weather_classic( avatar &, const catacurses::window &w, widget * ) +static void draw_weather_classic( const draw_args &args ) { + const catacurses::window &w = args._win; + werase( w ); if( get_map().get_abs_sub().z < 0 ) { @@ -2608,8 +2729,11 @@ static void draw_weather_classic( avatar &, const catacurses::window &w, widget wnoutrefresh( w ); } -static void draw_lighting_classic( const avatar &u, const catacurses::window &w, widget * ) +static void draw_lighting_classic( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); const std::pair ll = get_light_level( @@ -2627,8 +2751,11 @@ static void draw_lighting_classic( const avatar &u, const catacurses::window &w, wnoutrefresh( w ); } -static void draw_weapon_classic( const avatar &u, const catacurses::window &w, widget * ) +static void draw_weapon_classic( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); mvwprintz( w, point_zero, c_light_gray, _( "Weapon :" ) ); @@ -2645,8 +2772,11 @@ static void draw_weapon_classic( const avatar &u, const catacurses::window &w, w wnoutrefresh( w ); } -static void draw_time_classic( const avatar &u, const catacurses::window &w, widget * ) +static void draw_time_classic( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); // display date @@ -2671,8 +2801,10 @@ static void draw_time_classic( const avatar &u, const catacurses::window &w, wid wnoutrefresh( w ); } -static void draw_hint( const avatar &, const catacurses::window &w, widget * ) +static void draw_hint( const draw_args &args ) { + const catacurses::window &w = args._win; + werase( w ); std::string press = press_x( ACTION_TOGGLE_PANEL_ADM ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -2711,29 +2843,41 @@ static void draw_weariness_partial( const avatar &u, const catacurses::window &w wnoutrefresh( w ); } -static void draw_weariness( const avatar &u, const catacurses::window &w, widget * ) +static void draw_weariness( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); draw_weariness_partial( u, w, point_zero, false ); wnoutrefresh( w ); } -static void draw_weariness_narrow( const avatar &u, const catacurses::window &w, widget * ) +static void draw_weariness_narrow( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); draw_weariness_partial( u, w, point_east, false ); wnoutrefresh( w ); } -static void draw_weariness_wide( const avatar &u, const catacurses::window &w, widget * ) +static void draw_weariness_wide( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); draw_weariness_partial( u, w, point_east, true ); wnoutrefresh( w ); } -static void draw_weariness_classic( const avatar &u, const catacurses::window &w, widget * ) +static void draw_weariness_classic( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + werase( w ); std::pair weary = display::weariness_text_color( u ); @@ -2776,24 +2920,36 @@ static void print_mana( const Character &you, const catacurses::window &w, wnoutrefresh( w ); } -static void draw_mana_classic( const Character &you, const catacurses::window &w, widget * ) +static void draw_mana_classic( const draw_args &args ) { - print_mana( you, w, "%s: %s %s: %s", -8, -5, 20, -5 ); + const avatar &u = args._ava; + const catacurses::window &w = args._win; + + print_mana( u, w, "%s: %s %s: %s", -8, -5, 20, -5 ); } -static void draw_mana_compact( const Character &you, const catacurses::window &w, widget * ) +static void draw_mana_compact( const draw_args &args ) { - print_mana( you, w, "%s %s %s %s", 4, -5, 12, -5 ); + const avatar &u = args._ava; + const catacurses::window &w = args._win; + + print_mana( u, w, "%s %s %s %s", 4, -5, 12, -5 ); } -static void draw_mana_narrow( const Character &you, const catacurses::window &w, widget * ) +static void draw_mana_narrow( const draw_args &args ) { - print_mana( you, w, " %s: %s %s : %s", -5, -5, 9, -5 ); + const avatar &u = args._ava; + const catacurses::window &w = args._win; + + print_mana( u, w, " %s: %s %s : %s", -5, -5, 9, -5 ); } -static void draw_mana_wide( const Character &you, const catacurses::window &w, widget * ) +static void draw_mana_wide( const draw_args &args ) { - print_mana( you, w, " %s: %s %s : %s", -5, -5, 13, -5 ); + const avatar &u = args._ava; + const catacurses::window &w = args._win; + + print_mana( u, w, " %s: %s %s : %s", -5, -5, 13, -5 ); } // ============ @@ -3010,11 +3166,14 @@ static std::vector initialize_default_label_panels() } // Message on how to use the custom sidebar panel and edit its JSON -static void draw_custom_hint( const avatar &, const catacurses::window &w, widget * ) +static void draw_custom_hint( const draw_args &args ) { + const catacurses::window &w = args._win; + werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 0 ), c_white, _( "Custom moddable sidebar" ) ); + // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 1 ), c_light_gray, _( "Edit data/json/ui/sidebar.json to customize" ) ); mvwprintz( w, point( 1, 2 ), c_light_gray, @@ -3029,7 +3188,7 @@ static std::vector initialize_default_custom_panels() std::vector ret; // Get the root layout widget - widget root = widget_id( "root_layout" ).obj(); + widget root = widget_root_layout.obj(); // Use its defined width, or at least 32 const int width = std::max( root._width, 32 ); diff --git a/src/panels.h b/src/panels.h index ba80cf2ba6dc4..0d8a62102a877 100644 --- a/src/panels.h +++ b/src/panels.h @@ -116,7 +116,7 @@ std::pair rad_badge_text_color( const Character &u ); std::string weight_string( const Character &u ); // Prints a list of nearby monsters -void print_mon_info( avatar &u, const catacurses::window &, int hor_padding = 0, +void print_mon_info( const avatar &u, const catacurses::window &, int hor_padding = 0, bool compact = false ); } // namespace display @@ -129,33 +129,49 @@ void draw_overmap_chunk( const catacurses::window &w_minimap, const avatar &you, bool default_render(); +// Arguments to pass into the static draw function (in window_panel::draw) +// Includes avatar, window, and widget references (._ava, ._win, ._wgt) +struct draw_args { + public: + const avatar &_ava; + const catacurses::window &_win; + + draw_args( const avatar &a, const catacurses::window &w, const widget_id &wgt ) : + _ava( a ), _win( w ), _wgt( wgt ) {} + + widget *get_widget() const { + return _wgt.is_null() ? nullptr : const_cast( &*_wgt ); + } + private: + widget_id _wgt; +}; + // A window_panel is a rectangular region or panel within the sidebar window. // It is associated with a draw function (taking avatar and window), along with id and name. // The height, width, and default toggle state must be provided to the constructor as well. class window_panel { public: - window_panel( const std::function - &draw_func, + window_panel( const std::function &draw_func, const std::string &id, const translation &nm, int ht, int wd, bool default_toggle_, const std::function &render_func = default_render, bool force_draw = false ); - std::function draw; + std::function draw; std::function render; int get_height() const; int get_width() const; const std::string &get_id() const; std::string get_name() const; - void set_widget( const widget *w ); - widget *get_widget() const; + void set_widget( const widget_id &w ); + const widget_id &get_widget() const; bool toggle; bool always_draw; private: int height; int width; - widget *wgt = nullptr; + widget_id wgt; std::string id; translation name; }; diff --git a/src/string_id_null_ids.cpp b/src/string_id_null_ids.cpp index 3c9486c521d9d..126a4a3b08d6a 100644 --- a/src/string_id_null_ids.cpp +++ b/src/string_id_null_ids.cpp @@ -21,7 +21,7 @@ MAKE_NULL_ID( harvest_list, "null" ) MAKE_NULL_ID( Item_spawn_data, "null" ) MAKE_NULL_ID( effect_type, "null" ) MAKE_NULL_ID( material_type, "null" ) - +MAKE_NULL_ID( widget, "null" ) MAKE_NULL_ID( monfaction, "" ) MAKE_NULL_ID( nested_mapgen, "null" ) MAKE_NULL_ID( overmap_land_use_code, "" ) diff --git a/src/widget.cpp b/src/widget.cpp index fa87c652d91e7..a4291fa043871 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -338,10 +338,14 @@ std::string widget::show( const avatar &ava ) } } -// If this widget is not a layout, use its label for the window panel id and name -// FIXME: Support label for layout widgets too! -static void custom_draw_func( avatar &u, const catacurses::window &w, widget *wgt ) +// Drawing function, provided as a callback to the window_panel constructor. +// Handles rendering a widget's content into a window panel. +static void custom_draw_func( const draw_args &args ) { + const avatar &u = args._ava; + const catacurses::window &w = args._win; + widget *wgt = args.get_widget(); + const int width = catacurses::getmaxx( w ); const int widt = width - 1; // For margin @@ -391,7 +395,7 @@ window_panel widget::get_window_panel( const int width, const int req_height ) // (or they should allow caller to customize height) window_panel win( custom_draw_func, _label.translated(), _label, height, width, true ); - win.set_widget( &this->id.obj() ); + win.set_widget( this->id ); return win; } From 13af89bb6c62195d89784b382aaebc59a50f732d Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Sun, 26 Dec 2021 10:53:37 -0700 Subject: [PATCH 074/154] src,data, Replace "root_layout" with generic "sidebar" widget Don't call panel_manager::load() until all other JSON (widgets in particular) have been loaded by load_world_modfiles() Define a new "sidebar" widget style, for use at the highest level of sidebar layout (representing the entire sidebar panel). Remove the _load_fn callback mechanism from panel_layout, since it is no longer needed. Define a widget::get_all() function to support finding "sidebar" widgets Update SIDEBAR_MOD.md src: Apply 1-character margin to left and right Handle when layout() is called with a non-root widget having "rows" --- data/json/ui/sidebar.json | 6 ++--- doc/SIDEBAR_MOD.md | 35 ++++++++++++++++++++++++---- src/game.cpp | 3 ++- src/panels.cpp | 49 ++++++++++++++++++--------------------- src/panels.h | 20 +++++++--------- src/widget.cpp | 36 +++++++++++++++++----------- src/widget.h | 5 ++++ 7 files changed, 94 insertions(+), 60 deletions(-) diff --git a/data/json/ui/sidebar.json b/data/json/ui/sidebar.json index a61c8cb598f9e..049d7b7f72889 100644 --- a/data/json/ui/sidebar.json +++ b/data/json/ui/sidebar.json @@ -807,11 +807,11 @@ ] }, { - "id": "root_layout", + "id": "custom_sidebar", "type": "widget", - "style": "layout", + "style": "sidebar", "width": 50, - "arrange": "rows", + "label": "custom", "widgets": [ "hitpoints_all_graphs_layout", "sound_fatigue_focus_layout", "stamina_speed_move_layout", "stats_layout" ] } ] diff --git a/doc/SIDEBAR_MOD.md b/doc/SIDEBAR_MOD.md index ae01a11401f27..2fa18e418e8a7 100644 --- a/doc/SIDEBAR_MOD.md +++ b/doc/SIDEBAR_MOD.md @@ -16,7 +16,16 @@ Some parts of the main CDDA sidebar are now moddable, meaning they are data-driven and can be customized simply by editing JSON files, without recompiling the game. -You can add the custom sidebar via the Sidebar Options menu `}` by enabling the "Custom" section. +You can add a custom sidebar section to your regular sidebar via the Sidebar Options menu `}` +by enabling the "Custom" section from the left-hand column for any of the regular sidebar layouts +(classic, labels, narrow etc.) + +You can also switch to an (almost) completely custom layout, by selecting "custom" from the +right-hand column. This layout is built directly from the "root_layout" widget, with rows you can +rearrange according to your preference; see [Root layouts](#root-layouts). + +In both cases, you can further customize your sidebar widgets by modifying (or modding) the JSON +that describes them. This document explains how they work. ## About widgets @@ -349,15 +358,32 @@ Sound: 8 Focus: 105 Move: 120 Str: 8 Dex: 9 Int: 7 Per: 11 ``` + ### Root layouts There are two important "root layout" widgets defined in `data/json/ui/sidebar.json`: -- Widget id "root_layout_wide" is used for "labels" and "classic" sidebars -- Widget id "root_layout_narrow" is used for "compact" and "labels narrow" sidebars +- Widget id "root_layout_wide" is used for "labels" and "classic" sidebar layouts +- Widget id "root_layout_narrow" is used for "compact" and "labels narrow" sidebar layouts Modify or override the root layout widget to define all sub-layouts or child widgets you want to see -in the custom section of your sidebar. +in the "Custom" section those legacy sidebar options. + +Or, modify the existing "sidebar" widget (or create your own) to fully customize your sidebar +experience, as described in the next section. + + +## Sidebar widget + +The highest-level widget style is "sidebar", which represents the entire display region on the right +(or left) edge of the screen. It is much like a "layout", but includes a "width" in characters, and +its list of "widgets" are not rows or columns, but a list of sections that may be rearranged or +toggled in-game to customize how they are displayed. + +Each "layout" in the "sidebar" corresponds to a `panel_layout` instance. + +To ensure minimum usability, the "width" this must be at least the width of the "compact" or "labels +narrow" sidebars, at 32 characters; any smaller value is rounded up to 32. ## Colors @@ -398,4 +424,3 @@ yellow, light red, and red. Such coloration could be represented with "colors" l } ``` - diff --git a/src/game.cpp b/src/game.cpp index e2285fc3b1ca6..830b074cc9250 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -676,8 +676,9 @@ void game::setup() load_core_data( ui ); } - load_world_modfiles( ui ); + // Panel manager needs JSON data to be loaded before init + panel_manager::get_manager().init(); m = map(); diff --git a/src/panels.cpp b/src/panels.cpp index ee618b45c5a72..ccf1eb0822a43 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -245,10 +245,8 @@ const widget_id &window_panel::get_widget() const return wgt; } -panel_layout::panel_layout( const translation &_name, - const std::vector &_panels, - std::vector( *_load_fn )() ) - : _name( _name ), _panels( _panels ), _load_fn( _load_fn ) +panel_layout::panel_layout( const translation &_name, const std::vector &_panels ) + : _name( _name ), _panels( _panels ) { } @@ -267,14 +265,6 @@ std::vector &panel_layout::panels() return _panels; } -void panel_layout::deferred_load() -{ - if( _load_fn == nullptr ) { - return; - } - _panels = ( *this->_load_fn )(); -} - void overmap_ui::draw_overmap_chunk( const catacurses::window &w_minimap, const avatar &you, const tripoint_abs_omt &global_omt, const point &start_input, const int width, const int height ) @@ -3183,24 +3173,23 @@ static void draw_custom_hint( const draw_args &args ) } // Initialize custom panels from the "root_layout" widget -static std::vector initialize_default_custom_panels() +static std::vector initialize_default_custom_panels( const widget &wgt ) { std::vector ret; - // Get the root layout widget - widget root = widget_root_layout.obj(); - // Use its defined width, or at least 32 - const int width = std::max( root._width, 32 ); + // Use defined width, or at least 16 + const int width = std::max( wgt._width, 16 ); // Show hint on configuration ret.emplace_back( window_panel( draw_custom_hint, "Hint", to_translation( "Hint" ), 3, width, true ) ); - // Add each widget from the root layout - for( const widget_id &row_wid : root._widgets ) { + // Add window panel for each child widget + for( const widget_id &row_wid : wgt._widgets ) { widget row_widget = row_wid.obj(); ret.emplace_back( row_widget.get_window_panel( width ) ); } + // Add message log and map to fill remaining space // TODO: Make these into proper widgets ret.emplace_back( window_panel( draw_messages, "Log", to_translation( "Log" ), @@ -3218,15 +3207,21 @@ static std::map initialize_default_panel_layouts() std::map ret; ret.emplace( "classic", panel_layout( to_translation( "classic" ), - initialize_default_classic_panels(), nullptr ) ); + initialize_default_classic_panels() ) ); ret.emplace( "compact", panel_layout( to_translation( "compact" ), - initialize_default_compact_panels(), nullptr ) ); + initialize_default_compact_panels() ) ); ret.emplace( "labels-narrow", panel_layout( to_translation( "labels narrow" ), - initialize_default_label_narrow_panels(), nullptr ) ); + initialize_default_label_narrow_panels() ) ); ret.emplace( "labels", panel_layout( to_translation( "labels" ), - initialize_default_label_panels(), nullptr ) ); - ret.emplace( "custom", panel_layout( to_translation( "custom" ), - std::vector(), &initialize_default_custom_panels ) ); + initialize_default_label_panels() ) ); + + // Add panel layout for each "sidebar" widget + for( const widget &wgt : widget::get_all() ) { + if( wgt._style == "sidebar" ) { + ret.emplace( wgt._label.translated(), + panel_layout( wgt._label, initialize_default_custom_panels( wgt ) ) ); + } + } return ret; } @@ -3234,7 +3229,8 @@ static std::map initialize_default_panel_layouts() panel_manager::panel_manager() { current_layout_id = "labels"; - layouts = initialize_default_panel_layouts(); + // Set empty layouts; these will be populated by load() + layouts = std::map(); } panel_layout &panel_manager::get_current_layout() @@ -3271,6 +3267,7 @@ int panel_manager::get_width_left() void panel_manager::init() { + layouts = initialize_default_panel_layouts(); load(); update_offsets( get_current_layout().panels().begin()->get_width() ); } diff --git a/src/panels.h b/src/panels.h index 0d8a62102a877..c7d8f6845d97d 100644 --- a/src/panels.h +++ b/src/panels.h @@ -12,6 +12,7 @@ #include "color.h" #include "coordinates.h" #include "translations.h" +#include "widget.h" class JsonIn; class JsonOut; @@ -130,7 +131,8 @@ void draw_overmap_chunk( const catacurses::window &w_minimap, const avatar &you, bool default_render(); // Arguments to pass into the static draw function (in window_panel::draw) -// Includes avatar, window, and widget references (._ava, ._win, ._wgt) +// Includes public avatar (_ava) and window (_win) references, and private widget reference +// passed to the constructor, accessible with get_widget(). struct draw_args { public: const avatar &_ava; @@ -146,8 +148,9 @@ struct draw_args { widget_id _wgt; }; -// A window_panel is a rectangular region or panel within the sidebar window. -// It is associated with a draw function (taking avatar and window), along with id and name. +// A window_panel is a rectangular region or drawable area within the sidebar window. +// It corresponds to a section that the player may toggle or rearrange from the in-game sidebar options. +// It is associated with a draw function (taking draw_args with avatar and window), along with id and name. // The height, width, and default toggle state must be provided to the constructor as well. class window_panel { @@ -182,24 +185,19 @@ class panel_layout { public: panel_layout( const translation &_name, - const std::vector &_panels, - std::vector( *_load_fn )() ); + const std::vector &_panels ); std::string name() const; const std::vector &panels() const; std::vector &panels(); - // Do deferred loading of panel layout with _load_fn, if defined (otherwise do nothing) - void deferred_load(); private: translation _name; std::vector _panels; - // Optional callback function to generate window_panel list with deferred load - std::vector( *_load_fn )(); }; // The panel_manager allows the player choose their current panel layout and window panels. -// The player's selected panel_layout, and which window_panels are toggled on or off, are -// saved to the PATH_INFO::panel_options() file, typically config/panel_options.json. +// The player's selected panel_layout, enabled window_panels and what order they appear in, +// are saved to the PATH_INFO::panel_options() file, typically config/panel_options.json. class panel_manager { public: diff --git a/src/widget.cpp b/src/widget.cpp index a4291fa043871..59020af08495c 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -36,6 +36,11 @@ void widget::reset() widget_factory.reset(); } +const std::vector &widget::get_all() +{ + return widget_factory.get_all(); +} + // Convert widget "var" enums to string equivalents namespace io { @@ -185,11 +190,7 @@ void widget::load( const JsonObject &jo, const std::string & ) void widget::finalize() { - // If any layouts have been deferred for loading... - for( auto &l : panel_manager::get_manager().layouts ) { - l.second.deferred_load(); - } - panel_manager::get_manager().init(); + // Nothing to do? } int widget::get_var_max( const avatar &ava ) @@ -346,15 +347,20 @@ static void custom_draw_func( const draw_args &args ) const catacurses::window &w = args._win; widget *wgt = args.get_widget(); + // Get full window width const int width = catacurses::getmaxx( w ); - const int widt = width - 1; // For margin + // Leave 1 character space for margin on left and right + const int margin = 1; + const int widt = width - 2 * margin; + // Quit if there is nothing to draw or no space to draw it if( wgt == nullptr || width <= 0 ) { return; } werase( w ); - if( wgt->_style == "layout" ) { + if( wgt->_style == "sidebar" ) { + } else if( wgt->_style == "layout" ) { if( wgt->_arrange == "rows" ) { // Layout widgets in rows // FIXME: Be able to handle rows that are themselves more than one line! @@ -362,21 +368,19 @@ static void custom_draw_func( const draw_args &args ) int row_num = 0; for( const widget_id &row_wid : wgt->_widgets ) { widget row_widget = row_wid.obj(); - trim_and_print( w, point( 1, row_num ), widt, c_light_gray, row_widget.layout( u, + trim_and_print( w, point( margin, row_num ), widt, c_light_gray, row_widget.layout( u, widt ) ); row_num++; } } else { // Layout widgets in columns // For now, this is the default when calling layout() - // So, just layout self - // NOLINTNEXTLINE(cata-use-named-point-constants) - trim_and_print( w, point( 1, 1 ), widt, c_light_gray, _( wgt->layout( u, widt ) ) ); + // So, just layout self on a single line + trim_and_print( w, point( margin, 0 ), widt, c_light_gray, _( wgt->layout( u, widt ) ) ); } } else { - // Just layout self - // NOLINTNEXTLINE(cata-use-named-point-constants) - trim_and_print( w, point( 1, 1 ), widt, c_light_gray, _( wgt->layout( u, widt ) ) ); + // No layout, just a widget - simply layout self on a single line + trim_and_print( w, point( margin, 0 ), widt, c_light_gray, _( wgt->layout( u, widt ) ) ); } wnoutrefresh( w ); } @@ -645,6 +649,10 @@ std::string widget::layout( const avatar &ava, const unsigned int max_width ) { std::string ret; if( _style == "layout" ) { + // Widgets with "rows" arrangement must be laid out from window_panel + if( _arrange == "rows" ) { + debugmsg( "widget layout called with rows" ); + } // Divide max_width equally among all widgets int child_width = max_width / _widgets.size(); int remainder = max_width % _widgets.size(); diff --git a/src/widget.h b/src/widget.h index a4e1c0dde30cd..5c8fe7f6fdb08 100644 --- a/src/widget.h +++ b/src/widget.h @@ -80,6 +80,9 @@ class JsonObject; template class generic_factory; +// Forward declaration, due to codependency on panels.h +class window_panel; + // A widget is a UI element displaying information from the underlying value of a widget_var. // It may be loaded from a JSON object having "type": "widget". class widget @@ -131,6 +134,8 @@ class widget static void finalize(); // Reset to defaults using generic widget_factory static void reset(); + // Get all widget instances from the factory + static const std::vector &get_all(); // Layout this widget within max_width, including child widgets. Calling layout on a regular // (non-layout style) widget is the same as show(), but will pad with spaces inside the From 29f2f5afbbd213f70db84c22b23929d0ceb580c7 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Thu, 30 Dec 2021 16:13:20 -0700 Subject: [PATCH 075/154] src/panels: Shorten hint message --- src/panels.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/panels.cpp b/src/panels.cpp index ccf1eb0822a43..e12d71520a731 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -3162,12 +3162,12 @@ static void draw_custom_hint( const draw_args &args ) werase( w ); // NOLINTNEXTLINE(cata-use-named-point-constants) - mvwprintz( w, point( 1, 0 ), c_white, _( "Custom moddable sidebar" ) ); + mvwprintz( w, point( 1, 0 ), c_white, _( "Custom sidebar" ) ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 1 ), c_light_gray, - _( "Edit data/json/ui/sidebar.json to customize" ) ); + _( "Edit sidebar.json to adjust." ) ); mvwprintz( w, point( 1, 2 ), c_light_gray, - _( "See doc/SIDEBAR_MOD.md for help" ) ); + _( "See SIDEBAR_MOD.md for help." ) ); wnoutrefresh( w ); } From a121cb1f5e3720a986238e4432037be8f88c1b91 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Mon, 27 Dec 2021 19:26:11 -0700 Subject: [PATCH 076/154] data: Add new custom narrow sidebar sidebar layout Chose 36 width to allow even divisibility when using both 2-column and 3-column layouts, after accounting for 2 characters of margin (1 on each end) and 2 characters of space between fields. --- data/json/ui/sidebar.json | 135 +++++++++++++++++++++++++++++++------- 1 file changed, 110 insertions(+), 25 deletions(-) diff --git a/data/json/ui/sidebar.json b/data/json/ui/sidebar.json index 049d7b7f72889..22c5837e4757c 100644 --- a/data/json/ui/sidebar.json +++ b/data/json/ui/sidebar.json @@ -299,7 +299,7 @@ { "id": "stamina_graph", "type": "widget", - "label": "Stam", + "label": "Stamina", "var": "stamina", "style": "graph", "width": 10, @@ -424,43 +424,43 @@ { "id": "hitpoint_graphs_top_layout", "type": "widget", - "label": "HP Top", "style": "layout", + "label": "HP Top", "arrange": "columns", "widgets": [ "hp_left_arm_graph", "hp_head_graph", "hp_right_arm_graph" ] }, { "id": "hitpoint_graphs_bottom_layout", "type": "widget", - "label": "HP Bottom", "style": "layout", + "label": "HP Bottom", "arrange": "columns", "widgets": [ "hp_left_leg_graph", "hp_torso_graph", "hp_right_leg_graph" ] }, { "id": "hitpoints_all_graphs_layout", "type": "widget", - "label": "Hit Points", "style": "layout", + "label": "Hit Points", "arrange": "rows", "widgets": [ "hitpoints_top_layout", "hitpoints_bottom_layout" ] }, { - "id": "hitpoints_head_torso", + "id": "hitpoints_head_torso_layout", "type": "widget", "style": "layout", "arrange": "columns", "widgets": [ "hp_head_graph", "hp_torso_graph" ] }, { - "id": "hitpoints_arms", + "id": "hitpoints_arms_layout", "type": "widget", "style": "layout", "arrange": "columns", "widgets": [ "hp_left_arm_graph", "hp_right_arm_graph" ] }, { - "id": "hitpoints_legs", + "id": "hitpoints_legs_layout", "type": "widget", "style": "layout", "arrange": "columns", @@ -482,6 +482,14 @@ "arrange": "columns", "widgets": [ "hp_left_leg_num", "hp_torso_num", "hp_right_leg_num" ] }, + { + "id": "hitpoints_all_narrow_graphs_layout", + "type": "widget", + "style": "layout", + "label": "Hit Points", + "arrange": "rows", + "widgets": [ "hitpoints_head_torso_layout", "hitpoints_arms_layout", "hitpoints_legs_layout" ] + }, { "id": "encumbrance_top_layout", "type": "widget", @@ -514,6 +522,7 @@ "id": "stamina_fatigue_layout", "type": "widget", "style": "layout", + "label": "Stamina/Fatigue", "arrange": "columns", "widgets": [ "stamina_graph", "fatigue_graph" ] }, @@ -531,54 +540,91 @@ "arrange": "columns", "widgets": [ "wetness_left_leg_num", "wetness_torso_num", "wetness_right_leg_num" ] }, + { + "id": "speed_focus_layout", + "type": "widget", + "style": "layout", + "label": "Speed/Focus", + "arrange": "columns", + "widgets": [ "speed_num", "focus_num" ] + }, + { + "id": "weapon_style_layout", + "type": "widget", + "style": "layout", + "label": "Weapon/Style", + "arrange": "rows", + "widgets": [ "wielding_desc", "style_desc" ] + }, + { + "id": "needs_desc_layout", + "type": "widget", + "style": "layout", + "label": "Needs", + "arrange": "rows", + "widgets": [ "hunger_desc", "thirst_desc", "fatigue_desc", "pain_desc", "body_temp_desc" ] + }, { "id": "stamina_speed_layout", "type": "widget", "style": "layout", + "label": "Stamina/Speed", "arrange": "columns", "widgets": [ "stamina_graph_classic", "speed_num" ] }, { - "id": "focus_move_layout", + "id": "stamina_activity_weary_layout", + "type": "widget", + "style": "layout", + "label": "Stamina/Weariness", + "arrange": "rows", + "widgets": [ "stamina_graph", "activity_desc", "weariness_desc", "weary_malus_desc" ] + }, + { + "id": "mood_focus_layout", "type": "widget", "style": "layout", + "label": "Mood/Focus", "arrange": "columns", - "widgets": [ "focus_num", "move_num" ] + "widgets": [ "mood_desc", "focus_num" ] }, { "id": "stamina_fatigue_focus_layout", "type": "widget", "style": "layout", + "label": "Stamina/Fatigue/Focus", "arrange": "columns", "widgets": [ "stamina_graph_classic", "fatigue_graph", "focus_num" ] }, { - "id": "speed_move_layout", + "id": "move_speed_layout", "type": "widget", "style": "layout", + "label": "Move/Speed", "arrange": "columns", - "widgets": [ "speed_num", "move_num" ] + "widgets": [ "move_num", "speed_num" ] }, { - "id": "sound_speed_move_layout", + "id": "safe_sound_layout", "type": "widget", "style": "layout", + "label": "Safe/Sound", "arrange": "columns", - "widgets": [ "sound_num", "speed_num", "move_num" ] + "widgets": [ "safe_mode_desc", "sound_num" ] }, { "id": "sound_fatigue_focus_layout", "type": "widget", - "label": "Sound Fatigue Focus", "style": "layout", + "label": "Sound/Fatigue/Focus", "arrange": "columns", "widgets": [ "sound_num", "fatigue_graph", "focus_num" ] }, { "id": "stamina_speed_move_layout", "type": "widget", - "label": "Stamina Speed Move", "style": "layout", + "label": "Stamina/Speed/Move", "arrange": "columns", "widgets": [ "stamina_graph_classic", "speed_num", "move_num" ] }, @@ -586,14 +632,15 @@ "id": "sound_focus_layout", "type": "widget", "style": "layout", + "label": "Sound/Focus", "arrange": "columns", "widgets": [ "sound_num", "focus_num" ] }, { "id": "stats_layout", "type": "widget", - "label": "Stats", "style": "layout", + "label": "Stats", "arrange": "columns", "widgets": [ "str_num", "dex_num", "int_num", "per_num" ] }, @@ -601,6 +648,7 @@ "id": "str_dex_layout", "type": "widget", "style": "layout", + "label": "Str/Dex", "arrange": "columns", "widgets": [ "str_num", "dex_num" ] }, @@ -608,9 +656,18 @@ "id": "int_per_layout", "type": "widget", "style": "layout", + "label": "Int/Per", "arrange": "columns", "widgets": [ "int_num", "per_num" ] }, + { + "id": "stats_narrow_layout", + "type": "widget", + "style": "layout", + "label": "Stats", + "arrange": "rows", + "widgets": [ "mood_focus_layout", "move_speed_layout", "str_dex_layout", "int_per_layout" ] + }, { "id": "activity_desc", "type": "widget", @@ -622,7 +679,7 @@ { "id": "body_temp_desc", "type": "widget", - "label": "Body Heat", + "label": "Heat", "style": "text", "var": "body_temp_text", "//": "Uses display::temp_text_color" @@ -753,7 +810,7 @@ { "id": "power_desc", "type": "widget", - "label": "Power", + "label": "Bionic Power", "style": "text", "var": "power_text" }, @@ -774,10 +831,26 @@ { "id": "safe_mode_desc", "type": "widget", - "label": "Safe Mode", + "label": "Safe", "style": "text", "var": "safe_mode_text" }, + { + "id": "light_moon_wind_temp_layout", + "type": "widget", + "label": "Environment", + "style": "layout", + "arrange": "rows", + "widgets": [ "lighting_desc", "moon_phase_desc", "wind_desc", "env_temp_desc" ] + }, + { + "id": "place_date_time_layout", + "type": "widget", + "label": "Place/Date/Time", + "style": "layout", + "arrange": "rows", + "widgets": [ "place_desc", "date_desc", "time_desc" ] + }, { "id": "root_layout_wide", "type": "widget", @@ -797,11 +870,13 @@ "style": "layout", "arrange": "rows", "widgets": [ - "hitpoints_head_torso", - "hitpoints_arms", - "hitpoints_legs", + "hitpoints_head_torso_layout", + "hitpoints_arms_layout", + "hitpoints_legs_layout", + "move_speed_layout", + "safe_sound_layout", "stamina_speed_layout", - "focus_move_layout", + "mood_focus_layout", "str_dex_layout", "int_per_layout" ] @@ -810,8 +885,18 @@ "id": "custom_sidebar", "type": "widget", "style": "sidebar", - "width": 50, "label": "custom", - "widgets": [ "hitpoints_all_graphs_layout", "sound_fatigue_focus_layout", "stamina_speed_move_layout", "stats_layout" ] + "width": 36, + "widgets": [ + "hitpoints_all_narrow_graphs_layout", + "stats_narrow_layout", + "stamina_activity_weary_layout", + "needs_desc_layout", + "safe_sound_layout", + "power_desc", + "weapon_style_layout", + "place_date_time_layout", + "light_moon_wind_temp_layout" + ] } ] From 077f0766b4a0b35cead4396c1783de04506f4d8d Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Sun, 26 Dec 2021 10:55:12 -0700 Subject: [PATCH 077/154] src,tests: Fix column width distribution The widget::layout function was allotting too much to the last column. Fix the math to pre-calculate spacing between columns to distribute space more equitably, and add test cases to test different widths. --- data/mods/TEST_DATA/widgets.json | 22 ++++++ src/widget.cpp | 23 ++++-- tests/widget_test.cpp | 124 ++++++++++++++++++++++++++++--- 3 files changed, 152 insertions(+), 17 deletions(-) diff --git a/data/mods/TEST_DATA/widgets.json b/data/mods/TEST_DATA/widgets.json index 9092a8105f649..e10ed0e315ea9 100644 --- a/data/mods/TEST_DATA/widgets.json +++ b/data/mods/TEST_DATA/widgets.json @@ -198,8 +198,30 @@ "id": "test_stat_panel", "type": "widget", "style": "layout", + "arrange": "columns", "widgets": [ "test_str_num", "test_dex_num", "test_int_num", "test_per_num" ] }, + { + "id": "test_2_column_layout", + "type": "widget", + "style": "layout", + "arrange": "columns", + "widgets": [ "test_move_num", "test_speed_num" ] + }, + { + "id": "test_3_column_layout", + "type": "widget", + "style": "layout", + "arrange": "columns", + "widgets": [ "test_move_num", "test_speed_num", "test_focus_num" ] + }, + { + "id": "test_4_column_layout", + "type": "widget", + "style": "layout", + "arrange": "columns", + "widgets": [ "test_move_num", "test_speed_num", "test_focus_num", "test_mana_num" ] + }, { "id": "test_text_widget", "type": "widget", diff --git a/src/widget.cpp b/src/widget.cpp index 59020af08495c..ddef3a1be28bc 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -653,9 +653,18 @@ std::string widget::layout( const avatar &ava, const unsigned int max_width ) if( _arrange == "rows" ) { debugmsg( "widget layout called with rows" ); } - // Divide max_width equally among all widgets - int child_width = max_width / _widgets.size(); - int remainder = max_width % _widgets.size(); + const int num_widgets = _widgets.size(); + if( num_widgets == 0 ) { + debugmsg( "widget layout has no widgets" ); + } + // Number of spaces between columns + const int col_padding = 2; + // Subtract column padding to get space available for widgets + const int avail_width = max_width - col_padding * ( num_widgets - 1 ); + // Divide available width equally among all widgets + const int child_width = avail_width / num_widgets; + // Keep remainder to distribute + int remainder = avail_width % num_widgets; for( const widget_id &wid : _widgets ) { widget cur_child = wid.obj(); int cur_width = child_width; @@ -664,11 +673,11 @@ std::string widget::layout( const avatar &ava, const unsigned int max_width ) cur_width += 1; remainder -= 1; } - // Allow 2 spaces of padding after each column, except last column (full-justified) + // Layout child in this column + ret += string_format( "%s", cur_child.layout( ava, cur_width ) ); + // Add column padding until we reach the last column if( wid != _widgets.back() ) { - ret += string_format( "%s ", cur_child.layout( ava, cur_width == 0 ? cur_width : cur_width - 2 ) ); - } else { - ret += string_format( "%s", cur_child.layout( ava, cur_width ) ); + ret += std::string( col_padding, ' ' ); } } } else { diff --git a/tests/widget_test.cpp b/tests/widget_test.cpp index 2e15749826767..d5f9c676680f9 100644 --- a/tests/widget_test.cpp +++ b/tests/widget_test.cpp @@ -7,6 +7,9 @@ static const itype_id itype_rad_badge( "rad_badge" ); // test widgets defined in data/json/sidebar.json and data/mods/TEST_DATA/widgets.json +static const widget_id widget_test_2_column_layout( "test_2_column_layout" ); +static const widget_id widget_test_3_column_layout( "test_3_column_layout" ); +static const widget_id widget_test_4_column_layout( "test_4_column_layout" ); static const widget_id widget_test_bp_wetness_head_num( "test_bp_wetness_head_num" ); static const widget_id widget_test_bp_wetness_torso_num( "test_bp_wetness_torso_num" ); static const widget_id widget_test_bucket_graph( "test_bucket_graph" ); @@ -30,6 +33,7 @@ static const widget_id widget_test_stamina_num( "test_stamina_num" ); static const widget_id widget_test_stat_panel( "test_stat_panel" ); static const widget_id widget_test_str_num( "test_str_num" ); static const widget_id widget_test_text_widget( "test_text_widget" ); +static const widget_id widget_test_three_widget_layout( "test_three_widget_layout" ); static const widget_id widget_test_weariness_num( "test_weariness_num" ); TEST_CASE( "widget value strings", "[widget][value][string]" ) @@ -393,20 +397,120 @@ TEST_CASE( "radiation badge widget", "[widget][radiation]" ) CHECK( rads_w.layout( ava ) == "RADIATION: black " ); } -TEST_CASE( "layout widgets", "[widget][layout]" ) +// Widgets with "layout" style can combine other widgets in columns or rows. +// +// Using "arrange": "columns", width is divided as equally as possible among widgets. +// With C columns, (C-1)*2 characters are allotted for space between columns (__): +// +// C=2: FIRST__SECOND +// C=3: FIRST__SECOND__THIRD +// C=4: FIRST__SECOND__THIRD__FOURTH +// +// So total width available to each column is: +// +// (W - (C-1)*2) / C +// +// At 24 width, 2 columns, each column gets (24 - (2-1)*2) / 2 == 11 characters. +// At 36 width, 2 columns, each column gets (36 - (2-1)*2) / 2 == 17 characters. +// At 36 width, 3 columns, each column gets (36 - (3-1)*2) / 3 == 10 characters. +// +// This test case calls layout() at different widths for 2-, 3-, and 4-column layouts, +// to verify and demonstrate how the space is distributed among widgets in columns. +// +TEST_CASE( "layout widgets in columns", "[widget][layout][columns]" ) { - widget stats_w = widget_test_stat_panel.obj(); + widget stat_w = widget_test_stat_panel.obj(); + widget two_w = widget_test_2_column_layout.obj(); + widget three_w = widget_test_3_column_layout.obj(); + widget four_w = widget_test_4_column_layout.obj(); avatar &ava = get_avatar(); clear_avatar(); - CHECK( stats_w.layout( ava, 32 ) == - string_format( "STR: 8 DEX: 8 INT: 8 PER: 8" ) ); - CHECK( stats_w.layout( ava, 38 ) == - string_format( "STR: 8 DEX: 8 INT: 8 PER: 8" ) ); - CHECK( stats_w.layout( ava, 40 ) == - string_format( "STR: 8 DEX: 8 INT: 8 PER: 8" ) ); - CHECK( stats_w.layout( ava, 42 ) == - string_format( "STR: 8 DEX: 8 INT: 8 PER: 8" ) ); + ava.str_max = 8; + ava.dex_max = 8; + ava.int_max = 8; + ava.per_max = 8; + ava.movecounter = 50; + ava.set_focus( 120 ); + ava.set_speed_base( 100 ); + ava.magic->set_mana( 1000 ); + + // Two columns + // string ruler: 123456789012345678901234567890123456 + CHECK( two_w.layout( ava, 24 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 25 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 26 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 27 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 28 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 29 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 30 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 31 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 32 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 33 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 34 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 35 ) == "MOVE: 50 SPEED: 100" ); + CHECK( two_w.layout( ava, 36 ) == "MOVE: 50 SPEED: 100" ); + // string ruler: 123456789012345678901234567890123456 + + // Three columns + // string ruler: 1234567890123456789012345678901234567890 + CHECK( three_w.layout( ava, 36 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 37 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 38 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 39 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 40 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 41 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 42 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 43 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 44 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 45 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + CHECK( three_w.layout( ava, 46 ) == "MOVE: 50 SPEED: 100 FOCUS: 120" ); + // string ruler: 1234567890123456789012345678901234567890123456 + + // Four columns + // string ruler: 123456789012345678901234567890123456789012 + CHECK( stat_w.layout( ava, 32 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 33 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 34 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 35 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 36 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 37 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 38 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 39 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 40 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 41 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 42 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 43 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 44 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 45 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( stat_w.layout( ava, 46 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + // string ruler: 1234567890123456789012345678901234567890123456 + + // Column alignment + // Layout keeps labels vertically aligned for layouts with the same number of widgets + // string ruler: 123456789012345678901234567890123456789012345678 + CHECK( stat_w.layout( ava, 48 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( four_w.layout( ava, 48 ) == "MOVE: 50 SPEED: 100 FOCUS: 120 MANA: 1000" ); + + // string ruler: 1234567890123456789012345678901234567890123456789012 + CHECK( stat_w.layout( ava, 52 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( four_w.layout( ava, 52 ) == "MOVE: 50 SPEED: 100 FOCUS: 120 MANA: 1000" ); + + // string ruler: 12345678901234567890123456789012345678901234567890123456 + CHECK( stat_w.layout( ava, 56 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( four_w.layout( ava, 56 ) == "MOVE: 50 SPEED: 100 FOCUS: 120 MANA: 1000" ); + + // string ruler: 123456789012345678901234567890123456789012345678901234567890 + CHECK( stat_w.layout( ava, 60 ) == "STR: 8 DEX: 8 INT: 8 PER: 8" ); + CHECK( four_w.layout( ava, 60 ) == "MOVE: 50 SPEED: 100 FOCUS: 120 MANA: 1000" ); + + // TODO: Consider re-distributing space so values are closer to labels, like this: + // 48 width + // "STR: 8 DEX: 8 INT: 8 PER: 8 " + // "MOVE: 0 SPEED: 100 FOCUS: 100 MANA: 1000 " + // 60 width + // "STR: 8 DEX: 8 INT: 8 PER: 8 " + // "MOVE: 0 SPEED: 100 FOCUS: 100 MANA: 1000 " } From 758f7a43da59b8372d6e86fbddd87528dfce13c2 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Thu, 30 Dec 2021 17:22:40 -0700 Subject: [PATCH 078/154] src/panels: Revamp draw_overmap to use window size Also remove border (and now-unused draw_rectangle), and add compass and overmap to custom sidebar. --- src/panels.cpp | 53 ++++++++++++-------------------------------------- 1 file changed, 12 insertions(+), 41 deletions(-) diff --git a/src/panels.cpp b/src/panels.cpp index e12d71520a731..a8edccc41b229 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -109,26 +109,6 @@ static std::string trunc_ellipse( const std::string &input, unsigned int trunc ) return input; } -static void draw_rectangle( const catacurses::window &w, nc_color, point top_left, - point bottom_right ) -{ - // corners - mvwaddch( w, top_left, LINE_OXXO ); - mvwaddch( w, point( top_left.x, bottom_right.y ), LINE_XXOO ); - mvwaddch( w, point( bottom_right.x, top_left.y ), LINE_OOXX ); - mvwaddch( w, bottom_right, LINE_XOOX ); - - for( int i = 1; i < bottom_right.x; i++ ) { - mvwaddch( w, point( i, top_left.y ), LINE_OXOX ); - mvwaddch( w, point( i, bottom_right.y ), LINE_OXOX ); - } - - for( int i = 1; i < bottom_right.y; i++ ) { - mvwaddch( w, point( top_left.x, i ), LINE_XOXO ); - mvwaddch( w, point( bottom_right.x, i ), LINE_XOXO ); - } -} - std::pair display::str_text_color( const Character &p ) { nc_color clr; @@ -2570,29 +2550,15 @@ static void draw_compass_padding_compact( const draw_args &args ) wnoutrefresh( w ); } -static void draw_overmap_narrow( const draw_args &args ) -{ - const avatar &u = args._ava; - const catacurses::window &w = args._win; - - werase( w ); - const tripoint_abs_omt curs = u.global_omt_location(); - draw_rectangle( w, c_light_gray, point_zero, point( 31, 13 ) ); - // NOLINTNEXTLINE(cata-use-named-point-constants) - overmap_ui::draw_overmap_chunk( w, u, curs, point( 1, 1 ), 30, 12 ); - wnoutrefresh( w ); -} - -static void draw_overmap_wide( const draw_args &args ) +static void draw_overmap( const draw_args &args ) { const avatar &u = args._ava; const catacurses::window &w = args._win; werase( w ); const tripoint_abs_omt curs = u.global_omt_location(); - draw_rectangle( w, c_light_gray, point_zero, point( 43, 19 ) ); // NOLINTNEXTLINE(cata-use-named-point-constants) - overmap_ui::draw_overmap_chunk( w, u, curs, point( 1, 1 ), 42, 18 ); + overmap_ui::draw_overmap_chunk( w, u, curs, point_zero, getmaxx( w ) - 1, getmaxy( w ) - 1 ); wnoutrefresh( w ); } @@ -2985,7 +2951,7 @@ static std::vector initialize_default_classic_panels() ret.emplace_back( window_panel( draw_compass_padding_compact, "Alt Compass", to_translation( "Alt Compass" ), 5, 44, false ) ); - ret.emplace_back( window_panel( draw_overmap_wide, "Overmap", to_translation( "Overmap" ), + ret.emplace_back( window_panel( draw_overmap, "Overmap", to_translation( "Overmap" ), 20, 44, false ) ); ret.emplace_back( window_panel( draw_messages_classic, "Log", to_translation( "Log" ), -2, 44, true ) ); @@ -3031,7 +2997,7 @@ static std::vector initialize_default_compact_panels() ret.emplace_back( window_panel( draw_compass_compact, "Alt Compass", to_translation( "Alt Compass" ), 5, 32, true ) ); - ret.emplace_back( window_panel( draw_overmap_narrow, "Overmap", to_translation( "Overmap" ), + ret.emplace_back( window_panel( draw_overmap, "Overmap", to_translation( "Overmap" ), 14, 32, false ) ); ret.emplace_back( window_panel( draw_mod_sidebar_narrow, "Custom", to_translation( "Custom" ), 8, 32, false ) ); @@ -3084,7 +3050,7 @@ static std::vector initialize_default_label_narrow_panels() ret.emplace_back( window_panel( draw_compass_padding_compact, "Alt Compass", to_translation( "Alt Compass" ), 5, 32, false ) ); - ret.emplace_back( window_panel( draw_overmap_narrow, "Overmap", to_translation( "Overmap" ), + ret.emplace_back( window_panel( draw_overmap, "Overmap", to_translation( "Overmap" ), 14, 32, false ) ); ret.emplace_back( window_panel( draw_mod_sidebar_narrow, "Custom", to_translation( "Custom" ), 8, 32, false ) ); @@ -3141,7 +3107,7 @@ static std::vector initialize_default_label_panels() ret.emplace_back( window_panel( draw_compass_padding_compact, "Alt Compass", to_translation( "Alt Compass" ), 5, 44, false ) ); - ret.emplace_back( window_panel( draw_overmap_wide, "Overmap", to_translation( "Overmap" ), + ret.emplace_back( window_panel( draw_overmap, "Overmap", to_translation( "Overmap" ), 20, 44, false ) ); ret.emplace_back( window_panel( draw_mod_sidebar_wide, "Custom", to_translation( "Custom" ), 8, 44, false ) ); @@ -3190,7 +3156,7 @@ static std::vector initialize_default_custom_panels( const widget ret.emplace_back( row_widget.get_window_panel( width ) ); } - // Add message log and map to fill remaining space + // Add compass, message log, and map to fill remaining space // TODO: Make these into proper widgets ret.emplace_back( window_panel( draw_messages, "Log", to_translation( "Log" ), -2, width, true ) ); @@ -3198,6 +3164,11 @@ static std::vector initialize_default_custom_panels( const widget ret.emplace_back( window_panel( draw_mminimap, "Map", to_translation( "Map" ), -1, width, true, default_render, true ) ); #endif // TILES + ret.emplace_back( window_panel( draw_compass_padding_compact, "Compass", + to_translation( "Compass" ), + 5, width, true ) ); + ret.emplace_back( window_panel( draw_overmap, "Overmap", to_translation( "Overmap" ), + 7, width, false ) ); return ret; } From d29055bdc30cacc3916707c75f3451312e1d3c5f Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Thu, 30 Dec 2021 18:56:42 -0700 Subject: [PATCH 079/154] src,data: Remove Custom section from legacy sidebars This "Custom" section built from the "root_layout_wide" and "root_layout_narrow" widgets is obsolete, in favor of the new "sidebar" root widget. --- data/json/ui/sidebar.json | 30 ------------------------------ src/panels.cpp | 22 +--------------------- 2 files changed, 1 insertion(+), 51 deletions(-) diff --git a/data/json/ui/sidebar.json b/data/json/ui/sidebar.json index 22c5837e4757c..9ca8f2b8750a0 100644 --- a/data/json/ui/sidebar.json +++ b/data/json/ui/sidebar.json @@ -851,36 +851,6 @@ "arrange": "rows", "widgets": [ "place_desc", "date_desc", "time_desc" ] }, - { - "id": "root_layout_wide", - "type": "widget", - "style": "layout", - "arrange": "rows", - "widgets": [ - "hitpoint_graphs_top_layout", - "hitpoint_graphs_bottom_layout", - "sound_fatigue_focus_layout", - "stamina_speed_move_layout", - "stats_layout" - ] - }, - { - "id": "root_layout_narrow", - "type": "widget", - "style": "layout", - "arrange": "rows", - "widgets": [ - "hitpoints_head_torso_layout", - "hitpoints_arms_layout", - "hitpoints_legs_layout", - "move_speed_layout", - "safe_sound_layout", - "stamina_speed_layout", - "mood_focus_layout", - "str_dex_layout", - "int_per_layout" - ] - }, { "id": "custom_sidebar", "type": "widget", diff --git a/src/panels.cpp b/src/panels.cpp index a8edccc41b229..5fae48134902b 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -83,8 +83,6 @@ static const string_id behavior__node_t_npc_needs( "npc_needs" static const trait_id trait_NOPAIN( "NOPAIN" ); -static const widget_id widget_root_layout( "root_layout" ); - // constructor window_panel::window_panel( const std::function &draw_func, @@ -2584,16 +2582,6 @@ static void draw_mod_sidebar( const draw_args &args, const std::string layout_na wnoutrefresh( w ); } -static void draw_mod_sidebar_narrow( const draw_args &args ) -{ - draw_mod_sidebar( args, "root_layout_narrow", 31 ); -} - -static void draw_mod_sidebar_wide( const draw_args &args ) -{ - draw_mod_sidebar( args, "root_layout_wide", 43 ); -} - static void draw_veh_compact( const draw_args &args ) { const avatar &u = args._ava; @@ -2955,8 +2943,6 @@ static std::vector initialize_default_classic_panels() 20, 44, false ) ); ret.emplace_back( window_panel( draw_messages_classic, "Log", to_translation( "Log" ), -2, 44, true ) ); - ret.emplace_back( window_panel( draw_mod_sidebar_wide, "Custom", to_translation( "Custom" ), - 8, 44, false ) ); #if defined(TILES) ret.emplace_back( window_panel( draw_mminimap, "Map", to_translation( "Map" ), -1, 44, true, default_render, true ) ); @@ -2999,8 +2985,6 @@ static std::vector initialize_default_compact_panels() 5, 32, true ) ); ret.emplace_back( window_panel( draw_overmap, "Overmap", to_translation( "Overmap" ), 14, 32, false ) ); - ret.emplace_back( window_panel( draw_mod_sidebar_narrow, "Custom", to_translation( "Custom" ), - 8, 32, false ) ); #if defined(TILES) ret.emplace_back( window_panel( draw_mminimap, "Map", to_translation( "Map" ), -1, 32, true, default_render, true ) ); @@ -3052,8 +3036,6 @@ static std::vector initialize_default_label_narrow_panels() 5, 32, false ) ); ret.emplace_back( window_panel( draw_overmap, "Overmap", to_translation( "Overmap" ), 14, 32, false ) ); - ret.emplace_back( window_panel( draw_mod_sidebar_narrow, "Custom", to_translation( "Custom" ), - 8, 32, false ) ); #if defined(TILES) ret.emplace_back( window_panel( draw_mminimap, "Map", to_translation( "Map" ), -1, 32, true, default_render, true ) ); @@ -3109,8 +3091,6 @@ static std::vector initialize_default_label_panels() 5, 44, false ) ); ret.emplace_back( window_panel( draw_overmap, "Overmap", to_translation( "Overmap" ), 20, 44, false ) ); - ret.emplace_back( window_panel( draw_mod_sidebar_wide, "Custom", to_translation( "Custom" ), - 8, 44, false ) ); #if defined(TILES) ret.emplace_back( window_panel( draw_mminimap, "Map", to_translation( "Map" ), -1, 44, true, default_render, true ) ); @@ -3138,7 +3118,7 @@ static void draw_custom_hint( const draw_args &args ) wnoutrefresh( w ); } -// Initialize custom panels from the "root_layout" widget +// Initialize custom panels from a given "sidebar" style widget static std::vector initialize_default_custom_panels( const widget &wgt ) { std::vector ret; From 7ff4ce8d894f9b2c03a880dfa881423a9bf64fe5 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Thu, 30 Dec 2021 18:58:44 -0700 Subject: [PATCH 080/154] doc: Polish up and organize sidebar doc --- doc/SIDEBAR_MOD.md | 223 +++++++++++++++++++++++++-------------------- 1 file changed, 122 insertions(+), 101 deletions(-) diff --git a/doc/SIDEBAR_MOD.md b/doc/SIDEBAR_MOD.md index 2fa18e418e8a7..68849333ccaf8 100644 --- a/doc/SIDEBAR_MOD.md +++ b/doc/SIDEBAR_MOD.md @@ -1,15 +1,15 @@ # Sidebar Modification - [Overview](#overview) -- [About widgets](#about-widgets) -- [Widget variables](#widget-variables) -- [Number widget](#number-widget) -- [Graph widget](#graph-widget) - - [fill](#fill) - - [var_max](#var-max) -- [Layout widget](#layout-widget) - - [Root layouts](#root-layouts) - +- [Widgets](#widgets) +- [Sidebar widgets](#sidebar-widgets) +- [Layout widgets](#layout-widgets) +- [Variable widgets](#variable-widgets) + - [Number widget](#number-widget) + - [Graph widget](#graph-widget) + - [fill](#fill) + - [var_max](#var-max) + - [Colors](#colors) ## Overview @@ -20,19 +20,20 @@ You can add a custom sidebar section to your regular sidebar via the Sidebar Opt by enabling the "Custom" section from the left-hand column for any of the regular sidebar layouts (classic, labels, narrow etc.) -You can also switch to an (almost) completely custom layout, by selecting "custom" from the -right-hand column. This layout is built directly from the "root_layout" widget, with rows you can -rearrange according to your preference; see [Root layouts](#root-layouts). +You can also switch to an almost completely custom sidebar, by selecting "custom" from the +right-hand column of the sidebar options menu. This layout is built from the "custom_sidebar" widget +defined in `data/json/ui/sidebar.json`, with sections you can toggle or rearrange in-game according +to your preference. In both cases, you can further customize your sidebar widgets by modifying (or modding) the JSON that describes them. This document explains how they work. -## About widgets +## Widgets -Sidebar UI elements are defined in objects called widgets. A widget can display a variety of player -character attributes in numeric form, or as a bar graph of arbitrary width. A widget can also make a -layout of other widgets. +All "custom" sidebar UI elements are defined in objects called widgets. A widget can display a +variety of player character attributes in numeric form, or as a bar graph of arbitrary width. A +widget can also make a layout of other widgets. Widget instances are defined by JSON data, with the main game sidebar widgets and layouts being in `data/json/ui/sidebar.json`. You may customize yours by editing this file, or by loading a mod that @@ -52,21 +53,113 @@ For example, here is a widget to display the player character's "Focus" attribut All widgets must have a unique "id", and "type": "widget". -Widgets have the following "style" options: +Each widget has a "style" field that may be: -- `number`: Display value as a plain integer number +- `number`: Show value as a plain integer number - `graph`: Show a bar graph of the value with colored text characters - `text`: Show text from a `*_text` variable -- `layout`: Special style; this widget will be a layout container for other widgets +- `layout`: Layout container for arranging other widgets in rows or columns +- `sidebar`: Special top-level widget for defining custom sidebars + +Let's start at the top, with the "sidebar" widget, composed of several "layout" widgets. + + +## Sidebar widget + +The highest-level widget is the "sidebar", which represents the entire display region on the right +(or left) edge of the screen. It includes a "width" in characters, a "label" displayed in the +sidebar options menu, and a list of "widgets", shown as sections that may be rearranged or +toggled from the sidebar options menu. + +These sub-widgets are typically [layout widgets](#layout-widgets), with other widgets arranged +inside them, but they could also be plain [variable widgets](#variable-widgets), used for showing +character attributes or other information. + +Here is how a simple sidebar definition might look in JSON: + +```json +{ + "id": "my_sidebar", + "style": "sidebar", + "width": 40, + "widgets": [ + "sound_focus_move_layout", + "stats_layout" + ] +} +``` + +Each widget in the "sidebar" will be associated with a `panel_layout` instance in the code, which is +what allows them to be toggled and rearranged like the classic sidebar sections. + +You may define any number of "sidebar" widgets, each with their own width, label, and collection of +sub-widgets and layouts. -Non-layout widgets must define a "var" field, with the name of a predefined widget variable. +Sidebar widgets aside, there are two major types of widget: [variable widgets](#variable-widgets), +showing some piece of information (with a label); and [layout widgets](#layout-widgets), used for +arranging other widgets in rows or columns. +We will look at layout widgets first, since they are easier to explain. + + +## Layout widgets + +Use widgets with "style": "layout" to arrange child widgets in sidebar panels, giving widget ids in +the "widgets" list field. + +The arrangement of child widgets is defined by the "arrange" field, which may be "columns" (default) +to array widgets horizontally, or "rows" to arrange them vertically, one widget per row. Widgets in +the same row will have their horizontal space split as equally as possible. + +```json +[ + { + "id": "sound_focus_move_layout", + "type": "widget", + "style": "layout", + "arrange": "columns", + "widgets": [ "sound_num", "focus_num", "move_num" ] + }, + { + "id": "stats_layout", + "type": "widget", + "style": "layout", + "arrange": "columns", + "widgets": [ "str_num", "dex_num", "int_num", "per_num" ] + }, + { + "id": "sound_focus_move_stats_layout", + "type": "widget", + "style": "layout", + "arrange": "rows", + "widgets": [ + "sound_focus_move_layout", + "stats_layout" + ] + } +] +``` + +The above might yield: + +``` +Sound: 8 Focus: 105 Move: 120 +Str: 8 Dex: 9 Int: 7 Per: 11 +``` -## Widget variables +Where do all these numeric widgets and their values come from? These are variable widgets, discussed +next. -The "var" field of a widget tells what variable data gives the widget its value. Valid var names -are given by the `widget_var` enum defined in `widget.h`. In the widget's `show` method, these var -enums determine which avatar method(s) to get their values from. + +## Variable widgets + +Variable widgets define a "var" field, with the name of a predefined widget variable. This tells the +widget what information it should show. Most of the time, these are attributes of the player +character, but they can also be attributes of the world, environment, or vehicle where they are. + +The "var" field of a display widget tells what variable data gives the widget its value. Valid var +names are given by the `widget_var` enum defined in `widget.h`. In the widget's `show` method, these +var enums determine which avatar method(s) to get their values from. Below are a few examples of vars and what they mean. See the `widget_var` list in `widget.h` for the definitive list of vars. @@ -135,7 +228,7 @@ define a "var_max" as a cutoff point; see the "Graph widget" section for more. You may also define "var_min" if it's relevant. By default this is 0. -## Number widget +### Number widget The simplest and usually most compact widget for displaying a value, "style": "number" appears as a label with an integer number. @@ -156,7 +249,7 @@ Focus: 100 The numeric value comes from the given "var", displayed as a decimal integer. -## Graph widget +### Graph widget The graph shows an arrangement of symbols. It has two important parameters: @@ -240,7 +333,7 @@ The method is specified with the "fill" field. This example uses the default "bu there is also a "pool" method, described in the next section. -### fill +#### fill With "bucket" fill, positions are filled like a row of buckets, using all symbols in the first position before beginning to fill the next position. This is like the classic 5-bar HP meter. @@ -299,7 +392,7 @@ Result: The total number of possible graphs is the same in each case, so both have the same resolution. -### var_max +#### var_max Using "graph" style widgets, usually you should provide a "var_max" value (integer) with the maximum typical value of "var" that will ever be rendered. @@ -313,79 +406,7 @@ up to 100 or 200 (like focus). If a var usually varies within a range `[low, hig "var_max" greater than `high` to be sure the normal variance is captured in the graph's range. -## Layout widget - -Use widgets with "style": "layout" to arrange child widgets in sidebar panels, giving widget ids in -the "widgets" list field. - -The arrangement of child widgets is defined by the "arrange" field, which may be "columns" (default) -to array widgets horizontally, or "rows" to arrange them vertically, one widget per row. Widgets in -the same row will have their horizontal space split as equally as possible. - -```json -[ - { - "id": "sound_focus_move_layout", - "type": "widget", - "style": "layout", - "arrange": "columns", - "widgets": [ "sound_num", "focus_num", "move_num" ] - }, - { - "id": "stats_layout", - "type": "widget", - "style": "layout", - "arrange": "columns", - "widgets": [ "str_num", "dex_num", "int_num", "per_num" ] - }, - { - "id": "root_layout", - "type": "widget", - "style": "layout", - "arrange": "rows", - "widgets": [ - "sound_focus_move_layout", - "stats_layout" - ] - } -] -``` - -The above might yield: - -``` -Sound: 8 Focus: 105 Move: 120 -Str: 8 Dex: 9 Int: 7 Per: 11 -``` - - -### Root layouts - -There are two important "root layout" widgets defined in `data/json/ui/sidebar.json`: - -- Widget id "root_layout_wide" is used for "labels" and "classic" sidebar layouts -- Widget id "root_layout_narrow" is used for "compact" and "labels narrow" sidebar layouts - -Modify or override the root layout widget to define all sub-layouts or child widgets you want to see -in the "Custom" section those legacy sidebar options. - -Or, modify the existing "sidebar" widget (or create your own) to fully customize your sidebar -experience, as described in the next section. - - -## Sidebar widget - -The highest-level widget style is "sidebar", which represents the entire display region on the right -(or left) edge of the screen. It is much like a "layout", but includes a "width" in characters, and -its list of "widgets" are not rows or columns, but a list of sections that may be rearranged or -toggled in-game to customize how they are displayed. - -Each "layout" in the "sidebar" corresponds to a `panel_layout` instance. - -To ensure minimum usability, the "width" this must be at least the width of the "compact" or "labels -narrow" sidebars, at 32 characters; any smaller value is rounded up to 32. - -## Colors +### Colors Widgets with "number" or "graph" style may define "colors", which will be used as a spectrum across the widget's values ("var_min" to "var_max"), applying the appropriate color at each level. From 1da9520c1ccf4e8696ea165d195676b669405448 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Thu, 30 Dec 2021 19:04:21 -0700 Subject: [PATCH 081/154] src: Remove unused draw_mod_sidebar --- src/panels.cpp | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/src/panels.cpp b/src/panels.cpp index 5fae48134902b..a3fc9e8e708b9 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -2560,28 +2560,6 @@ static void draw_overmap( const draw_args &args ) wnoutrefresh( w ); } -// Custom moddable sidebar -static void draw_mod_sidebar( const draw_args &args, const std::string layout_name, - const int width ) -{ - const avatar &u = args._ava; - const catacurses::window &w = args._win; - - werase( w ); - - // Render each row of the root layout widget - widget root = widget_id( layout_name ).obj(); - int row_num = 0; - for( const widget_id &row_wid : root._widgets ) { - widget row_widget = row_wid.obj(); - trim_and_print( w, point( 1, row_num ), width - 1, c_light_gray, _( row_widget.layout( u, - width - 1 ) ) ); - row_num++; - } - - wnoutrefresh( w ); -} - static void draw_veh_compact( const draw_args &args ) { const avatar &u = args._ava; From f70b34bebae1b052a4658674ff333e3bf5a6d877 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Fri, 31 Dec 2021 14:57:21 -0700 Subject: [PATCH 082/154] tests: Remove unused var --- tests/widget_test.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/widget_test.cpp b/tests/widget_test.cpp index d5f9c676680f9..0044ebda34bc7 100644 --- a/tests/widget_test.cpp +++ b/tests/widget_test.cpp @@ -33,7 +33,6 @@ static const widget_id widget_test_stamina_num( "test_stamina_num" ); static const widget_id widget_test_stat_panel( "test_stat_panel" ); static const widget_id widget_test_str_num( "test_str_num" ); static const widget_id widget_test_text_widget( "test_text_widget" ); -static const widget_id widget_test_three_widget_layout( "test_three_widget_layout" ); static const widget_id widget_test_weariness_num( "test_weariness_num" ); TEST_CASE( "widget value strings", "[widget][value][string]" ) From f97b8c948ad0a94603ef608d3556c41f373bcfc3 Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Sun, 2 Jan 2022 06:23:30 -0700 Subject: [PATCH 083/154] data: Add radiation badge to default sidebar --- data/json/ui/sidebar.json | 1 + 1 file changed, 1 insertion(+) diff --git a/data/json/ui/sidebar.json b/data/json/ui/sidebar.json index 9ca8f2b8750a0..c08b0a1950c7c 100644 --- a/data/json/ui/sidebar.json +++ b/data/json/ui/sidebar.json @@ -864,6 +864,7 @@ "needs_desc_layout", "safe_sound_layout", "power_desc", + "rad_badge_desc", "weapon_style_layout", "place_date_time_layout", "light_moon_wind_temp_layout" From a55048356cb015797ca3a3c7f518bda8fd505f73 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Sun, 2 Jan 2022 16:36:38 +0100 Subject: [PATCH 084/154] adjusted workshop recipes plus parkour bug --- .../version_2/recipe_modular_field_common.json | 1 + .../version_2/modular_workshop_recipe_groups.json | 2 ++ 2 files changed, 3 insertions(+) diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json index 16fa1b2efe185..aed7191a774bf 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json @@ -551,6 +551,7 @@ "construction_blueprint": "fbmh_2_parkour", "blueprint_name": "build an obstacle course", "blueprint_provides": [ { "id": "fbmh_2_parkour" } ], + "blueprint_requires": [ { "id": "fbmh_2" } ], "blueprint_excludes": [ { "id": "fbmh_2_parkour" } ] } ] diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_2/modular_workshop_recipe_groups.json b/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_2/modular_workshop_recipe_groups.json index 2caa6e16d7abe..e0c522985102c 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_2/modular_workshop_recipe_groups.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_2/modular_workshop_recipe_groups.json @@ -47,6 +47,8 @@ { "id": "boots_scrap", "description": " Craft: Armor, Scrap Boots" }, { "id": "chisel", "description": " Craft: Metalworking Chisel" }, { "id": "hammer", "description": " Craft: Hammer" }, + { "id": "metal_file", "description": " Craft: Metal Fileset" }, + { "id": "stone_polishing", "description": " Craft: Polishing Stone" }, { "id": "tongs", "description": " Craft: Metal Tongs" }, { "id": "metalworking_tongs", "description": " Craft: Pair of Flatjaw Tongs" }, { "id": "hotcut", "description": " Craft: Hotcut (chisel for metal working)" }, From acacbb1daa63bb4e96311786f08829fe4dd09d60 Mon Sep 17 00:00:00 2001 From: Fris0uman <41293484+Fris0uman@users.noreply.github.com> Date: Sun, 2 Jan 2022 19:04:35 +0100 Subject: [PATCH 085/154] Add sound support for clear, cloudy and sunny weather (#53389) * Add sound support for clear, cloudy and sunny weather * add missing sound channels --- data/core/weather.json | 1 + data/json/weather_type.json | 2 ++ doc/SOUNDPACKS.md | 2 +- src/sounds.cpp | 17 ++++++++++++++++- src/sounds.h | 3 +++ src/weather_type.cpp | 6 ++++++ src/weather_type.h | 3 +++ 7 files changed, 32 insertions(+), 2 deletions(-) diff --git a/data/core/weather.json b/data/core/weather.json index f3cd4238d3685..7627d0f688889 100644 --- a/data/core/weather.json +++ b/data/core/weather.json @@ -14,6 +14,7 @@ "precip": "none", "rains": false, "acidic": false, + "sound_category": "clear", "sun_intensity": "normal" }, { diff --git a/data/json/weather_type.json b/data/json/weather_type.json index d7451ad296b51..7706e3a513d42 100644 --- a/data/json/weather_type.json +++ b/data/json/weather_type.json @@ -15,6 +15,7 @@ "rains": false, "acidic": false, "sun_intensity": "high", + "sound_category": "sunny", "condition": { "and": [ "is_day", @@ -38,6 +39,7 @@ "precip": "none", "rains": false, "acidic": false, + "sound_category": "cloudy", "sun_intensity": "light", "condition": { "and": [ diff --git a/doc/SOUNDPACKS.md b/doc/SOUNDPACKS.md index 2b565fa1b976e..c15498cbee3c4 100644 --- a/doc/SOUNDPACKS.md +++ b/doc/SOUNDPACKS.md @@ -125,7 +125,7 @@ Divided by sections for clarity. * `environment thunder_near|thunder_far` * `environment daytime|nighttime` * `environment indoors|indoors_rain|underground` -* `environment ` # examples: `WEATHER_DRIZZLE|WEATHER_RAINY|WEATHER_THUNDER|WEATHER_FLURRIES|WEATHER_SNOW|WEATHER_SNOWSTORM` +* `environment ` # examples: `WEATHER_DRIZZLE|WEATHER_RAINY|WEATHER_THUNDER|WEATHER_FLURRIES|WEATHER_SNOW|WEATHER_SNOWSTORM|WEATHER_CLEAR|WEATHER_SUNNY|WEATHER_CLOUDY` * `environment alarm|church_bells|police_siren` * `environment deafness_shock|deafness_tone_start|deafness_tone_light|deafness_tone_medium|deafness_tone_heavy` diff --git a/src/sounds.cpp b/src/sounds.cpp index db93a35edc1de..53c83bd0078ed 100644 --- a/src/sounds.cpp +++ b/src/sounds.cpp @@ -1115,7 +1115,10 @@ void sfx::do_ambient() !is_channel_playing( channel::outdoors_thunderstorm_env ) && !is_channel_playing( channel::outdoors_rain_env ) && !is_channel_playing( channel::outdoors_drizzle_env ) && - !is_channel_playing( channel::outdoor_blizzard ) ) + !is_channel_playing( channel::outdoor_blizzard ) && + !is_channel_playing( channel::outdoors_clear_env ) && + !is_channel_playing( channel::outdoors_sunny_env ) && + !is_channel_playing( channel::outdoors_cloudy_env ) ) || ( !is_sheltered && weather_changed && !is_deaf ) ) { fade_audio_group( group::weather, 1000 ); @@ -1151,6 +1154,18 @@ void sfx::do_ambient() play_ambient_variant_sound( "environment", "WEATHER_PORTAL_STORM", seas_str, heard_volume, channel::outdoors_portal_storm_env, 1000 ); break; + case weather_sound_category::clear: + play_ambient_variant_sound( "environment", "WEATHER_CLEAR", seas_str, heard_volume, + channel::outdoors_clear_env, 1000 ); + break; + case weather_sound_category::sunny: + play_ambient_variant_sound( "environment", "WEATHER_SUNNY", seas_str, heard_volume, + channel::outdoors_sunny_env, 1000 ); + break; + case weather_sound_category::cloudy: + play_ambient_variant_sound( "environment", "WEATHER_CLOUDY", seas_str, heard_volume, + channel::outdoors_cloudy_env, 1000 ); + break; case weather_sound_category::last: debugmsg( "Invalid weather sound category." ); break; diff --git a/src/sounds.h b/src/sounds.h index 690dfc82c578f..a65a13e1a4eb5 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -119,6 +119,9 @@ enum class channel : int { interior_engine_sound, radio, outdoors_portal_storm_env, + outdoors_clear_env, + outdoors_cloudy_env, + outdoors_sunny_env, MAX_CHANNEL //the last reserved channel }; diff --git a/src/weather_type.cpp b/src/weather_type.cpp index 77b08b91d6f1d..577d9b133fccf 100644 --- a/src/weather_type.cpp +++ b/src/weather_type.cpp @@ -72,6 +72,12 @@ std::string enum_to_string( weather_sound_category data return "silent"; case weather_sound_category::portal_storm: return "portal_storm"; + case weather_sound_category::clear: + return "clear"; + case weather_sound_category::sunny: + return "sunny"; + case weather_sound_category::cloudy: + return "cloudy"; case weather_sound_category::last: break; } diff --git a/src/weather_type.h b/src/weather_type.h index 3980e89dbd657..41ed217ee0b86 100644 --- a/src/weather_type.h +++ b/src/weather_type.h @@ -59,6 +59,9 @@ enum weather_sound_category : int { snowstorm, snow, portal_storm, + clear, + sunny, + cloudy, last }; From eb9c7325253fbf11b0c12fd9bcf1bee148b0a3ee Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Sun, 2 Jan 2022 18:56:51 -0500 Subject: [PATCH 086/154] Fix out of bounds nest placements Lots of nests were placed in such a way as to potentially span OMT boundaries. This doesn't work properly, and could lead to debugmsg errors in some cases. Fix almost all the issues found by a check I implemented to look for such issues. Some more details: - The island prison did a lot of mass low-probability nest placements of 3x3 corpse nests. I had to make the tiles close to the map boundary variants of some common symbols that lacked the corresponding nest. - The mi-go encampment was using '@' as a null symbol in the nests. I had to rearrange the palette so that '.' could be the null symbol to allow that to be the off-the-edge symbol for the nests. - Various of the map extras had low-probability nests on every tile. As with the island prison, I had to remove these from all the tiles near two edges. - The remaining issues were mostly roof spawns. In particular the 16x16 'help' nest is tricky to fit. --- data/json/mapgen/apartment_mod_new.json | 2 +- data/json/mapgen/exodii/exodii_nested.json | 2 +- data/json/mapgen/irradiator_1.json | 6 +- data/json/mapgen/map_extras/college_kids.json | 51 ++--- data/json/mapgen/map_extras/drug_dealers.json | 51 ++--- data/json/mapgen/map_extras/scientists.json | 51 ++--- data/json/mapgen/map_extras/wilderness.json | 8 +- data/json/mapgen/megastore.json | 23 +- data/json/mapgen/mi-go/mi-go_encampment.json | 48 ++--- data/json/mapgen/mi-go/mi-go_nested.json | 198 +++++++++--------- .../mapgen/nested/city_npc_nested_spawns.json | 28 +-- data/json/mapgen/nested/lmoe_nested.json | 18 +- data/json/mapgen/prison_1.json | 131 ++++++------ data/json/mapgen_palettes/mi-go_palette.json | 3 +- 14 files changed, 313 insertions(+), 307 deletions(-) diff --git a/data/json/mapgen/apartment_mod_new.json b/data/json/mapgen/apartment_mod_new.json index d9c85d41df18d..b79ab52c0e63d 100644 --- a/data/json/mapgen/apartment_mod_new.json +++ b/data/json/mapgen/apartment_mod_new.json @@ -255,7 +255,7 @@ [ "roof_2x2_utilities_b", 20 ] ], "x": [ 13, 19 ], - "y": [ 17, 20 ] + "y": [ 17, 19 ] }, { "chunks": [ diff --git a/data/json/mapgen/exodii/exodii_nested.json b/data/json/mapgen/exodii/exodii_nested.json index b9e200e590475..657cb93bab12c 100644 --- a/data/json/mapgen/exodii/exodii_nested.json +++ b/data/json/mapgen/exodii/exodii_nested.json @@ -11,7 +11,7 @@ "1__cc", "L____", "2345T", - "|||||" + " " ], "place_npcs": [ { "class": "exodii_merchant", "x": 2, "y": 1 } ], "terrain": { "_": "t_metal_floor", "|": "t_junk_wall", "T": "t_metal_floor" }, diff --git a/data/json/mapgen/irradiator_1.json b/data/json/mapgen/irradiator_1.json index d41372764bda4..575921f1ee01d 100644 --- a/data/json/mapgen/irradiator_1.json +++ b/data/json/mapgen/irradiator_1.json @@ -463,16 +463,16 @@ "place_nested": [ { "chunks": [ - [ "null", 5 ], + [ "null", 30 ], [ "roof_4x4_survivor", 15 ], - [ "roof_16x16_help", 25 ], [ "roof_4x4_holdout", 5 ], [ "roof_6x6_utility", 45 ], [ "roof_5x5_coop", 5 ] ], "x": [ 11, 18 ], "y": [ 5, 18 ] - } + }, + { "chunks": [ [ "null", 75 ], [ "roof_16x16_help", 25 ] ], "x": [ 24, 32 ], "y": [ 5, 8 ] } ] } } diff --git a/data/json/mapgen/map_extras/college_kids.json b/data/json/mapgen/map_extras/college_kids.json index a50e6a6f88cd2..05ba13c82040d 100644 --- a/data/json/mapgen/map_extras/college_kids.json +++ b/data/json/mapgen/map_extras/college_kids.json @@ -29,35 +29,38 @@ "update_mapgen_id": "mx_collegekids", "object": { "rows": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " 1 ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "-----------1---------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", " ", " " ], "terrain": { "1": "t_null" }, - "monsters": { " ": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 } }, + "monsters": { + " ": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 }, + "-": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 } + }, "nested": { - " ": { "chunks": [ [ "corpse_blood_gibs_college_3x3", 1 ], [ "null", 150 ] ] }, + "-": { "chunks": [ [ "corpse_blood_gibs_college_3x3", 1 ], [ "null", 150 ] ] }, "1": { "chunks": [ "corpse_blood_gibs_college_3x3" ] } } } diff --git a/data/json/mapgen/map_extras/drug_dealers.json b/data/json/mapgen/map_extras/drug_dealers.json index bf9c10cf053ae..cc999f169ea97 100644 --- a/data/json/mapgen/map_extras/drug_dealers.json +++ b/data/json/mapgen/map_extras/drug_dealers.json @@ -15,35 +15,38 @@ "update_mapgen_id": "mx_drugdeal", "object": { "rows": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " 1 ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "-----------1---------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", " ", " " ], "terrain": { "1": "t_null" }, - "monsters": { " ": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 } }, + "monsters": { + " ": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 }, + "-": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 } + }, "nested": { - " ": { "chunks": [ [ "corpse_blood_gibs_drugs_3x3", 1 ], [ "null", 150 ] ] }, + "-": { "chunks": [ [ "corpse_blood_gibs_drugs_3x3", 1 ], [ "null", 150 ] ] }, "1": { "chunks": [ "corpse_blood_gibs_drugs_3x3" ] } } } diff --git a/data/json/mapgen/map_extras/scientists.json b/data/json/mapgen/map_extras/scientists.json index 7522b9ce4b23a..9733bae505eb3 100644 --- a/data/json/mapgen/map_extras/scientists.json +++ b/data/json/mapgen/map_extras/scientists.json @@ -15,35 +15,38 @@ "update_mapgen_id": "mx_science", "object": { "rows": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " 1 ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "-----------1---------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", + "---------------------- ", " ", " " ], "terrain": { "1": "t_null" }, - "monsters": { " ": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 } }, + "monsters": { + " ": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 }, + "-": { "monster": "GROUP_NETHER_CAPTURED", "chance": 1, "density": 0.0001 } + }, "nested": { - " ": { "chunks": [ [ "corpse_blood_gibs_science_3x3", 1 ], [ "null", 150 ] ] }, + "-": { "chunks": [ [ "corpse_blood_gibs_science_3x3", 1 ], [ "null", 150 ] ] }, "1": { "chunks": [ "corpse_blood_gibs_science_3x3" ] } } } diff --git a/data/json/mapgen/map_extras/wilderness.json b/data/json/mapgen/map_extras/wilderness.json index 11977ae2a10e6..7140b04b7eecd 100644 --- a/data/json/mapgen/map_extras/wilderness.json +++ b/data/json/mapgen/map_extras/wilderness.json @@ -70,7 +70,7 @@ "type": "mapgen", "method": "json", "update_mapgen_id": "mx_grass2_map", - "object": { "place_nested": [ { "chunks": [ [ "mx_grass_nested", 100 ] ], "x": [ 0, 17 ], "y": [ 0, 17 ], "repeat": [ 1, 6 ] } ] } + "object": { "place_nested": [ { "chunks": [ [ "mx_grass_nested", 100 ] ], "x": [ 0, 16 ], "y": [ 0, 16 ], "repeat": [ 1, 6 ] } ] } }, { "type": "mapgen", @@ -146,7 +146,7 @@ "type": "mapgen", "method": "json", "update_mapgen_id": "mx_trees2_map", - "object": { "place_nested": [ { "chunks": [ [ "mx_trees_nested", 100 ] ], "x": [ 0, 17 ], "y": [ 0, 17 ], "repeat": [ 1, 6 ] } ] } + "object": { "place_nested": [ { "chunks": [ [ "mx_trees_nested", 100 ] ], "x": [ 0, 16 ], "y": [ 0, 16 ], "repeat": [ 1, 6 ] } ] } }, { "type": "mapgen", @@ -192,8 +192,8 @@ "place_nested": [ { "chunks": [ [ "mx_grass_nested", 70 ], [ "mx_trees_nested", 30 ] ], - "x": [ 0, 17 ], - "y": [ 0, 17 ], + "x": [ 0, 16 ], + "y": [ 0, 16 ], "repeat": [ 2, 6 ] }, { "chunks": [ [ "mx_fallen_shed_nested", 100 ] ], "x": [ 0, 11 ], "y": [ 0, 11 ] } diff --git a/data/json/mapgen/megastore.json b/data/json/mapgen/megastore.json index 219dd8baf4d60..8396b2240af6b 100644 --- a/data/json/mapgen/megastore.json +++ b/data/json/mapgen/megastore.json @@ -2260,8 +2260,7 @@ "place_nested": [ { "chunks": [ - [ "null", 5 ], - [ "roof_16x16_help", 5 ], + [ "null", 10 ], [ "roof_2x2_infrastructure", 80 ], [ "roof_2x2_infrastructure_2", 40 ], [ "roof_2x2_utilities", 40 ], @@ -2310,20 +2309,7 @@ "rotation": 0, "palettes": [ "megastore" ], "terrain": { " ": "t_flat_roof" }, - "place_nested": [ - { - "chunks": [ - [ "null", 5 ], - [ "roof_16x16_help", 5 ], - [ "roof_2x2_infrastructure", 80 ], - [ "roof_2x2_infrastructure_2", 40 ], - [ "roof_2x2_utilities", 40 ], - [ "roof_6x6_survivor", 5 ] - ], - "x": [ 1, 18 ], - "y": [ 6, 18 ] - } - ] + "place_nested": [ { "chunks": [ [ "null", 160 ], [ "roof_16x16_help", 5 ] ], "x": [ 1, 8 ], "y": [ 6, 8 ] } ] } }, { @@ -2367,14 +2353,13 @@ { "chunks": [ [ "null", 5 ], - [ "roof_16x16_help", 5 ], [ "roof_2x2_infrastructure", 80 ], [ "roof_2x2_infrastructure_2", 40 ], [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 6, 22 ], - "y": [ 7, 22 ] + "x": [ 6, 18 ], + "y": [ 7, 18 ] } ] } diff --git a/data/json/mapgen/mi-go/mi-go_encampment.json b/data/json/mapgen/mi-go/mi-go_encampment.json index d3c08a119951f..15855a1fd4215 100644 --- a/data/json/mapgen/mi-go/mi-go_encampment.json +++ b/data/json/mapgen/mi-go/mi-go_encampment.json @@ -7,30 +7,30 @@ "object": { "fill_ter": "t_floor_resin", "rows": [ - ".......||.....||.....||.........................", - ".....||||||.||||||.||||||.......................", - ".||||| ||| 4 ||| ||......................", - "|| + ||# | |..........||..........", - "| 1 | 2 + #####| 5 |........||||||........", - "|| | | 3 + |......||| |||......", - ".| || ||| ||| ||....||| |||....", - ".| |||||||| |||||| |+||||||.||| ||...", - ".|+|||||| || |||< |...", - "|| || | || 6 ||..", - "| | | | |..", - "| 7 | 8 || 9 9a | |..", - "| + ||| + ||..", - "|| || |+| ||| || |...", - ".|||||||| ||12 ||| ||| |...", - "...|||||||| ||||+||| + ||...", - "....||11 || || || ||| |||....", - ".|||| + | | 14 |||||||| ||......", - "||10| & |+|| + 13 | ||......||||.......", - "|& + |15||||| |||||..................", - "| || || || ||......................", - "|| ||||+||| ||||||||.......................", - ".|||+|.||16 ||||||...||.........................", - "........|||+|.||................................" + ";;;;;;;||;;;;;||;;;;;||;;;;;;;;;;;;;;;;;;;;;;;;;", + ";;;;;||||||;||||||;||||||;;;;;;;;;;;;;;;;;;;;;;;", + ";||||| ||| 4 ||| ||;;;;;;;;;;;;;;;;;;;;;;", + "|| + ||# | |;;;;;;;;;;||;;;;;;;;;;", + "| 1 | 2 + #####| 5 |;;;;;;;;||||||;;;;;;;;", + "|| | | 3 + |;;;;;;||| |||;;;;;;", + ";| || ||| ||| ||;;;;||| |||;;;;", + ";| |||||||| |||||| |+||||||;||| ||;;;", + ";|+|||||| || |||< |;;;", + "|| || | || 6 ||;;", + "| | | | |;;", + "| 7 | 8 || 9 9a | |;;", + "| + ||| + ||;;", + "|| || |+| ||| || |;;;", + ";|||||||| ||12 ||| ||| |;;;", + ";;;|||||||| ||||+||| + ||;;;", + ";;;;||11 || || || ||| |||;;;;", + ";|||| + | | 14 |||||||| ||;;;;;;", + "||10| & |+|| + 13 | ||;;;;;;||||;;;;;;;", + "|& + |15||||| |||||;;;;;;;;;;;;;;;;;;", + "| || || || ||;;;;;;;;;;;;;;;;;;;;;;", + "|| ||||+||| ||||||||;;;;;;;;;;;;;;;;;;;;;;;", + ";|||+|;||16 ||||||;;;||;;;;;;;;;;;;;;;;;;;;;;;;;", + ";;;;;;;;|||+|;||;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" ], "palettes": [ "mi-go_palette" ], "place_nested": [ diff --git a/data/json/mapgen/mi-go/mi-go_nested.json b/data/json/mapgen/mi-go/mi-go_nested.json index edcd6a8181630..cbbb13acb8f82 100644 --- a/data/json/mapgen/mi-go/mi-go_nested.json +++ b/data/json/mapgen/mi-go/mi-go_nested.json @@ -7,13 +7,13 @@ "mapgensize": [ 7, 7 ], "rotation": [ 0, 3 ], "rows": [ - ".||||@@", - "||T +@@", - "|& P|@@", - "|| |@@", - ".| T|@@", - ".| ||@@", - ".|+||@@" + ";||||..", + "||T +..", + "|& P|..", + "|| |..", + ";| T|..", + ";| ||..", + ";|+||.." ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_COMMON", "x": [ 2, 3 ], "y": [ 1, 4 ], "density": 0.02, "repeat": [ 0, 2 ] } ], "palettes": [ "mi-go_palette" ] @@ -27,14 +27,14 @@ "mapgensize": [ 8, 8 ], "rotation": [ 0, 3 ], "rows": [ - ".||||||.", + ";||||||;", "||PPPP||", "+ i P|", "| & +", "|P P|", "||PPPP||", - "|||||||@", - "@@@@@@@@" + "|||||||.", + "........" ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_COMMON", "x": [ 1, 6 ], "y": [ 2, 4 ], "density": 0.01, "repeat": [ 1, 3 ] } ], "palettes": [ "mi-go_palette" ] @@ -48,14 +48,14 @@ "mapgensize": [ 8, 8 ], "rotation": [ 0, 3 ], "rows": [ - "||#@@@@|", + "||#....|", "+ #####|", "| iT+", "||PFPV||", - "@||||||@", - "@@@@@@@@", - "@@@@@@@@", - "@@@@@@@@" + ".||||||.", + "........", + "........", + "........" ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_CAPTORS", "x": [ 1, 6 ], "y": 2, "density": 0.01, "repeat": [ 1, 2 ] } ], "palettes": [ "mi-go_palette" ] @@ -70,13 +70,13 @@ "mapgensize": [ 7, 7 ], "rotation": [ 0, 3 ], "rows": [ - "..||...", - "||||||.", + ";;||;;;", + "||||||;", "|V # ||", "|# # |", - "@#####|", - "@@@@@@@", - "@@@@@@@" + ".#####|", + ".......", + "......." ], "place_monster": [ { @@ -101,13 +101,13 @@ "mapgensize": [ 7, 7 ], "rotation": [ 0, 3 ], "rows": [ - ".|||||@", - "|| P @", - "+ @", - "| &F @", - "| P @", - "|| i@", - "@|+|||@" + ";|||||.", + "|| P .", + "+ .", + "| &F .", + "| P .", + "|| i.", + ".|+|||." ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_COMMON", "x": [ 2, 5 ], "y": [ 1, 5 ], "density": 0.02, "repeat": [ 1, 3 ] } ], "palettes": [ "mi-go_palette" ] @@ -122,24 +122,24 @@ "mapgensize": [ 18, 18 ], "rotation": [ 0, 3 ], "rows": [ - "........||........", - "......||||||......", - "....|||PPPP|||....", - "..|||PP #1|||..", - "|||&P i ### ||.", - "|< P #2 |.", + ";;;;;;;;||;;;;;;;;", + ";;;;;;||||||;;;;;;", + ";;;;|||PPPP|||;;;;", + ";;|||PP #1|||;;", + "|||&P i ### ||;", + "|< P #2 |;", "|| TnT i ###||", - "@|i nnn #3|", - "@|i nnn &i # |", - "@+ TnT ###||", - "|| i #4 |.", - "|P P ### ###|.", - "+ i # ####5||.", - "|||VPPP #7#6 |||..", - "@@||||||||# ||....", - "@||......||||.....", - "@@@@@@@@@@@@@@@@@@", - "@@@@@@@@@@@@@@@@@@" + ".|i nnn #3|", + ".|i nnn &i # |", + ".+ TnT ###||", + "|| i #4 |;", + "|P P ### ###|;", + "+ i # ####5||;", + "|||VPPP #7#6 |||;;", + "..||||||||# ||;;;;", + ".||;;;;;;||||;;;;;", + "..................", + ".................." ], "palettes": [ "mi-go_palette" ], "npcs": { @@ -165,14 +165,14 @@ "mapgensize": [ 8, 8 ], "rotation": [ 0, 3 ], "rows": [ - ".|+|||||", + ";|+|||||", "|| ||", "|T i |", "|i &i |", "|T +", "||PPPP||", - ".|||||||", - "@@@@@@@@" + ";|||||||", + "........" ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_COMMON", "x": [ 2, 5 ], "y": [ 1, 4 ], "density": 0.01, "repeat": [ 0, 3 ] } ], "palettes": [ "mi-go_palette" ] @@ -193,8 +193,8 @@ "|P iT # ", "|P &P #|", "+ ||", - "|###|+|@", - "|| ||@@@" + "|###|+|.", + "|| ||..." ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_CAPTORS", "x": [ 2, 4 ], "y": [ 2, 5 ], "density": 0.01, "repeat": [ 1, 2 ] }, @@ -222,8 +222,8 @@ "| & ", "|T P ", "|||T P ", - "@@|||T V ", - "@@@@||||+" + "..|||T V ", + "....||||+" ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_COMMON", "x": [ 1, 8 ], "y": [ 3, 5 ], "density": 0.01, "repeat": [ 0, 2 ] } ], "palettes": [ "mi-go_palette" ] @@ -238,15 +238,15 @@ "mapgensize": [ 9, 9 ], "rotation": [ 0, 3 ], "rows": [ - "|||.||@@@", - "PP|||<@@@", - " P||@@@", - "i PTP|@@@", - "V P P|@@@", - "i +@@@", - " PP||@@@", - "P&|||@@@@", - "|||@+@@@@" + "|||;||...", + "PP|||<...", + " P||...", + "i PTP|...", + "V P P|...", + "i +...", + " PP||...", + "P&|||....", + "|||.+...." ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_COMMON", "x": [ 0, 3 ], "y": [ 2, 5 ], "density": 0.01, "repeat": [ 0, 2 ] } ], "palettes": [ "mi-go_palette" ] @@ -261,12 +261,12 @@ "mapgensize": [ 6, 6 ], "rotation": [ 0, 3 ], "rows": [ - ".||||@", - "||Ti|@", - "|V +@", + ";||||.", + "||Ti|.", + "|V +.", "| ||", "||i |", - ".|||+|" + ";|||+|" ], "palettes": [ "mi-go_palette" ] } @@ -279,14 +279,14 @@ "mapgensize": [ 8, 8 ], "rotation": [ 0, 3 ], "rows": [ - "|||||||@", + "|||||||.", "||TiT ||", "| & +", "| || |", "+ i|", "||P V ||", - "@||||+||", - "@@@@@@@@" + ".||||+||", + "........" ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_COMMON", "x": [ 1, 3 ], "y": [ 2, 5 ], "density": 0.01, "repeat": [ 0, 2 ] } ], "palettes": [ "mi-go_palette" ] @@ -300,16 +300,16 @@ "mapgensize": [ 10, 10 ], "rotation": [ 0, 3 ], "rows": [ - "@|+|P|||@@", + ".|+|P|||..", "|| |||", "|P i P|", "|| i&i ||", - "@+ |@", - "@|+||T +@", - "@|@@|||||@", - "@@@@@@@@@@", - "@@@@@@@@@@", - "@@@@@@@@@@" + ".+ |.", + ".|+||T +.", + ".|..|||||.", + "..........", + "..........", + ".........." ], "place_monsters": [ { "monster": "GROUP_MI-GO_BASE_COMMON", "x": [ 2, 6 ], "y": [ 1, 4 ], "density": 0.01, "repeat": [ 0, 1 ] } ], "palettes": [ "mi-go_palette" ] @@ -323,14 +323,14 @@ "mapgensize": [ 8, 8 ], "rotation": [ 0, 3 ], "rows": [ - "@||||+||", - "||T ||", - "| PT |", - "+ i& |", - "| PT |", - "||T ||", - "|||||||.", - "@@@@@@@@" + ".||||+..", + "||T ..", + "| PT ..", + "+ i&..", + "| PT ..", + "||T ..", + "||||||..", + "........" ], "palettes": [ "mi-go_palette" ] } @@ -344,12 +344,12 @@ "mapgensize": [ 6, 6 ], "rotation": [ 0, 3 ], "rows": [ - "@|||@@", - "|| +@@", + ".|||..", + "|| +..", "|##|||", "|1 P|", "| 1||", - "|||||." + "|||||;" ], "palettes": [ "mi-go_palette" ], "place_monsters": [ { "monster": "GROUP_ZOMBIE_BRUTE", "x": [ 1, 3 ], "y": [ 3, 4 ], "repeat": [ 1, 2 ] } ] @@ -364,14 +364,14 @@ "mapgensize": [ 8, 8 ], "rotation": [ 0, 3 ], "rows": [ - "|+||@@@+", + "|+||...+", "| F|||||", "| P|", "||F F||", - "@||||||.", - "@@@@@@@@", - "@@@@@@@@", - "@@@@@@@@" + ".||||||;", + "........", + "........", + "........" ], "palettes": [ "mi-go_palette" ] } @@ -388,8 +388,8 @@ "|+|||", "| |", "|||+|", - "@@@@@", - "@@@@@" + ".....", + "....." ], "palettes": [ "mi-go_palette" ] } @@ -410,17 +410,17 @@ "|||VP i ### ||v", "|< P #2 |v", "|> TnT i ###||", - "@|i nnn #3|", - "@|i nnn & # |", - "@| TnT ###||", + ".|i nnn #3|", + ".|i nnn & # |", + ".| TnT ###||", "|| i #4 |v", "|P P ### ###|v", "| i # ####5||v", "|||VPPP #7#6 |||vv", - "@@||||||||# ||vvvv", - "@||vvvvvv||||vvvvv", - "@vvv@@@@@@@@@@@@@@", - "@@@@@@@@@@@@@@@@@@" + "..||||||||# ||vvvv", + ".||vvvvvv||||vvvvv", + ".vvv..............", + ".................." ], "palettes": [ "mi-go_palette" ], "npcs": { diff --git a/data/json/mapgen/nested/city_npc_nested_spawns.json b/data/json/mapgen/nested/city_npc_nested_spawns.json index 6afff486fdb54..82dd4918b359a 100644 --- a/data/json/mapgen/nested/city_npc_nested_spawns.json +++ b/data/json/mapgen/nested/city_npc_nested_spawns.json @@ -6,21 +6,21 @@ "object": { "mapgensize": [ 13, 13 ], "rows": [ - "mt_________#t", - "____________r", - "__________ffr", - "___________W_", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________" + "mt #t", + " r", + " ffr", + " W ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " ], - "terrain": { "_": "t_null", "-": "t_wall", "W": "t_window_boarded" }, + "terrain": { "-": "t_wall", "W": "t_window_boarded" }, "furniture": { "r": "f_rack", "f": "f_fridge", "t": "f_table", "#": "f_counter", "m": "f_makeshift_bed" }, "place_npcs": [ { "class": "survivor_chef", "x": 5, "y": 1 } ], "place_loot": [ diff --git a/data/json/mapgen/nested/lmoe_nested.json b/data/json/mapgen/nested/lmoe_nested.json index c072b1a740163..7ed8e685578ff 100644 --- a/data/json/mapgen/nested/lmoe_nested.json +++ b/data/json/mapgen/nested/lmoe_nested.json @@ -36,11 +36,11 @@ "_{|l_______", "__+________", "|||||||||||", - "###########", - "###########", - "###########", - "###########", - "###########" + " ", + " ", + " ", + " ", + " " ], "palettes": [ "bunker", "empty_bunker_items" ] } @@ -59,10 +59,10 @@ "__h___c=_l", "TTTcccc=_A", "||||||||||", - "##########", - "##########", - "##########", - "##########" + " ", + " ", + " ", + " " ], "palettes": [ "bunker", "empty_bunker_items" ] } diff --git a/data/json/mapgen/prison_1.json b/data/json/mapgen/prison_1.json index 3287af7ebbeb5..b72a898105b57 100644 --- a/data/json/mapgen/prison_1.json +++ b/data/json/mapgen/prison_1.json @@ -868,74 +868,74 @@ "rows": [ "````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````", "````````````###*********````````````````ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–````````````````````", - "```````*****###****#Ā¦***```````````````ā„–ā„–''''''''''''''''''''''''''''''''''''''''''''''''''''''''''ā„–````````````````````", + "```````*****###****#Ā¦***```````````````ā„–ā„–'''''ā€™ā€™''''''''''''''''''''''ā€™ā€™''''''''''''''''''''''ā€™ā€™'''ā„–````````````````````", "``******###***##***#****``````````````ā„–ā„–'' |----------| 'ā„–ā„–ā„–ā„–ā„–'ā„–````````````````````", - "``*####*###***##***#******####```````ā„–ā„–'' |7Š‘7Š‘77Š‘7Š‘7| 'ā„–..>ā„–'ā„–````````````````````", - "***########******###******######````ā„–ā„–'' |7Š‘7Š‘77Š‘7Š‘7| 'ā„–...ā„–'ā„–````````````````````", + "``*####*###***##***#******####```````ā„–ā„–'' |7Š‘7Š‘77Š‘7Š‘7| 'ā„–āø¼āø¼>ā„–'ā„–````````````````````", + "***########******###******######````ā„–ā„–'' |7Š‘7Š‘77Š‘7Š‘7| 'ā„–āø¼āø¼.ā„–'ā„–````````````````````", "*#############*###################`ā„–ā„–'' |7Š‘Š‘Š‘Š‘Š‘Š‘Š‘Š‘7| 'ā„–ā„–@ā„–ā„–'ā„–````````````````````", - "*ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–'' |----?-----| '''''''ā„–````````````````````", - "*ā„–''''''''''''''''''''''''''''''''''' /|,,,,,,,,,,| ' ā„–````````````````````", + "*ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–'' |----?-----| ''ā€™ā€™'''ā„–````````````````````", + "*ā„–''''''''''''''''''''ā€™ā€™''''''''''''' /|,,,,,,,,,,| ' ā„–````````````````````", "*ā„–'ā„–ā„–ā„–ā„–ā„–' |--g--|XXX,,,3333|/ ' ā„–````````````````````", - "*ā„–'ā„–>ŠæŠæā„–' |-----------------------------|,,,,,|----?-----|--------------------------| ' ā„–````````````````````", - "*ā„–'ā„–ŠæŠæŠæā„–' |bo|bo|bo|bo|bo|bo|bo|bo|bo|bo|,,,,,,,,,,,,,,,,|bo|bo|bo|bo|bo|bo|bo|bo|b<| ' ā„–````````````````````", - "`ā„–'ā„–ā„–@ā„–ā„–' |b,|b,|b,|b,|b,|b,|b,|b,|b,|b,|,,,,,,,,,,,,,,,,|b,|b,|b,|b,|b,|b,|b,|b,|b,| ' ā„–````````````````````", - "`ā„–''''''' |T,|T,|T,|T,|T,|T,|T,|T,|T,|T,|,,,|---@----|,,,|T,|T,|T,|T,|T,|T,|T,|T,|T,| ' ā„–````````````````````", + "*ā„–'ā„–>ŠæŠæā„–' |-----------------------------|,,,āø²āø²|----?-----|--------------------------| ' ā„–````````````````````", + "*ā„–'ā„–ŠæŠæŠæā„–' |bo|bo|bo|bo|bo|bo|bo|bo|bo|bo|,,,āø²āø²,,,,,,,,,,,|bo|bo|bo|bo|bo|bo|bo|bo|b<| ' ā„–````````````````````", + "`ā„–'ā„–ā„–@ā„–ā„–' |b,|b,|b,|bāø²|b,|b,|b,|b,|b,|b,|,,,āø²āø²,,,,,,,,,,,|b,|b,|b,|bāø²|b,|b,|b,|b,|b,| ' ā„–````````````````````", + "`ā„–''''''' |T,|T,|T,|Tāø²|T,|T,|T,|T,|T,|T,|,,,|---@----|,,,|T,|T,|T,|Tāø²|T,|T,|T,|T,|T,| ' ā„–````````````````````", "`ā„–'' |-G|-G|-G|-G|-G|-G|-G|-G|-G|-G|,,,|h...Y.Š%|,,,|-G|-G|-G|-G|-G|-G|-G|-G|-G| ' ā„–````````````````````", - "`ā„–'' |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,|dd.....1|,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,| ' ā„–````````````````````", - "`ā„–'' |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,B,,,|.......1|,,,B,,,,,,,,,,,,,,,,,,,,,,,,,,| ' ā„–````````````````````", - "`ā„–'' g,,,3333,,,3333,,,3333,,,3333,G,,,|dh.11..6|,,,G,3333,,,3333,,,3333,,,3333g ' ā„–````````````````````", - "`ā„–'' |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,B,,,|d..66...|,,,B,,,,,,,,,,,,,,,,,,,,,,,,,,| ' ā„–````````````````````", - "`ā„–'' |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,|6h..h..6|,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,| ' ā„–````````````````````", + "`ā„–'' |,,,,,,,,,āø²āø²,,,,,,,,,,,,,,,,,,|,,,|dd.....1|,,,|,,,,,,,,,,āø²āø²,,,,,,,,,,,,,,| ' ā„–````````````````````", + "`ā„–'' |,,,,,,,,,āø²āø²,,,,,,,,,,,,,,,,,,B,,,|āø¼......1|,,,B,,,,,,,,,,āø²āø²,,,,,,,,,,,,,,| ' ā„–````````````````````", + "`ā„–'' g,,,3333,,āø²3333,,,3333,,,3333,G,,,|dh.11..6|,,,G,3333,,,3333,,,3333,,,3333g ' ā„–````````````````````", + "`ā„–'' |,,,,,,,,,āø²āø²,,,,,,,,,,,,,,,,,,B,,,|d..66...|,,,B,,,,,,,,,,āø²āø²,,,,,,,,,,,,,,| ' ā„–````````````````````", + "`ā„–'' |,,,,,,,,,āø²āø²,,,,,,,,,,,,,,,,,,|,,,|6h..h..6|,,,|,,,,,,,,,,āø²āø²,,,,,,,,,,,,,,| ' ā„–````````````````````", "`ā„–'' |-G|-G|-G|-G|-G|-G|-G|-G|-G|-G|,,,|6.....h6|,,,|-G|-G|-G|-G|-G|-G|-G|-G|-G| ' ā„–````````````````````", - "`ā„–'' |T,|T,|T,|T,|T,|T,|T,|T,|T,|T,|,,,|--------|,,,|T,|T,|T,|T,|T,|T,|T,|T,|T,| ' ā„–````````````````````", - "`ā„–'' |b,|b,|b,|b,|b,|b,|b,|b,|b,|b,|,,,,,,,,,,,,,,,,|b,|b,|b,|b,|b,|b,|b,|b,|b,| ' ā„–````````````````````", - "`ā„–'' |bo|bo|bo|bo|bo|bo|bo|bo|bo|bo|,,,,,,,,,,,,,,,,|bo|bo|bo|bo|bo|bo|bo|bo|bo| ' ā„–````````````````````", - "`ā„–'' |-----------------------------|,,,,,,,,,,,,,,,,|-----------|--------------| ' ā„–````````````````````", - "`ā„–'' B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|------BGGB------|,,,,,,,,,,,|Š,,,,,,?Ā”Ā”Ā”Ā”Ā”ĀæB ' ā„–````````````````````", - "`ā„–'' B^E^^^888^^^E^^^^^^^^^^^^^^^^^^|bbT|,,,,,,|Tbb|L,,,P,,P,,,M|dh,,,,Š½|-?|Ā”Ā”ĀæB ' ā„–````````````````````", - "`ā„–'' B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8|o,,G,,,,,,G,,o|,,,,P,,P,,,,|---?---|Šž,|Ā”Ā”ĀæB ' ā„–````````````````````", - "`ā„–'' B^E^^^888^^^E^^^^^^^^^^^^^^^^^8|---|,,3,,,|---|L,,,P,,P,,,M|,,,,,,,|--|-----|-| ' ā„–````````````````````", - "`ā„–'' B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8|bbT|,,3,,,|Tbb|,,,,P,,P,,,,|,,ttt,,|,,+,hgh,=,|/ ' ā„–````````````````````", - "`ā„–'' B^E^^^888^^^K^^^^^^^^^^^^^^^^^^|o,,G,,3,,,G,,o|L,,,P,,P,,,M|,,,,,,,|,,|-----|,|---|ā„–ā„–Äœā„–ā„–````````````````````", - "`ā„–'' / B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|---|,,3,,,|---|,,,,,,,,,,,,|333,333|,,+,hgh,=,=,,3| ' ā„–````````````````````", + "`ā„–'' |T,|T,|T,|Tāø²|T,|T,|T,|T,|T,|T,|,,,|--------|,,,|T,|T,|T,|Tāø²|T,|T,|T,|T,|T,| ' ā„–````````````````````", + "`ā„–ā€™ā€™ |bāø²|bāø²|bāø²|bāø²|bāø²|bāø²|bāø²|bāø²|bāø²|bāø²|āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²|bāø²|bāø²|bāø²|bāø²|bāø²|bāø²|bāø²|bāø²|bāø²| ā€™ ā„–````````````````````", + "`ā„–ā€™ā€™ |bo|bo|bo|bo|bo|bo|bo|bo|bo|bo|āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²āø²|bo|bo|bo|bo|bo|bo|bo|bo|bo| ā€™ ā„–````````````````````", + "`ā„–'' |-----------------------------|,,,āø²āø²,,,,,,,,,,,|-----------|--------------| ' ā„–````````````````````", + "`ā„–'' B^^^^^^^^^āˆ§āˆ§^^^^^^^^^^^^^^^^^^|------BGGB------|,,,,,,,,,,āø²|Š,,,,,,?Ā”Ā”Ā”Ā”Ā”ĀæB ' ā„–````````````````````", + "`ā„–'' B^E^^^888^āˆ§āˆ§E^^^^^^^^^^^^^^^^^^|bbT|,,,,,,|Tbb|L,,,P,,P,,,M|dh,,,,Š½|-?|Ā”Ā”ĀæB ' ā„–````````````````````", + "`ā„–'' B^^^^^^^^^āˆ§āˆ§^^^^^^^^^^^^^^^^^^8|o,āø²G,,,,,,G,,o|,,,,P,,P,,,āø²|---?---|Šž,|Ā”Ā”ĀæB ' ā„–````````````````````", + "`ā„–'' B^E^^^888^āˆ§āˆ§E^^^^^^^^^^^^^^^^^8|---|,,3,,,|---|L,,,P,,P,,,M|,,,,,,,|--|-----|-| ' ā„–````````````````````", + "`ā„–'' B^^^^^^^^^āˆ§āˆ§^^^^^^^^^^^^^^^^^^8|bbT|,,3,,,|Tbb|,,,,P,,P,,,āø²|,,ttt,,|,,+,hgh,=,|/ ' ā„–````````````````````", + "`ā„–'' B^E^^^888^āˆ§āˆ§K^^^^^^^^^^^^^^^^^^|o,āø²G,,3,,,G,,o|L,,,P,,P,,,M|,,,,,,,|,,|-----|,|---|ā„–ā„–Äœā„–ā„–````````````````````", + "`ā„–'' / B^^^^^^^^^āˆ§āˆ§^^^^^^^^^^^^^^^^^^^|---|,,3,,,|---|,,,,,,,,,,,āø²|333,333|,,+,hgh,=,=,,3| ' ā„–````````````````````", "`ā„–''|-------|------|-------|))_____)_____))|bbT|,,,,,,|Tbb|lll,,,,,NNNN|,,,,,,,|,,|-----|,|,,3| ' ā„–ā„–```````````````````", - "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|o,,T,,o|_))____)____))_|o,,G,,,,,,G,,o|---|,,,|----|333,333|,,+,hgh,=,|,,3| ' ā„–ā„–ZZZZZZZ!!{!!ZZZZZZ", - "`ā„–''|Ā°33333Ā°Ā°33333Ā°|bb,,,bb|__))___)___))__|---|,,,,,,|---|Šœ,ŠœŠœ,,,,Š¼Š¼Š¼Š¼|---?---|@-|-----|-|,,,|''''''ā„–!!!!!!!!!!!!!!!!!Z", - "`ā„–''|Ā°uuuuuĀ°Ā°uuuuuĀ°|-o,3,o-|f__)___)___)__f|bbT|,,3,,,|Tbb|Šœ,,,,,,,,,,,|^^^^^^^^^^Ĝ,,,,,,,,,,,g''''''B!!!!!!!!!!!!!!!!!Z", - "`ā„–''|Ā°33333Ā°Ā°33333Ā°|bb,3,bb|__))___)___))__|o,,G,,3,,,G,,o|Šœ,ŠœŠœ,,,,,,,,@^^^^^^^^^^Ĝ,,,,,,,,,,,@''''''Ĝ!!!!!!!!!!!!!!!!!Z", - "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|-o,3,o-|_))____)____))_|---|,,3,,,|---|Šœ,ŠœŠœ,,,,,,,,|^^^^^|-gg-|------|,,,,g''''''B!!!!!!!!!!!!!!!!!Z", - "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|bb,3,bb|))_____)_____))|bbT|,,3,,,|Tbb|Šœ,,,,,,,Š¼Š¼Š¼Š¼|^^^^^|hd.6|qd...o|,,,,|''''''ā„–!!!!!!!!!!!!!!!!!Z", - "`ā„–''|Ā°33333Ā°Ā°33333Ā°|-o,,,o-|^^^^^^^^^^^^^^^|o,,G,,,,,,G,,o|Šœ,ŠœŠœ,,,,,,,,|^^^^^|.d.6|hd..h.?,,,,| ' ā„–ā„–ZZZZZZZ!!{!!ZZZZZZ", - "`ā„–''|Ā°uuuuuĀ°Ā°uuuĀ°Ā°Ā°|bb,,,bb|^^^^^88888^^^^-|---|-BGGB-|---|---|-?-|Š¼Š¼Š¼Š¼|^^^^^@...6|......|,,,,| ' ā„–ā„–```````````````````", - "`ā„–''|Ā°33333Ā°Ā°33333Ā°|---G---|--G--|--------|^^^^^^^^^^^^|,X|777|,,,|----|-BĜB-|Y..1|%Š.11Y|,,,Š| ' ā„–````````````````````", - "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|'''''''''''''|66666611|^^^^^^^^^^^^|,X|Š‘Š‘Š‘|Š›,Š»|Š¹Š‘Š‘Šø|^^^^^|%...|----|-|-?--|ā„–ā„–Äœā„–ā„–````````````````````", - "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°ŠŸĆ˜''''''''''''|..h..h..|^^^^^^^^^^^^|,X|Š‘77|Š›,Š»|ŠšŠ‘Š‘Š‘=^^^^^|66..|Šd.1|vV...J| ' ā„–````````````````````", - "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°ŠŸĆ˜''''''''''''g........@^^^^^^^^^^^^?,,?Š‘77|Š›,Š»|----|^^^^^|--|?|hd.1|......g ' ā„–Ā±Ā±Ā±Ā±Ā±Ā±``````````````", - "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|Ƙ''''''''''''|.h,.....|^^^^^^^^^^^^|,3|Š‘Š‘Š‘|Š›,Š»|ŠšŠ‘Š‘Š‘=^^^|-|Š%|'|....|...t,A| ' ā„–`````}``````````````", - "`ā„–''|Ā°33333Ā°Ā°Ā°Ā°3u3Ā°|'''''''''''''|ddd66Š%Y|^^|---|^^^^^|,3|777|,,,|Š¹Š‘Š‘Šø|^^^|Y...|'|A..A|A..t,A| ' ā„–`````}``````````````", - "`ā„–''|Ā°uuuuuĀ°Ā°Ā°Ā°3u3Ā°|'''''''''''''|--------|^^|%dq|^^^^^|--|---|-@-|----|^^^@....|'|A..A|A..t,A| ' ā„–`````}``````````````", - "`ā„–''|Ā°33333Ā°Ā°Ā°Ā°3u3Ā°|'''''''''''''''''''''''^^|hd,?^^^^^^^^^^^^^^^^^^^^^^^^^|1.d.|'|....?......g ''}!!!!ĀµĀ±``````````````", - "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|'''''''''''''''''''''''^^|,,,|^^^^^^^^^^^^^^^^^^^^^^^^^|1.dH|'|11.%|qŠ%ooŠ°| ''Ā¶Ā±Ā±Ā±Ā±Ā±Ā±``````````````", - "`ā„–''|-------??-----|ĜĜ|------|-ĜĜ-|---?--|---|,,,|^^^^^^^^^^^^^^^^^^^^^^^^^|o.dĘ¼|'|----|-|----| ' ā„–````````````````````", - "`ā„–'' /|22Ā²Ā²Š˜Š˜Š˜Š˜Ā³Ā³Ā©Ā©|''||00000|^^^^|x,,,,y|,s,s,,s|^^^^^^^^^^^^^^^^^^^^^^^^^|----|''''''''|Š“Š“Š“Š”| ' ā„–````````````````````", - "`ā„–'' |Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|''}Ĝ....0|^^^^|x,,,,y|,h,h,,h|^^^^|-@---|^^^^^^^^^^^^^^?....|-?----|'|Ā§Ā¢Ā¢Ā¢| ' ā„–````````````````````", - "`ā„–'' gĀ§Ā°Ā°Ā°nnnnĀ°Ā°Ā°Ā°@''||....0|^^^^|,,,,,,|,,,,,,,|^^^^|%...6|^^^^^^^^^^^^^^|....|Ā¢Ā¢Ā¢Ā¢Ā„Ā¢|'|--?-| ' ā„–````````````````````", - "`ā„–'' gĀ§Ā°Ā°Ā°nnnnĀ°Ā°Ā°Ā°|'a||00000|^^^^|DDDWWW|,s,s,,s|^^^^|...h6|^^^^^^^^^^^^^^|Š–Š–Š–Š–|Š¾Š¾Ā¤Ā¤ŠĀ£|''''''Š’ ' ā„–````````````````````", - "`ā„–'' |Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|---------|^^^^|-------|h,h,,h|^^^^|Š1ddd|----G----|-@--|----|---|--|Š“Š’Š’Š’Š’Š’Š’ ' ā„–````````````````````", + "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|o,āø²T,,o|_))____)____))_|o,āø²G,,,,,,G,,o|---|,,,|----|333,333|,,+,hgh,=,|,,3| ' ā„–ā„–ZZZZZZZ!!{!!ZZZZZZ", + "`ā„–''|Ā°33333Ā°Ā°33333Ā°|bbāø²āø²,bb|__))___)___))__|---|,,,,,,|---|Šœ,ŠœŠœ,,,,Š¼Š¼Š¼Š¼|---?---|@-|-----|-|,,,|ā€™'''''ā„–!!!!!!!!!!!!!!!!!Z", + "`ā„–''|Ā°uuuuuĀ°Ā°uuuuuĀ°|-oāø²3,o-|f__)___)___)__f|bbT|,,3,,,|Tbb|Šœ,,,,,,,,,,āø²|^^^^^^^^^^Ĝ,,,,,,,,,,,gā€™'''''B!!!!!!!!!!!!!!!!!Z", + "`ā„–''|Ā°33333Ā°Ā°33333Ā°|bbāø²3,bb|__))___)___))__|o,āø²G,,3,,,G,,o|Šœ,ŠœŠœ,,,,,,,āø²@^^^^^^^^^^Ĝ,,,,,,,,,,,@ā€™'''''Ĝ!!!!!!!!!!!!!!!!!Z", + "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|-oāø²3,o-|_))____)____))_|---|,,3,,,|---|Šœ,ŠœŠœ,,,,,,,āø²|^^^^^|-gg-|------|,,,,gā€™'''''B!!!!!!!!!!!!!!!!!Z", + "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|bbāø²3,bb|))_____)_____))|bbT|,,3,,,|Tbb|Šœ,,,,,,,Š¼Š¼Š¼Š¼|^^^^^|hd.6|qd...o|,,,,|ā€™'''''ā„–!!!!!!!!!!!!!!!!!Z", + "`ā„–''|Ā°33333Ā°Ā°33333Ā°|-oāø²āø²,o-|^^^^^^^^^^^^^^^|o,āø²G,,,,,,G,,o|Šœ,ŠœŠœ,,,,,,,āø²|^^^^^|.d.6|hd..h.?,,,,| ' ā„–ā„–ZZZZZZZ!!{!!ZZZZZZ", + "`ā„–''|Ā°uuuuuĀ°Ā°uuuĀ°Ā°Ā°|bbāø²āø²,bb|^^^^^88888^^^^-|---|-BGGB-|---|---|-?-|Š¼Š¼Š¼Š¼|^^^^^@...6|......|,,,,| ' ā„–ā„–```````````````````", + "`ā„–''|Ā°33333Ā°Ā°33333Ā°|---G---|--G--|--------|^^^āˆ§āˆ§^^^^^^^|,X|777|,,,|----|-BĜB-|Y..1|%Š.11Y|,,,Š| ' ā„–````````````````````", + "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|''ā€™ā€™'''''''''|66666611|^^^āˆ§āˆ§^^^^^^^|,X|Š‘Š‘Š‘|Š›,Š»|Š¹Š‘Š‘Šø|^^^^^|%...|----|-|-?--|ā„–ā„–Äœā„–ā„–````````````````````", + "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°ŠŸĆ˜'ā€™ā€™'''''''''|..h..h..|^^^āˆ§āˆ§^^^^^^^|,X|Š‘77|Š›,Š»|ŠšŠ‘Š‘Š±=^^^^^|66..|Šd.1|vV...J| ' ā„–````````````````````", + "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°ŠŸĆ˜'ā€™ā€™'''''''''g........@^^^āˆ§āˆ§^^^^^^^?,,?Š‘77|Š›,Š»|----|^^^^^|--|?|hd.1|......g ' ā„–Ā±Ā±Ā±Ā±Ā±Ā±``````````````", + "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|Ƙ'ā€™ā€™'''''''''|.h,.....|^^^āˆ§āˆ§^^^^^^^|,3|Š‘Š‘Š‘|Š›,Š»|ŠšŠ‘Š‘Š±=^^^|-|Š%|'|....|...t,A| ' ā„–`````}``````````````", + "`ā„–ā€™ā€™|Ā°33333Ā°Ā°Ā°Ā°3u3Ā°|ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™|ddd66Š%Y|āˆ§āˆ§|---|āˆ§āˆ§āˆ§āˆ§āˆ§|āø²3|777|āø²āø²āø²|Š¹Š±Š±Šø|āˆ§āˆ§āˆ§|Yāø¼āø¼āø¼|ā€™|Aāø¼āø¼A|Aāø¼āø¼tāø²A| ā€™ ā„–`````}``````````````", + "`ā„–ā€™ā€™|Ā°uuuuuĀ°Ā°Ā°Ā°3u3Ā°|ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™ā€™|--------|āˆ§āˆ§|%dq|āˆ§āˆ§āˆ§āˆ§āˆ§|--|---|-@-|----|āˆ§āˆ§āˆ§@āø¼āø¼āø¼āø¼|ā€™|Aāø¼āø¼A|Aāø¼āø¼tāø²A| ā€™ ā„–`````}``````````````", + "`ā„–''|Ā°33333Ā°Ā°Ā°Ā°3u3Ā°|''ā€™ā€™'''''''''''''''''''^^|hd,?^^^^^^^^^^^^^^^^^^^^āˆ§āˆ§^^^|1.d.|'|....?......g ''}!!!!ĀµĀ±``````````````", + "`ā„–''|Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|''ā€™ā€™'''''''''''''''''''^^|āø²āø²,|^^^^^^^^^^^^^^^^^^^^āˆ§āˆ§^^^|1.dH|'|11.%|qŠ%ooŠ°| ''Ā¶Ā±Ā±Ā±Ā±Ā±Ā±``````````````", + "`ā„–''|-------??-----|ĜĜ|------|-ĜĜ-|---?--|---|āø²āø²,|^^^^^^^^^^^^^^^^^^^^āˆ§āˆ§^^^|o.dĘ¼|'|----|-|----| ' ā„–````````````````````", + "`ā„–'' /|22Ā²Ā²Š˜Š˜Š˜Š˜Ā³Ā³Ā©Ā©|''||00000|^^^^|x,,,,y|,s,sāø²āø²s|^^^^^^^^^^^^^^^^^^^^āˆ§āˆ§^^^|----|''''''''|Š“Š“Š“Š”| ' ā„–````````````````````", + "`ā„–'' |Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|''}Ĝ....0|^^^^|x,,,,y|,h,hāø²āø²h|^^^^|-@---|^^^^^^^^^āˆ§āˆ§^^^?....|-?----|'|Ā§Ā¢Ā¢Ā¢| ' ā„–````````````````````", + "`ā„–'' gĀ§Ā°Ā°Ā°nnnnĀ°Ā°Ā°Ā°@''||....0|^^^^|,,,,,,|,,,,āø²āø²,|^^^^|%...6|^^^^^^^^^āˆ§āˆ§^^^|....|Ā¢Ā¢Ā¢Ā¢Ā„Ā¢|'|--?-| ' ā„–````````````````````", + "`ā„–'' gĀ§Ā°Ā°Ā°nnnnĀ°Ā°Ā°Ā°|'a||00000|^^^^|DDDWWW|,s,sāø²āø²s|^^^^|...h6|^^^^^^^^^āˆ§āˆ§^^^|Š–Š–Š–Š–|Š¾Š¾Ā¤Ā¤ŠĀ£|''''''Š’ ' ā„–````````````````````", + "`ā„–'' |Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°Ā°|---------|^^^^|-------|h,hāø²āø²h|^^^^|Š1ddd|----G----|-@--|----|---|--|Š“Š’Š’Š’Š’Š’Š’ ' ā„–````````````````````", "`ā„–'' |qqŠ˜Š˜eeŠ˜Š˜Š˜Š˜SS|b|b|b|b|b|^^^^|ŠAAAooo|------|-G--|--|gg|bo|,,,|ob|Y..Š|S44|%.dq|/ ' ā„–````````````````````", - "`ā„–''|--------------|bobobobob|^^^^|,,,,,,,H|b,T|.....|T,b| |b,G,,,G,b|........?..dHg''''''''''''' ā„–````````````````````", - "`ā„–''|U|U|U|U|Š—...dd|,,,,,,,,,|^^^^?,,ddd,,,|b,,G.....G,,b| |,T|,,,|T,|........|....|' |w-|w-|w-|--ā„–````````````````````", - "`ā„–''|Š“|Š“|Š“|Š“|1....h|T,,3333,,G^^^^|%,,h,,,H|---|.....|---| |--|,,,|--|=-|=-|=-|m.1-|' |CI|CI|CI|ŠšŠ¹ā„–````````````````````", - "`ā„–''g..............|,,,,,,,,,|^^^^|--------|b,T|.....|T,b| |bo|,,,|ob|,c|,c|,c|m.Š—|'' |C.|C.|C.|Š‘Š‘ā„–````````````````````", - "`ā„–''|..........|-@-|,obobobob|^^^^@......d5|b,,G.....G,,b| |b,G,,,G,b|,,|,,|,,|---|' |.h|.h|.h|Š‘Š‘ā„–````````````````````", - "`ā„–''|QQQRRRcccS|/''|9|b|b|b|b|^^^^|-=|Y..dH|---|.....|---| |,T|,,,|T,|bb|bb|bb|/ '' /|.d|.d|.d|Š‘Šøā„–````````````````````", + "`ā„–''|--------------|bobobobob|^^^^|,,,,,,,H|b,T|.....|T,b| |b,G,,,G,b|āø¼.......?..dHg'''''''''ā€™ā€™'' ā„–````````````````````", + "`ā„–''|U|U|U|U|Š—...dd|,,āø²āø²,,,,,|^^^^?,,ddd,,,|b,āø²G.....G,,b| |,T|,,,|T,|āø¼.......|....|' |w-|w-|w-|--ā„–````````````````````", + "`ā„–''|Š“|Š“|Š“|Š“|1....h|T,āø²3333,,G^^^^|%,,h,,,H|---|.....|---| |--|,,,|--|=-|=-|=-|m.1-|' |CI|CI|CI|ŠšŠ¹ā„–````````````````````", + "`ā„–''g..............|,,āø²āø²,,,,,|^^^^|--------|b,T|.....|T,b| |bo|,,,|ob|āø²c|,c|,c|m.Š—|'' |C.|C.|Cāø¼|Š‘Š‘ā„–````````````````````", + "`ā„–''|..........|-@-|,obobobob|^^^^@......d5|b,āø²G.....G,,b| |b,G,,,G,b|āø²,|,,|,,|---|' |.h|.h|āø¼h|Š‘Š‘ā„–````````````````````", + "`ā„–''|QQQRRRcccS|/''|9|b|b|b|b|^^^^|-=|Y..dH|---|.....|---| |,T|,,,|T,|bb|bb|bb|/ '' /|.d|.d|āø¼d|Š‘Šøā„–````````````````````", "`ā„–''|-------g--|'''|---------|-ĜĜ-|Š‘Š‘|.....|b,T|.ddd.|T,b| |--|---|--|--------| '|--|+-|+-|+-|=-ā„–````````````````````", - "`ā„–'''''''Š’::::::'''Š“'''''''''''''/|Š¹Šø|11.%q|b,,G.6h..G,,b|''''''''''''''''''''''''''+..............g````````````````````", + "`ā„–'''''''Š’::::::'''Š“''ā€™ā€™'''''''''/|Š¹Šø|11.%q|b,āø²G.6h..G,,b|''''''''''''ā€™ā€™''''''''''''+.........āø¼āø¼...g````````````````````", "`ā„–'ā„–ā„–@ā„–ā„–'Š’:::::::::Š’ ''' |-----g--|---|-----|---|' ā„–ā„–@ā„–ā„– |+-|+-|+-|+-|=-ā„–````````````````````", - "`ā„–'ā„–...ā„–'Š’:;;;:::::Š’ ''''''''''''''''''''''''''''' ā„–...ā„– |.d|.d|.d|.d|Š‘Š™ā„–````````````````````", - "`ā„–'ā„–>..ā„–'Š’:::::::::Š’ '' ā„–..>ā„– |.h|.h|.h|.h|Š‘Š‘ā„–````````````````````", - "`ā„–'ā„–ā„–ā„–ā„–ā„–'Š’Š’Š’Š’Š’Š’Š’Š’Š’Š’Š’ '' ā„–ā„–ā„–ā„–ā„– |C.|C.|C.|C.|Š‘Š‘ā„–````````````````````", - "`ā„–''''''''''''''''''''''''''' |CI|CI|CI|CI|Š‘7ā„–````````````````````", + "`ā„–'ā„–...ā„–'Š’:;;;:::::Š’ ''''''''''''''''ā€™ā€™''''''''''' ā„–...ā„– |.d|.d|.d|āø¼d|Š‘Š™ā„–````````````````````", + "`ā„–'ā„–>..ā„–'Š’:::::::::Š’ '' ā„–..>ā„– |.h|.h|.h|āø¼h|Š‘Š‘ā„–````````````````````", + "`ā„–'ā„–ā„–ā„–ā„–ā„–'Š’Š’Š’Š’Š’Š’Š’Š’Š’Š’Š’ '' ā„–ā„–ā„–ā„–ā„– |C.|C.|C.|Cāø¼|Š‘Š‘ā„–````````````````````", + "`ā„–''''''''''''''''''''ā€™ā€™''''' |CI|CI|CI|CI|Š‘7ā„–````````````````````", "`ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–ā„–gā„–ā„–gā„–ā„–gā„–ā„–gā„–ā„–ā„–ā„–ā„–````````````````````", "````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````" ], @@ -950,6 +950,8 @@ "-": "t_brick_wall", "|": "t_brick_wall", "ā„–": "t_concrete_wall", + "āø²": "t_floor", + "āø¼": "t_floor", ".": [ "t_floor" ], ":": [ "t_region_groundcover_barren" ], "#": [ "t_sand" ], @@ -967,7 +969,9 @@ ")": [ "t_pavement_y" ], "}": [ "t_door_metal_locked" ], "`": [ [ "t_water_dp", 20 ], "t_water_sh" ], + "āˆ§": [ "t_concrete" ], "^": [ "t_concrete" ], + "ā€™": [ "t_concrete" ], "'": [ "t_concrete" ], "Ƙ": [ "t_concrete" ], "Ā£": [ "t_thconc_floor" ], @@ -1024,6 +1028,7 @@ "Z": [ "t_fence_rope" ], "Š": [ "t_floor" ], "Š°": [ "t_floor" ], + "Š±": [ "t_linoleum_white" ], "Š‘": [ "t_linoleum_white" ], "Š’": [ "t_chainfence" ], "Š“": [ "t_chaingate_l" ], @@ -1183,17 +1188,25 @@ }, "vendingmachines": { "v": { "item_group": "vending_drink" }, "V": { "item_group": "vending_food" } }, "monster": { + "āø²": [ + { "monster": "mon_zombie_prisoner", "chance": 2 }, + { "monster": "mon_zombie_prisoner_fat", "chance": 2 }, + { "monster": "mon_zombie_prisoner_tough", "chance": 2 } + ], ",": [ { "monster": "mon_zombie_prisoner", "chance": 2 }, { "monster": "mon_zombie_prisoner_fat", "chance": 2 }, { "monster": "mon_zombie_prisoner_tough", "chance": 2 } ], + "āø¼": { "monster": "mon_zombie_cop", "chance": 1 }, ".": { "monster": "mon_zombie_cop", "chance": 1 }, "Ā¢": { "monster": "mon_zombie_technician", "chance": 20 }, + "āˆ§": { "monster": "mon_zombie_prisoner_brute", "chance": 1 }, "^": { "monster": "mon_zombie_prisoner_brute", "chance": 1 }, "`": { "monster": "mon_zhark", "chance": 1 }, ":": { "monster": "mon_dog_gshepherd", "chance": 1 }, "U": { "monster": "mon_dog_gshepherd", "chance": 10 }, + "ā€™": [ { "monster": "mon_dog_zombie_cop", "chance": 1 }, { "monster": "mon_zombie_cop", "chance": 1 } ], "'": [ { "monster": "mon_dog_zombie_cop", "chance": 1 }, { "monster": "mon_zombie_cop", "chance": 1 } ] }, "place_monster": [ diff --git a/data/json/mapgen_palettes/mi-go_palette.json b/data/json/mapgen_palettes/mi-go_palette.json index 888ca25f50de4..910db5815ca17 100644 --- a/data/json/mapgen_palettes/mi-go_palette.json +++ b/data/json/mapgen_palettes/mi-go_palette.json @@ -25,8 +25,7 @@ "p": "t_platform_resin", "v": "t_open_air", "_": "t_resin_roof", - ".": "t_region_groundcover", - "@": "t_null" + ";": "t_region_groundcover" }, "furniture": { "i": "f_alien_tendril", From 5d156c4d7658f2b25ba59afca97674eed619272a Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Mon, 3 Jan 2022 12:53:52 +0100 Subject: [PATCH 087/154] removed redundant blueprint resource sections --- .../recipe_modular_field_common.json | 429 ++---------------- .../recipe_modular_field_defenses.json | 88 +--- .../version_1/recipe_modular_field_wood.json | 242 +--------- 3 files changed, 62 insertions(+), 697 deletions(-) diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_common.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_common.json index 0dd7be1f227b9..5477c8ef37173 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_common.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_common.json @@ -63,16 +63,7 @@ "blueprint_name": "northeast fireplace", "blueprint_requires": [ { "id": "fbmh_northeast" } ], "blueprint_provides": [ { "id": "fbmh_fire_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_fire_northeast" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 2 ], [ "survival", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "DIG", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ [ [ "rock", 40 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_fire_northeast" } ] }, { "type": "recipe", @@ -99,19 +90,13 @@ "description": "Now that we have some cover, we should build a stove in the northeast shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", - "skill_used": "fabrication", "autolearn": false, "never_learn": true, "construction_blueprint": "fbmh_stove_northeast", "blueprint_name": "northeast stove", "blueprint_requires": [ { "id": "fbmh_northeast" } ], "blueprint_provides": [ { "id": "fbmh_fire_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_fire_northeast" } ], - "blueprint_needs": { - "time": "1 h", - "skills": [ [ "fabrication", 5 ], [ "mechanics", 3 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SAW_M" } ] ], "components": [ [ [ "metal_tank", 1 ] ], [ [ "pipe", 1 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_fire_northeast" } ] }, { "type": "recipe", @@ -126,16 +111,7 @@ "blueprint_name": "northeast straw bed", "blueprint_requires": [ { "id": "fbmh_northeast" } ], "blueprint_provides": [ { "id": "bed" }, { "id": "fbmh_bed1_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_northeast" } ], - "blueprint_needs": { - "time": "1 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 8 ], [ "stick", 8 ] ], [ [ "straw_pile", 16 ], [ "withered", 16 ], [ "pine_bough", 16 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_northeast" } ] }, { "type": "recipe", @@ -150,21 +126,7 @@ "blueprint_name": "northeast bed", "blueprint_requires": [ { "id": "fbmh_northeast" } ], "blueprint_provides": [ { "id": "bed" }, { "id": "fbmh_bed1_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_northeast" } ], - "blueprint_needs": { - "time": "3 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 30 ] ], - [ [ "wood_sheet", 1 ], [ "wood_panel", 2 ] ], - [ [ "nail", 36 ] ], - [ [ "mattress", 2 ], [ "down_mattress", 2 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_northeast" } ] }, { "type": "recipe", @@ -179,16 +141,7 @@ "blueprint_name": "northeast straw bed", "blueprint_requires": [ { "id": "fbmh_bed1_northeast" }, { "id": "fbmh_northeast", "amount": 2 } ], "blueprint_provides": [ { "id": "bed" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_bed2_northeast" } ], - "blueprint_needs": { - "time": "1 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 8 ], [ "stick", 8 ] ], [ [ "straw_pile", 16 ], [ "withered", 16 ], [ "pine_bough", 16 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed2_northeast" } ] }, { "type": "recipe", @@ -203,21 +156,7 @@ "blueprint_name": "northeast bed", "blueprint_requires": [ { "id": "fbmh_bed1_northeast" }, { "id": "fbmh_northeast", "amount": 2 } ], "blueprint_provides": [ { "id": "bed" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_bed2_northeast" } ], - "blueprint_needs": { - "time": "3 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 30 ] ], - [ [ "wood_sheet", 1 ], [ "wood_panel", 2 ] ], - [ [ "nail", 36 ] ], - [ [ "mattress", 2 ], [ "down_mattress", 2 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed2_northeast" } ] }, { "type": "recipe", @@ -232,16 +171,7 @@ "blueprint_name": "east straw beds", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ] }, { "type": "recipe", @@ -256,21 +186,7 @@ "blueprint_name": "east beds", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ] }, { "type": "recipe", @@ -285,16 +201,7 @@ "blueprint_name": "east straw beds", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -309,21 +216,7 @@ "blueprint_name": "east beds", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -338,16 +231,7 @@ "blueprint_name": "southeast straw beds", "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ] }, { "type": "recipe", @@ -362,21 +246,7 @@ "blueprint_name": "southeast beds", "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ] }, { "type": "recipe", @@ -391,16 +261,7 @@ "blueprint_name": "southeast straw beds", "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" }, { "id": "fbmh_tent_southeast" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" }, { "id": "fbmh_tent_southeast" } ] }, { "type": "recipe", @@ -415,21 +276,7 @@ "blueprint_name": "southeast beds", "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" }, { "id": "fbmh_tent_southeast" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" }, { "id": "fbmh_tent_southeast" } ] }, { "type": "recipe", @@ -444,16 +291,7 @@ "blueprint_name": "northwest straw beds", "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ] }, { "type": "recipe", @@ -468,21 +306,7 @@ "blueprint_name": "northwest beds", "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ] }, { "type": "recipe", @@ -497,16 +321,7 @@ "blueprint_name": "west straw beds", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ] }, { "type": "recipe", @@ -521,21 +336,7 @@ "blueprint_name": "west beds", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ] }, { "type": "recipe", @@ -550,16 +351,7 @@ "blueprint_name": "west straw beds", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -574,21 +366,7 @@ "blueprint_name": "west beds", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -603,16 +381,7 @@ "blueprint_name": "southwest straw beds", "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ] }, { "type": "recipe", @@ -627,21 +396,7 @@ "blueprint_name": "southwest beds", "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ] }, { "type": "recipe", @@ -656,16 +411,7 @@ "blueprint_name": "southwest straw beds", "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" }, { "id": "fbmh_tent_southwest" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ ], - "components": [ [ [ "2x4", 16 ], [ "stick", 16 ] ], [ [ "straw_pile", 32 ], [ "withered", 32 ], [ "pine_bough", 32 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" }, { "id": "fbmh_tent_southwest" } ] }, { "type": "recipe", @@ -680,21 +426,7 @@ "blueprint_name": "southwest beds", "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], - "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" }, { "id": "fbmh_tent_southwest" } ], - "blueprint_needs": { - "time": "6 h", - "skills": [ [ "fabrication", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 60 ] ], - [ [ "wood_sheet", 2 ], [ "wood_panel", 4 ] ], - [ [ "nail", 72 ] ], - [ [ "mattress", 4 ], [ "down_mattress", 4 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" }, { "id": "fbmh_tent_southwest" } ] }, { "type": "recipe", @@ -709,16 +441,7 @@ "blueprint_name": "central fireplace", "blueprint_requires": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], "blueprint_provides": [ { "id": "trapping" }, { "id": "hunting" }, { "id": "kitchen" }, { "id": "kitchen_recipes_1" } ], - "blueprint_resources": [ "fake_fireplace", "pot" ], - "blueprint_needs": { - "time": "2 h 30 m", - "skills": [ [ "fabrication", 2 ], [ "survival", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "DIG", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ [ [ "2x4", 2 ] ], [ [ "wood_sheet", 1 ], [ "wood_panel", 2 ] ], [ [ "nail", 8 ] ], [ [ "rock", 40 ] ] ] - } - } + "blueprint_resources": [ "fake_fireplace", "pot" ] }, { "type": "recipe", @@ -732,35 +455,7 @@ "construction_blueprint": "fbmh_core_kitchen_butchery_center", "blueprint_name": "central butchery rack", "blueprint_requires": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_provides": [ { "id": "trapping" }, { "id": "hunting" } ], - "blueprint_needs": { - "time": "45 m", - "skills": [ [ "survival", 3 ], [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ - [ "cordage_36", 2 ], - [ "cordage_6", 12 ], - [ "plant_fibre", 600 ], - [ "rope_6", 1 ], - [ "rope_makeshift_6", 1 ], - [ "sinew", 600 ], - [ "string_36", 2 ], - [ "string_6", 12 ], - [ "thread", 600 ], - [ "thread_kevlar", 600 ], - [ "thread_nomex", 600 ], - [ "vine_6", 1 ], - [ "wire", 8 ], - [ "yarn", 600 ] - ], - [ [ "pointy_stick", 2 ], [ "spike", 2 ] ], - [ [ "stick_long", 6 ] ] - ] - } - } + "blueprint_provides": [ { "id": "trapping" }, { "id": "hunting" } ] }, { "type": "recipe", @@ -774,16 +469,7 @@ "construction_blueprint": "fbmh_core_kitchen_toolrack_center", "blueprint_name": "central tool rack", "blueprint_requires": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_provides": [ { "id": "tool_storage" } ], - "blueprint_needs": { - "time": "1 h", - "skills": [ [ "fabrication", 1 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ [ [ "2x4", 6 ] ], [ [ "wood_sheet", 1 ], [ "wood_panel", 2 ] ], [ [ "nail", 16 ] ] ] - } - } + "blueprint_provides": [ { "id": "tool_storage" } ] }, { "type": "recipe", @@ -797,16 +483,7 @@ "construction_blueprint": "fbmh_core_kitchen_table_center", "blueprint_name": "central dining hall", "blueprint_requires": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], - "blueprint_provides": [ { "id": "relaying" }, { "id": "walls" }, { "id": "recruiting" }, { "id": "scouting" }, { "id": "patrolling" } ], - "blueprint_needs": { - "time": "3 h", - "skills": [ [ "fabrication", 2 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ [ [ "2x4", 24 ] ], [ [ "wood_sheet", 2 ], [ "wood_panel", 2 ] ], [ [ "nail", 48 ] ] ] - } - } + "blueprint_provides": [ { "id": "relaying" }, { "id": "walls" }, { "id": "recruiting" }, { "id": "scouting" }, { "id": "patrolling" } ] }, { "type": "recipe", @@ -821,16 +498,7 @@ "construction_blueprint": "fbmh_core_kitchen_table_south", "blueprint_name": "south dining hall", "blueprint_requires": [ { "id": "fbmh_south", "amount": 4 }, { "id": "fbmh_se_south" }, { "id": "fbmh_sw_south" } ], - "blueprint_provides": [ { "id": "relaying" }, { "id": "walls" }, { "id": "recruiting" }, { "id": "scouting" }, { "id": "patrolling" } ], - "blueprint_needs": { - "time": "3 h", - "skills": [ [ "fabrication", 2 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ [ [ "2x4", 24 ] ], [ [ "wood_sheet", 2 ], [ "wood_panel", 2 ] ], [ [ "nail", 48 ] ] ] - } - } + "blueprint_provides": [ { "id": "relaying" }, { "id": "walls" }, { "id": "recruiting" }, { "id": "scouting" }, { "id": "patrolling" } ] }, { "type": "recipe", @@ -845,22 +513,7 @@ "blueprint_name": "south wood stove", "blueprint_resources": [ "fake_woodstove" ], "blueprint_requires": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_provides": [ { "id": "trapping" }, { "id": "hunting" }, { "id": "kitchen" }, { "id": "kitchen_recipes_1" } ], - "blueprint_needs": { - "time": "1 h 30 m", - "skills": [ [ "fabrication", 5 ], [ "mechanics", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 2 ] ], - [ [ "wood_sheet", 1 ], [ "wood_panel", 2 ] ], - [ [ "nail", 8 ] ], - [ [ "metal_tank", 1 ] ], - [ [ "pipe", 1 ] ] - ] - } - } + "blueprint_provides": [ { "id": "trapping" }, { "id": "hunting" }, { "id": "kitchen" }, { "id": "kitchen_recipes_1" } ] }, { "type": "recipe", @@ -874,16 +527,7 @@ "construction_blueprint": "fbmh_well_north", "blueprint_name": "north water well", "blueprint_provides": [ { "id": "water_well" } ], - "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_needs": { - "time": "11 h", - "skills": [ [ "fabrication", 4 ], [ "mechanics", 2 ], [ "survival", 4 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "DIG", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "rock", 40 ] ], [ [ "2x4", 4 ] ], [ [ "nail", 8 ] ], [ [ "well_pump", 1 ] ], [ [ "pipe", 6 ] ] ] - } - } + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ] }, { "type": "recipe", @@ -897,16 +541,7 @@ "construction_blueprint": "fbmh_root_cellar_north", "blueprint_name": "north root cellar", "blueprint_provides": [ { "id": "pantry" } ], - "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_needs": { - "time": "7 h 10 m", - "skills": [ [ "survival", 4 ], [ "fabrication", 4 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 7000 ], [ "jackhammer", 140 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ [ [ "2x4", 6 ], [ "stick", 6 ] ], [ [ "brick", 40 ], [ "rock", 40 ] ], [ [ "straw_pile", 12 ], [ "withered", 12 ] ] ] - } - } + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ] }, { "type": "recipe", diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_defenses.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_defenses.json index b1df09f3d343b..c0401b0a3e34d 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_defenses.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_defenses.json @@ -12,16 +12,7 @@ "blueprint_name": "north trench", "blueprint_provides": [ { "id": "fbmh_trench_north" } ], "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbm_no_dig" } ], - "blueprint_needs": { - "time": "3 d 18 h", - "skills": [ [ "survival", 3 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 126000 ], [ "jackhammer", 2520 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ] ], - "components": [ ] - } - } + "blueprint_excludes": [ { "id": "fbm_no_dig" } ] }, { "type": "recipe", @@ -36,16 +27,7 @@ "blueprint_name": "south trench", "blueprint_provides": [ { "id": "fbmh_trench_south" } ], "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbm_no_dig" } ], - "blueprint_needs": { - "time": "3 d 18 h", - "skills": [ [ "survival", 3 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 126000 ], [ "jackhammer", 2520 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ] ], - "components": [ ] - } - } + "blueprint_excludes": [ { "id": "fbm_no_dig" } ] }, { "type": "recipe", @@ -60,16 +42,7 @@ "blueprint_name": "northeast trench", "blueprint_provides": [ { "id": "fbmh_trench_northeast" } ], "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_northeast" }, { "id": "fbmh_trench_east" } ], - "blueprint_needs": { - "time": "1 d 1 h", - "skills": [ [ "survival", 3 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 35000 ], [ "jackhammer", 700 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ] ], - "components": [ ] - } - } + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_northeast" }, { "id": "fbmh_trench_east" } ] }, { "type": "recipe", @@ -84,16 +57,7 @@ "blueprint_name": "northwest trench", "blueprint_provides": [ { "id": "fbmh_trench_northwest" } ], "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_northwest" }, { "id": "fbmh_trench_west" } ], - "blueprint_needs": { - "time": "1 d 1 h", - "skills": [ [ "survival", 3 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 35000 ], [ "jackhammer", 700 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ] ], - "components": [ ] - } - } + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_northwest" }, { "id": "fbmh_trench_west" } ] }, { "type": "recipe", @@ -108,16 +72,7 @@ "blueprint_name": "southeast trench", "blueprint_provides": [ { "id": "fbmh_trench_southeast" } ], "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southeast" }, { "id": "fbmh_trench_east" } ], - "blueprint_needs": { - "time": "1 d 1 h", - "skills": [ [ "survival", 3 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 35000 ], [ "jackhammer", 700 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ] ], - "components": [ ] - } - } + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southeast" }, { "id": "fbmh_trench_east" } ] }, { "type": "recipe", @@ -132,16 +87,7 @@ "blueprint_name": "southwest trench", "blueprint_provides": [ { "id": "fbmh_trench_southwest" } ], "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southwest" }, { "id": "fbmh_trench_west" } ], - "blueprint_needs": { - "time": "1 d 1 h", - "skills": [ [ "survival", 3 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 35000 ], [ "jackhammer", 700 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ] ], - "components": [ ] - } - } + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southwest" }, { "id": "fbmh_trench_west" } ] }, { "type": "recipe", @@ -156,16 +102,7 @@ "blueprint_name": "east trench", "blueprint_provides": [ { "id": "fbmh_trench_east" } ], "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southeast" }, { "id": "fbmh_trench_northeast" } ], - "blueprint_needs": { - "time": "5 d 20 h", - "skills": [ [ "survival", 3 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 196000 ], [ "jackhammer", 3920 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ] ], - "components": [ ] - } - } + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southeast" }, { "id": "fbmh_trench_northeast" } ] }, { "type": "recipe", @@ -180,15 +117,6 @@ "blueprint_name": "west trench", "blueprint_provides": [ { "id": "fbmh_trench_west" } ], "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southwest" }, { "id": "fbmh_trench_northwest" } ], - "blueprint_needs": { - "time": "5 d 20 h", - "skills": [ [ "survival", 3 ] ], - "inline": { - "tools": [ [ [ "elec_jackhammer", 196000 ], [ "jackhammer", 3920 ], [ "pickaxe", -1 ] ] ], - "qualities": [ [ { "id": "DIG", "level": 2 } ] ], - "components": [ ] - } - } + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southwest" }, { "id": "fbmh_trench_northwest" } ] } ] diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wood.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wood.json index 3e625b322c8dd..c92962dd2e9cb 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wood.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wood.json @@ -12,16 +12,7 @@ "blueprint_name": "northeast shack", "blueprint_requires": [ { "id": "fbmh_0" } ], "blueprint_provides": [ { "id": "fbmh_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_northeast" } ], - "blueprint_needs": { - "time": "13 h 20 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 64 ] ], [ [ "nail", 320 ] ], [ [ "wood_sheet", 8 ], [ "wood_panel", 16 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast" } ] }, { "type": "recipe", @@ -36,16 +27,7 @@ "blueprint_name": "expand northeast shack", "blueprint_requires": [ { "id": "fbmh_northeast" } ], "blueprint_provides": [ { "id": "fbmh_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "15 h 45 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 75 ] ], [ [ "glass_sheet", 1 ] ], [ [ "nail", 350 ] ], [ [ "wood_panel", 16 ], [ "wood_sheet", 8 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -60,16 +42,7 @@ "blueprint_name": "finish northeast shack", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 2 } ], "blueprint_provides": [ { "id": "fbmh_northeast", "amount": 2 } ], - "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "10 h 50 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 84 ] ], [ [ "nail", 316 ] ], [ [ "wood_panel", 15 ] ], [ [ "hinge", 2 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -84,16 +57,7 @@ "blueprint_name": "east shack", "blueprint_requires": [ { "id": "fbmh_tent_northeast" }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_east" } ], - "blueprint_needs": { - "time": "2 d 11 h 25 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 309 ] ], [ [ "nail", 1422 ] ], [ [ "wood_panel", 68 ] ], [ [ "hinge", 4 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_east" } ] }, { "type": "recipe", @@ -108,16 +72,7 @@ "blueprint_name": "east room", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "2 d 15 h 25 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 303 ] ], [ [ "nail", 1462 ] ], [ [ "wood_panel", 70 ] ], [ [ "hinge", 4 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -132,16 +87,7 @@ "blueprint_name": "southeast shack", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southeast" } ], - "blueprint_needs": { - "time": "2 d 11 h 25 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 309 ] ], [ [ "nail", 1422 ] ], [ [ "wood_panel", 68 ] ], [ [ "hinge", 4 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southeast" } ] }, { "type": "recipe", @@ -156,16 +102,7 @@ "blueprint_name": "southeast room", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "2 d 14 h 5 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 293 ] ], [ [ "nail", 1422 ] ], [ [ "wood_panel", 68 ] ], [ [ "hinge", 4 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -180,16 +117,7 @@ "blueprint_name": "northwest shack", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_northwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_northwest" } ], - "blueprint_needs": { - "time": "1 d 15 h 55 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 223 ] ], [ [ "nail", 986 ] ], [ [ "wood_panel", 47 ] ], [ [ "hinge", 2 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northwest" } ] }, { "type": "recipe", @@ -204,16 +132,7 @@ "blueprint_name": "west shack", "blueprint_requires": [ { "id": "fbmh_tent_northwest" } ], "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_west" } ], - "blueprint_needs": { - "time": "2 d 11 h 25 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 309 ] ], [ [ "nail", 1422 ] ], [ [ "wood_panel", 68 ] ], [ [ "hinge", 4 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_west" } ] }, { "type": "recipe", @@ -228,16 +147,7 @@ "blueprint_name": "west room", "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ], - "blueprint_needs": { - "time": "2 d 15 h 25 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 303 ] ], [ [ "nail", 1462 ] ], [ [ "wood_panel", 70 ] ], [ [ "hinge", 4 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ] }, { "type": "recipe", @@ -252,16 +162,7 @@ "blueprint_name": "southwest shack", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southwest" } ], - "blueprint_needs": { - "time": "2 d 11 h 25 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 309 ] ], [ [ "nail", 1422 ] ], [ [ "wood_panel", 68 ] ], [ [ "hinge", 4 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southwest" } ] }, { "type": "recipe", @@ -276,16 +177,7 @@ "blueprint_name": "southwest room", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "2 d 14 h 5 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 293 ] ], [ [ "nail", 1422 ] ], [ [ "wood_panel", 68 ] ], [ [ "hinge", 4 ] ], [ [ "glass_sheet", 1 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -300,16 +192,7 @@ "blueprint_name": "central building NE corner", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" } ], - "blueprint_needs": { - "time": "1 d 6 h 50 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 144 ] ], [ [ "nail", 716 ] ], [ [ "wood_panel", 35 ] ], [ [ "hinge", 2 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" } ] }, { "type": "recipe", @@ -324,16 +207,7 @@ "blueprint_name": "central building NE corner", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "1 d 10 h", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 120 ] ], [ [ "nail", 720 ] ], [ [ "wood_sheet", 18 ], [ "wood_panel", 36 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -348,16 +222,7 @@ "blueprint_name": "central building NW corner", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_nw_center" } ], - "blueprint_needs": { - "time": "1 d 7 h", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 148 ] ], [ [ "nail", 712 ] ], [ [ "wood_panel", 34 ] ], [ [ "hinge", 4 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_nw_center" } ] }, { "type": "recipe", @@ -372,16 +237,7 @@ "blueprint_name": "central building NW corner", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "1 d 10 h 10 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 124 ] ], [ [ "nail", 716 ] ], [ [ "wood_panel", 35 ] ], [ [ "hinge", 2 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -396,16 +252,7 @@ "blueprint_name": "central building north half", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 }, { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "2 d 20 h 10 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 244 ] ], [ [ "nail", 1436 ] ], [ [ "wood_panel", 71 ] ], [ [ "hinge", 2 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -420,16 +267,7 @@ "blueprint_name": "central building SE corner", "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], - "blueprint_excludes": [ { "id": "fbmh_se_south" } ], - "blueprint_needs": { - "time": "1 d 7 h", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 148 ] ], [ [ "nail", 712 ] ], [ [ "wood_panel", 34 ] ], [ [ "hinge", 4 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_se_south" } ] }, { "type": "recipe", @@ -444,16 +282,7 @@ "blueprint_name": "central building SE corner", "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], - "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ], - "blueprint_needs": { - "time": "1 d 10 h 10 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 124 ] ], [ [ "nail", 716 ] ], [ [ "wood_panel", 35 ] ], [ [ "hinge", 2 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ] }, { "type": "recipe", @@ -468,16 +297,7 @@ "blueprint_name": "central building SW corner", "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmh_sw_south" } ], - "blueprint_needs": { - "time": "1 d 6 h 50 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 144 ] ], [ [ "nail", 716 ] ], [ [ "wood_panel", 35 ] ], [ [ "hinge", 2 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_sw_south" } ] }, { "type": "recipe", @@ -492,16 +312,7 @@ "blueprint_name": "central building SW corner", "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ], - "blueprint_needs": { - "time": "1 d 10 h", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 120 ] ], [ [ "nail", 720 ] ], [ [ "wood_sheet", 18 ], [ "wood_panel", 36 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ] }, { "type": "recipe", @@ -521,15 +332,6 @@ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southeast" }, { "id": "fbmh_tent_southwest" } - ], - "blueprint_needs": { - "time": "2 d 20 h 10 m", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 244 ] ], [ [ "nail", 1436 ] ], [ [ "wood_panel", 71 ] ], [ [ "hinge", 2 ] ] ] - } - } + ] } ] From 29b7473ee15f66ad5220e0348746771b820226bf Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Wed, 29 Dec 2021 12:42:47 -0700 Subject: [PATCH 088/154] Add weather description widget - New display::weather_text_color - current weather conditions, in color - New weather_text widget_var - showing weather_text_color - New weather_desc widget using weather_text var - Add weather_desc to light/moon/wind/temp section of custom sidebar - Test cases (fixing scoped_weather_override to refresh current weather) --- data/json/ui/sidebar.json | 2 +- data/json/ui/weather.json | 9 +++++ data/mods/TEST_DATA/widgets.json | 7 ++++ src/panels.cpp | 12 +++++++ src/panels.h | 2 +- src/widget.cpp | 6 ++++ src/widget.h | 1 + tests/options_helpers.cpp | 3 ++ tests/widget_test.cpp | 56 ++++++++++++++++++++++++++++++++ 9 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 data/json/ui/weather.json diff --git a/data/json/ui/sidebar.json b/data/json/ui/sidebar.json index c08b0a1950c7c..23cf3172560d4 100644 --- a/data/json/ui/sidebar.json +++ b/data/json/ui/sidebar.json @@ -841,7 +841,7 @@ "label": "Environment", "style": "layout", "arrange": "rows", - "widgets": [ "lighting_desc", "moon_phase_desc", "wind_desc", "env_temp_desc" ] + "widgets": [ "lighting_desc", "moon_phase_desc", "weather_desc", "wind_desc", "env_temp_desc" ] }, { "id": "place_date_time_layout", diff --git a/data/json/ui/weather.json b/data/json/ui/weather.json new file mode 100644 index 0000000000000..3042c161777a2 --- /dev/null +++ b/data/json/ui/weather.json @@ -0,0 +1,9 @@ +[ + { + "id": "weather_desc", + "type": "widget", + "label": "Weather", + "style": "text", + "var": "weather_text" + } +] diff --git a/data/mods/TEST_DATA/widgets.json b/data/mods/TEST_DATA/widgets.json index e10ed0e315ea9..94ff8d288b473 100644 --- a/data/mods/TEST_DATA/widgets.json +++ b/data/mods/TEST_DATA/widgets.json @@ -152,6 +152,13 @@ "var": "stat_per", "style": "number" }, + { + "id": "test_weather_text", + "type": "widget", + "label": "Weather", + "var": "weather_text", + "style": "text" + }, { "id": "test_weariness_num", "type": "widget", diff --git a/src/panels.cpp b/src/panels.cpp index a3fc9e8e708b9..aa13fba1ca873 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -2157,6 +2157,18 @@ static void draw_wind_padding( const draw_args &args ) render_wind( args, " %s: " ); } +std::pair display::weather_text_color( const Character &u ) +{ + if( u.pos().z < 0 ) { + return std::make_pair( _( "Underground" ), c_light_gray ); + } else { + weather_manager &weather = get_weather(); + std::string weather_text = weather.weather_id->name.translated(); + nc_color weather_color = weather.weather_id->color; + return std::make_pair( weather_text, weather_color ); + } +} + static void draw_health_classic( const draw_args &args ) { const avatar &u = args._ava; diff --git a/src/panels.h b/src/panels.h index c7d8f6845d97d..714513781cb5e 100644 --- a/src/panels.h +++ b/src/panels.h @@ -86,7 +86,6 @@ std::pair morale_emotion( const int morale_cur, const moo // Current movement mode (as single letter) and color std::pair move_mode_text_color( const Character &u ); -// TODO: Swap text/string order to match previous functions std::pair temp_text_color( const Character &u ); std::pair power_text_color( const Character &u ); std::pair mana_text_color( const Character &you ); @@ -96,6 +95,7 @@ std::pair int_text_color( const Character &p ); std::pair per_text_color( const Character &p ); std::pair safe_mode_text_color( const bool classic_mode ); std::pair wind_text_color( const Character &u ); +std::pair weather_text_color( const Character &u ); // Define color for displaying the body temperature nc_color bodytemp_color( const Character &u, const bodypart_id &bp ); diff --git a/src/widget.cpp b/src/widget.cpp index ddef3a1be28bc..6264e2c72258c 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -135,6 +135,8 @@ std::string enum_to_string( widget_var data ) return "thirst_text"; case widget_var::time_text: return "time_text"; + case widget_var::weather_text: + return "weather_text"; case widget_var::weariness_text: return "weariness_text"; case widget_var::weary_malus_text: @@ -424,6 +426,7 @@ bool widget::uses_text_function() case widget_var::style_text: case widget_var::thirst_text: case widget_var::time_text: + case widget_var::weather_text: case widget_var::weariness_text: case widget_var::weary_malus_text: case widget_var::weight_text: @@ -496,6 +499,9 @@ std::string widget::color_text_function_string( const avatar &ava ) case widget_var::time_text: desc.first = display::time_string( ava ); break; + case widget_var::weather_text: + desc = display::weather_text_color( ava ); + break; case widget_var::weariness_text: desc = display::weariness_text_color( ava ); break; diff --git a/src/widget.h b/src/widget.h index 5c8fe7f6fdb08..ba8232f7d569b 100644 --- a/src/widget.h +++ b/src/widget.h @@ -60,6 +60,7 @@ enum class widget_var : int { style_text, // Active martial arts style name thirst_text, // Thirst description text, color string time_text, // Current time - exact if character has a watch, approximate otherwise + weather_text, // Weather/sky conditions (if visible), color string weariness_text, // Weariness description text, color string weary_malus_text, // Weariness malus or penalty weight_text, // Weight description text, color string diff --git a/tests/options_helpers.cpp b/tests/options_helpers.cpp index 2d24ac90df7a4..001d2a64497d4 100644 --- a/tests/options_helpers.cpp +++ b/tests/options_helpers.cpp @@ -19,11 +19,13 @@ override_option::~override_option() scoped_weather_override::scoped_weather_override( const weather_type_id &weather ) { get_weather().weather_override = weather; + get_weather().set_nextweather( calendar::turn ); } void scoped_weather_override::with_windspeed( const int windspeed_override ) { get_weather().windspeed_override = windspeed_override; + get_weather().set_nextweather( calendar::turn ); } scoped_weather_override::~scoped_weather_override() @@ -31,4 +33,5 @@ scoped_weather_override::~scoped_weather_override() weather_manager &weather = get_weather(); weather.weather_override = WEATHER_NULL; weather.windspeed_override.reset(); + get_weather().set_nextweather( calendar::turn ); } diff --git a/tests/widget_test.cpp b/tests/widget_test.cpp index 0044ebda34bc7..482f427e7858f 100644 --- a/tests/widget_test.cpp +++ b/tests/widget_test.cpp @@ -2,10 +2,20 @@ #include "player_helpers.h" #include "morale.h" +#include "options_helpers.h" +#include "weather.h" +#include "weather_type.h" #include "widget.h" static const itype_id itype_rad_badge( "rad_badge" ); +static const weather_type_id weather_acid_rain( "acid_rain" ); +static const weather_type_id weather_cloudy( "cloudy" ); +static const weather_type_id weather_drizzle( "drizzle" ); +static const weather_type_id weather_portal_storm( "portal_storm" ); +static const weather_type_id weather_snowing( "snowing" ); +static const weather_type_id weather_sunny( "sunny" ); + // test widgets defined in data/json/sidebar.json and data/mods/TEST_DATA/widgets.json static const widget_id widget_test_2_column_layout( "test_2_column_layout" ); static const widget_id widget_test_3_column_layout( "test_3_column_layout" ); @@ -34,6 +44,7 @@ static const widget_id widget_test_stat_panel( "test_stat_panel" ); static const widget_id widget_test_str_num( "test_str_num" ); static const widget_id widget_test_text_widget( "test_text_widget" ); static const widget_id widget_test_weariness_num( "test_weariness_num" ); +static const widget_id widget_test_weather_text( "test_weather_text" ); TEST_CASE( "widget value strings", "[widget][value][string]" ) { @@ -513,3 +524,48 @@ TEST_CASE( "layout widgets in columns", "[widget][layout][columns]" ) // "MOVE: 0 SPEED: 100 FOCUS: 100 MANA: 1000 " } +TEST_CASE( "widgets showing weather conditions", "[widget][weather]" ) +{ + widget weather_w = widget_test_weather_text.obj(); + + avatar &ava = get_avatar(); + clear_avatar(); + + SECTION( "weather conditions" ) { + SECTION( "sunny" ) { + scoped_weather_override forecast( weather_sunny ); + REQUIRE( get_weather().weather_id->name.translated() == "Sunny" ); + CHECK( weather_w.layout( ava ) == "Weather: Sunny" ); + } + + SECTION( "cloudy" ) { + scoped_weather_override forecast( weather_cloudy ); + CHECK( weather_w.layout( ava ) == "Weather: Cloudy" ); + } + + SECTION( "drizzle" ) { + scoped_weather_override forecast( weather_drizzle ); + CHECK( weather_w.layout( ava ) == "Weather: Drizzle" ); + } + + SECTION( "snowing" ) { + scoped_weather_override forecast( weather_snowing ); + CHECK( weather_w.layout( ava ) == "Weather: Snowing" ); + } + + SECTION( "acid rain" ) { + scoped_weather_override forecast( weather_acid_rain ); + CHECK( weather_w.layout( ava ) == "Weather: Acid Rain" ); + } + + SECTION( "portal storm" ) { + scoped_weather_override forecast( weather_portal_storm ); + CHECK( weather_w.layout( ava ) == "Weather: Portal Storm" ); + } + + SECTION( "cannot see weather when underground" ) { + ava.setpos( tripoint_below ); + CHECK( weather_w.layout( ava ) == "Weather: Underground" ); + } + } +} From 6b5fb45a4cb26f5a1f7353636a41f97ed63439cf Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Mon, 3 Jan 2022 16:19:51 +0800 Subject: [PATCH 089/154] Use pimpl class for TranslationManagerImpl --- src/translation_manager.cpp | 5 ----- src/translation_manager.h | 22 +++------------------ src/translation_manager_impl.cpp | 32 +++++++++++++++---------------- src/translation_manager_impl.h | 25 ++++++++++++------------ tests/translation_system_test.cpp | 4 ++-- 5 files changed, 33 insertions(+), 55 deletions(-) diff --git a/src/translation_manager.cpp b/src/translation_manager.cpp index 23e121c0bda47..e17deb8585563 100644 --- a/src/translation_manager.cpp +++ b/src/translation_manager.cpp @@ -8,11 +8,6 @@ TranslationManager &TranslationManager::GetInstance() return singleton; } -TranslationManager::TranslationManager() -{ - impl = std::make_unique(); -} - std::unordered_set TranslationManager::GetAvailableLanguages() { return impl->GetAvailableLanguages(); diff --git a/src/translation_manager.h b/src/translation_manager.h index a9b99612cdb70..79a0ce5aa777e 100644 --- a/src/translation_manager.h +++ b/src/translation_manager.h @@ -8,30 +8,14 @@ #include #include -class TranslationManagerInterface -{ - public: - virtual ~TranslationManagerInterface() = default; - virtual std::unordered_set GetAvailableLanguages() = 0; - virtual void SetLanguage( const std::string &language_code ) = 0; - virtual std::string GetCurrentLanguage() const = 0; - virtual void LoadDocuments( const std::vector &files ) = 0; - - virtual const char *Translate( const std::string &message ) const = 0; - virtual const char *Translate( const char *message ) const = 0; - virtual const char *TranslatePlural( const char *singular, const char *plural, - std::size_t n ) const = 0; - virtual const char *TranslateWithContext( const char *context, const char *message ) const = 0; - virtual const char *TranslatePluralWithContext( const char *context, const char *singular, - const char *plural, std::size_t n ) const = 0; -}; +#include "pimpl.h" class TranslationManager { private: - std::unique_ptr impl; + class Impl; + pimpl impl; public: - TranslationManager(); static TranslationManager &GetInstance(); std::unordered_set GetAvailableLanguages(); void SetLanguage( const std::string &language_code ); diff --git a/src/translation_manager_impl.cpp b/src/translation_manager_impl.cpp index ab2560df0a3b4..a0675c7f35ea1 100644 --- a/src/translation_manager_impl.cpp +++ b/src/translation_manager_impl.cpp @@ -9,7 +9,7 @@ #include "translations.h" #include "translation_manager_impl.h" -std::uint32_t TranslationManagerImpl::Hash( const char *str ) +std::uint32_t TranslationManager::Impl::Hash( const char *str ) { std::uint32_t hash = 5381U; while( *str != '\0' ) { @@ -18,7 +18,7 @@ std::uint32_t TranslationManagerImpl::Hash( const char *str ) return hash; } -cata::optional> TranslationManagerImpl::LookupString( +cata::optional> TranslationManager::Impl::LookupString( const char *query ) const { std::uint32_t hash = Hash( query ); @@ -36,7 +36,7 @@ cata::optional> TranslationManagerImpl::Look return cata::nullopt; } -std::string TranslationManagerImpl::LanguageCodeOfPath( const std::string &path ) +std::string TranslationManager::Impl::LanguageCodeOfPath( const std::string &path ) { const std::size_t end = path.rfind( "/LC_MESSAGES" ); if( end == std::string::npos ) { @@ -49,7 +49,7 @@ std::string TranslationManagerImpl::LanguageCodeOfPath( const std::string &path return path.substr( begin, end - begin ); } -void TranslationManagerImpl::ScanTranslationDocuments() +void TranslationManager::Impl::ScanTranslationDocuments() { DebugLog( D_INFO, DC_ALL ) << "[i18n] Scanning core translations from " << locale_dir(); DebugLog( D_INFO, DC_ALL ) << "[i18n] Scanning mod translations from " << PATH_INFO::user_moddir(); @@ -73,19 +73,19 @@ void TranslationManagerImpl::ScanTranslationDocuments() } } -void TranslationManagerImpl::Reset() +void TranslationManager::Impl::Reset() { documents.clear(); strings.clear(); strings.max_load_factor( 1.0f ); } -TranslationManagerImpl::TranslationManagerImpl() +TranslationManager::Impl::Impl() { current_language_code = "en"; } -std::unordered_set TranslationManagerImpl::GetAvailableLanguages() +std::unordered_set TranslationManager::Impl::GetAvailableLanguages() { if( mo_files.empty() ) { ScanTranslationDocuments(); @@ -97,7 +97,7 @@ std::unordered_set TranslationManagerImpl::GetAvailableLanguages() return languages; } -void TranslationManagerImpl::SetLanguage( const std::string &language_code ) +void TranslationManager::Impl::SetLanguage( const std::string &language_code ) { if( mo_files.empty() ) { ScanTranslationDocuments(); @@ -113,12 +113,12 @@ void TranslationManagerImpl::SetLanguage( const std::string &language_code ) LoadDocuments( mo_files[current_language_code] ); } -std::string TranslationManagerImpl::GetCurrentLanguage() const +std::string TranslationManager::Impl::GetCurrentLanguage() const { return current_language_code; } -void TranslationManagerImpl::LoadDocuments( const std::vector &files ) +void TranslationManager::Impl::LoadDocuments( const std::vector &files ) { Reset(); for( const std::string &file : files ) { @@ -150,12 +150,12 @@ void TranslationManagerImpl::LoadDocuments( const std::vector &file } } -const char *TranslationManagerImpl::Translate( const std::string &message ) const +const char *TranslationManager::Impl::Translate( const std::string &message ) const { return Translate( message.c_str() ); } -const char *TranslationManagerImpl::Translate( const char *message ) const +const char *TranslationManager::Impl::Translate( const char *message ) const { cata::optional> entry = LookupString( message ); if( entry ) { @@ -166,7 +166,7 @@ const char *TranslationManagerImpl::Translate( const char *message ) const return message; } -const char *TranslationManagerImpl::TranslatePlural( const char *singular, const char *plural, +const char *TranslationManager::Impl::TranslatePlural( const char *singular, const char *plural, std::size_t n ) const { cata::optional> entry = LookupString( singular ); @@ -182,7 +182,7 @@ const char *TranslationManagerImpl::TranslatePlural( const char *singular, const } } -std::string TranslationManagerImpl::ConstructContextualQuery( const char *context, +std::string TranslationManager::Impl::ConstructContextualQuery( const char *context, const char *message ) const { std::string query; @@ -193,7 +193,7 @@ std::string TranslationManagerImpl::ConstructContextualQuery( const char *contex return query; } -const char *TranslationManagerImpl::TranslateWithContext( const char *context, +const char *TranslationManager::Impl::TranslateWithContext( const char *context, const char *message ) const { std::string query = ConstructContextualQuery( context, message ); @@ -206,7 +206,7 @@ const char *TranslationManagerImpl::TranslateWithContext( const char *context, return message; } -const char *TranslationManagerImpl::TranslatePluralWithContext( const char *context, +const char *TranslationManager::Impl::TranslatePluralWithContext( const char *context, const char *singular, const char *plural, std::size_t n ) const diff --git a/src/translation_manager_impl.h b/src/translation_manager_impl.h index afd53812ccab4..8771c5413eee6 100644 --- a/src/translation_manager_impl.h +++ b/src/translation_manager_impl.h @@ -10,7 +10,7 @@ #include "translation_document.h" #include "translation_manager.h" -class TranslationManagerImpl : public TranslationManagerInterface +class TranslationManager::Impl { private: std::vector documents; @@ -26,19 +26,18 @@ class TranslationManagerImpl : public TranslationManagerInterface void Reset(); std::string current_language_code; public: - TranslationManagerImpl(); - std::unordered_set GetAvailableLanguages() override; - void SetLanguage( const std::string &language_code ) override; - std::string GetCurrentLanguage() const override; - void LoadDocuments( const std::vector &files ) override; - - const char *Translate( const std::string &message ) const override; - const char *Translate( const char *message ) const override; - const char *TranslatePlural( const char *singular, const char *plural, - std::size_t n ) const override; - const char *TranslateWithContext( const char *context, const char *message ) const override; + Impl(); + std::unordered_set GetAvailableLanguages(); + void SetLanguage( const std::string &language_code ); + std::string GetCurrentLanguage() const; + void LoadDocuments( const std::vector &files ); + + const char *Translate( const std::string &message ) const; + const char *Translate( const char *message ) const; + const char *TranslatePlural( const char *singular, const char *plural, std::size_t n ) const; + const char *TranslateWithContext( const char *context, const char *message ) const; const char *TranslatePluralWithContext( const char *context, const char *singular, - const char *plural, std::size_t n ) const override; + const char *plural, std::size_t n ) const; }; #endif // defined(LOCALIZE) diff --git a/tests/translation_system_test.cpp b/tests/translation_system_test.cpp index 49c5fcba301c1..a6d37143002c3 100644 --- a/tests/translation_system_test.cpp +++ b/tests/translation_system_test.cpp @@ -3,7 +3,7 @@ #include "filesystem.h" #include "string_formatter.h" #include "translation_document.h" -#include "translation_manager.h" +#include "translation_manager_impl.h" #if defined(LOCALIZE) @@ -79,7 +79,7 @@ TEST_CASE( "TranslationManager loading benchmark", "[.][benchmark][translations] BENCHMARK( "Load Russian" ) { TranslationManager manager; manager.LoadDocuments( std::vector {"./lang/mo/ru/LC_MESSAGES/cataclysm-dda.mo"} ); - return manager; + return manager.Translate( "battery" ); }; } From d5e3aa2963d582621dd3fd893cb56265c8cf6fec Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Mon, 3 Jan 2022 17:58:49 +0800 Subject: [PATCH 090/154] Forbid copy and move construction of TranslationManager --- src/translation_manager.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/translation_manager.h b/src/translation_manager.h index 79a0ce5aa777e..848f45b4e1f60 100644 --- a/src/translation_manager.h +++ b/src/translation_manager.h @@ -16,6 +16,9 @@ class TranslationManager class Impl; pimpl impl; public: + TranslationManager() = default; + TranslationManager( const TranslationManager & ) = delete; + TranslationManager( TranslationManager && ) = delete; static TranslationManager &GetInstance(); std::unordered_set GetAvailableLanguages(); void SetLanguage( const std::string &language_code ); From a1982d99bd9b35a625239b32995a5ed55b43282c Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Mon, 3 Jan 2022 14:59:03 +0100 Subject: [PATCH 091/154] hub 1 blueprint cleanup wad --- .../version_1/recipe_modular_field_wad.json | 473 +----------------- 1 file changed, 22 insertions(+), 451 deletions(-) diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wad.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wad.json index c320d63a80a9b..d93771478b653 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wad.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wad.json @@ -12,25 +12,7 @@ "blueprint_name": "northeast shack", "blueprint_requires": [ { "id": "fbmh_0" } ], "blueprint_provides": [ { "id": "fbmh_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_northeast" } ], - "blueprint_needs": { - "time": "14 h 40 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 72 ], [ "stick", 96 ] ], - [ [ "material_quicklime", 32 ], [ "material_limestone", 32 ], [ "clay_lump", 32 ] ], - [ [ "pebble", 80 ], [ "material_sand", 80 ] ], - [ [ "straw_pile", 32 ], [ "cattail_stalk", 32 ], [ "dogbane", 32 ], [ "pine_bough", 32 ] ], - [ [ "water", 40 ], [ "water_clean", 40 ] ], - [ [ "log", 8 ] ], - [ [ "material_soil", 160 ] ], - [ [ "birchbark", 48 ], [ "pine_bough", 48 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast" } ] }, { "type": "recipe", @@ -45,25 +27,7 @@ "blueprint_name": "expand northeast shack", "blueprint_requires": [ { "id": "fbmh_northeast" } ], "blueprint_provides": [ { "id": "fbmh_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "15 h 50 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 75 ], [ "stick", 90 ] ], - [ [ "material_quicklime", 28 ], [ "material_limestone", 28 ], [ "clay_lump", 28 ] ], - [ [ "pebble", 70 ], [ "material_sand", 70 ] ], - [ [ "straw_pile", 28 ], [ "cattail_stalk", 28 ], [ "dogbane", 28 ], [ "pine_bough", 28 ] ], - [ [ "water", 35 ], [ "water_clean", 35 ] ], - [ [ "log", 10 ] ], - [ [ "material_soil", 200 ] ], - [ [ "birchbark", 60 ], [ "pine_bough", 60 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -79,24 +43,7 @@ "blueprint_name": "finish northeast shack", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 2 } ], "blueprint_provides": [ { "id": "fbmh_northeast", "amount": 2 } ], - "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "13 h 10 m", - "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 88 ] ], - [ [ "nail", 24 ] ], - [ [ "material_quicklime", 56 ], [ "material_limestone", 56 ], [ "clay_lump", 56 ] ], - [ [ "pebble", 140 ], [ "material_sand", 140 ] ], - [ [ "straw_pile", 56 ], [ "cattail_stalk", 56 ], [ "dogbane", 56 ], [ "pine_bough", 56 ] ], - [ [ "water", 70 ], [ "water_clean", 70 ] ], - [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -111,27 +58,7 @@ "blueprint_name": "east shack", "blueprint_requires": [ { "id": "fbmh_tent_northeast" }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_east" } ], - "blueprint_needs": { - "time": "2 d 16 h 10 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 339 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 140 ], [ "material_limestone", 140 ], [ "clay_lump", 140 ] ], - [ [ "pebble", 350 ], [ "material_sand", 350 ] ], - [ [ "straw_pile", 140 ], [ "cattail_stalk", 140 ], [ "dogbane", 140 ], [ "pine_bough", 140 ] ], - [ [ "water", 175 ], [ "water_clean", 175 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 32 ] ], - [ [ "material_soil", 640 ] ], - [ [ "birchbark", 192 ], [ "pine_bough", 192 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_east" } ] }, { "type": "recipe", @@ -147,27 +74,7 @@ "blueprint_name": "east room", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "2 d 19 h 10 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 341 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 116 ], [ "material_limestone", 116 ], [ "clay_lump", 116 ] ], - [ [ "pebble", 290 ], [ "material_sand", 290 ] ], - [ [ "straw_pile", 116 ], [ "cattail_stalk", 116 ], [ "dogbane", 116 ], [ "pine_bough", 116 ] ], - [ [ "water", 145 ], [ "water_clean", 145 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 40 ] ], - [ [ "material_soil", 800 ] ], - [ [ "birchbark", 240 ], [ "pine_bough", 240 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -182,27 +89,7 @@ "blueprint_name": "southeast shack", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southeast" } ], - "blueprint_needs": { - "time": "2 d 16 h 10 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 339 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 140 ], [ "material_limestone", 140 ], [ "clay_lump", 140 ] ], - [ [ "pebble", 350 ], [ "material_sand", 350 ] ], - [ [ "straw_pile", 140 ], [ "cattail_stalk", 140 ], [ "dogbane", 140 ], [ "pine_bough", 140 ] ], - [ [ "water", 175 ], [ "water_clean", 175 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 32 ] ], - [ [ "material_soil", 640 ] ], - [ [ "birchbark", 192 ], [ "pine_bough", 192 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southeast" } ] }, { "type": "recipe", @@ -218,27 +105,7 @@ "blueprint_name": "southeast room", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "2 d 17 h 30 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 331 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 108 ], [ "material_limestone", 108 ], [ "clay_lump", 108 ] ], - [ [ "pebble", 270 ], [ "material_sand", 270 ] ], - [ [ "straw_pile", 108 ], [ "cattail_stalk", 108 ], [ "dogbane", 108 ], [ "pine_bough", 108 ] ], - [ [ "water", 135 ], [ "water_clean", 135 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 40 ] ], - [ [ "material_soil", 800 ] ], - [ [ "birchbark", 240 ], [ "pine_bough", 240 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -253,27 +120,7 @@ "blueprint_name": "northwest shack", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_northwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_northwest" } ], - "blueprint_needs": { - "time": "1 d 19 h 40 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 235 ] ], - [ [ "nail", 24 ] ], - [ [ "material_quicklime", 116 ], [ "material_limestone", 116 ], [ "clay_lump", 116 ] ], - [ [ "pebble", 290 ], [ "material_sand", 290 ] ], - [ [ "straw_pile", 116 ], [ "cattail_stalk", 116 ], [ "dogbane", 116 ], [ "pine_bough", 116 ] ], - [ [ "water", 145 ], [ "water_clean", 145 ] ], - [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ], - [ [ "log", 18 ] ], - [ [ "material_soil", 360 ] ], - [ [ "birchbark", 108 ], [ "pine_bough", 108 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northwest" } ] }, { "type": "recipe", @@ -288,27 +135,7 @@ "blueprint_name": "west shack", "blueprint_requires": [ { "id": "fbmh_tent_northwest" } ], "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_west" } ], - "blueprint_needs": { - "time": "2 d 16 h 10 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 339 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 140 ], [ "material_limestone", 140 ], [ "clay_lump", 140 ] ], - [ [ "pebble", 350 ], [ "material_sand", 350 ] ], - [ [ "straw_pile", 140 ], [ "cattail_stalk", 140 ], [ "dogbane", 140 ], [ "pine_bough", 140 ] ], - [ [ "water", 175 ], [ "water_clean", 175 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 32 ] ], - [ [ "material_soil", 640 ] ], - [ [ "birchbark", 192 ], [ "pine_bough", 192 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_west" } ] }, { "type": "recipe", @@ -323,27 +150,7 @@ "blueprint_name": "west room", "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ], - "blueprint_needs": { - "time": "2 d 19 h 10 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 341 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 116 ], [ "material_limestone", 116 ], [ "clay_lump", 116 ] ], - [ [ "pebble", 290 ], [ "material_sand", 290 ] ], - [ [ "straw_pile", 116 ], [ "cattail_stalk", 116 ], [ "dogbane", 116 ], [ "pine_bough", 116 ] ], - [ [ "water", 145 ], [ "water_clean", 145 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 40 ] ], - [ [ "material_soil", 800 ] ], - [ [ "birchbark", 240 ], [ "pine_bough", 240 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ] }, { "type": "recipe", @@ -358,27 +165,7 @@ "blueprint_name": "southwest shack", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southwest" } ], - "blueprint_needs": { - "time": "2 d 16 h 10 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 339 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 140 ], [ "material_limestone", 140 ], [ "clay_lump", 140 ] ], - [ [ "pebble", 350 ], [ "material_sand", 350 ] ], - [ [ "straw_pile", 140 ], [ "cattail_stalk", 140 ], [ "dogbane", 140 ], [ "pine_bough", 140 ] ], - [ [ "water", 175 ], [ "water_clean", 175 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 32 ] ], - [ [ "material_soil", 640 ] ], - [ [ "birchbark", 192 ], [ "pine_bough", 192 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southwest" } ] }, { "type": "recipe", @@ -393,27 +180,7 @@ "blueprint_name": "southwest room", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "2 d 17 h 30 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 331 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 108 ], [ "material_limestone", 108 ], [ "clay_lump", 108 ] ], - [ [ "pebble", 270 ], [ "material_sand", 270 ] ], - [ [ "straw_pile", 108 ], [ "cattail_stalk", 108 ], [ "dogbane", 108 ], [ "pine_bough", 108 ] ], - [ [ "water", 135 ], [ "water_clean", 135 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 40 ] ], - [ [ "material_soil", 800 ] ], - [ [ "birchbark", 240 ], [ "pine_bough", 240 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -428,27 +195,7 @@ "blueprint_name": "central building NE corner", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" } ], - "blueprint_needs": { - "time": "1 d 9 h 10 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 168 ] ], - [ [ "nail", 24 ] ], - [ [ "material_quicklime", 56 ], [ "material_limestone", 56 ], [ "clay_lump", 56 ] ], - [ [ "pebble", 140 ], [ "material_sand", 140 ] ], - [ [ "straw_pile", 56 ], [ "cattail_stalk", 56 ], [ "dogbane", 56 ], [ "pine_bough", 56 ] ], - [ [ "water", 70 ], [ "water_clean", 70 ] ], - [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ], - [ [ "log", 20 ] ], - [ [ "material_soil", 400 ] ], - [ [ "birchbark", 120 ], [ "pine_bough", 120 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" } ] }, { "type": "recipe", @@ -463,25 +210,7 @@ "blueprint_name": "central building NE corner", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "1 d 11 h", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 150 ], [ "stick", 120 ] ], - [ [ "material_quicklime", 24 ], [ "material_limestone", 24 ], [ "clay_lump", 24 ] ], - [ [ "pebble", 60 ], [ "material_sand", 60 ] ], - [ [ "straw_pile", 24 ], [ "cattail_stalk", 24 ], [ "dogbane", 24 ], [ "pine_bough", 24 ] ], - [ [ "water", 30 ], [ "water_clean", 30 ] ], - [ [ "log", 30 ] ], - [ [ "material_soil", 600 ] ], - [ [ "birchbark", 180 ], [ "pine_bough", 180 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -496,27 +225,7 @@ "blueprint_name": "central building NW corner", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_nw_center" } ], - "blueprint_needs": { - "time": "1 d 9 h", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 176 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 48 ], [ "material_limestone", 48 ], [ "clay_lump", 48 ] ], - [ [ "pebble", 120 ], [ "material_sand", 120 ] ], - [ [ "straw_pile", 48 ], [ "cattail_stalk", 48 ], [ "dogbane", 48 ], [ "pine_bough", 48 ] ], - [ [ "water", 60 ], [ "water_clean", 60 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 20 ] ], - [ [ "material_soil", 400 ] ], - [ [ "birchbark", 120 ], [ "pine_bough", 120 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_nw_center" } ] }, { "type": "recipe", @@ -531,27 +240,7 @@ "blueprint_name": "central building NW corner", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "1 d 10 h 50 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 158 ] ], - [ [ "nail", 24 ] ], - [ [ "material_quicklime", 16 ], [ "material_limestone", 16 ], [ "clay_lump", 16 ] ], - [ [ "pebble", 40 ], [ "material_sand", 40 ] ], - [ [ "straw_pile", 16 ], [ "cattail_stalk", 16 ], [ "dogbane", 16 ], [ "pine_bough", 16 ] ], - [ [ "water", 20 ], [ "water_clean", 20 ] ], - [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ], - [ [ "log", 30 ] ], - [ [ "material_soil", 600 ] ], - [ [ "birchbark", 180 ], [ "pine_bough", 180 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -566,27 +255,7 @@ "blueprint_name": "central building north half", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 }, { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "2 d 21 h 50 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 308 ] ], - [ [ "nail", 24 ] ], - [ [ "material_quicklime", 40 ], [ "material_limestone", 40 ], [ "clay_lump", 40 ] ], - [ [ "pebble", 100 ], [ "material_sand", 100 ] ], - [ [ "straw_pile", 40 ], [ "cattail_stalk", 40 ], [ "dogbane", 40 ], [ "pine_bough", 40 ] ], - [ [ "water", 50 ], [ "water_clean", 50 ] ], - [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ], - [ [ "log", 60 ] ], - [ [ "material_soil", 1200 ] ], - [ [ "birchbark", 360 ], [ "pine_bough", 360 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -601,27 +270,7 @@ "blueprint_name": "central building SE corner", "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], - "blueprint_excludes": [ { "id": "fbmh_se_south" } ], - "blueprint_needs": { - "time": "1 d 9 h", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 176 ] ], - [ [ "nail", 48 ] ], - [ [ "material_quicklime", 48 ], [ "material_limestone", 48 ], [ "clay_lump", 48 ] ], - [ [ "pebble", 120 ], [ "material_sand", 120 ] ], - [ [ "straw_pile", 48 ], [ "cattail_stalk", 48 ], [ "dogbane", 48 ], [ "pine_bough", 48 ] ], - [ [ "water", 60 ], [ "water_clean", 60 ] ], - [ [ "rope_makeshift_6", 4 ], [ "rope_6", 4 ] ], - [ [ "log", 20 ] ], - [ [ "material_soil", 400 ] ], - [ [ "birchbark", 120 ], [ "pine_bough", 120 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_se_south" } ] }, { "type": "recipe", @@ -637,27 +286,7 @@ "blueprint_name": "central building SE corner", "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], - "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ], - "blueprint_needs": { - "time": "1 d 10 h 50 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 158 ] ], - [ [ "nail", 24 ] ], - [ [ "material_quicklime", 16 ], [ "material_limestone", 16 ], [ "clay_lump", 16 ] ], - [ [ "pebble", 40 ], [ "material_sand", 40 ] ], - [ [ "straw_pile", 16 ], [ "cattail_stalk", 16 ], [ "dogbane", 16 ], [ "pine_bough", 16 ] ], - [ [ "water", 20 ], [ "water_clean", 20 ] ], - [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ], - [ [ "log", 30 ] ], - [ [ "material_soil", 600 ] ], - [ [ "birchbark", 180 ], [ "pine_bough", 180 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ] }, { "type": "recipe", @@ -672,27 +301,7 @@ "blueprint_name": "central building SW corner", "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmh_sw_south" } ], - "blueprint_needs": { - "time": "1 d 9 h 10 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 168 ] ], - [ [ "nail", 24 ] ], - [ [ "material_quicklime", 56 ], [ "material_limestone", 56 ], [ "clay_lump", 56 ] ], - [ [ "pebble", 140 ], [ "material_sand", 140 ] ], - [ [ "straw_pile", 56 ], [ "cattail_stalk", 56 ], [ "dogbane", 56 ], [ "pine_bough", 56 ] ], - [ [ "water", 70 ], [ "water_clean", 70 ] ], - [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ], - [ [ "log", 20 ] ], - [ [ "material_soil", 400 ] ], - [ [ "birchbark", 120 ], [ "pine_bough", 120 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_sw_south" } ] }, { "type": "recipe", @@ -707,25 +316,7 @@ "blueprint_name": "central building SW corner", "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ], - "blueprint_needs": { - "time": "1 d 11 h", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 150 ], [ "stick", 120 ] ], - [ [ "material_quicklime", 24 ], [ "material_limestone", 24 ], [ "clay_lump", 24 ] ], - [ [ "pebble", 60 ], [ "material_sand", 60 ] ], - [ [ "straw_pile", 24 ], [ "cattail_stalk", 24 ], [ "dogbane", 24 ], [ "pine_bough", 24 ] ], - [ [ "water", 30 ], [ "water_clean", 30 ] ], - [ [ "log", 30 ] ], - [ [ "material_soil", 600 ] ], - [ [ "birchbark", 180 ], [ "pine_bough", 180 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ] }, { "type": "recipe", @@ -745,26 +336,6 @@ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southeast" }, { "id": "fbmh_tent_southwest" } - ], - "blueprint_needs": { - "time": "2 d 21 h 50 m", - "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ - [ [ "2x4", 308 ] ], - [ [ "nail", 24 ] ], - [ [ "material_quicklime", 40 ], [ "material_limestone", 40 ], [ "clay_lump", 40 ] ], - [ [ "pebble", 100 ], [ "material_sand", 100 ] ], - [ [ "straw_pile", 40 ], [ "cattail_stalk", 40 ], [ "dogbane", 40 ], [ "pine_bough", 40 ] ], - [ [ "water", 50 ], [ "water_clean", 50 ] ], - [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ], - [ [ "log", 60 ] ], - [ [ "material_soil", 1200 ] ], - [ [ "birchbark", 360 ], [ "pine_bough", 360 ] ] - ] - } - } + ] } ] From a4d1e3153ef483ee891fd8ff0860c4e07e71f4f0 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Mon, 3 Jan 2022 18:13:30 +0100 Subject: [PATCH 092/154] hub 1 blueprint cleanup tent, rock, rammed earth, mi-go resin --- .../version_1/modular_field_migo_resin.json | 2 +- .../version_1/modular_field_rammed_earth.json | 2 +- .../version_1/modular_field_rock.json | 2 +- .../version_1/modular_field_tent.json | 2 +- .../version_1/modular_field_wad.json | 2 +- .../version_1/modular_field_wood.json | 2 +- .../recipe_modular_field_migo_resin.json | 154 +++--------------- 7 files changed, 28 insertions(+), 138 deletions(-) diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_migo_resin.json b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_migo_resin.json index e08e55f4f2b14..05fdea4c37b68 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_migo_resin.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_migo_resin.json @@ -3,7 +3,7 @@ "type": "palette", "id": "fbmh_migo_resin_palette", "terrain": { ";": "t_dirt", ".": "t_floor_resin", "+": "t_resin_hole_c", "v": "t_wall_resin_cage", "w": "t_wall_resin" }, - "furniture": { } + "furniture": { ";": "f_clear", ".": "f_clear", "+": "f_clear", "v": "f_clear", "w": "f_clear" } }, { "type": "mapgen", diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_rammed_earth.json b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_rammed_earth.json index ea9fdfc9e4ddf..61206b87c317d 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_rammed_earth.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_rammed_earth.json @@ -9,7 +9,7 @@ "v": "t_window_empty", "w": "t_wall_rammed_earth" }, - "furniture": { } + "furniture": { ";": "f_clear", ".": "f_clear", "+": "f_clear", "v": "f_clear", "w": "f_clear" } }, { "type": "mapgen", diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_rock.json b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_rock.json index df383cffd88b6..66d6df3a66a17 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_rock.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_rock.json @@ -3,7 +3,7 @@ "type": "palette", "id": "fbmh_rock_palette", "terrain": { ";": "t_dirt", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_rock_wall" }, - "furniture": { } + "furniture": { ";": "f_clear", ".": "f_clear", "+": "f_clear", "v": "f_clear", "w": "f_clear" } }, { "type": "mapgen", diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_tent.json b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_tent.json index e2675d80dbe0c..db266ce0d09ee 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_tent.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_tent.json @@ -3,7 +3,7 @@ "type": "palette", "id": "fbmh_tent_palette", "terrain": { " ": "t_dirt", ".": "t_dirtfloor", "+": "t_dirtfloor", "w": "t_dirtfloor" }, - "furniture": { "+": "f_canvas_door", "w": "f_canvas_wall" } + "furniture": { " ": "f_clear", ".": "f_clear", "+": "f_canvas_door", "w": "f_canvas_wall" } }, { "type": "mapgen", diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_wad.json b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_wad.json index dfd368333f5c6..aa20446dfb153 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_wad.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_wad.json @@ -3,7 +3,7 @@ "type": "palette", "id": "fbmh_wad_palette", "terrain": { ";": "t_dirt", ".": "t_floor_primitive", "+": "t_door_makeshift_c", "v": "t_wall_wattle_half", "w": "t_wall_wattle" }, - "furniture": { } + "furniture": { ";": "f_clear", ".": "f_clear", "+": "f_clear", "v": "f_clear", "w": "f_clear" } }, { "type": "mapgen", diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_wood.json b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_wood.json index 5f2db459d69ef..70461d49008f3 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_wood.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_wood.json @@ -3,7 +3,7 @@ "type": "palette", "id": "fbmh_wood_palette", "terrain": { ";": "t_dirt", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_wall_wood" }, - "furniture": { } + "furniture": { ";": "f_clear", ".": "f_clear", "+": "f_clear", "v": "f_clear", "w": "f_clear" } }, { "type": "mapgen", diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_migo_resin.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_migo_resin.json index 5f15d03fab1c1..efdcb95c01b15 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_migo_resin.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_migo_resin.json @@ -12,12 +12,7 @@ "blueprint_name": "northeast shack", "blueprint_requires": [ { "id": "fbmh_0" } ], "blueprint_provides": [ { "id": "fbmh_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_northeast" } ], - "blueprint_needs": { - "time": "8 h", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 16 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_northeast" } ] }, { "type": "recipe", @@ -32,12 +27,7 @@ "blueprint_name": "expand northeast shack", "blueprint_requires": [ { "id": "fbmh_northeast" } ], "blueprint_provides": [ { "id": "fbmh_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "11 h", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 17 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -53,12 +43,7 @@ "blueprint_name": "finish northeast shack", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 2 } ], "blueprint_provides": [ { "id": "fbmh_northeast", "amount": 2 } ], - "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "3 h 30 m", - "skills": [ [ "fabrication", 0 ] ], - "inline": { "tools": [ ], "qualities": [ ], "components": [ [ [ "alien_pod_resin", 14 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -73,12 +58,7 @@ "blueprint_name": "east shack", "blueprint_requires": [ { "id": "fbmh_tent_northeast" }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_east" } ], - "blueprint_needs": { - "time": "1 d 10 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 67 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_east" } ] }, { "type": "recipe", @@ -94,12 +74,7 @@ "blueprint_name": "east room", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "1 d 15 h", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 69 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -114,12 +89,7 @@ "blueprint_name": "southeast shack", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southeast" } ], - "blueprint_needs": { - "time": "1 d 10 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 67 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_southeast" } ] }, { "type": "recipe", @@ -135,12 +105,7 @@ "blueprint_name": "southeast room", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "1 d 14 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 67 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -155,12 +120,7 @@ "blueprint_name": "northwest shack", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_northwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_northwest" } ], - "blueprint_needs": { - "time": "22 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 47 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_northwest" } ] }, { "type": "recipe", @@ -175,12 +135,7 @@ "blueprint_name": "west shack", "blueprint_requires": [ { "id": "fbmh_tent_northwest" } ], "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_west" } ], - "blueprint_needs": { - "time": "1 d 10 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 67 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_west" } ] }, { "type": "recipe", @@ -195,12 +150,7 @@ "blueprint_name": "west room", "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ], - "blueprint_needs": { - "time": "1 d 15 h", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 69 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ] }, { "type": "recipe", @@ -215,12 +165,7 @@ "blueprint_name": "southwest shack", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southwest" } ], - "blueprint_needs": { - "time": "1 d 10 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 67 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_southwest" } ] }, { "type": "recipe", @@ -235,12 +180,7 @@ "blueprint_name": "southwest room", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "1 d 14 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 67 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -255,12 +195,7 @@ "blueprint_name": "central building NE corner", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" } ], - "blueprint_needs": { - "time": "18 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 34 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" } ] }, { "type": "recipe", @@ -275,12 +210,7 @@ "blueprint_name": "central building NE corner", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "1 d", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 36 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -295,12 +225,7 @@ "blueprint_name": "central building NW corner", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_nw_center" } ], - "blueprint_needs": { - "time": "18 h", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 32 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_nw_center" } ] }, { "type": "recipe", @@ -315,12 +240,7 @@ "blueprint_name": "central building NW corner", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "23 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 34 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -335,12 +255,7 @@ "blueprint_name": "central building north half", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 }, { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "1 d 23 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 70 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -355,12 +270,7 @@ "blueprint_name": "central building SE corner", "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], - "blueprint_excludes": [ { "id": "fbmh_se_south" } ], - "blueprint_needs": { - "time": "18 h", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 32 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_se_south" } ] }, { "type": "recipe", @@ -376,12 +286,7 @@ "blueprint_name": "central building SE corner", "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], - "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ], - "blueprint_needs": { - "time": "23 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 34 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ] }, { "type": "recipe", @@ -396,12 +301,7 @@ "blueprint_name": "central building SW corner", "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmh_sw_south" } ], - "blueprint_needs": { - "time": "18 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 34 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_sw_south" } ] }, { "type": "recipe", @@ -416,12 +316,7 @@ "blueprint_name": "central building SW corner", "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ], - "blueprint_needs": { - "time": "1 d", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 36 ] ] ] } - } + "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ] }, { "type": "recipe", @@ -441,11 +336,6 @@ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southeast" }, { "id": "fbmh_tent_southwest" } - ], - "blueprint_needs": { - "time": "1 d 23 h 30 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { "tools": [ ], "qualities": [ [ { "id": "SMOOTH" } ] ], "components": [ [ [ "alien_pod_resin", 70 ] ] ] } - } + ] } ] From ceecae8c86b17596e405efeb9eacfde4b520cf8b Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Tue, 4 Jan 2022 02:11:59 +0800 Subject: [PATCH 093/154] Fix time stamp retrieval on Windows --- src/game.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/game.cpp b/src/game.cpp index 830b074cc9250..698ba4f6ceda3 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2559,9 +2559,20 @@ void game::death_screen() static std::string timestamp_now() { std::time_t time = std::time( nullptr ); - std::stringstream date_buffer; - date_buffer << std::put_time( std::gmtime( &time ), "%FT%H-%M-%S%z" ); - return date_buffer.str(); + std::tm *timedate = std::gmtime( &time ); + std::string date_buffer( 32, '\0' ); +#if defined(_WIN32) + std::strftime( &date_buffer[0], date_buffer.capacity(), "%Y-%m-%dT%H-%M-%S", timedate ); + TIME_ZONE_INFORMATION tz_info; + if( GetTimeZoneInformation( &tz_info ) == TIME_ZONE_ID_INVALID ) { + return string_format( "%sZ", date_buffer ); + } + const int bias = -static_cast( tz_info.Bias ); + return string_format( "%s%+.2d%02d", date_buffer, bias / 60, std::abs( bias ) % 60 ); +#else + std::strftime( &date_buffer[0], date_buffer.capacity(), "%Y-%m-%dT%H-%M-%S%z", timedate ); +#endif + return date_buffer; } void game::move_save_to_graveyard() From 3acbcaaaf85f746104ef4abcef455e48aaca51e2 Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Tue, 4 Jan 2022 02:22:29 +0800 Subject: [PATCH 094/154] Move some template specializations of StringMaker::convert to a cpp file --- tests/character_modifier_test.cpp | 1 + tests/mongroup_test.cpp | 1 + tests/stringmaker.cpp | 56 ++++++++++++++++++++++ tests/stringmaker.h | 77 +++++++++---------------------- 4 files changed, 81 insertions(+), 54 deletions(-) create mode 100644 tests/stringmaker.cpp diff --git a/tests/character_modifier_test.cpp b/tests/character_modifier_test.cpp index 0b5feb477ee3a..7bf14d1fc3332 100644 --- a/tests/character_modifier_test.cpp +++ b/tests/character_modifier_test.cpp @@ -1,5 +1,6 @@ #include "bodypart.h" #include "cata_catch.h" +#include "character.h" #include "character_modifier.h" #include "damage.h" #include "magic_enchantment.h" diff --git a/tests/mongroup_test.cpp b/tests/mongroup_test.cpp index 85fbdd65b81c4..395a2a0594090 100644 --- a/tests/mongroup_test.cpp +++ b/tests/mongroup_test.cpp @@ -3,6 +3,7 @@ #include "cata_catch.h" #include "cata_utility.h" +#include "item.h" #include "mongroup.h" #include "options.h" #include "options_helpers.h" diff --git a/tests/stringmaker.cpp b/tests/stringmaker.cpp new file mode 100644 index 0000000000000..56238e7adc02a --- /dev/null +++ b/tests/stringmaker.cpp @@ -0,0 +1,56 @@ +#include "cata_variant.h" +#include "cuboid_rectangle.h" +#include "dialogue.h" +#include "item.h" +#include "stringmaker.h" + +// StringMaker specializations for Cata types for reporting via Catch2 macros + +namespace Catch +{ + +template<> template<> +std::string StringMaker::convert( const item &i ) +{ + return string_format( "item( itype_id( \"%s\" ) )", i.typeId().str() ); +} + +template<> template<> +std::string StringMaker::convert( const point &p ) +{ + return string_format( "point( %d, %d )", p.x, p.y ); +} + +template<> template<> +std::string StringMaker::convert( const rl_vec2d &p ) +{ + return string_format( "rl_vec2d( %f, %f )", p.x, p.y ); +} + +template<> template<> +std::string StringMaker::convert( const cata_variant &v ) +{ + return string_format( "cata_variant<%s>(\"%s\")", + io::enum_to_string( v.type() ), v.get_string() ); +} + +template<> template<> +std::string StringMaker::convert( const time_duration &d ) +{ + return string_format( "time_duration( %d ) [%s]", to_turns( d ), to_string( d ) ); +} + +template<> template<> +std::string StringMaker::convert( const time_point &d ) +{ + return string_format( + "time_point( %d ) [%s]", to_turns( d - calendar::turn_zero ), to_string( d ) ); +} + +template<> template<> +std::string StringMaker::convert( const talk_response &r ) +{ + return string_format( "talk_response( text=\"%s\" )", r.text ); +} + +} // namespace Catch diff --git a/tests/stringmaker.h b/tests/stringmaker.h index 1cfd99232c790..a3b868e4b3607 100644 --- a/tests/stringmaker.h +++ b/tests/stringmaker.h @@ -4,15 +4,35 @@ #include "cuboid_rectangle.h" #include "cata_catch.h" -#include "cata_variant.h" -#include "dialogue.h" -#include "item.h" // StringMaker specializations for Cata types for reporting via Catch2 macros +class item; +struct point; +struct rl_vec2d; +class cata_variant; +class time_duration; +class time_point; +struct talk_response; + namespace Catch { +template<> template<> std::string StringMaker::convert( const item &i ); +extern template struct StringMaker; +template<> template<> std::string StringMaker::convert( const point &p ); +extern template struct StringMaker; +template<> template<> std::string StringMaker::convert( const rl_vec2d &p ); +extern template struct StringMaker; +template<> template<> std::string StringMaker::convert( const cata_variant &v ); +extern template struct StringMaker; +template<> template<> std::string StringMaker::convert( const time_duration &d ); +extern template struct StringMaker; +template<> template<> std::string StringMaker::convert( const time_point &d ); +extern template struct StringMaker; +template<> template<> std::string StringMaker::convert( const talk_response &r ); +extern template struct StringMaker; + template struct StringMaker> { static std::string convert( const string_id &i ) { @@ -27,27 +47,6 @@ struct StringMaker> { } }; -template<> -struct StringMaker { - static std::string convert( const item &i ) { - return string_format( "item( itype_id( \"%s\" ) )", i.typeId().str() ); - } -}; - -template<> -struct StringMaker { - static std::string convert( const point &p ) { - return string_format( "point( %d, %d )", p.x, p.y ); - } -}; - -template<> -struct StringMaker { - static std::string convert( const rl_vec2d &p ) { - return string_format( "rl_vec2d( %f, %f )", p.x, p.y ); - } -}; - template struct StringMaker> { static std::string convert( const rectangle &r ) { @@ -62,36 +61,6 @@ struct StringMaker> { } }; -template<> -struct StringMaker { - static std::string convert( const cata_variant &v ) { - return string_format( "cata_variant<%s>(\"%s\")", - io::enum_to_string( v.type() ), v.get_string() ); - } -}; - -template<> -struct StringMaker { - static std::string convert( const time_duration &d ) { - return string_format( "time_duration( %d ) [%s]", to_turns( d ), to_string( d ) ); - } -}; - -template<> -struct StringMaker { - static std::string convert( const time_point &d ) { - return string_format( - "time_point( %d ) [%s]", to_turns( d - calendar::turn_zero ), to_string( d ) ); - } -}; - -template<> -struct StringMaker { - static std::string convert( const talk_response &r ) { - return string_format( "talk_response( text=\"%s\" )", r.text ); - } -}; - } // namespace Catch #endif // CATA_TESTS_STRINGMAKER_H From f144cf404c4d883e898d8f7d2ee95e78a9f7ab9f Mon Sep 17 00:00:00 2001 From: Kevin Granade Date: Mon, 3 Jan 2022 11:45:54 -0800 Subject: [PATCH 095/154] Shift campfire nests so they don't overlap OMT boundaries --- data/mods/Magiclysm/worldgen/goblin_encampment.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/worldgen/goblin_encampment.json b/data/mods/Magiclysm/worldgen/goblin_encampment.json index f3c5960c42d5f..756730211da7a 100644 --- a/data/mods/Magiclysm/worldgen/goblin_encampment.json +++ b/data/mods/Magiclysm/worldgen/goblin_encampment.json @@ -34,8 +34,8 @@ " #.....# #.....# ", " #.....# #.....# ", " #.....# l#.....# ", - " #1....# #1....# ", " #.....# #.....# ", + " #1....# #1....# ", " #.....# #.....# ", " #.....# #.....# ", " #.....# #.....# ", From 2677f4533dc6d24a68aa9fc6ce7e9b89a9cf2f3d Mon Sep 17 00:00:00 2001 From: Giordano Abruzzese <89805801+ProgrammerForFun@users.noreply.github.com> Date: Mon, 3 Jan 2022 21:54:02 +0100 Subject: [PATCH 096/154] Update help file (#54001) --- data/help/texts.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/help/texts.json b/data/help/texts.json index 99496ee953c52..52e982456de6d 100644 --- a/data/help/texts.json +++ b/data/help/texts.json @@ -308,8 +308,8 @@ "name": "<3>: Description of gun types", "messages": [ "( Handguns\nHandguns are small weapons held in one or both hands. They are much more difficult to aim and control than larger firearms, and this is reflected in their poor accuracy. However, their small size makes them appropriate for short-range combat. They are also relatively quick to reload and use a very wide variety of ammunition. Their small size and low weight make it possible to carry several loaded handguns, switching from one to the next as their ammo is spent.", - "( Crossbows\nThe best feature of crossbows is their silence. The bolts they fire are only rarely destroyed; if you pick up the bolts after firing them, your ammunition supply will last much longer. Crossbows suffer from a short range and a very long reload time (modified by your strength); plus, most only hold a single round.\nFor this reason, it is advisable to carry a few loaded crossbows. Crossbows can be very difficult to find; however, it is possible to craft one given a high enough Mechanics skill. Likewise, it is possible to make wooden bolts from any number of wooden objects, though these are much less effective than steel bolts. Crossbows use the handgun skill.", - "( Bows\nSilent, deadly, relatively easy to make, and the arrows are reusable. Bows have been used forever. Bows are two-handed, and require the user to have a certain strength level. If you do not have enough strength to draw the string back, you will fire at a reduced effectiveness. This reduces the reload and fire speeds and decreases the range of the arrows fired.\nMost normal bows require strength of at least 8, others require an above average strength of 10, or a significant strength of 12. Bows use the archery skill.", + "( Crossbows\nThe best feature of crossbows is low noise they produce. The bolts they fire are only rarely destroyed; if you pick up the bolts after firing them, your ammunition supply will last much longer. Crossbows suffer from a short range and a very long reload time (modified by your strength); plus, most only hold a single round.\nFor this reason, it is advisable to carry a few loaded crossbows. Crossbows can be very difficult to find; however, it is possible to craft one given a high enough Fabrication skill. Likewise, it is possible to make wooden bolts from any number of wooden objects, though these are much less effective than steel bolts. Crossbows use the rifles skill.", + "( Bows\nSilent, deadly, relatively easy to make, and the arrows are reusable. Bows have been used forever. Bows are two-handed, and require the user to have a certain strength level. If you do not have enough strength to draw the string back, you won't be able to use the bow.\nMost normal bows require strength of at least 8, others require an above average strength of 10, or a significant strength of 12. Bows use the archery skill.", "( Shotguns\nShotguns are some of the most powerful weapons in the game, capable of taking out almost any enemy with a single hit. Birdshot and 00 shot spread out after leaving the barrel, making it very easy to hit nearby monsters. However, they are very ineffective against armor, and some armored monsters might shrug off 00 shot completely. Shotgun slugs are the answer to this problem; they also offer much better range than shot.\nThe biggest drawback to shotguns is their noisiness. They are very loud, and impossible to silence. A shot that kills one zombie might attract three more! Beware of that.", "( Submachine Guns\nSubmachine guns are small weapons (some are barely larger than a handgun), designed for relatively close combat and the ability to spray large numbers of bullets. However, they are more effective when firing single shots, so use discretion. They mainly use 9mm and .45 ammunition; however, other SMGs exist. They reload moderately quickly, and are suitable for close or medium-long range combat.", "( Sniper and Marksman Rifles\nSniper and marksman rifles are popular for their superior range and accuracy. What's more, their scopes or sights make shots fired at targets at very long range as accurate as those fired at shorter range. Unlike assault rifles, sniper and marksman rifles usually have no automatic fire. They also may be slow to reload and fire, so when facing a large group of nearby enemies, they are not the best pick.", @@ -328,7 +328,7 @@ "Q: How can I remove boards from boarded-up windows and doors?\nA: Use a hammer and choose the direction of the boarded-up window or door to remove the boards.", "Q: The game just told me to quit, and other weird stuff is happening.\nA: You have the \"Kaluptic Psychosis\" trait, which might make the game seem buggy.", "Q: How can I prevent monsters from attacking me while I sleep?\nA: Find a safe place to sleep; for example, in a cleared building far from the front door. Set traps if you have them, or build a fire to scare off wild animals.", - "Q: Why do I always sink when I try to swim?\nA: Your swimming ability is reduced greatly by the weight you are carrying, and is also adversely affected by most clothing you wear. Until you reach a high level of the swimming skill, you'll need to drop your equipment and remove your clothing to swim, making it a last-ditch escape plan. Diving gear may significantly help you in swimming and diving.", + "Q: Why do I always sink when I try to swim?\nA: Your swimming ability is reduced greatly by the weight you are carrying, and is also adversely affected by most clothing you wear. Until you reach a high level of the athletics skill, you'll need to drop your equipment and remove your clothing to swim, making it a last-ditch escape plan. Diving gear may significantly help you in swimming and diving.", "Q: How can I cure a fungal infection?\nA: The Blood Filter bionic and some antifungal chemicals can cure fungal infection. Antifungal chemicals to cure the fungal infection can either be found as random loot or made from other ingredients.", "Q: How do I get into science labs?\nA: You can enter the front door if you have an appropriate ID card by examining () the keypad. If you are skilled in computers and have an electrohack, it is possible to hack the keypad. An EMP blast has a chance to force the doors open, but it's more likely to break them. You can also sneak in through the sewers sometimes, or try to smash through the walls with explosions.", "Q: Why does my crafting fail so often?\nA: Check the difficulty of the recipe, and the primary skill used; your skill level should be around one and a half times the difficulty to be confident that it will succeed. Also, note any proficiencies or other skills that may influence your chances of success.", From 4482d5005138e3d7aadd40f14f1ae5a7407a98f8 Mon Sep 17 00:00:00 2001 From: Paul Fenwick Date: Mon, 3 Jan 2022 12:54:22 -0800 Subject: [PATCH 097/154] Description update: wild yeast must be placed in a fermenting vat to mature. (#53990) --- data/json/items/comestibles/brewing.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/comestibles/brewing.json b/data/json/items/comestibles/brewing.json index 2e46f52ef9c6f..79b42ab257a23 100644 --- a/data/json/items/comestibles/brewing.json +++ b/data/json/items/comestibles/brewing.json @@ -497,7 +497,7 @@ "id": "young_yeast", "looks_like": "yeast", "name": { "str": "growing wild yeast" }, - "description": "Mixture of water, sugar and fruits with some naturally occurring yeast, that will eventually produce a more sizeable yeast culture.", + "description": "Mixture of water, sugar and fruits with some naturally occurring yeast. If placed in a fermenting vat and given time, it will eventually produce a more sizeable yeast culture.", "weight": "16 g", "color": "yellow", "container": "jug_plastic", From 71851498270f3c97cd343c76715a0259cda63ce4 Mon Sep 17 00:00:00 2001 From: Benjamin Mauer Date: Mon, 3 Jan 2022 15:55:24 -0500 Subject: [PATCH 098/154] Mre fix sirbab (#53984) * Fix MRE's not spawning sealed Fix MRE's not being sealed by just adjusting the size of the MRE "pocket", and increasing a few items inside as a stopgap to prevent the bags not being sealed. * Adjust a few volumes from previous commit Reduces cheese spread to be 8, as that's the max that will fit in a small mre bag, and adjusts the volume of an mre package to match either cheese or peanut butter not both. --- data/json/itemgroups/SUS/mre_packages.json | 4 ++-- data/json/items/containers.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/json/itemgroups/SUS/mre_packages.json b/data/json/itemgroups/SUS/mre_packages.json index 69ebcaacbc197..ae1c5443758c7 100644 --- a/data/json/itemgroups/SUS/mre_packages.json +++ b/data/json/itemgroups/SUS/mre_packages.json @@ -92,11 +92,11 @@ { "item": "heatpack" }, { "distribution": [ - { "item": "can_cheese", "charges": 1, "container-item": "mre_bag_small", "sealed": true }, + { "item": "can_cheese", "charges": 8, "container-item": "mre_bag_small", "sealed": true }, { "item": "spread_peanutbutter", "charges": 1, "container-item": "mre_bag_small", "sealed": true } ] }, - { "item": "crackers", "charges": 1, "container-item": "mre_bag_small", "sealed": true }, + { "item": "crackers", "charges": 2, "container-item": "mre_bag_small", "sealed": true }, { "group": "mre_accessory_pack" }, { "item": "mre_bag", "contents-group": "mre_dessert_pack", "sealed": true } ] diff --git a/data/json/items/containers.json b/data/json/items/containers.json index b4739a08c49cc..a89f97813f327 100644 --- a/data/json/items/containers.json +++ b/data/json/items/containers.json @@ -2074,7 +2074,7 @@ "pocket_data": [ { "pocket_type": "CONTAINER", - "max_contains_volume": "2831 ml", + "max_contains_volume": "2749 ml", "max_contains_weight": "4 kg", "airtight": true, "moves": 200, From 8ac049553c66ab3470fc8373640444023ffbe815 Mon Sep 17 00:00:00 2001 From: Kevin Granade Date: Mon, 3 Jan 2022 12:55:57 -0800 Subject: [PATCH 099/154] Whitelist new rarely spawning map locations to prevent test failures. (#53986) --- tests/overmap_test.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/overmap_test.cpp b/tests/overmap_test.cpp index 57b0c7f91be98..3dbbe5df1baaa 100644 --- a/tests/overmap_test.cpp +++ b/tests/overmap_test.cpp @@ -23,6 +23,8 @@ static const oter_str_id oter_cabin_west( "cabin_west" ); static const oter_type_str_id oter_type_ants_lab( "ants_lab" ); static const oter_type_str_id oter_type_ants_lab_stairs( "ants_lab_stairs" ); +static const oter_type_str_id oter_type_bunker_shop_b( "bunker_shop_b" ); +static const oter_type_str_id oter_type_bunker_shop_g( "bunker_shop_g" ); static const oter_type_str_id oter_type_marina_1( "marina_1" ); static const oter_type_str_id oter_type_marina_10( "marina_10" ); static const oter_type_str_id oter_type_marina_11( "marina_11" ); @@ -48,6 +50,11 @@ static const oter_type_str_id oter_type_ravine_edge( "ravine_edge" ); static const oter_type_str_id oter_type_ravine_floor( "ravine_floor" ); static const oter_type_str_id oter_type_ravine_floor_edge( "ravine_floor_edge" ); static const oter_type_str_id oter_type_rock_border( "rock_border" ); +static const oter_type_str_id oter_type_s_gas_b11( "s_gas_b11" ); +static const oter_type_str_id oter_type_s_gas_b20( "s_gas_b20" ); +static const oter_type_str_id oter_type_s_gas_b21( "s_gas_b21" ); +static const oter_type_str_id oter_type_s_gas_g0( "s_gas_g0" ); +static const oter_type_str_id oter_type_s_gas_g1( "s_gas_g1" ); static const oter_type_str_id oter_type_s_restaurant_deserted_test( "s_restaurant_deserted_test" ); static const overmap_special_id overmap_special_Cabin( "Cabin" ); @@ -301,6 +308,8 @@ TEST_CASE( "overmap_terrain_coverage", "[overmap][slow]" ) std::unordered_set whitelist = { oter_type_ants_lab.id(), // ant lab is a very improbable spawn oter_type_ants_lab_stairs.id(), + oter_type_bunker_shop_b.id(), + oter_type_bunker_shop_g.id(), oter_type_marina_1.id(), // marina struggles to spawn reliably oter_type_marina_2.id(), oter_type_marina_3.id(), @@ -326,6 +335,11 @@ TEST_CASE( "overmap_terrain_coverage", "[overmap][slow]" ) oter_type_ravine_floor_edge.id(), oter_type_ravine_floor.id(), oter_type_rock_border.id(), // only in the bordered scenario + oter_type_s_gas_b11.id(), + oter_type_s_gas_b20.id(), + oter_type_s_gas_b21.id(), + oter_type_s_gas_g0.id(), + oter_type_s_gas_g1.id(), oter_type_s_restaurant_deserted_test.id(), // only in the desert test region }; From 8c3d31bf3ed99e468ab29872fc2d4d614bd682a1 Mon Sep 17 00:00:00 2001 From: Rovalen <34404128+Rovallen@users.noreply.github.com> Date: Mon, 3 Jan 2022 23:57:01 +0300 Subject: [PATCH 100/154] Add cursor navigation to the mutations UI. (#53764) --- src/mutation_ui.cpp | 234 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 218 insertions(+), 16 deletions(-) diff --git a/src/mutation_ui.cpp b/src/mutation_ui.cpp index 61c10ae7dfe58..db3eef55fb779 100644 --- a/src/mutation_ui.cpp +++ b/src/mutation_ui.cpp @@ -19,7 +19,17 @@ #include "string_formatter.h" #include "translations.h" #include "ui_manager.h" - +enum class mutation_menu_mode { + activating, + examining, + reassigning, + hiding +}; +enum class mutation_tab_mode { + active, + passive, + none +}; // '!' and '=' are uses as default bindings in the menu static const invlet_wrapper mutation_chars( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"#&()*+./:;@[\\]^_{|}" ); @@ -37,12 +47,19 @@ static const auto shortcut_desc = []( const std::string &comment, const std::str return string_format( comment, string_format( "[%s]", keys ) ); }; -enum class mutation_menu_mode : int { - activating, - examining, - reassigning, - hidding, -}; +// needs extensive improvement + +static trait_id GetTrait( std::vector active, std::vector passive, int cursor, + mutation_tab_mode tab_mode ) +{ + trait_id mut_id; + if( tab_mode == mutation_tab_mode::active ) { + mut_id = active[cursor]; + } else { + mut_id = passive[cursor]; + } + return mut_id; +} static void show_mutations_titlebar( const catacurses::window &window, const mutation_menu_mode menu_mode, const input_context &ctxt ) @@ -63,7 +80,7 @@ static void show_mutations_titlebar( const catacurses::window &window, c_light_blue ) + " " + shortcut_desc( _( "%s to activate mutation, " ), ctxt.get_desc( "TOGGLE_EXAMINE" ) ); } - if( menu_mode == mutation_menu_mode::hidding ) { + if( menu_mode == mutation_menu_mode::hiding ) { desc += colorize( _( "Hidding" ), c_cyan ) + " " + shortcut_desc( _( "%s to activate mutation, " ), ctxt.get_desc( "TOGGLE_EXAMINE" ) ); } @@ -100,8 +117,8 @@ void avatar::power_mutations() // maximal number of rows in both columns const int mutations_count = std::max( passive.size(), active.size() ); - const int TITLE_HEIGHT = 2; + const int DESCRIPTION_HEIGHT = 5; // + lines with text in titlebar, local const int HEADER_LINE_Y = TITLE_HEIGHT + 1; @@ -132,13 +149,25 @@ void avatar::power_mutations() int second_column = 0; int scroll_position = 0; + int cursor = 0; int max_scroll_position = 0; int list_height = 0; + int half_list_view_location = 0; mutation_menu_mode menu_mode = mutation_menu_mode::activating; + mutation_tab_mode tab_mode; + if( !passive.empty() ) { + tab_mode = mutation_tab_mode::passive; + } else if( !active.empty() ) { + tab_mode = mutation_tab_mode::active; + } else { + tab_mode = mutation_tab_mode::none; + } + const auto recalc_max_scroll_position = [&]() { list_height = ( menu_mode == mutation_menu_mode::examining ? DESCRIPTION_LINE_Y : HEIGHT - 1 ) - list_start_y; max_scroll_position = mutations_count - list_height; + half_list_view_location = list_height / 2; if( max_scroll_position < 0 ) { scroll_position = 0; } else if( scroll_position > max_scroll_position ) { @@ -180,6 +209,9 @@ void avatar::power_mutations() ctxt.register_action( "TOGGLE_EXAMINE" ); ctxt.register_action( "TOGGLE_SPRITE" ); ctxt.register_action( "REASSIGN" ); + ctxt.register_action( "NEXT_TAB" ); + ctxt.register_action( "PREV_TAB" ); + ctxt.register_action( "CONFIRM" ); ctxt.register_action( "HELP_KEYBINDINGS" ); ctxt.register_action( "QUIT" ); #if defined(__ANDROID__) @@ -216,10 +248,15 @@ void avatar::power_mutations() for( int i = scroll_position; static_cast( i ) < passive.size(); i++ ) { const mutation_branch &md = passive[i].obj(); const trait_data &td = my_mutations[passive[i]]; + const bool is_highlighted = cursor == static_cast( i ); if( i - scroll_position == list_height ) { break; } - type = has_base_trait( passive[i] ) ? c_cyan : c_light_cyan; + if( is_highlighted && tab_mode == mutation_tab_mode::passive ) { + type = has_base_trait( passive[i] ) ? c_cyan_yellow : c_light_cyan_yellow; + } else { + type = has_base_trait( passive[i] ) ? c_cyan : c_light_cyan; + } mvwprintz( wBio, point( 2, list_start_y + i - scroll_position ), type, "%c %s", td.key, md.name() ); if( !td.show_sprite ) { @@ -235,13 +272,22 @@ void avatar::power_mutations() for( int i = scroll_position; static_cast( i ) < active.size(); i++ ) { const mutation_branch &md = active[i].obj(); const trait_data &td = my_mutations[active[i]]; + const bool is_highlighted = cursor == static_cast( i ); if( i - scroll_position == list_height ) { break; } if( td.powered ) { - type = has_base_trait( active[i] ) ? c_green : c_light_green; + if( is_highlighted && tab_mode == mutation_tab_mode::active ) { + type = has_base_trait( active[i] ) ? c_green_yellow : c_light_green_yellow; + } else { + type = has_base_trait( active[i] ) ? c_green : c_light_green; + } } else { - type = has_base_trait( active[i] ) ? c_red : c_light_red; + if( is_highlighted && tab_mode == mutation_tab_mode::active ) { + type = has_base_trait( active[i] ) ? c_red_yellow : c_light_red_yellow; + } else { + type = has_base_trait( active[i] ) ? c_red : c_light_red; + } } // TODO: track resource(s) used and specify mvwputch( wBio, point( second_column, list_start_y + i - scroll_position ), @@ -287,6 +333,9 @@ void avatar::power_mutations() const input_event evt = ctxt.get_raw_input(); if( evt.type == input_event_t::keyboard_char && !evt.sequence.empty() ) { const int ch = evt.get_first_input(); + if( ch == ' ' ) { //skip if space is pressed (space is used as an empty hotkey) + continue; + } const trait_id mut_id = trait_by_invlet( ch ); if( !mut_id.is_null() ) { const mutation_branch &mut_data = mut_id.obj(); @@ -363,7 +412,7 @@ void avatar::power_mutations() // Describing mutations, not activating them! examine_id = mut_id; break; - case mutation_menu_mode::hidding: + case mutation_menu_mode::hiding: my_mutations[mut_id].show_sprite = !my_mutations[mut_id].show_sprite; break; } @@ -373,14 +422,167 @@ void avatar::power_mutations() } } if( !handled ) { + + // Essentially, up-down navigation adapted from the bionics_ui.cpp, with a bunch of extra workarounds to keep functionality + if( action == "DOWN" ) { - if( scroll_position < max_scroll_position ) { + + int lowerlim; + + if( tab_mode == mutation_tab_mode::passive ) { + lowerlim = static_cast( passive.size() ) - 1; + } else if( tab_mode == mutation_tab_mode::active ) { + lowerlim = static_cast( active.size() ) - 1; + } else { + continue; + } + + if( cursor < lowerlim ) { + cursor++; + } else { + cursor = 0; + } + if( scroll_position < max_scroll_position && + cursor - scroll_position > list_height - half_list_view_location ) { scroll_position++; } + if( scroll_position > 0 && cursor - scroll_position < half_list_view_location ) { + scroll_position = std::max( cursor - half_list_view_location, 0 ); + } + + // Draw the description, shabby workaround + examine_id = GetTrait( active, passive, cursor, tab_mode ); + } else if( action == "UP" ) { - if( scroll_position > 0 ) { + + int lim; + if( tab_mode == mutation_tab_mode::passive ) { + lim = passive.size() - 1; + } else if( tab_mode == mutation_tab_mode::active ) { + lim = active.size() - 1; + } else { + continue; + } + if( cursor > 0 ) { + cursor--; + } else { + cursor = lim; + } + if( scroll_position > 0 && cursor - scroll_position < half_list_view_location ) { scroll_position--; } + if( scroll_position < max_scroll_position && + cursor - scroll_position > list_height - half_list_view_location ) { + scroll_position = + std::max( std::min( lim + 1 - list_height, + cursor - half_list_view_location ), 0 ); + } + + examine_id = GetTrait( active, passive, cursor, tab_mode ); + } else if( action == "NEXT_TAB" || "PREV_TAB" ) { + if( tab_mode == mutation_tab_mode::active && !passive.empty() ) { + tab_mode = mutation_tab_mode::passive; + } else if( tab_mode == mutation_tab_mode::passive && !active.empty() ) { + tab_mode = mutation_tab_mode::active; + } else { + continue; + } + examine_id = GetTrait( active, passive, cursor, tab_mode ); + scroll_position = 0; + cursor = 0; + } else if( action == "CONFIRM" ) { + trait_id mut_id; + if( tab_mode == mutation_tab_mode::active ) { + mut_id = active[cursor]; + } else if( tab_mode == mutation_tab_mode::passive ) { + mut_id = passive[cursor]; + } else { + continue; + } + if( !mut_id.is_null() ) { + const mutation_branch &mut_data = mut_id.obj(); + switch( menu_mode ) { + case mutation_menu_mode::reassigning: { + query_popup pop; + pop.message( _( "%s; enter new letter." ), + mutation_branch::get_name( mut_id ) ) + .preferred_keyboard_mode( keyboard_mode::keychar ) + .context( "POPUP_WAIT" ) + .allow_cancel( true ) + .allow_anykey( true ); + + bool pop_exit = false; + while( !pop_exit ) { + const query_popup::result ret = pop.query(); + bool pop_handled = false; + if( ret.evt.type == input_event_t::keyboard_char && !ret.evt.sequence.empty() ) { + const int newch = ret.evt.get_first_input(); + if( mutation_chars.valid( newch ) ) { + const trait_id other_mut_id = trait_by_invlet( newch ); + if( !other_mut_id.is_null() ) { + std::swap( my_mutations[mut_id].key, my_mutations[other_mut_id].key ); + } else { + my_mutations[mut_id].key = newch; + } + pop_exit = true; + pop_handled = true; + } else if( newch == ' ' ) { + my_mutations[mut_id].key = newch; + pop_exit = true; + pop_handled = true; + } + } + if( !pop_handled ) { + if( ret.action == "QUIT" ) { + pop_exit = true; + } else if( ret.action != "HELP_KEYBINDINGS" && + ret.evt.type == input_event_t::keyboard_char ) { + popup( _( "Invalid mutation letter. Only those characters are valid:\n\n%s" ), + mutation_chars.get_allowed_chars() ); + } + } + } + + menu_mode = mutation_menu_mode::activating; + examine_id = cata::nullopt; + // TODO: show a message like when reassigning a key to an item? + break; + } + case mutation_menu_mode::activating: { + if( mut_data.activated ) { + if( my_mutations[mut_id].powered ) { + add_msg_if_player( m_neutral, _( "You stop using your %s." ), mut_data.name() ); + + deactivate_mutation( mut_id ); + // Action done, leave screen + exit = true; + } else if( ( !mut_data.hunger || get_kcal_percent() >= 0.8f ) && + ( !mut_data.thirst || get_thirst() <= 400 ) && + ( !mut_data.fatigue || get_fatigue() <= 400 ) ) { + add_msg_if_player( m_neutral, _( "You activate your %s." ), mut_data.name() ); + + activate_mutation( mut_id ); + // Action done, leave screen + exit = true; + } else { + popup( _( "You don't have enough in you to activate your %s!" ), mut_data.name() ); + } + } else { + popup( _( "You cannot activate %s! To read a description of " + "%s, press '!', then '%c'." ), + mut_data.name(), mut_data.name(), my_mutations[mut_id].key ); + } + break; + } + case mutation_menu_mode::examining: + // Describing mutations, not activating them! + examine_id = mut_id; + break; + case mutation_menu_mode::hiding: + my_mutations[mut_id].show_sprite = !my_mutations[mut_id].show_sprite; + break; + } + } } else if( action == "REASSIGN" ) { menu_mode = mutation_menu_mode::reassigning; examine_id = cata::nullopt; @@ -390,7 +592,7 @@ void avatar::power_mutations() mutation_menu_mode::examining : mutation_menu_mode::activating; examine_id = cata::nullopt; } else if( action == "TOGGLE_SPRITE" ) { - menu_mode = mutation_menu_mode::hidding; + menu_mode = mutation_menu_mode::hiding; examine_id = cata::nullopt; } else if( action == "QUIT" ) { exit = true; From d6e1bed7dbaced493b504ce22f68e38f82bffb63 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Mon, 3 Jan 2022 18:18:34 -0500 Subject: [PATCH 101/154] Fix spell effect name in documentation (#53992) --- doc/MAGIC.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/MAGIC.md b/doc/MAGIC.md index 8d3938239e7c3..dc106c556006d 100644 --- a/doc/MAGIC.md +++ b/doc/MAGIC.md @@ -123,7 +123,7 @@ Below is a table of currently implemented effects, along with special rules for | `banishment` | kills monsters in the aoe up to damage hp. any overflow hp the monster has is taken from the caster; if it's more hp than the caster has it fails. | `revive` | Revives a monster like a zombie necromancer. The monster must have the revives flag | `upgrade` | Immediately upgrades a target monster -| `pull_to_caster` | Attempts to pull the target towards the caster in a straight line. If the path is blocked by impassable furniture or terrain, the effect fails. +| `pull_target` | Attempts to pull the target towards the caster in a straight line. If the path is blocked by impassable furniture or terrain, the effect fails. | `guilt` | The target gets the guilt morale as if it killed the caster | `remove_effect` | Removes `effect_str` effects from all creatures in aoe | `emit` | Causes an emit at the target From 176799a4829bd6895a7dd1f96a0f960365e26401 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Tue, 4 Jan 2022 00:40:56 +0100 Subject: [PATCH 102/154] Stop towed vehicles from rear-ending tow-ers (#53596) --- src/vehicle.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 533c59d337607..dbeb44c8f662d 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -4285,7 +4285,30 @@ float vehicle::k_traction( float wheel_traction_area ) const int vehicle::static_drag( bool actual ) const { - return extra_drag + ( actual && !engine_on && !is_towed() ? -1500 : 0 ); + bool is_actively_towed = is_towed(); + if( is_actively_towed ) { + vehicle *towing_veh = tow_data.get_towed_by(); + if( !towing_veh ) { + is_actively_towed = false; + } else { + const int tow_index = get_tow_part(); + if( tow_index == -1 ) { + is_actively_towed = false; + } else { + const int other_tow_index = towing_veh->get_tow_part(); + if( other_tow_index == -1 ) { + is_actively_towed = false; + } else { + map &here = get_map(); + const tripoint towed_tow_point = here.getabs( global_part_pos3( tow_index ) ); + const tripoint tower_tow_point = here.getabs( towing_veh->global_part_pos3( other_tow_index ) ); + is_actively_towed = rl_dist( towed_tow_point, tower_tow_point ) >= 6; + } + } + } + } + + return extra_drag + ( actual && !engine_on && !is_actively_towed ? -1500 : 0 ); } float vehicle::strain() const From fb9d0192dda93f1c5c0d9747345a527492f821c1 Mon Sep 17 00:00:00 2001 From: Roy Berube Date: Fri, 31 Dec 2021 03:17:41 -0700 Subject: [PATCH 103/154] 500L fridge capacity --- data/json/items/appliances.json | 2 +- data/json/vehicleparts/appliances.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/items/appliances.json b/data/json/items/appliances.json index 0084f9c86e708..69641984c3f92 100644 --- a/data/json/items/appliances.json +++ b/data/json/items/appliances.json @@ -16,7 +16,7 @@ "pocket_type": "CONTAINER", "rigid": true, "watertight": true, - "max_contains_volume": "700 L", + "max_contains_volume": "500 L", "max_contains_weight": "400 kg" } ] diff --git a/data/json/vehicleparts/appliances.json b/data/json/vehicleparts/appliances.json index f0ec76f1b9ffe..bb60e7a37bba3 100644 --- a/data/json/vehicleparts/appliances.json +++ b/data/json/vehicleparts/appliances.json @@ -14,7 +14,7 @@ "description": "A fridge. When turned on, it will cool the food inside, extended the time until the food spoils.", "//": "Use average consumption, not the max on the appliance rating plate. 30W ~ 260kWh per annum", "epower": -30, - "size": 300, + "size": 2000, "item": "fridge", "location": "center", "requirements": { From 71b289a207facc85549b50940781ccf1792d389f Mon Sep 17 00:00:00 2001 From: Adam Chirnside Date: Mon, 3 Jan 2022 20:58:35 -0400 Subject: [PATCH 104/154] M855 yields lead not steel (#53985) Changed uncraft component from 1 scrap to 1 lead --- data/json/uncraft/ammo/556.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/uncraft/ammo/556.json b/data/json/uncraft/ammo/556.json index 489f32823ec4b..64e4c155c23da 100644 --- a/data/json/uncraft/ammo/556.json +++ b/data/json/uncraft/ammo/556.json @@ -8,7 +8,7 @@ "time": "5 s", "qualities": [ { "id": "PULL", "level": 1 } ], "components": [ - [ [ "scrap", 1 ] ], + [ [ "lead", 1 ] ], [ [ "223_casing", 1 ] ], [ [ "smrifle_primer", 1 ] ], [ [ "gunpowder_rifle", 17 ] ], From c85948c5c7fbe3902f7c48579f30286a61be89cd Mon Sep 17 00:00:00 2001 From: Hirmuolio <22011552+Hirmuolio@users.noreply.github.com> Date: Tue, 4 Jan 2022 03:03:58 +0200 Subject: [PATCH 105/154] Fix firing gun with mixed fav/unfav ammo (#53973) * also remove unnecessary and problematic holster attributes --- data/json/items/gun/10mm.json | 29 +++-------------------------- data/json/items/gun/22.json | 1 - data/json/items/gun/38.json | 3 --- data/json/items/gun/44.json | 2 -- data/json/items/gun/454.json | 1 - data/json/items/gun/50.json | 2 +- data/json/items/gun/500.json | 9 +-------- src/item_pocket.cpp | 2 +- 8 files changed, 6 insertions(+), 43 deletions(-) diff --git a/data/json/items/gun/10mm.json b/data/json/items/gun/10mm.json index 7327dc96d2cce..c3ed1199fd415 100644 --- a/data/json/items/gun/10mm.json +++ b/data/json/items/gun/10mm.json @@ -32,12 +32,7 @@ "blackpowder_tolerance": 56, "clip_size": 6, "pocket_data": [ - { - "pocket_type": "MAGAZINE", - "holster": true, - "ammo_restriction": { "10mm": 6, "40": 6 }, - "allowed_speedloaders": [ "40_speedloader6" ] - } + { "pocket_type": "MAGAZINE", "ammo_restriction": { "10mm": 6, "40": 6 }, "allowed_speedloaders": [ "40_speedloader6" ] } ] }, { @@ -149,16 +144,7 @@ "ranged_damage": { "damage_type": "bullet", "amount": 1 }, "built_in_mods": [ "folding_stock" ], "modes": [ [ "DEFAULT", "semi-auto", 1 ] ], - "pocket_data": [ - { - "pocket_type": "MAGAZINE_WELL", - "magazine_well": "62 ml", - "holster": true, - "max_contains_volume": "20 L", - "max_contains_weight": "20 kg", - "item_restriction": [ "mp5_10_mag" ] - } - ] + "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "magazine_well": "62 ml", "item_restriction": [ "mp5_10_mag" ] } ] }, { "id": "m1911_10", @@ -319,15 +305,6 @@ "ammo": "10mm", "min_cycle_recoil": 675, "modes": [ [ "DEFAULT", "semi-auto", 1 ] ], - "pocket_data": [ - { - "pocket_type": "MAGAZINE_WELL", - "magazine_well": "103 ml", - "holster": true, - "max_contains_volume": "20 L", - "max_contains_weight": "20 kg", - "item_restriction": [ "glock_20mag", "tdi_10mm_mag" ] - } - ] + "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "magazine_well": "103 ml", "item_restriction": [ "glock_20mag", "tdi_10mm_mag" ] } ] } ] diff --git a/data/json/items/gun/22.json b/data/json/items/gun/22.json index cf6a939c08acf..f9ea52d3c9407 100644 --- a/data/json/items/gun/22.json +++ b/data/json/items/gun/22.json @@ -221,7 +221,6 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", - "holster": true, "rigid": true, "ammo_restriction": { "22": 8 }, "allowed_speedloaders": [ "22_speedloader8" ] diff --git a/data/json/items/gun/38.json b/data/json/items/gun/38.json index 391629c4d904f..4c4be167f30bd 100644 --- a/data/json/items/gun/38.json +++ b/data/json/items/gun/38.json @@ -97,7 +97,6 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", - "holster": true, "rigid": true, "ammo_restriction": { "38": 6 }, "allowed_speedloaders": [ "38_speedloader6" ] @@ -182,7 +181,6 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", - "holster": true, "rigid": true, "ammo_restriction": { "38": 5 }, "allowed_speedloaders": [ "38_speedloader5" ] @@ -225,7 +223,6 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", - "holster": true, "rigid": true, "ammo_restriction": { "357mag": 7, "38": 7 }, "allowed_speedloaders": [ "38_speedloader" ] diff --git a/data/json/items/gun/44.json b/data/json/items/gun/44.json index 15218a1fcf0c2..a83fb720beedd 100644 --- a/data/json/items/gun/44.json +++ b/data/json/items/gun/44.json @@ -155,7 +155,6 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", - "holster": true, "rigid": true, "ammo_restriction": { "44": 6 }, "allowed_speedloaders": [ "44_speedloader6" ] @@ -198,7 +197,6 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", - "holster": true, "rigid": true, "ammo_restriction": { "44": 6 }, "allowed_speedloaders": [ "44_speedloader6" ] diff --git a/data/json/items/gun/454.json b/data/json/items/gun/454.json index 836bce327f976..f6e4ab58b5bbd 100644 --- a/data/json/items/gun/454.json +++ b/data/json/items/gun/454.json @@ -33,7 +33,6 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", - "holster": true, "ammo_restriction": { "454": 5, "410shot": 5, "45colt": 5 }, "allowed_speedloaders": [ "454_speedloader5" ] } diff --git a/data/json/items/gun/50.json b/data/json/items/gun/50.json index c6fb1aa625c0a..e0c02ddb82f1b 100644 --- a/data/json/items/gun/50.json +++ b/data/json/items/gun/50.json @@ -98,7 +98,7 @@ "blackpowder_tolerance": 24, "longest_side": "130 cm", "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "50": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "50": 1 } } ] }, { "id": "as50", diff --git a/data/json/items/gun/500.json b/data/json/items/gun/500.json index 6838ac8105240..34d2cab092b4f 100644 --- a/data/json/items/gun/500.json +++ b/data/json/items/gun/500.json @@ -68,13 +68,6 @@ [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ - { - "pocket_type": "MAGAZINE", - "holster": true, - "ammo_restriction": { "500": 5 }, - "allowed_speedloaders": [ "500_speedloader5" ] - } - ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "500": 5 }, "allowed_speedloaders": [ "500_speedloader5" ] } ] } ] diff --git a/src/item_pocket.cpp b/src/item_pocket.cpp index 33b51594ecd99..65cce03e5e0d2 100644 --- a/src/item_pocket.cpp +++ b/src/item_pocket.cpp @@ -639,7 +639,7 @@ int item_pocket::ammo_consume( int qty ) it = contents.erase( it ); } else { it->charges -= need; - used = need; + used += need; break; } } From b50c696ef15e8b29e3af5a0c2d0b52cb687e004f Mon Sep 17 00:00:00 2001 From: Fris0uman <41293484+Fris0uman@users.noreply.github.com> Date: Tue, 4 Jan 2022 02:05:15 +0100 Subject: [PATCH 106/154] Port overmap mission arrow fix (#53971) Co-authored-by: olanti-p --- src/sdltiles.cpp | 64 ++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index ddf444f1eb7ec..06b4b41fc0ba0 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -704,29 +704,41 @@ static cata::optional> get_mission_arro } const tripoint_abs_omt mission_target = get_avatar().get_active_mission_target(); - std::string mission_arrow_variant = "mission_cursor"; + std::string mission_arrow_variant; if( overmap_area.contains( mission_target.raw() ) ) { + mission_arrow_variant = "mission_cursor"; return std::make_pair( mission_target, mission_arrow_variant ); } - const std::vector mission_trajectory = line_to( center.raw(), - tripoint( mission_target.raw().xy(), center.raw().z ) ); - - cata::optional prev; - int z = 0; - for( const tripoint &traj_pt : mission_trajectory ) { - if( !overmap_area.contains( traj_pt ) ) { - z = prev->z - traj_pt.z; - break; + inclusive_rectangle area_flat( overmap_area.p_min.xy(), overmap_area.p_max.xy() ); + if( area_flat.contains( mission_target.raw().xy() ) ) { + int area_z = center.z(); + if( mission_target.z() > area_z ) { + mission_arrow_variant = "mission_arrow_up"; + } else { + mission_arrow_variant = "mission_arrow_down"; } - prev = traj_pt; + return std::make_pair( tripoint_abs_omt( mission_target.xy(), area_z ), mission_arrow_variant ); } - if( !prev ) { - debugmsg( "ERROR: trajectory for mission in overmap failed" ); + const std::vector traj = line_to( center.raw(), + tripoint( mission_target.raw().xy(), center.raw().z ) ); + + if( traj.empty() ) { + debugmsg( "Failed to gen overmap mission trajectory %s %s", + center.to_string(), mission_target.to_string() ); return cata::nullopt; } + + tripoint arr_pos = traj[0]; + for( auto it = traj.rbegin(); it != traj.rend(); it++ ) { + if( overmap_area.contains( *it ) ) { + arr_pos = *it; + break; + } + } + const int north_border_y = ( overmap_area.p_max.y - overmap_area.p_min.y ) / 3; const int south_border_y = north_border_y * 2; const int west_border_x = ( overmap_area.p_max.x - overmap_area.p_min.x ) / 3; @@ -747,24 +759,18 @@ static cata::optional> get_mission_arro const inclusive_cuboid east_sector( east_pmin, overmap_area.p_max ); mission_arrow_variant = "mission_arrow_"; - if( z == 0 ) { - if( north_sector.contains( *prev ) ) { - mission_arrow_variant += 'n'; - } else if( south_sector.contains( *prev ) ) { - mission_arrow_variant += 's'; - } - if( west_sector.contains( *prev ) ) { - mission_arrow_variant += 'w'; - } else if( east_sector.contains( *prev ) ) { - mission_arrow_variant += 'e'; - } - } else if( z > 0 ) { - mission_arrow_variant += "down"; - } else { - mission_arrow_variant += "up"; + if( north_sector.contains( arr_pos ) ) { + mission_arrow_variant += 'n'; + } else if( south_sector.contains( arr_pos ) ) { + mission_arrow_variant += 's'; + } + if( west_sector.contains( arr_pos ) ) { + mission_arrow_variant += 'w'; + } else if( east_sector.contains( arr_pos ) ) { + mission_arrow_variant += 'e'; } - return std::make_pair( tripoint_abs_omt( *prev ), mission_arrow_variant ); + return std::make_pair( tripoint_abs_omt( arr_pos ), mission_arrow_variant ); } std::string cata_tiles::get_omt_id_rotation_and_subtile( From 7dc394a844b593082c0e0e15b305d72ab0e708b4 Mon Sep 17 00:00:00 2001 From: Jason Fields Date: Mon, 3 Jan 2022 20:18:21 -0500 Subject: [PATCH 107/154] Fix typo in minifridge description (#54011) --- data/json/vehicleparts/appliances.json | 2 +- data/json/vehicleparts/vehicle_parts.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/vehicleparts/appliances.json b/data/json/vehicleparts/appliances.json index f0ec76f1b9ffe..7442cbb5a72f8 100644 --- a/data/json/vehicleparts/appliances.json +++ b/data/json/vehicleparts/appliances.json @@ -11,7 +11,7 @@ "broken_color": "light_blue", "damage_modifier": 80, "durability": 100, - "description": "A fridge. When turned on, it will cool the food inside, extended the time until the food spoils.", + "description": "A fridge. When turned on, it will cool the food inside, extending the time until the food spoils.", "//": "Use average consumption, not the max on the appliance rating plate. 30W ~ 260kWh per annum", "epower": -30, "size": 300, diff --git a/data/json/vehicleparts/vehicle_parts.json b/data/json/vehicleparts/vehicle_parts.json index 8bab388e56d79..8fe2a86e69b95 100644 --- a/data/json/vehicleparts/vehicle_parts.json +++ b/data/json/vehicleparts/vehicle_parts.json @@ -638,7 +638,7 @@ "broken_color": "light_blue", "damage_modifier": 80, "durability": 100, - "description": "A small fridge. When turned on, it will cool the food inside, extended the time until the food spoils.", + "description": "A small fridge. When turned on, it will cool the food inside, extending the time until the food spoils.", "//": "Use average consumption, not the max on the appliance rating plate. 30W ~ 260kWh per annum", "epower": -30, "size": 300, From 95ab58f26da2517b5a61c6c4a03cacc36dca3a6d Mon Sep 17 00:00:00 2001 From: Jason Fields Date: Mon, 3 Jan 2022 21:44:23 -0500 Subject: [PATCH 108/154] When confirming the player's selection of martial art style, include style's name in message This isn't shown anywhere else on this screen, so there's no indication of what "this style" refers to (i.e. if you made the selection that you intended to) --- src/newcharacter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 971084b1475ba..e282715fdf424 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -358,7 +358,7 @@ static matype_id choose_ma_style( const character_type type, const std::vector Date: Tue, 4 Jan 2022 12:38:20 +0800 Subject: [PATCH 109/154] Skip translating solely tag harvest messages --- lang/string_extractor/parsers/harvest.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lang/string_extractor/parsers/harvest.py b/lang/string_extractor/parsers/harvest.py index 9844743d936dd..c077fdd0ba18e 100644 --- a/lang/string_extractor/parsers/harvest.py +++ b/lang/string_extractor/parsers/harvest.py @@ -1,6 +1,8 @@ +from ..helper import is_tag from ..write_text import write_text def parse_harvest(json, origin): if "message" in json: - write_text(json["message"], origin, comment="Harvest message") + if not is_tag(json["message"]): + write_text(json["message"], origin, comment="Harvest message") From bcf500c54af94ed689a0b729a11e409559581c3f Mon Sep 17 00:00:00 2001 From: Hirmuolio Date: Tue, 4 Jan 2022 10:48:28 +0200 Subject: [PATCH 110/154] remove curammo --- src/item.cpp | 3 --- src/item.h | 1 - src/savegame_json.cpp | 7 ------- 3 files changed, 11 deletions(-) diff --git a/src/item.cpp b/src/item.cpp index f687fde9b60ea..4ec0380b097c0 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -588,7 +588,6 @@ item &item::ammo_set( const itype_id &ammo, int qty ) if( ammo.is_null() && ammo_types().empty() ) { if( magazine_integral() ) { if( is_tool() ) { - curammo = nullptr; charges = std::min( qty, ammo_capacity( ammo_type ) ); } else if( is_gun() ) { const item temp_ammo( ammo_default(), calendar::turn, std::min( qty, ammo_capacity( ammo_type ) ) ); @@ -684,7 +683,6 @@ item &item::ammo_unset() } contents.clear_magazines(); } else if( magazine_integral() ) { - curammo = nullptr; charges = 0; if( is_gun() ) { contents.clear_magazines(); @@ -10025,7 +10023,6 @@ bool item::reload( Character &u, item_location ammo, int qty ) } } - curammo = ammo->type; item item_copy( *ammo ); ammo->charges -= qty; diff --git a/src/item.h b/src/item.h index 32dbdbffd0e2c..3bd701ac24355 100644 --- a/src/item.h +++ b/src/item.h @@ -2679,7 +2679,6 @@ class item : public visitable bool requires_tags_processing = true; FlagsSetType item_tags; // generic item specific flags safe_reference_anchor anchor; - const itype *curammo = nullptr; std::map item_vars; const mtype *corpse = nullptr; std::string corpse_name; // Name of the late lamented diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index 38cc5b08fd466..9d3e1b944cd84 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -2728,9 +2728,6 @@ void item::io( Archive &archive ) convert( item_controller->migrate_id( orig ) ); }; - const auto load_curammo = [this]( const std::string & id ) { - curammo = item::find_type( item_controller->migrate_id( itype_id( id ) ) ); - }; const auto load_corpse = [this]( const std::string & id ) { if( itype_id( id ).is_null() ) { // backwards compatibility, nullptr should not be stored at all @@ -2784,10 +2781,6 @@ void item::io( Archive &archive ) // Legacy: remove flag check/unset after 0.F archive.io( "ethereal", ethereal, has_flag( flag_ETHEREAL_ITEM ) ); unset_flag( flag_ETHEREAL_ITEM ); - archive.template io( "curammo", curammo, load_curammo, - []( const itype & i ) { - return i.get_id().str(); - } ); archive.template io( "corpse", corpse, load_corpse, []( const mtype & i ) { return i.id.str(); From 1787cb0afc429ff25a556146920952a6bc88901c Mon Sep 17 00:00:00 2001 From: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Date: Tue, 4 Jan 2022 04:21:51 -0600 Subject: [PATCH 111/154] Yule Wreath Fix (#54023) --- .../furniture-decorative.json | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-decorative.json b/data/json/furniture_and_terrain/furniture-decorative.json index b81accbfeff65..ea53c2aebfee9 100644 --- a/data/json/furniture_and_terrain/furniture-decorative.json +++ b/data/json/furniture_and_terrain/furniture-decorative.json @@ -235,9 +235,20 @@ "description": "A decorative wreath for the winter holidays.", "symbol": "o", "color": "light_green", - "move_cost_mod": -1, - "required_str": 10, - "flags": [ "PLACE_ITEM" ] + "move_cost_mod": 2, + "required_str": 5, + "bash": { + "str_min": 20, + "str_max": 40, + "sound": "smash!", + "sound_fail": "thump.", + "items": [ + { "item": "pine_bough", "count": [ 4, 6 ] }, + { "item": "nail", "count": [ 5, 14 ] }, + { "item": "stick", "count": [ 1, 3 ] } + ] + }, + "flags": [ "PERMEABLE", "THIN_OBSTACLE", "PLACE_ITEM", "EASY_DECONSTRUCT" ] }, { "type": "furniture", From 0c25ba9f35b0868e36f208d67696d31aaf169f67 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Tue, 4 Jan 2022 15:14:56 +0100 Subject: [PATCH 112/154] brought blueprint recipe names inside their name spaces --- .../recipe_modular_canteen_common.json | 52 +++++++++---------- .../recipe_modular_storehouse_bookcase.json | 32 ++++++------ .../recipe_modular_storehouse_dresser.json | 32 ++++++------ .../recipe_modular_storehouse_locker.json | 32 ++++++------ .../recipe_modular_storehouse_rack.json | 32 ++++++------ ...pe_modular_storehouse_warehouse_shelf.json | 32 ++++++------ ...recipe_modular_storehouse_wooden_rack.json | 32 ++++++------ .../recipe_modular_workshop_common.json | 4 +- 8 files changed, 124 insertions(+), 124 deletions(-) diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_2/recipe_modular_canteen_common.json b/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_2/recipe_modular_canteen_common.json index 62708c389df4c..87ce793fb5b12 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_2/recipe_modular_canteen_common.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_2/recipe_modular_canteen_common.json @@ -184,7 +184,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_cellar", + "result": "fbmk_2_cellar", "description": "Lets build 2 root cellars in the kitchen.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -211,7 +211,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_pantry_furniture", + "result": "fbmk_2_pantry_furniture", "description": "Lets furnish the pantry.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -238,7 +238,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_butchery", + "result": "fbmk_2_butchery", "description": "Let's make a butchery area.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -267,7 +267,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_dining_furniture", + "result": "fbmk_2_dining_furniture", "description": "Let's make some furniture for the dining hall.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -295,7 +295,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_1", + "result": "fbmk_2_planters_1", "description": "Let's build some planters for a chef's garden.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -323,7 +323,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_2", + "result": "fbmk_2_planters_2", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -351,7 +351,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_3", + "result": "fbmk_2_planters_3", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -379,7 +379,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_4", + "result": "fbmk_2_planters_4", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -407,7 +407,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_5", + "result": "fbmk_2_planters_5", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -435,7 +435,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_6", + "result": "fbmk_2_planters_6", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -463,7 +463,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_7", + "result": "fbmk_2_planters_7", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -491,7 +491,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_8", + "result": "fbmk_2_planters_8", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -519,7 +519,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_9", + "result": "fbmk_2_planters_9", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -547,7 +547,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_10", + "result": "fbmk_2_planters_10", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -575,7 +575,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_11", + "result": "fbmk_2_planters_11", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -603,7 +603,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_12", + "result": "fbmk_2_planters_12", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -631,7 +631,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_13", + "result": "fbmk_2_planters_13", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -659,7 +659,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_14", + "result": "fbmk_2_planters_14", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -687,7 +687,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_15", + "result": "fbmk_2_planters_15", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -715,7 +715,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_planters_16", + "result": "fbmk_2_planters_16", "description": "Let's expand the chef's garden in the 'free' area (stop expanding if you want to use the area for something else)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -743,7 +743,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_tanks", + "result": "fbmk_2_tanks", "description": "Let's install a pair of tanks for salt water to allow for salt production and make hide working easier.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -771,7 +771,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_vats", + "result": "fbmk_2_vat", "description": "Let's install some vats in the brewery", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -799,7 +799,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_display", + "result": "fbmk_2_display", "description": "Let's install some racks for storage in the brewery", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -827,7 +827,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_still", + "result": "fbmk_2_still", "description": "Let's install a still in the brewery", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -855,7 +855,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_windmill", + "result": "fbmk_2_windmill", "description": "Let's build a windmill to allow us to grid flour efficiently", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -883,7 +883,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_canteen_bath", + "result": "fbmk_2_bath", "description": "Let's build a bench and a bird bath outside the kitchen for relaxation", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_bookcase.json b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_bookcase.json index afb3344c638a9..f47f92ce9bb93 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_bookcase.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_bookcase.json @@ -2,7 +2,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_1", + "result": "fbms_2_bookcase_1", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -29,7 +29,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_2", + "result": "fbms_2_bookcase_2", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -56,7 +56,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_3", + "result": "fbms_2_bookcase_3", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -83,7 +83,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_4", + "result": "fbms_2_bookcase_4", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -110,7 +110,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_5", + "result": "fbms_2_bookcase_5", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -137,7 +137,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_6", + "result": "fbms_2_bookcase_6", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -164,7 +164,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_7", + "result": "fbms_2_bookcase_7", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -191,7 +191,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_8", + "result": "fbms_2_bookcase_8", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -218,7 +218,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_9", + "result": "fbms_2_bookcase_9", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -245,7 +245,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_10", + "result": "fbms_2_bookcase_10", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -272,7 +272,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_11", + "result": "fbms_2_bookcase_11", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -299,7 +299,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_12", + "result": "fbms_2_bookcase_12", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -326,7 +326,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_13", + "result": "fbms_2_bookcase_13", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -353,7 +353,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_14", + "result": "fbms_2_bookcase_14", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -380,7 +380,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_15", + "result": "fbms_2_bookcase_15", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -407,7 +407,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_bookcase_16", + "result": "fbms_2_bookcase_16", "description": "Place 12 bookcases forming 1 Ā½ aisle for storage (2000 L storage, contents visible from a distance, blocks LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_dresser.json b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_dresser.json index 79540b380af86..25df9a8bd6e1c 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_dresser.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_dresser.json @@ -2,7 +2,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_1", + "result": "fbms_2_dresser_1", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -29,7 +29,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_2", + "result": "fbms_2_dresser_2", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -56,7 +56,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_3", + "result": "fbms_2_dresser_3", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -83,7 +83,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_4", + "result": "fbms_2_dresser_4", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -110,7 +110,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_5", + "result": "fbms_2_dresser_5", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -137,7 +137,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_6", + "result": "fbms_2_dresser_6", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -164,7 +164,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_7", + "result": "fbms_2_dresser_7", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -191,7 +191,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_8", + "result": "fbms_2_dresser_8", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -218,7 +218,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_9", + "result": "fbms_2_dresser_9", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -245,7 +245,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_10", + "result": "fbms_2_dresser_10", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -272,7 +272,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_11", + "result": "fbms_2_dresser_11", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -299,7 +299,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_12", + "result": "fbms_2_dresser_12", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -326,7 +326,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_13", + "result": "fbms_2_dresser_13", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -353,7 +353,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_14", + "result": "fbms_2_dresser_14", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -380,7 +380,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_15", + "result": "fbms_2_dresser_15", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -407,7 +407,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_dresser_16", + "result": "fbms_2_dresser_16", "description": "Place 12 dressers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, doesn't block LoS)", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_locker.json b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_locker.json index a5a5e65ab6159..01a1f2e327e54 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_locker.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_locker.json @@ -2,7 +2,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_1", + "result": "fbms_2_locker_1", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -29,7 +29,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_2", + "result": "fbms_2_locker_2", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -56,7 +56,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_3", + "result": "fbms_2_locker_3", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -83,7 +83,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_4", + "result": "fbms_2_locker_4", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -110,7 +110,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_5", + "result": "fbms_2_locker_5", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -137,7 +137,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_6", + "result": "fbms_2_locker_6", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -164,7 +164,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_7", + "result": "fbms_2_locker_7", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -191,7 +191,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_8", + "result": "fbms_2_locker_8", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -218,7 +218,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_9", + "result": "fbms_2_locker_9", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -245,7 +245,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_10", + "result": "fbms_2_locker_10", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -272,7 +272,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_11", + "result": "fbms_2_locker_11", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -299,7 +299,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_12", + "result": "fbms_2_locker_12", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -326,7 +326,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_13", + "result": "fbms_2_locker_13", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -353,7 +353,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_14", + "result": "fbms_2_locker_14", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -380,7 +380,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_15", + "result": "fbms_2_locker_15", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -407,7 +407,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_locker_16", + "result": "fbms_2_locker_16", "description": "Place 12 lockers forming 1 Ā½ aisle for storage (2000 L storage, contents not visible from a distance, blocks LoS). Consider if bookcases or dressers might be better.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_rack.json b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_rack.json index 0ccb56d3aebee..f87cd8bec555a 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_rack.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_rack.json @@ -2,7 +2,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_1", + "result": "fbms_2_rack_1", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -29,7 +29,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_2", + "result": "fbms_2_rack_2", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -56,7 +56,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_3", + "result": "fbms_2_rack_3", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -83,7 +83,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_4", + "result": "fbms_2_rack_4", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -110,7 +110,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_5", + "result": "fbms_2_rack_5", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -137,7 +137,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_6", + "result": "fbms_2_rack_6", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -164,7 +164,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_7", + "result": "fbms_2_rack_7", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -191,7 +191,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_8", + "result": "fbms_2_rack_8", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -218,7 +218,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_9", + "result": "fbms_2_rack_9", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -245,7 +245,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_10", + "result": "fbms_2_rack_10", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -272,7 +272,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_11", + "result": "fbms_2_rack_11", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -299,7 +299,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_12", + "result": "fbms_2_rack_12", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -326,7 +326,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_13", + "result": "fbms_2_rack_13", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -353,7 +353,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_14", + "result": "fbms_2_rack_14", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -380,7 +380,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_15", + "result": "fbms_2_rack_15", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -407,7 +407,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_rack_16", + "result": "fbms_2_rack_16", "description": "Place 12 display racks forming 1 Ā½ aisle for storage (1750 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_warehouse_shelf.json b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_warehouse_shelf.json index 0ad2b6e7c0f62..fda7e92e116cf 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_warehouse_shelf.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_warehouse_shelf.json @@ -2,7 +2,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_1", + "result": "fbms_2_warehouse_shelf_1", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -29,7 +29,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_2", + "result": "fbms_2_warehouse_shelf_2", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -56,7 +56,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_3", + "result": "fbms_2_warehouse_shelf_3", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -83,7 +83,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_4", + "result": "fbms_2_warehouse_shelf_4", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -110,7 +110,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_5", + "result": "fbms_2_warehouse_shelf_5", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -137,7 +137,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_6", + "result": "fbms_2_warehouse_shelf_6", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -164,7 +164,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_7", + "result": "fbms_2_warehouse_shelf_7", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -191,7 +191,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_8", + "result": "fbms_2_warehouse_shelf_8", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -218,7 +218,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_9", + "result": "fbms_2_warehouse_shelf_9", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -245,7 +245,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_10", + "result": "fbms_2_warehouse_shelf_10", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -272,7 +272,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_11", + "result": "fbms_2_warehouse_shelf_11", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -299,7 +299,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_12", + "result": "fbms_2_warehouse_shelf_12", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -326,7 +326,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_13", + "result": "fbms_2_warehouse_shelf_13", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -353,7 +353,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_14", + "result": "fbms_2_warehouse_shelf_14", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -380,7 +380,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_15", + "result": "fbms_2_warehouse_shelf_15", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -407,7 +407,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_warehouse_shelf_16", + "result": "fbms_2_warehouse_shelf_16", "description": "Place 12 warehouse shelves forming 1 Ā½ aisle for storage (3500 L storage, contents visible from a distance, blocks LoS). The king of storage space, with a royal resource price tag", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_wooden_rack.json b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_wooden_rack.json index f79878cfcc280..3d965c385ff1e 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_wooden_rack.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_2/recipe_modular_storehouse_wooden_rack.json @@ -2,7 +2,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_1", + "result": "fbms_2_wooden_rack_1", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -29,7 +29,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_2", + "result": "fbms_2_wooden_rack_2", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -56,7 +56,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_3", + "result": "fbms_2_wooden_rack_3", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -83,7 +83,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_4", + "result": "fbms_2_wooden_rack_4", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -110,7 +110,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_5", + "result": "fbms_2_wooden_rack_5", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -137,7 +137,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_6", + "result": "fbms_2_wooden_rack_6", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -164,7 +164,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_7", + "result": "fbms_2_wooden_rack_7", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -191,7 +191,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_8", + "result": "fbms_2_wooden_rack_8", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -218,7 +218,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_9", + "result": "fbms_2_wooden_rack_9", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -245,7 +245,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_10", + "result": "fbms_2_wooden_rack_10", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -272,7 +272,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_11", + "result": "fbms_2_wooden_rack_11", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -299,7 +299,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_12", + "result": "fbms_2_wooden_rack_12", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -326,7 +326,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_13", + "result": "fbms_2_wooden_rack_13", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -353,7 +353,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_14", + "result": "fbms_2_wooden_rack_14", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -380,7 +380,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_15", + "result": "fbms_2_wooden_rack_15", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -407,7 +407,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "faction_base_modular_storehouse_wooden_rack_16", + "result": "fbms_2_wooden_rack_16", "description": "Place 12 wooden racks forming 1 Ā½ aisle for storage (1500 L storage, contents visible from a distance, doesn't block LoS).", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_2/recipe_modular_workshop_common.json b/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_2/recipe_modular_workshop_common.json index 4ead7871fa64e..f2364326cd228 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_2/recipe_modular_workshop_common.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_2/recipe_modular_workshop_common.json @@ -30,7 +30,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "bmw_common_1", + "result": "fbmw_2_common_1", "description": "Let's install a metal working forge in the smithy. We'll need a few tools too, so we'll include some storage space. This will provide us with a first couple of primitive crafting recipes.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -59,7 +59,7 @@ { "type": "recipe", "activity_level": "MODERATE_EXERCISE", - "result": "bmw_common_smithy_2", + "result": "fbmw_2_common_smithy_2", "description": "Let's install a couple of charcoal kilns outside of the smithy. We'll add a crucible as well. This will allow us to produce a few additional things.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", From 3255a83b723d97accf209a1e0af291d6e1bf6b6e Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Tue, 4 Jan 2022 22:20:07 +0800 Subject: [PATCH 113/154] Remove diary.h from avatar.h --- src/avatar.cpp | 1 + src/avatar.h | 2 +- src/game.cpp | 1 + src/handle_action.cpp | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/avatar.cpp b/src/avatar.cpp index 34f17edd7e501..5a66b50f7bcc2 100644 --- a/src/avatar.cpp +++ b/src/avatar.cpp @@ -27,6 +27,7 @@ #include "color.h" #include "cursesdef.h" #include "debug.h" +#include "diary.h" #include "effect.h" #include "enums.h" #include "event.h" diff --git a/src/avatar.h b/src/avatar.h index 5a4973b7e7672..2e80e7773d781 100644 --- a/src/avatar.h +++ b/src/avatar.h @@ -14,7 +14,6 @@ #include "calendar.h" #include "character.h" #include "coordinates.h" -#include "diary.h" #include "enums.h" #include "game_constants.h" #include "json.h" @@ -26,6 +25,7 @@ class advanced_inv_area; class advanced_inv_listitem; class advanced_inventory_pane; +class diary; class faction; class item; class item_location; diff --git a/src/game.cpp b/src/game.cpp index 698ba4f6ceda3..36e31948fa696 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -69,6 +69,7 @@ #include "debug.h" #include "dependency_tree.h" #include "dialogue_chatbin.h" +#include "diary.h" #include "editmap.h" #include "effect_on_condition.h" #include "enums.h" diff --git a/src/handle_action.cpp b/src/handle_action.cpp index 39b30f5a28387..2090b84e0a4bd 100644 --- a/src/handle_action.cpp +++ b/src/handle_action.cpp @@ -33,6 +33,7 @@ #include "damage.h" #include "debug.h" #include "debug_menu.h" +#include "diary.h" #include "do_turn.h" #include "event.h" #include "event_bus.h" From 6427c257cfa5493326c30f3d1a013c402d83a7e4 Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Tue, 4 Jan 2022 23:34:01 +0800 Subject: [PATCH 114/154] Use forward declaration of struct dialogue in weather_type.h --- src/character_attire.cpp | 1 + src/do_turn.cpp | 1 + src/game.h | 1 + src/handle_action.cpp | 1 + src/kill_tracker.cpp | 1 + src/panels.cpp | 1 + src/weather_type.h | 2 +- 7 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/character_attire.cpp b/src/character_attire.cpp index 9c019adb48600..aec2c595b803f 100644 --- a/src/character_attire.cpp +++ b/src/character_attire.cpp @@ -3,6 +3,7 @@ #include "event_bus.h" #include "flag.h" #include "game.h" +#include "inventory.h" #include "messages.h" #include "mutation.h" diff --git a/src/do_turn.cpp b/src/do_turn.cpp index 27fd09b43d806..f6a8897c36310 100644 --- a/src/do_turn.cpp +++ b/src/do_turn.cpp @@ -20,6 +20,7 @@ #include "mission.h" #include "monattack.h" #include "mtype.h" +#include "npc.h" #include "options.h" #include "output.h" #include "overmapbuffer.h" diff --git a/src/game.h b/src/game.h index 5a414e6f3bc69..42b6c56f6e2f8 100644 --- a/src/game.h +++ b/src/game.h @@ -17,6 +17,7 @@ #include #include "calendar.h" +#include "character.h" #include "character_id.h" #include "coordinates.h" #include "creature.h" diff --git a/src/handle_action.cpp b/src/handle_action.cpp index 2090b84e0a4bd..b103a3ba12e91 100644 --- a/src/handle_action.cpp +++ b/src/handle_action.cpp @@ -58,6 +58,7 @@ #include "magic.h" #include "make_static.h" #include "map.h" +#include "map_iterator.h" #include "mapdata.h" #include "mapsharing.h" #include "messages.h" diff --git a/src/kill_tracker.cpp b/src/kill_tracker.cpp index 2de26fa7dbf18..421c2712f9f2a 100644 --- a/src/kill_tracker.cpp +++ b/src/kill_tracker.cpp @@ -12,6 +12,7 @@ #include "event.h" #include "game.h" #include "mtype.h" +#include "npc.h" #include "options.h" #include "string_formatter.h" #include "translations.h" diff --git a/src/panels.cpp b/src/panels.cpp index aa13fba1ca873..ea7ba548a0aa5 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -41,6 +41,7 @@ #include "mood_face.h" #include "move_mode.h" #include "mtype.h" +#include "npc.h" #include "omdata.h" #include "options.h" #include "output.h" diff --git a/src/weather_type.h b/src/weather_type.h index 41ed217ee0b86..71f12d0f7df0d 100644 --- a/src/weather_type.h +++ b/src/weather_type.h @@ -13,13 +13,13 @@ #include "catacharset.h" #include "color.h" #include "damage.h" -#include "dialogue.h" #include "optional.h" #include "translations.h" #include "type_id.h" class JsonObject; template struct enum_traits; +struct dialogue; template class generic_factory; From dd046a9ea1708dff6942b1a2208f5d0d8eb781e1 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Tue, 4 Jan 2022 16:50:15 +0100 Subject: [PATCH 115/154] fixed butchery requirements mismatch --- .../recipe_modular_canteen_common.json | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_common.json b/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_common.json index c227af149757c..656e6a0610f73 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_common.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_common.json @@ -207,35 +207,6 @@ "blueprint_requires": [ { "id": "fbmk_canteen_smoking" } ], "blueprint_provides": [ { "id": "fbmk_canteen_butchery" }, { "id": "kitchen_recipes_3" }, { "id": "trapping" }, { "id": "hunting" } ], "blueprint_excludes": [ { "id": "fbmk_canteen_butchery" } ], - "blueprint_needs": { - "time": "1 h 15 m", - "skills": [ [ "fabrication", 1 ], [ "survival", 3 ] ], - "inline": { - "tools": [ ], - "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], - "components": [ - [ [ "2x4", 4 ] ], - [ [ "wood_sheet", 1 ], [ "wood_panel", 1 ] ], - [ [ "nail", 8 ] ], - [ [ "stick_long", 6 ] ], - [ - [ "rope_6", 1 ], - [ "vine_6", 1 ], - [ "rope_makeshift_6", 1 ], - [ "string_36", 2 ], - [ "cordage_36", 2 ], - [ "string_6", 12 ], - [ "cordage_6", 12 ], - [ "thread", 600 ], - [ "sinew", 600 ], - [ "plant_fibre", 600 ], - [ "yarn", 600 ], - [ "wire", 8 ] - ], - [ [ "pointy_stick", 2 ], [ "spike", 2 ] ] - ] - } - }, "components": [ [ [ "knife_butcher", 1 ], [ "knife_steak", 1 ], [ "knife_chef", 1 ], [ "knife_carving", 1 ] ] ] }, { From 15938b36528d9efca90ead30960723c02e10f58c Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Tue, 4 Jan 2022 09:00:02 -0700 Subject: [PATCH 116/154] Include sstream to fix test compilation (#54034) --- tests/distribution_test.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/distribution_test.cpp b/tests/distribution_test.cpp index 3105467fb4312..760696bbeb4ed 100644 --- a/tests/distribution_test.cpp +++ b/tests/distribution_test.cpp @@ -1,3 +1,5 @@ +#include + #include "cata_catch.h" #include "distribution.h" From 5ea4546a97d761511a580952444d72ffcb44f7c3 Mon Sep 17 00:00:00 2001 From: Fris0uman <41293484+Fris0uman@users.noreply.github.com> Date: Tue, 4 Jan 2022 18:09:42 +0100 Subject: [PATCH 117/154] Automatically connect Appliances to their neighbours upon completion (#53981) --- src/construction.cpp | 14 +++++++++++- src/vehicle.cpp | 6 +++-- src/vehicle.h | 4 +++- src/vehicle_use.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/construction.cpp b/src/construction.cpp index 2f2d8944bd4b1..98277142a19ac 100644 --- a/src/construction.cpp +++ b/src/construction.cpp @@ -98,6 +98,7 @@ static const vpart_id vpart_frame_vertical_2( "frame_vertical_2" ); static const vproto_id vehicle_prototype_none( "none" ); static const std::string flag_INITIAL_PART( "INITIAL_PART" ); +static const std::string flag_APPLIANCE( "APPLIANCE" ); static bool finalized = false; @@ -1328,12 +1329,23 @@ void construct::done_appliance( const tripoint &p ) } const vpart_id &vpart = vpart_from_item( get_avatar().lastconsumed ); veh->install_part( point_zero, vpart ); - veh->add_tag( "APPLIANCE" ); + veh->add_tag( flag_APPLIANCE ); veh->name = vpart->name(); // Update the vehicle cache immediately, // or the appliance will be invisible for the first couple of turns. here.add_vehicle_to_cache( veh ); + + for( const tripoint trip : here.points_in_radius( p, 1 ) ) { + const optional_vpart_position vp = here.veh_at( trip ); + if( !vp ) { + continue; + } + const vehicle &veh_target = vp->vehicle(); + if( veh_target.has_tag( flag_APPLIANCE ) ) { + veh->connect( p, trip ); + } + } } void construct::done_deconstruct( const tripoint &p ) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index dbeb44c8f662d..b62afe5c3d45b 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -120,6 +120,8 @@ static const zone_type_id zone_type_VEHICLE_PATROL( "VEHICLE_PATROL" ); static const std::string flag_E_COMBUSTION( "E_COMBUSTION" ); +static const std::string flag_APPLIANCE( "APPLIANCE" ); + static bool is_sm_tile_outside( const tripoint &real_global_pos ); static bool is_sm_tile_over_water( const tripoint &real_global_pos ); @@ -1257,7 +1259,7 @@ bool vehicle::can_mount( const point &dp, const vpart_id &id ) const //First part in an empty square MUST be a structural part or be an appliance if( parts_in_square.empty() && part.location != part_location_structure && - !part.has_flag( "APPLIANCE" ) ) { + !part.has_flag( flag_APPLIANCE ) ) { return false; } // If its a part that harnesses animals that don't allow placing on it. @@ -7314,7 +7316,7 @@ void vehicle::add_tag( std::string tag ) tags.insert( tag ); } -bool vehicle::has_tag( std::string tag ) +bool vehicle::has_tag( std::string tag ) const { return tags.count( tag ) > 0; } diff --git a/src/vehicle.h b/src/vehicle.h index d6967b4f9a487..70c16e6483d1c 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -897,7 +897,9 @@ class vehicle */ void use_controls( const tripoint &pos ); + item init_cord( const tripoint &pos ); void plug_in( const tripoint &pos ); + void connect( const tripoint &source_pos, const tripoint &target_pos ); // Fold up the vehicle bool fold_up(); @@ -1923,7 +1925,7 @@ class vehicle bool has_enabled_smart_controller = false; // NOLINT(cata-serialize) void add_tag( std::string tag ); - bool has_tag( std::string tag ); + bool has_tag( std::string tag ) const; private: mutable units::mass mass_cache; // NOLINT(cata-serialize) diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index 25690ec33a8a7..1a0cc33838fb1 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -95,6 +95,8 @@ static const vpart_id vpart_horn_bicycle( "horn_bicycle" ); static const zone_type_id zone_type_VEHICLE_PATROL( "VEHICLE_PATROL" ); +static const std::string flag_APPLIANCE( "APPLIANCE" ); + enum change_types : int { OPENCURTAINS = 0, OPENBOTH, @@ -829,7 +831,7 @@ void vehicle::use_controls( const tripoint &pos ) } } -void vehicle::plug_in( const tripoint &pos ) +item vehicle::init_cord( const tripoint &pos ) { item powercord( "power_cord" ); powercord.set_var( "source_x", pos.x ); @@ -838,6 +840,13 @@ void vehicle::plug_in( const tripoint &pos ) powercord.set_var( "state", "pay_out_cable" ); powercord.active = true; + return powercord; +} + +void vehicle::plug_in( const tripoint &pos ) +{ + item powercord = init_cord( pos ); + if( powercord.get_use( "CABLE_ATTACH" ) ) { powercord.get_use( "CABLE_ATTACH" )->call( get_player_character(), powercord, powercord.active, pos ); @@ -845,6 +854,45 @@ void vehicle::plug_in( const tripoint &pos ) } +void vehicle::connect( const tripoint &source_pos, const tripoint &target_pos ) +{ + + item cord = init_cord( source_pos ); + map &here = get_map(); + + const optional_vpart_position target_vp = here.veh_at( target_pos ); + const optional_vpart_position source_vp = here.veh_at( source_pos ); + + if( !target_vp ) { + return; + } + vehicle *const target_veh = &target_vp->vehicle(); + vehicle *const source_veh = &source_vp->vehicle(); + if( source_veh == target_veh ) { + return ; + } + + tripoint target_global = here.getabs( target_pos ); + // TODO: make sure there is always a matching vpart id here. Maybe transform this into + // a iuse_actor class, or add a check in item_factory. + const vpart_id vpid( cord.typeId().str() ); + + point vcoords = source_vp->mount(); + vehicle_part source_part( vpid, "", vcoords, item( cord ) ); + source_part.target.first = target_global; + source_part.target.second = target_veh->global_square_location().raw(); + source_veh->install_part( vcoords, source_part ); + + vcoords = target_vp->mount(); + vehicle_part target_part( vpid, "", vcoords, item( cord ) ); + tripoint source_global( cord.get_var( "source_x", 0 ), + cord.get_var( "source_y", 0 ), + cord.get_var( "source_z", 0 ) ); + target_part.target.first = source_global; + target_part.target.second = source_veh->global_square_location().raw(); + target_veh->install_part( vcoords, target_part ); +} + bool vehicle::fold_up() { const bool can_be_folded = is_foldable(); @@ -2079,7 +2127,7 @@ void vehicle::interact_with( const vpart_position &vp, bool with_pickup ) const bool vp_has_items = vp_cargo && !get_items( vp_cargo->part_index() ).empty(); const bool map_has_items = here.has_items( vp.pos() ); - bool is_appliance = has_tag( "APPLIANCE" ); + bool is_appliance = has_tag( flag_APPLIANCE ); enum { EXAMINE, From f6b6b8e6959068cfdbf041c34e9fdfb8d9e0ea5d Mon Sep 17 00:00:00 2001 From: LyleSY Date: Tue, 4 Jan 2022 12:35:53 -0500 Subject: [PATCH 118/154] [DinoMod] dino blood --- data/mods/DinoMod/harvest.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/data/mods/DinoMod/harvest.json b/data/mods/DinoMod/harvest.json index b66a21f156bde..eb192fd7b3cef 100644 --- a/data/mods/DinoMod/harvest.json +++ b/data/mods/DinoMod/harvest.json @@ -5,6 +5,7 @@ "type": "harvest", "entries": [ { "drop": "meat", "type": "flesh", "mass_ratio": 0.3 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.03 }, { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, @@ -25,6 +26,7 @@ "type": "harvest", "entries": [ { "drop": "meat", "type": "flesh", "mass_ratio": 0.32 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.01 }, { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, @@ -45,6 +47,7 @@ "type": "harvest", "entries": [ { "drop": "meat", "type": "flesh", "mass_ratio": 0.32 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.01 }, { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, @@ -67,6 +70,7 @@ "type": "harvest", "entries": [ { "drop": "meat", "type": "flesh", "mass_ratio": 0.32 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.01 }, { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, @@ -90,6 +94,7 @@ "type": "harvest", "entries": [ { "drop": "meat", "type": "flesh", "mass_ratio": 0.3 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.03 }, { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, @@ -120,6 +125,7 @@ "type": "harvest", "entries": [ { "drop": "meat", "type": "flesh", "mass_ratio": 0.3 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.03 }, { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, @@ -152,6 +158,7 @@ "type": "harvest", "entries": [ { "drop": "meat", "type": "flesh", "mass_ratio": 0.32 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.01 }, { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, @@ -183,6 +190,7 @@ "type": "harvest", "entries": [ { "drop": "meat", "type": "flesh", "mass_ratio": 0.32 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.01 }, { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, @@ -217,6 +225,7 @@ { "drop": "science", "type": "bionic_group", "flags": [ "FILTHY" ] }, { "drop": "corpses", "type": "bionic_group", "flags": [ "FILTHY" ] }, { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.25 }, + { "drop": "blood_tainted", "type": "blood", "mass_ratio": 0.1 }, { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 }, { "drop": "raw_tainted_leather", "type": "skin", "mass_ratio": 0.02 } @@ -230,6 +239,7 @@ { "drop": "science", "type": "bionic_group", "flags": [ "FILTHY" ] }, { "drop": "corpses", "type": "bionic_group", "flags": [ "FILTHY" ] }, { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.25 }, + { "drop": "blood_tainted", "type": "blood", "mass_ratio": 0.1 }, { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 }, { "drop": "raw_tainted_leather", "type": "skin", "mass_ratio": 0.02 }, @@ -244,6 +254,7 @@ { "drop": "science", "type": "bionic_group", "flags": [ "FILTHY" ] }, { "drop": "corpses", "type": "bionic_group", "flags": [ "FILTHY" ] }, { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.25 }, + { "drop": "blood_tainted", "type": "blood", "mass_ratio": 0.1 }, { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 }, { "drop": "raw_tainted_leather", "type": "skin", "mass_ratio": 0.02 }, @@ -269,6 +280,7 @@ { "drop": "science", "type": "bionic_group", "flags": [ "FILTHY" ] }, { "drop": "corpses", "type": "bionic_group", "flags": [ "FILTHY" ] }, { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.25 }, + { "drop": "blood_tainted", "type": "blood", "mass_ratio": 0.1 }, { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 }, { "drop": "raw_tainted_leather", "type": "skin", "mass_ratio": 0.02 }, From a0bf6e10263f0e609d4696e6dbb3549fd1388620 Mon Sep 17 00:00:00 2001 From: Dillon Matchett Date: Tue, 4 Jan 2022 14:01:37 -0400 Subject: [PATCH 119/154] Added warmth fixed volumes and weight for Robofac Ponchos (#53988) --- data/json/items/armor/robofac_armor.json | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/data/json/items/armor/robofac_armor.json b/data/json/items/armor/robofac_armor.json index a5c1e733523bd..f03ea2bd43daf 100644 --- a/data/json/items/armor/robofac_armor.json +++ b/data/json/items/armor/robofac_armor.json @@ -56,7 +56,7 @@ { "pocket_type": "CONTAINER", "ablative": true, - "max_contains_volume": "1600 ml", + "max_contains_volume": "5000 ml", "max_contains_weight": "5 kg", "moves": 200, "description": "Hooks for an armored mantle", @@ -65,7 +65,7 @@ { "pocket_type": "CONTAINER", "ablative": true, - "max_contains_volume": "1600 ml", + "max_contains_volume": "4000 ml", "max_contains_weight": "5 kg", "moves": 200, "description": "Hooks for an armored skirt", @@ -96,8 +96,8 @@ "category": "armor", "name": "abstract mantle", "repairs_like": "armor_lightplate", - "weight": "1 kg", - "volume": "1533 ml", + "weight": "2 kg", + "volume": "4500 ml", "price": 60000, "price_postapoc": 5000, "material": [ "ceramic" ], @@ -105,6 +105,7 @@ "color": "dark_gray", "material_thickness": 8, "environmental_protection": 5, + "warmth": 15, "flags": [ "ABLATIVE_MANTLE", "CANT_WEAR", "OUTER" ], "armor": [ { "encumbrance": 5, "coverage": 95, "covers": [ "torso" ], "specifically_covers": [ "torso_upper" ] }, @@ -139,8 +140,8 @@ "category": "armor", "name": "abstract armored skirt", "repairs_like": "armor_lightplate", - "weight": "800 g", - "volume": "900 ml", + "weight": "1800 g", + "volume": "3500 ml", "price": 60000, "price_postapoc": 5000, "material": [ "ceramic" ], @@ -148,6 +149,7 @@ "color": "dark_gray", "material_thickness": 8, "environmental_protection": 5, + "warmth": 15, "flags": [ "ABLATIVE_SKIRT", "CANT_WEAR", "OUTER" ], "armor": [ { @@ -174,8 +176,8 @@ "name": { "str_sp": "abstract armored vambraces" }, "looks_like": "armguard_hard", "repairs_like": "armguard_hard", - "weight": "500 g", - "volume": "900 ml", + "weight": "1750 g", + "volume": "4000 ml", "price": 60000, "price_postapoc": 5000, "material": [ "ceramic" ], @@ -183,6 +185,7 @@ "color": "dark_gray", "material_thickness": 6, "environmental_protection": 5, + "warmth": 20, "flags": [ "BLOCK_WHILE_WORN", "OUTER" ], "armor": [ { @@ -201,8 +204,8 @@ "name": { "str_sp": "abstract armored greaves" }, "looks_like": "legguard_hard", "repairs_like": "legguard_hard", - "weight": "500 g", - "volume": "900 ml", + "weight": "1750 g", + "volume": "5000 ml", "price": 60000, "price_postapoc": 5000, "material": [ "ceramic" ], @@ -210,6 +213,7 @@ "color": "dark_gray", "material_thickness": 6, "environmental_protection": 5, + "warmth": 20, "flags": [ "OUTER" ], "armor": [ { From 03d9f5c813f0c7409ca673c14ad44fdad5d2a18d Mon Sep 17 00:00:00 2001 From: Jason Fields Date: Tue, 4 Jan 2022 13:20:36 -0500 Subject: [PATCH 120/154] Use Oxford comma consistently in tips --- data/core/tips.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/data/core/tips.json b/data/core/tips.json index b7d84a0d654b1..6ebdfa84a88be 100644 --- a/data/core/tips.json +++ b/data/core/tips.json @@ -12,7 +12,7 @@ { "type": "snippet", "category": "tip", - "text": [ "Light itself doesn't draw zombies, it's sight, noise or smell." ] + "text": [ "Light itself doesn't draw zombies, it's sight, noise, or smell." ] }, { "type": "snippet", @@ -287,7 +287,7 @@ { "type": "snippet", "category": "tip", - "text": [ "Different characters, professions, hobbies and scenarios can spice up your game. Roleplay!" ] + "text": [ "Different characters, professions, hobbies, and scenarios can spice up your game. Roleplay!" ] }, { "type": "snippet", @@ -372,7 +372,7 @@ { "type": "snippet", "category": "tip", - "text": [ "Major blood loss? Drink plenty, supplement iron and rest to regenerate your red blood cells." ] + "text": [ "Major blood loss? Drink plenty, supplement iron, and rest to regenerate your red blood cells." ] }, { "type": "snippet", @@ -432,7 +432,7 @@ { "type": "snippet", "category": "tip", - "text": [ "You can automate repetitive tasks such as foraging, mining or mopping for your convenience." ] + "text": [ "You can automate repetitive tasks such as foraging, mining, or mopping for your convenience." ] }, { "type": "snippet", @@ -517,7 +517,7 @@ { "type": "snippet", "category": "tip", - "text": [ "Fight on your conditions whenever you can. Use terrain, traps and fire to your advantage." ] + "text": [ "Fight on your conditions whenever you can. Use terrain, traps, and fire to your advantage." ] }, { "type": "snippet", @@ -552,7 +552,7 @@ { "type": "snippet", "category": "tip", - "text": [ "Where applicable, use blacklists, whitelists and filters for a better quality of life." ] + "text": [ "Where applicable, use blacklists, whitelists, and filters for a better quality of life." ] }, { "type": "snippet", @@ -582,7 +582,7 @@ { "type": "snippet", "category": "tip", - "text": [ "Be mindful of what, when and how much you eat. A balanced diet is crucial in the long run." ] + "text": [ "Be mindful of what, when, and how much you eat. A balanced diet is crucial in the long run." ] }, { "type": "snippet", @@ -592,7 +592,7 @@ { "type": "snippet", "category": "tip", - "text": [ "For free in the construction menu: a crafting spot, a firewood source and a practice target." ] + "text": [ "For free in the construction menu: a crafting spot, a firewood source, and a practice target." ] }, { "type": "snippet", From b757057ad12a9044424691b4a0476d1e172cd1ec Mon Sep 17 00:00:00 2001 From: LyleSY Date: Tue, 4 Jan 2022 13:26:38 -0500 Subject: [PATCH 121/154] spinning wheels revived (#54015) --- data/json/construction.json | 12 + data/json/construction_group.json | 5 + .../furniture-tools.json | 26 ++ data/json/items/fake.json | 6 + data/json/recipes/other/cords_and_ropes.json | 354 ++++++++++++++++++ data/json/recipes/other/materials.json | 110 ++++++ 6 files changed, 513 insertions(+) diff --git a/data/json/construction.json b/data/json/construction.json index 0735d838b6de5..bd25d2c0a8d99 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -3450,6 +3450,18 @@ "pre_special": "check_empty", "post_terrain": "f_butcher_rack" }, + { + "type": "construction", + "id": "constr_spin_wheel", + "group": "build_spinwheel", + "category": "FURN", + "required_skills": [ [ "fabrication", 3 ], [ "mechanics", 2 ], [ "tailor", 1 ] ], + "time": "3 h", + "qualities": [ [ { "id": "CUT", "level": 1 } ], [ { "id": "SAW_W", "level": 1 } ], [ { "id": "HAMMER", "level": 1 } ] ], + "components": [ [ [ "2x4", 20 ] ], [ [ "string_36", 15 ] ], [ [ "nail", 25 ] ] ], + "pre_special": "check_empty", + "post_terrain": "f_spinwheel" + }, { "type": "construction", "id": "constr_junk_palisade", diff --git a/data/json/construction_group.json b/data/json/construction_group.json index c09ec773581de..9602c3d746dae 100644 --- a/data/json/construction_group.json +++ b/data/json/construction_group.json @@ -724,6 +724,11 @@ "id": "build_sofa", "name": "Build Sofa" }, + { + "type": "construction_group", + "id": "build_spinwheel", + "name": "Build Spinwheel" + }, { "type": "construction_group", "id": "build_split_rail_fence", diff --git a/data/json/furniture_and_terrain/furniture-tools.json b/data/json/furniture_and_terrain/furniture-tools.json index bfaba43694a43..94daaa25a4af8 100644 --- a/data/json/furniture_and_terrain/furniture-tools.json +++ b/data/json/furniture_and_terrain/furniture-tools.json @@ -327,6 +327,32 @@ "items": [ { "item": "rock", "count": 8 }, { "item": "stick", "count": [ 8, 12 ] } ] } }, + { + "type": "furniture", + "id": "f_spinwheel", + "name": "spinning wheel", + "looks_like": "f_table", + "description": "Large wooden device with a mechanical wheel used to combine fibers together into a stronger material.", + "symbol": "=", + "bgcolor": "brown", + "move_cost_mod": 2, + "required_str": 11, + "coverage": 40, + "flags": [ "TRANSPARENT", "NOITEM" ], + "crafting_pseudo_item": "spinwheelitem", + "deconstruct": { "items": [ { "item": "string_36", "count": 15 }, { "item": "2x4", "count": 20 }, { "item": "nail", "charges": 25 } ] }, + "bash": { + "str_min": 18, + "str_max": 50, + "sound": "crunch!", + "sound_fail": "whump!", + "items": [ + { "item": "string_36", "count": [ 12, 15 ] }, + { "item": "2x4", "count": [ 10, 20 ] }, + { "item": "nail", "charges": [ 15, 25 ] } + ] + } + }, { "type": "furniture", "id": "f_smoking_rack_active", diff --git a/data/json/items/fake.json b/data/json/items/fake.json index b608a955c6fc0..4508f5de8b2d8 100644 --- a/data/json/items/fake.json +++ b/data/json/items/fake.json @@ -15,6 +15,12 @@ "type": "TOOL", "name": { "str": "arc furnace" } }, + { + "id": "spinwheelitem", + "copy-from": "fake_item", + "type": "TOOL", + "name": { "str": "spinning wheel" } + }, { "id": "fake_burrowing", "copy-from": "fake_item", diff --git a/data/json/recipes/other/cords_and_ropes.json b/data/json/recipes/other/cords_and_ropes.json index 9bdbfc8313b99..6790ddef905d1 100644 --- a/data/json/recipes/other/cords_and_ropes.json +++ b/data/json/recipes/other/cords_and_ropes.json @@ -12,6 +12,22 @@ "proficiencies": [ { "proficiency": "prof_fibers" } ], "components": [ [ [ "filament", 50, "LIST" ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "string_6", + "id_suffix": "spinwheel", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "15 s", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" } ], + "components": [ [ [ "filament", 50, "LIST" ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -25,6 +41,22 @@ "proficiencies": [ { "proficiency": "prof_fibers" } ], "components": [ [ [ "string_6", 6 ], [ "filament", 300, "LIST" ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "string_36", + "id_suffix": "spinwheel", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "90 s", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" } ], + "components": [ [ [ "string_6", 6 ], [ "filament", 300, "LIST" ] ] ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -39,6 +71,22 @@ "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "string_36", 6 ], [ "string_6", 36 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_6", + "id_suffix": "spinwheel_string", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "90 s", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "string_36", 6 ], [ "string_6", 36 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -53,6 +101,22 @@ "proficiencies": [ { "proficiency": "prof_fibers", "fail_multiplier": 1.5 }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "filament", 1800, "LIST" ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_6", + "id_suffix": "spinwheel_filament", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "6 m", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers", "fail_multiplier": 1.5 }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "filament", 1800, "LIST" ] ] ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -68,6 +132,23 @@ "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "rag", 30 ], [ "leather", 30 ], [ "felt_patch", 30 ], [ "tanned_hide", 5 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_6", + "id_suffix": "spinwheel_cloth", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "3 m", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "qualities": [ { "id": "CUT", "level": 2 } ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "rag", 30 ], [ "leather", 30 ], [ "felt_patch", 30 ], [ "tanned_hide", 5 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -81,6 +162,22 @@ "proficiencies": [ { "proficiency": "prof_fibers_rope", "required": false, "time_multiplier": 1.5 } ], "components": [ [ [ "rope_6", 5 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_30", + "id_suffix": "spinwheel_ropes", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "5 m", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers_rope", "required": false, "time_multiplier": 1.5 } ], + "components": [ [ [ "rope_6", 5 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -96,6 +193,23 @@ "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "rag", 150 ], [ "leather", 150 ], [ "felt_patch", 150 ], [ "tanned_hide", 25 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_30", + "id_suffix": "spinwheel_cloth", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "15 m", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "qualities": [ { "id": "CUT", "level": 2 } ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "rag", 150 ], [ "leather", 150 ], [ "felt_patch", 150 ], [ "tanned_hide", 25 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -110,6 +224,22 @@ "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "string_36", 30 ], [ "string_6", 180 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_30", + "id_suffix": "spinwheel_string", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "10 m", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "string_36", 30 ], [ "string_6", 180 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -124,6 +254,22 @@ "proficiencies": [ { "proficiency": "prof_fibers", "fail_multiplier": 1.5 }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "filament", 10800, "LIST" ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_30", + "id_suffix": "spinwheel_filament", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "30 m", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers", "fail_multiplier": 1.5 }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "filament", 10800, "LIST" ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -137,6 +283,22 @@ "components": [ [ [ "withered", 1 ], [ "straw_pile", 1 ], [ "tanbark", 1 ], [ "willowbark", 1 ] ] ], "proficiencies": [ { "proficiency": "prof_fibers" } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "cordage_6", + "id_suffix": "spinwheel_plant", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "15 s", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "components": [ [ [ "withered", 1 ], [ "straw_pile", 1 ], [ "tanbark", 1 ], [ "willowbark", 1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" } ] + }, { "type": "recipe", "activity_level": "fake", @@ -150,6 +312,22 @@ "components": [ [ [ "withered", 6 ], [ "straw_pile", 6 ], [ "tanbark", 6 ], [ "willowbark", 6 ] ] ], "proficiencies": [ { "proficiency": "prof_fibers" } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "cordage_36", + "id_suffix": "spinwheel_plant", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "90 s", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "components": [ [ [ "withered", 6 ], [ "straw_pile", 6 ], [ "tanbark", 6 ], [ "willowbark", 6 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" } ] + }, { "type": "recipe", "activity_level": "fake", @@ -164,6 +342,22 @@ "components": [ [ [ "cordage_6", 6 ] ] ], "proficiencies": [ { "proficiency": "prof_fibers" } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "cordage_36", + "id_suffix": "spinwheel_ropes", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "8 s", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "components": [ [ [ "cordage_6", 6 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" } ] + }, { "type": "recipe", "activity_level": "fake", @@ -177,6 +371,22 @@ "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "cordage_36", 6 ], [ "cordage_6", 36 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_makeshift_6", + "id_suffix": "spinwheel_cordages", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "90 s", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "cordage_36", 6 ], [ "cordage_6", 36 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -191,6 +401,22 @@ "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "cordage_6", 150 ], [ "cordage_36", 30 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_makeshift_30", + "id_suffix": "spinwheel_cordages", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "8 m", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "cordage_6", 150 ], [ "cordage_36", 30 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -204,5 +430,133 @@ "autolearn": true, "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "rope_makeshift_6", 5 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_makeshift_30", + "id_suffix": "spinwheel_ropes", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "30 s", + "reversible": true, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "rope_makeshift_6", 5 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_6", + "id_suffix": "spinwheel_dissasemble", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "1 m", + "byproducts": [ [ "rope_6", 5 ] ], + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "rope_30", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "string_36", + "id_suffix": "spinwheel_dissasemble", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "90 s", + "byproducts": [ [ "string_36", 5 ] ], + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "rope_6", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rope_makeshift_6", + "id_suffix": "spinwheel_dissasemble", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "1 m", + "byproducts": [ [ "rope_makeshift_6", 4 ] ], + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "rope_makeshift_30", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "cordage_36", + "id_suffix": "spinwheel_string", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "90 s", + "byproducts": [ [ "cordage_36", 5 ] ], + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "rope_makeshift_6", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "string_6", + "id_suffix": "spinwheel_string", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "2 s", + "byproducts": [ [ "rope_6", 4 ] ], + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "string_36", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "cordage_6", + "id_suffix": "spinwheel_string", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "2 s", + "byproducts": [ [ "cordage_6", 4 ] ], + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "cordage_36", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "thread", + "id_suffix": "spinwheel_string", + "batch_time_factors": [ 70, 1 ], + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "15 s", + "charges": 50, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], + "components": [ [ [ "string_6", 1 ] ] ] } ] diff --git a/data/json/recipes/other/materials.json b/data/json/recipes/other/materials.json index 388b99fc6928d..1c97ffe1b94ec 100644 --- a/data/json/recipes/other/materials.json +++ b/data/json/recipes/other/materials.json @@ -231,6 +231,7 @@ "category": "CC_OTHER", "subcategory": "CSC_OTHER_MATERIALS", "skill_used": "fabrication", + "batch_time_factors": [ 99, 1 ], "//": "primitive recipe used for thousands of years before modern era. Folk craft teachers refer to this as the clumping method that is not appropriate for beginners.", "skills_required": [ "survival", 3 ], "difficulty": 1, @@ -238,6 +239,21 @@ "autolearn": true, "components": [ [ [ "soap", 5 ] ], [ [ "water_clean", 3 ] ], [ [ "wool_staple", 1 ] ] ] }, + { + "type": "recipe", + "activity_level": "fake", + "result": "thread", + "id_suffix": "spinningwheel", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "batch_time_factors": [ 70, 1 ], + "time": "15 s", + "charges": 50, + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "components": [ [ [ "felt_patch", 1 ] ] ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -300,6 +316,21 @@ "tools": [ [ [ "carding_paddles", -1 ] ] ], "components": [ [ [ "cotton_boll", 1 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "cotton_ball", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "batch_time_factors": [ 70, 1 ], + "id_suffix": "spinningwheel", + "time": "27 s", + "autolearn": true, + "byproducts": [ [ "seed_cotton_boll", 2 ] ], + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "components": [ [ [ "cotton_boll", 1 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -315,6 +346,21 @@ "tools": [ [ [ "distaff_spindle", -1 ] ] ], "components": [ [ [ "cotton_ball", 3 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "thread", + "id_suffix": "spinningwheel", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "batch_time_factors": [ 70, 1 ], + "skill_used": "tailor", + "time": "30 s", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_spinning", "fail_multiplier": 1.5 } ], + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "components": [ [ [ "cotton_ball", 3 ] ] ] + }, { "result": "grass_yarn", "type": "recipe", @@ -330,6 +376,22 @@ "tools": [ [ [ "distaff_spindle", -1 ] ] ], "components": [ [ [ "straw_pile", 5 ], [ "withered", 5 ] ] ] }, + { + "result": "grass_yarn", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "id_suffix": "spinningwheel", + "batch_time_factors": [ 70, 1 ], + "time": "90 s", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_spinning" }, { "proficiency": "prof_fibers" } ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "components": [ [ [ "straw_pile", 5 ], [ "withered", 5 ] ] ] + }, { "result": "yarn", "type": "recipe", @@ -345,6 +407,22 @@ "tools": [ [ [ "distaff_spindle", -1 ] ] ], "components": [ [ [ "wool_staple", 1 ] ] ] }, + { + "result": "yarn", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "id_suffix": "spinningwheel", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "batch_time_factors": [ 70, 1 ], + "time": "90 s", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_spinning" }, { "proficiency": "prof_fibers" } ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "components": [ [ [ "wool_staple", 1 ] ] ] + }, { "type": "recipe", "activity_level": "NO_EXERCISE", @@ -360,6 +438,21 @@ "qualities": [ { "id": "KNIT", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_knitting" }, { "proficiency": "prof_knitting_speed" } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "rag", + "id_suffix": "spinningwheel", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "batch_time_factors": [ 70, 1 ], + "time": "18 s", + "autolearn": true, + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "using": [ [ "filament", 80 ] ], + "proficiencies": [ { "proficiency": "prof_knitting" }, { "proficiency": "prof_knitting_speed" } ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -414,6 +507,23 @@ "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "thread", 5 ] ] ] }, + { + "result": "sheet_cotton", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_OTHER", + "id_suffix": "spinningwheel", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "batch_time_factors": [ 70, 1 ], + "time": "30 s", + "charges": 1, + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_weaving" } ], + "tools": [ [ [ "spinwheelitem", -1 ] ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "thread", 5 ] ] ] + }, { "result": "sheet_cotton_patchwork", "type": "recipe", From 06acd8464b1965f67dd45f3c56e970254bfe90d1 Mon Sep 17 00:00:00 2001 From: Eric <52087122+Ramza13@users.noreply.github.com> Date: Tue, 4 Jan 2022 13:29:44 -0500 Subject: [PATCH 122/154] Portal Storm changes (#54018) --- .../portal_dependent_effect_on_condition.json | 2 +- .../portal_storm_effect_on_condition.json | 103 ++-- data/json/scenarios.json | 2 +- doc/NPCs.md | 8 +- src/condition.cpp | 35 +- src/condition.h | 2 + src/dialogue.h | 1 - src/npctalk.cpp | 488 ++++++++++-------- 8 files changed, 352 insertions(+), 289 deletions(-) diff --git a/data/json/portal_dependent_effect_on_condition.json b/data/json/portal_dependent_effect_on_condition.json index daf60c6aedd38..8b9d2f53470a3 100644 --- a/data/json/portal_dependent_effect_on_condition.json +++ b/data/json/portal_dependent_effect_on_condition.json @@ -18,7 +18,7 @@ { "id": "EOC_PDEPENDENT_STRONG_WEAK_EFFECTS_ACCEPTANCE", "condition": { - "compare_int": [ { "global_val": "var", "var_name": "ps_str", "type": "weather", "context": "ps" }, { "const": 8 } ], + "compare_int": [ { "global_val": "var", "var_name": "ps_str", "type": "weather", "context": "ps" }, { "const": 4 } ], "op": ">" }, "effect": { diff --git a/data/json/portal_storm_effect_on_condition.json b/data/json/portal_storm_effect_on_condition.json index 5bec8d479d242..7e0d77e59ab1e 100644 --- a/data/json/portal_storm_effect_on_condition.json +++ b/data/json/portal_storm_effect_on_condition.json @@ -20,17 +20,15 @@ "id": "scenario_quick_portal_storm", "eoc_type": "SCENARIO_SPECIFIC", "effect": [ - { "arithmetic": [ { "global_val": "var", "var_name": "ps_min_increase" }, "=", { "time": "15 minutes" } ] }, - { "arithmetic": [ { "global_val": "var", "var_name": "ps_max_increase" }, "=", { "time": "30 minutes" } ] }, - { "arithmetic": [ { "global_val": "var", "var_name": "ps_min_woc" }, "=", { "time": "2 days" } ] }, - { "arithmetic": [ { "global_val": "var", "var_name": "ps_max_woc" }, "=", { "time": "4 days" } ] } + { "arithmetic": [ { "global_val": "var", "var_name": "ps_min_woc" }, "=", { "time": "1 days" } ] }, + { "arithmetic": [ { "global_val": "var", "var_name": "ps_max_woc" }, "=", { "time": "2 days" } ] } ] }, { "type": "effect_on_condition", "id": "EOC_PORTAL_STORM_WARN_OR_CAUSE_RECURRING", - "recurrence_min": { "global_val": "ps_min_woc", "default": "6 days" }, - "recurrence_max": { "global_val": "ps_max_woc", "default": "9 days" }, + "recurrence_min": { "global_val": "ps_min_woc", "default": "2 days" }, + "recurrence_max": { "global_val": "ps_max_woc", "default": "4 days" }, "global": true, "effect": [ { "set_queue_effect_on_condition": [ "EOC_PORTAL_STORM_WARN" ] } ] }, @@ -184,20 +182,10 @@ { "const": 1 } ] }, - { - "set_queue_effect_on_condition": [ - { - "id": "EOC_PORTAL_STORM_INCREASE_BASE_STRENGTH", - "//": "Cap portal storm base strength at 25", - "condition": { "compare_int": [ { "global_val": "var", "var_name": "ps_base_str" }, { "const": 25 } ], "op": "<" }, - "effect": [ { "arithmetic": [ { "global_val": "var", "var_name": "ps_base_str" }, "++" ] } ] - } - ] - }, { "set_queue_effect_on_condition": [ "EOC_CANCEL_PORTAL_STORM" ], - "time_in_future_min": "4 hours", - "time_in_future_max": "6 hours" + "time_in_future_min": { "global_val": "ps_min_length", "default": "2 hours" }, + "time_in_future_max": { "global_val": "ps_max_length", "default": "4 hours" } }, { "u_message": "Reality is breaking. It is subtle but something deep inside you feels the wrongness.", @@ -219,19 +207,49 @@ "effect": [ { "arithmetic": [ { "global_val": "var", "var_name": "cause_portal_storm" }, "=", { "const": 0 } ] }, "next_weather", - { "u_message": "The damage to reality fades. Hopefully the scarring is minimal.", "type": "good" } + { "u_message": "The damage to reality fades. Hopefully the scarring is minimal.", "type": "good" }, + { "set_queue_effect_on_condition": [ "EOC_WORSEN_PORTAL_STORM" ] } ] }, + { + "type": "effect_on_condition", + "id": "EOC_WORSEN_PORTAL_STORM", + "effect": { + "set_weighted_list_eocs": [ [ "EOC_PORTAL_STRENGTHEN", 1 ], [ "EOC_PORTAL_LENGTHEN", 1 ], [ "EOC_PORTAL_OFTEN", 1 ] ] + } + }, { "type": "effect_on_condition", "id": "EOC_PORTAL_STRENGTHEN", - "//": "Increases the portal storms strength.", - "recurrence_min": { "global_val": "ps_min_increase", "default": "45 minutes" }, - "recurrence_max": { "global_val": "ps_max_increase", "default": "75 minutes" }, - "global": true, - "condition": { "is_weather": "portal_storm" }, - "deactivate_condition": { "not": { "is_weather": "portal_storm" } }, - "effect": [ { "arithmetic": [ { "global_val": "var", "var_name": "ps_str" }, "++" ] } ] + "effect": { "arithmetic": [ { "global_val": "var", "var_name": "ps_base_str" }, "++" ], "max": 10 } + }, + { + "type": "effect_on_condition", + "id": "EOC_PORTAL_LENGTHEN", + "effect": [ + { + "arithmetic": [ { "global_val": "var", "var_name": "ps_min_length", "default_time": "2 hours" }, "+=", { "time": "15 minutes" } ], + "max_time": "12 hours" + }, + { + "arithmetic": [ { "global_val": "var", "var_name": "ps_max_length", "default_time": "4 hours" }, "+=", { "time": "30 minutes" } ], + "max_time": "16 hours" + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PORTAL_OFTEN", + "effect": [ + { + "arithmetic": [ { "global_val": "var", "var_name": "ps_min_woc", "default_time": "2 days" }, "-=", { "time": "1 hours" } ], + "min_time": "24 hours" + }, + { + "arithmetic": [ { "global_val": "var", "var_name": "ps_max_woc", "default_time": "4 days" }, "-=", { "time": "2 hours" } ], + "min_time": "36 hours" + } + ] }, { "type": "effect_on_condition", @@ -243,7 +261,7 @@ "condition": { "and": [ { "is_weather": "portal_storm" }, - { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 4 } ], "op": "<=" } + { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 2 } ], "op": "<=" } ] }, "deactivate_condition": { "not": { "is_weather": "portal_storm" } }, @@ -279,8 +297,8 @@ "condition": { "and": [ { "is_weather": "portal_storm" }, - { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 4 } ], "op": ">" }, - { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 8 } ], "op": "<=" } + { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 2 } ], "op": ">" }, + { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 4 } ], "op": "<=" } ] }, "deactivate_condition": { "not": { "is_weather": "portal_storm" } }, @@ -319,7 +337,7 @@ "condition": { "and": [ { "is_weather": "portal_storm" }, - { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 8 } ], "op": ">" } + { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 4 } ], "op": ">" } ] }, "deactivate_condition": { "not": { "is_weather": "portal_storm" } }, @@ -359,22 +377,22 @@ "set_queue_effect_on_condition": [ { "id": "EOC_PORTAL_STORM_MESSAGE_1", - "condition": { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 3 } ], "op": "<" }, + "condition": { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 2 } ], "op": "<=" }, "effect": [ { "u_message": "PORTAL_STORM_MESSAGES_1", "snippet": true } ] }, { "id": "EOC_PORTAL_STORM_MESSAGE_2", "condition": { "and": [ - { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 6 } ], "op": "<" }, - { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 3 } ], "op": ">=" } + { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 4 } ], "op": "<" }, + { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 2 } ], "op": ">=" } ] }, "effect": [ { "u_message": "PORTAL_STORM_MESSAGES_2", "snippet": true } ] }, { "id": "EOC_PORTAL_STORM_MESSAGE_3", - "condition": { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 6 } ], "op": ">=" }, + "condition": { "compare_int": [ { "global_val": "var", "var_name": "ps_str" }, { "const": 4 } ], "op": ">=" }, "effect": [ { "u_message": "PORTAL_STORM_MESSAGES_3", "snippet": true } ] } ] @@ -397,16 +415,7 @@ "u_message": "For a second the air glows a beautiful color you've never seen before and can't quite recall afterwards.", "type": "good" }, - { - "arithmetic": [ - { "global_val": "var", "var_name": "ps_rad_str" }, - "=", - { "global_val": "var", "var_name": "ps_str" }, - "+", - { "const": 10 } - ] - }, - { "arithmetic": [ { "u_val": "rad" }, "+=", { "global_val": "var", "var_name": "ps_rad_str" } ] } + { "arithmetic": [ { "u_val": "rad" }, "+=", { "global_val": "var", "var_name": "ps_str" } ] } ] }, { @@ -441,10 +450,10 @@ "=", { "global_val": "var", "var_name": "ps_str" }, "/", - { "const": 3 } - ] + { "const": 2 } + ], + "min": 1 }, - { "arithmetic": [ { "global_val": "var", "var_name": "ps_shifting_mass_count" }, "++" ] }, { "u_set_spawn_monster": "mon_shifting_mass", "real_count": { "global_val": "ps_shifting_mass_count", "default": 1 }, diff --git a/data/json/scenarios.json b/data/json/scenarios.json index c50d6de38a77b..dcfe59939097f 100644 --- a/data/json/scenarios.json +++ b/data/json/scenarios.json @@ -685,7 +685,7 @@ "id": "quick_portal_storm_base", "name": "Frequent Portal Storms", "points": -4, - "description": "You've managed to get to a shelter, but reality has grown weaker than normal, portal storms will be more frequent and strengthen faster.", + "description": "You've managed to get to a shelter, but reality has grown weaker than normal, portal storms will be more frequent.", "flags": [ "CHALLENGE", "LONE_START" ], "start_name": "Evac Shelter", "allowed_locs": [ "sloc_shelter_a", "sloc_shelter_b", "sloc_shelter_c" ], diff --git a/doc/NPCs.md b/doc/NPCs.md index 160e30ced3258..50845d9afc274 100644 --- a/doc/NPCs.md +++ b/doc/NPCs.md @@ -893,13 +893,13 @@ Condition | Type | Description `"compare_int"` can be used to compare two values to each other, while `"arithmetic"` can be used to take up to two values, perform arithmetic on them, and then save them in a third value. The syntax is as follows. ``` { - "text": "If player strength is more than or equal to 5, sets time since cataclysm to the player's focus times the player's maximum mana.", + "text": "If player strength is more than or equal to 5, sets time since cataclysm to the player's focus times the player's maximum mana with at maximum a value of 15.", "topic": "TALK_DONE", "condition": { "compare_int": [ { "u_val": "strength" }, { "const": 5 } ], "op": ">=" } - "effect": { "arithmetic": [ { "time_since_cataclysm": "turns" }, "=", { "u_val": "focus" }, "*", { "u_val": "mana_max" } ] } + "effect": { "arithmetic": [ { "time_since_cataclysm": "turns" }, "=", { "u_val": "focus" }, "*", { "u_val": "mana_max" } ], "max":15 } }, ``` - +`min` and `max` are optional int or variable_object values. If supplied they will limit the result, it will be no lower than `min` and no higher than `max`. `min_time` and `max_time` work the same way but will parse times written as a string i.e. "10 hours". `"compare_int"` supports the following opperators: `"=="`, `"="` (Both are treated the same, as a compare), `"!="`, `"<="`, `">="`, `"<"`, and `">"`. `"arithmetic"` supports the following opperators: `"*"`, `"/"`, `"+"`, `"-"`, `"%"`, `"&"`, `"|"`, `"<<"`, `">>"`, `"~"`, `"^"` and the following results `"="`, `"*="`, `"/="`, `"+="`, `"-="`, `"%="`, `"++"`, and `"--"` @@ -918,7 +918,7 @@ Example | Description `"weather": "pressure"` | Current pressure. `"u_val": "strength"` | Player character's strength. Can be read but not written to. Replace `"strength"` with `"dexterity"`, `"intelligence"`, or `"perception"` to get such values. `"u_val": "strength_base"` | Player character's strength. Replace `"strength_base"` with `"dexterity_base"`, `"intelligence_base"`, or `"perception_base"` to get such values. -`"u_val": "var"` | Custom variable. `"var_name"`, `"type"`, and `"context"` must also be specified. If `global_val` is used then a global variable will be used. +`"u_val": "var"` | Custom variable. `"var_name"`, `"type"`, and `"context"` must also be specified. If `global_val` is used then a global variable will be used. If `default` is given as either an int or a variable_object then that value will be used if the variable is empty. If `default_time` is the same thing will happen, but it will be parsed as a time string aka "10 hours". Otherwise 0 will be used if the variable is empty. `"u_val": "time_since_var"` | Time since a custom variable was set. Unit used is turns. `"var_name"`, `"type"`, and `"context"` must also be specified. `"u_val": "hour"` | Hours since midnight. `"u_val": "moon"` | Phase of the moon. MOON_NEW =0, WAXING_CRESCENT =1, HALF_MOON_WAXING =2, WAXING_GIBBOUS =3, FULL =4, WANING_GIBBOUS =5, HALF_MOON_WANING =6, WANING_CRESCENT =7 diff --git a/src/condition.cpp b/src/condition.cpp index b647c20dd9d47..ae0ab03baaf32 100644 --- a/src/condition.cpp +++ b/src/condition.cpp @@ -53,6 +53,13 @@ static const json_character_flag json_flag_MUTATION_THRESHOLD( "MUTATION_THRESHO // throws an error on failure, so no need to return std::string get_talk_varname( const JsonObject &jo, const std::string &member, bool check_value ) +{ + int_or_var empty; + return get_talk_varname( jo, member, check_value, empty ); +} + +std::string get_talk_varname( const JsonObject &jo, const std::string &member, + bool check_value, int_or_var &default_val ) { if( check_value && !( jo.has_string( "value" ) || jo.has_member( "time" ) || jo.has_array( "possible_values" ) ) ) { @@ -61,6 +68,14 @@ std::string get_talk_varname( const JsonObject &jo, const std::string &member, const std::string &var_basename = jo.get_string( member ); const std::string &type_var = jo.get_string( "type", "" ); const std::string &var_context = jo.get_string( "context", "" ); + default_val = get_int_or_var( jo, "default", false ); + if( jo.has_member( "default_time" ) ) { + int_or_var value; + time_duration max_time; + mandatory( jo, false, "default_time", max_time ); + value.int_val = to_turns( max_time ); + default_val = value; + } return "npctalk_var" + ( type_var.empty() ? "" : "_" + type_var ) + ( var_context.empty() ? "" : "_" + var_context ) + "_" + var_basename; } @@ -1117,20 +1132,16 @@ std::function conditional_t::get_get_int( const JsonObject return d.actor( is_npc )->get_per_max(); }; } else if( checked_value == "var" ) { - const std::string var_name = get_talk_varname( jo, "var_name", false ); - return [is_npc, var_name, is_global]( const T & d ) { - int stored_value = 0; - std::string var; - if( is_global ) { - global_variables &globvars = get_globals(); - var = globvars.get_global_value( var_name ); - } else { - var = d.actor( is_npc )->get_value( var_name ); - } + int_or_var default_val; + const std::string var_name = get_talk_varname( jo, "var_name", false, default_val ); + return [is_npc, var_name, is_global, default_val]( const T & d ) { + std::string var = read_var_value( is_npc ? var_type::npc : ( is_global ? var_type::global : + var_type::u ), var_name, d.actor( is_npc ) ); if( !var.empty() ) { - stored_value = std::stoi( var ); + return std::stoi( var ); + } else { + return default_val.evaluate( d.actor( default_val.is_npc() ) ); } - return stored_value; }; } else if( checked_value == "time_since_var" ) { const std::string var_name = get_talk_varname( jo, "var_name", false ); diff --git a/src/condition.h b/src/condition.h index 9af9652aa285e..14bab5397824d 100644 --- a/src/condition.h +++ b/src/condition.h @@ -59,6 +59,8 @@ tripoint get_tripoint_from_var( talker *target, cata::optional targ var_info read_var_info( JsonObject jo, bool require_default ); std::string get_talk_varname( const JsonObject &jo, const std::string &member, bool check_value = false ); +std::string get_talk_varname( const JsonObject &jo, const std::string &member, + bool check_value, int_or_var &default_val ); // the truly awful declaration for the conditional_t loading helper_function template void read_condition( const JsonObject &jo, const std::string &member_name, diff --git a/src/dialogue.h b/src/dialogue.h index 82b925e4ca597..80fabe86d007c 100644 --- a/src/dialogue.h +++ b/src/dialogue.h @@ -156,7 +156,6 @@ struct talk_effect_fun_t { void set_add_faction_trust( const JsonObject &jo, const std::string &member ); void set_lose_faction_trust( const JsonObject &jo, const std::string &member ); void set_arithmetic( const JsonObject &jo, const std::string &member ); - std::function get_set_int( const JsonObject &jo ); void set_custom_light_level( const JsonObject &jo, const std::string &member ); void set_spawn_monster( const JsonObject &jo, const std::string &member, bool is_npc ); void set_field( const JsonObject &jo, const std::string &member, bool is_npc ); diff --git a/src/npctalk.cpp b/src/npctalk.cpp index a172e5f6194d6..75f9e72326e0b 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -2779,161 +2779,22 @@ void talk_effect_fun_t::set_next_weather() }; } -void talk_effect_fun_t::set_arithmetic( const JsonObject &jo, const std::string &member ) +static int handle_min_max( const dialogue &d, int input, cata::optional min, + cata::optional max ) { - JsonArray objects = jo.get_array( member ); - std::string op = "none"; - std::string result = "none"; - std::function set_int = get_set_int( objects.get_object( 0 ) ); - // Normal full version - if( objects.size() == 5 ) { - op = objects.get_string( 3 ); - result = objects.get_string( 1 ); - if( result != "=" ) { - jo.throw_error( "invalid result " + op + " in " + jo.str() ); - function = []( const dialogue & ) { - return false; - }; - } - std::function get_first_int = conditional_t< dialogue >::get_get_int( - objects.get_object( 2 ) ); - std::function get_second_int = conditional_t< dialogue >::get_get_int( - objects.get_object( 4 ) ); - if( op == "*" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) * get_second_int( d ) ); - }; - } else if( op == "/" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) / get_second_int( d ) ); - }; - } else if( op == "+" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) + get_second_int( d ) ); - }; - } else if( op == "-" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) - get_second_int( d ) ); - }; - } else if( op == "%" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) % get_second_int( d ) ); - }; - } else if( op == "&" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) & get_second_int( d ) ); - }; - } else if( op == "|" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) | get_second_int( d ) ); - }; - } else if( op == "<<" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) << get_second_int( d ) ); - }; - } else if( op == ">>" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) >> get_second_int( d ) ); - }; - } else if( op == "^" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) ^ get_second_int( d ) ); - }; - } else { - jo.throw_error( "unexpected operator " + op + " in " + jo.str() ); - function = []( const dialogue & ) { - return false; - }; - } - // ~ - } else if( objects.size() == 4 ) { - op = objects.get_string( 3 ); - result = objects.get_string( 1 ); - if( result != "=" ) { - jo.throw_error( "invalid result " + op + " in " + jo.str() ); - function = []( const dialogue & ) { - return false; - }; - } - std::function get_first_int = conditional_t< dialogue >::get_get_int( - objects.get_object( 2 ) ); - if( op == "~" ) { - function = [get_first_int, set_int]( const dialogue & d ) { - set_int( d, ~get_first_int( d ) ); - }; - } else { - jo.throw_error( "unexpected operator " + op + " in " + jo.str() ); - function = []( const dialogue & ) { - return false; - }; - } - - // =, -=, +=, *=, and /= - } else if( objects.size() == 3 ) { - result = objects.get_string( 1 ); - std::function get_first_int = conditional_t< dialogue >::get_get_int( - objects.get_object( 0 ) ); - std::function get_second_int = conditional_t< dialogue >::get_get_int( - objects.get_object( 2 ) ); - if( result == "+=" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) + get_second_int( d ) ); - }; - } else if( result == "-=" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) - get_second_int( d ) ); - }; - } else if( result == "*=" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) * get_second_int( d ) ); - }; - } else if( result == "/=" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) / get_second_int( d ) ); - }; - } else if( result == "%=" ) { - function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) % get_second_int( d ) ); - }; - } else if( result == "=" ) { - function = [get_second_int, set_int]( const dialogue & d ) { - set_int( d, get_second_int( d ) ); - }; - } else { - jo.throw_error( "unexpected result " + result + " in " + jo.str() ); - function = []( const dialogue & ) { - return false; - }; - } - // ++ and -- - } else if( objects.size() == 2 ) { - op = objects.get_string( 1 ); - std::function get_first_int = conditional_t< dialogue >::get_get_int( - objects.get_object( 0 ) ); - if( op == "++" ) { - function = [get_first_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) + 1 ); - }; - } else if( op == "--" ) { - function = [get_first_int, set_int]( const dialogue & d ) { - set_int( d, get_first_int( d ) - 1 ); - }; - } else { - jo.throw_error( "unexpected operator " + op + " in " + jo.str() ); - function = []( const dialogue & ) { - return false; - }; - } - } else { - jo.throw_error( "Invalid number of args in " + jo.str() ); - function = []( const dialogue & ) { - return false; - }; - return; + if( min.has_value() ) { + int min_val = min.value().evaluate( d.actor( min.value().is_npc() ) ); + input = std::max( min_val, input ); + } + if( max.has_value() ) { + int max_val = max.value().evaluate( d.actor( max.value().is_npc() ) ); + input = std::min( max_val, input ); } + return input; } -std::function talk_effect_fun_t::get_set_int( const JsonObject &jo ) +static std::function get_set_int( const JsonObject &jo, + cata::optional min, cata::optional max ) { if( jo.has_member( "const" ) ) { jo.throw_error( "attempted to alter a constant value in " + jo.str() ); @@ -2957,31 +2818,31 @@ std::function talk_effect_fun_t::get_set_int( con jo.throw_error( "unrecognized time unit in " + jo.str() ); } } - return [given_unit]( const dialogue &, int input ) { - calendar::turn = time_point( input * to_turns( given_unit ) ); + return [given_unit, min, max]( const dialogue & d, int input ) { + calendar::turn = time_point( handle_min_max( d, input, min, max ) * to_turns( given_unit ) ); }; } else if( jo.has_member( "rand" ) ) { jo.throw_error( "can not alter the random number generator, silly! In " + jo.str() ); } else if( jo.has_member( "weather" ) ) { std::string weather_aspect = jo.get_string( "weather" ); if( weather_aspect == "temperature" ) { - return []( const dialogue &, int input ) { - get_weather().weather_precise->temperature = input; + return [min, max]( const dialogue & d, int input ) { + get_weather().weather_precise->temperature = handle_min_max( d, input, min, max );; get_weather().clear_temp_cache(); }; } else if( weather_aspect == "windpower" ) { - return []( const dialogue &, int input ) { - get_weather().weather_precise->windpower = input; + return [min, max]( const dialogue & d, int input ) { + get_weather().weather_precise->windpower = handle_min_max( d, input, min, max );; get_weather().clear_temp_cache(); }; } else if( weather_aspect == "humidity" ) { - return []( const dialogue &, int input ) { - get_weather().weather_precise->humidity = input; + return [min, max]( const dialogue & d, int input ) { + get_weather().weather_precise->humidity = handle_min_max( d, input, min, max );; get_weather().clear_temp_cache(); }; } else if( weather_aspect == "pressure" ) { - return []( const dialogue &, int input ) { - get_weather().weather_precise->pressure = input; + return [min, max]( const dialogue & d, int input ) { + get_weather().weather_precise->pressure = handle_min_max( d, input, min, max );; get_weather().clear_temp_cache(); }; } @@ -3010,31 +2871,32 @@ std::function talk_effect_fun_t::get_set_int( con const bool is_npc = type == var_type::npc; if( checked_value == "strength_base" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_str_max( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_str_max( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "dexterity_base" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_dex_max( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_dex_max( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "intelligence_base" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_int_max( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_int_max( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "perception_base" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_per_max( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_per_max( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "var" ) { const std::string var_name = get_talk_varname( jo, "var_name", false ); - return [is_npc, var_name, type]( const dialogue & d, int input ) { - write_var_value( type, var_name, d.actor( is_npc ), std::to_string( input ) ); + return [is_npc, var_name, type, min, max]( const dialogue & d, int input ) { + write_var_value( type, var_name, d.actor( is_npc ), std::to_string( handle_min_max( d, input, min, + max ) ) ); }; } else if( checked_value == "time_since_var" ) { // This is a strange thing to want to adjust. But we allow it nevertheless. const std::string var_name = get_talk_varname( jo, "var_name", false ); - return [is_npc, var_name]( const dialogue & d, int input ) { - int storing_value = to_turn( calendar::turn ) - input; + return [is_npc, var_name, min, max]( const dialogue & d, int input ) { + int storing_value = to_turn( calendar::turn ) - handle_min_max( d, input, min, max ); d.actor( is_npc )->set_value( var_name, std::to_string( storing_value ) ); }; } else if( checked_value == "allies" ) { @@ -3048,126 +2910,131 @@ std::function talk_effect_fun_t::get_set_int( con if( is_npc ) { jo.throw_error( "owed amount not supported for NPCs. In " + jo.str() ); } else { - return []( const dialogue & d, int input ) { - d.actor( true )->add_debt( input - d.actor( true )->debt() ); + return [min, max]( const dialogue & d, int input ) { + d.actor( true )->add_debt( handle_min_max( d, input, min, max ) - d.actor( true )->debt() ); }; } } else if( checked_value == "sold" ) { if( is_npc ) { jo.throw_error( "sold amount not supported for NPCs. In " + jo.str() ); } else { - return []( const dialogue & d, int input ) { - d.actor( true )->add_sold( input - d.actor( true )->sold() ); + return [min, max]( const dialogue & d, int input ) { + d.actor( true )->add_sold( handle_min_max( d, input, min, max ) - d.actor( true )->sold() ); }; } } else if( checked_value == "skill_level" ) { const skill_id skill( jo.get_string( "skill" ) ); - return [is_npc, skill]( const dialogue & d, int input ) { - d.actor( is_npc )->set_skill_level( skill, input ); + return [is_npc, skill, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_skill_level( skill, handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "pos_x" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_pos( tripoint( input, d.actor( is_npc )->posy(), + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_pos( tripoint( handle_min_max( d, input, min, max ), + d.actor( is_npc )->posy(), d.actor( is_npc )->posz() ) ); }; } else if( checked_value == "pos_y" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_pos( tripoint( d.actor( is_npc )->posx(), input, + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_pos( tripoint( d.actor( is_npc )->posx(), handle_min_max( d, input, min, + max ), d.actor( is_npc )->posz() ) ); }; } else if( checked_value == "pos_z" ) { - return [is_npc]( const dialogue & d, int input ) { + return [is_npc, min, max]( const dialogue & d, int input ) { d.actor( is_npc )->set_pos( tripoint( d.actor( is_npc )->posx(), d.actor( is_npc )->posy(), - input ) ); + handle_min_max( d, input, min, max ) ) ); }; } else if( checked_value == "pain" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->mod_pain( input - d.actor( is_npc )->pain_cur() ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->mod_pain( handle_min_max( d, input, min, max ) - d.actor( is_npc )->pain_cur() ); }; } else if( checked_value == "power" ) { - return [is_npc]( const dialogue & d, int input ) { + return [is_npc, min, max]( const dialogue & d, int input ) { // Energy in milijoule - d.actor( is_npc )->set_power_cur( 1_mJ * input ); + d.actor( is_npc )->set_power_cur( 1_mJ * handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "power_max" ) { jo.throw_error( "altering max power this way is currently not supported. In " + jo.str() ); } else if( checked_value == "power_percentage" ) { - return [is_npc]( const dialogue & d, int input ) { + return [is_npc, min, max]( const dialogue & d, int input ) { // Energy in milijoule - d.actor( is_npc )->set_power_cur( ( d.actor( is_npc )->power_max() * input ) / 100 ); + d.actor( is_npc )->set_power_cur( ( d.actor( is_npc )->power_max() * handle_min_max( d, input, min, + max ) ) / 100 ); }; } else if( checked_value == "focus" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->mod_focus( input - d.actor( is_npc )->focus_cur() ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->mod_focus( handle_min_max( d, input, min, + max ) - d.actor( is_npc )->focus_cur() ); }; } else if( checked_value == "mana" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_mana_cur( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_mana_cur( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "mana_max" ) { jo.throw_error( "altering max mana this way is currently not supported. In " + jo.str() ); } else if( checked_value == "mana_percentage" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_mana_cur( ( d.actor( is_npc )->mana_max() * input ) / 100 ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_mana_cur( ( d.actor( is_npc )->mana_max() * handle_min_max( d, input, min, + max ) ) / 100 ); }; } else if( checked_value == "hunger" ) { jo.throw_error( "altering hunger this way is currently not supported. In " + jo.str() ); } else if( checked_value == "thirst" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_thirst( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_thirst( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "stored_kcal" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_stored_kcal( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_stored_kcal( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "stored_kcal_percentage" ) { // 100% is 55'000 kcal, which is considered healthy. - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_stored_kcal( input * 5500 ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_stored_kcal( handle_min_max( d, input, min, max ) * 5500 ); }; } else if( checked_value == "item_count" ) { jo.throw_error( "altering items this way is currently not supported. In " + jo.str() ); } else if( checked_value == "exp" ) { jo.throw_error( "altering max exp this way is currently not supported. In " + jo.str() ); } else if( checked_value == "stim" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_stim( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_stim( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "pkill" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_pkill( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_pkill( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "rad" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_rad( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_rad( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "fatigue" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_fatigue( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_fatigue( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "stamina" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_stamina( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_stamina( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "sleep_deprivation" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_sleep_deprivation( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_sleep_deprivation( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "anger" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_anger( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_anger( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "morale" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_morale( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_morale( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "friendly" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_friendly( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_friendly( handle_min_max( d, input, min, max ) ); }; } else if( checked_value == "exp" ) { - return [is_npc]( const dialogue & d, int input ) { - d.actor( is_npc )->set_kill_xp( input ); + return [is_npc, min, max]( const dialogue & d, int input ) { + d.actor( is_npc )->set_kill_xp( handle_min_max( d, input, min, max ) ); }; } } @@ -3175,6 +3042,181 @@ std::function talk_effect_fun_t::get_set_int( con return []( const dialogue &, int ) {}; } +void talk_effect_fun_t::set_arithmetic( const JsonObject &jo, const std::string &member ) +{ + JsonArray objects = jo.get_array( member ); + cata::optional min; + cata::optional max; + if( jo.has_member( "min" ) ) { + min = get_int_or_var( jo, "min" ); + } else if( jo.has_member( "min_time" ) ) { + int_or_var value; + time_duration min_time; + mandatory( jo, false, "min_time", min_time ); + value.int_val = to_turns( min_time ); + min = value; + } + if( jo.has_member( "max" ) ) { + max = get_int_or_var( jo, "max" ); + } else if( jo.has_member( "max_time" ) ) { + int_or_var value; + time_duration max_time; + mandatory( jo, false, "max_time", max_time ); + value.int_val = to_turns( max_time ); + max = value; + } + std::string op = "none"; + std::string result = "none"; + std::function set_int = get_set_int( objects.get_object( 0 ), min, + max ); + // Normal full version + if( objects.size() == 5 ) { + op = objects.get_string( 3 ); + result = objects.get_string( 1 ); + if( result != "=" ) { + jo.throw_error( "invalid result " + op + " in " + jo.str() ); + function = []( const dialogue & ) { + return false; + }; + } + std::function get_first_int = conditional_t< dialogue >::get_get_int( + objects.get_object( 2 ) ); + std::function get_second_int = conditional_t< dialogue >::get_get_int( + objects.get_object( 4 ) ); + if( op == "*" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) * get_second_int( d ) ); + }; + } else if( op == "/" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) / get_second_int( d ) ); + }; + } else if( op == "+" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) + get_second_int( d ) ); + }; + } else if( op == "-" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) - get_second_int( d ) ); + }; + } else if( op == "%" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) % get_second_int( d ) ); + }; + } else if( op == "&" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) & get_second_int( d ) ); + }; + } else if( op == "|" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) | get_second_int( d ) ); + }; + } else if( op == "<<" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) << get_second_int( d ) ); + }; + } else if( op == ">>" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) >> get_second_int( d ) ); + }; + } else if( op == "^" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) ^ get_second_int( d ) ); + }; + } else { + jo.throw_error( "unexpected operator " + op + " in " + jo.str() ); + function = []( const dialogue & ) { + return false; + }; + } + // ~ + } else if( objects.size() == 4 ) { + op = objects.get_string( 3 ); + result = objects.get_string( 1 ); + if( result != "=" ) { + jo.throw_error( "invalid result " + op + " in " + jo.str() ); + function = []( const dialogue & ) { + return false; + }; + } + std::function get_first_int = conditional_t< dialogue >::get_get_int( + objects.get_object( 2 ) ); + if( op == "~" ) { + function = [get_first_int, set_int]( const dialogue & d ) { + set_int( d, ~get_first_int( d ) ); + }; + } else { + jo.throw_error( "unexpected operator " + op + " in " + jo.str() ); + function = []( const dialogue & ) { + return false; + }; + } + + // =, -=, +=, *=, and /= + } else if( objects.size() == 3 ) { + result = objects.get_string( 1 ); + std::function get_first_int = conditional_t< dialogue >::get_get_int( + objects.get_object( 0 ) ); + std::function get_second_int = conditional_t< dialogue >::get_get_int( + objects.get_object( 2 ) ); + if( result == "+=" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) + get_second_int( d ) ); + }; + } else if( result == "-=" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) - get_second_int( d ) ); + }; + } else if( result == "*=" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) * get_second_int( d ) ); + }; + } else if( result == "/=" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) / get_second_int( d ) ); + }; + } else if( result == "%=" ) { + function = [get_first_int, get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) % get_second_int( d ) ); + }; + } else if( result == "=" ) { + function = [get_second_int, set_int]( const dialogue & d ) { + set_int( d, get_second_int( d ) ); + }; + } else { + jo.throw_error( "unexpected result " + result + " in " + jo.str() ); + function = []( const dialogue & ) { + return false; + }; + } + // ++ and -- + } else if( objects.size() == 2 ) { + op = objects.get_string( 1 ); + std::function get_first_int = conditional_t< dialogue >::get_get_int( + objects.get_object( 0 ) ); + if( op == "++" ) { + function = [get_first_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) + 1 ); + }; + } else if( op == "--" ) { + function = [get_first_int, set_int]( const dialogue & d ) { + set_int( d, get_first_int( d ) - 1 ); + }; + } else { + jo.throw_error( "unexpected operator " + op + " in " + jo.str() ); + function = []( const dialogue & ) { + return false; + }; + } + } else { + jo.throw_error( "Invalid number of args in " + jo.str() ); + function = []( const dialogue & ) { + return false; + }; + return; + } +} + void talk_effect_fun_t::set_assign_mission( const JsonObject &jo, const std::string &member ) { std::string mission_name = jo.get_string( member ); From 55283d76de37c31d5c2b96f2f86cc17ce44c0bfa Mon Sep 17 00:00:00 2001 From: Venera3 <72006894+Venera3@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:18:59 +0100 Subject: [PATCH 123/154] Fix (#54033) Co-authored-by: Venera3 --- src/anatomy.cpp | 2 +- src/mattack_actors.cpp | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/anatomy.cpp b/src/anatomy.cpp index d8bef82d62912..658d82c4f15c6 100644 --- a/src/anatomy.cpp +++ b/src/anatomy.cpp @@ -195,7 +195,7 @@ bodypart_id anatomy::select_body_part( int min_hit, int max_hit, bool can_attack } } - if( hit_roll != 0 ) { + if( hit_roll > 0 ) { weight *= std::pow( static_cast( hit_roll ), bp->hit_difficulty ); } diff --git a/src/mattack_actors.cpp b/src/mattack_actors.cpp index 53da1d5177726..ad30198ace166 100644 --- a/src/mattack_actors.cpp +++ b/src/mattack_actors.cpp @@ -320,12 +320,21 @@ bool melee_actor::call( monster &z ) const // Dodge check const int acc = accuracy >= 0 ? accuracy : z.type->melee_skill; int hitspread = target->deal_melee_attack( &z, dice( acc, 10 ) ); + + // Pick body part + bodypart_str_id bp_hit = body_parts.empty() ? + target->select_body_part( hitsize_min, hitsize_max, attack_upper, hitspread ).id() : + *body_parts.pick(); + + bodypart_id bp_id = bodypart_id( bp_hit ); + if( dodgeable ) { if( hitspread < 0 ) { game_message_type msg_type = target->is_avatar() ? m_warning : m_info; sfx::play_variant_sound( "mon_bite", "bite_miss", sfx::get_heard_volume( z.pos() ), sfx::get_heard_angle( z.pos() ) ); - target->add_msg_player_or_npc( msg_type, miss_msg_u, miss_msg_npc, z.name() ); + target->add_msg_player_or_npc( msg_type, miss_msg_u, miss_msg_npc, z.name(), + body_part_name_accusative( bp_id ) ); return true; } } @@ -335,13 +344,6 @@ bool melee_actor::call( monster &z ) const double multiplier = rng_float( min_mul, max_mul ); damage.mult_damage( multiplier ); - // Pick body part - bodypart_str_id bp_hit = body_parts.empty() ? - target->select_body_part( hitsize_min, hitsize_max, attack_upper, hitspread ).id() : - *body_parts.pick(); - - bodypart_id bp_id = bodypart_id( bp_hit ); - // Block our hit if( blockable ) { target->block_hit( &z, bp_id, damage ); From aa7dee9dabc93c767a6f3a82153c339c9f340f10 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Tue, 4 Jan 2022 20:27:08 +0100 Subject: [PATCH 124/154] hub 1 blueprint cleanup metal log (#54029) --- .../version_1/modular_field_log.json | 2 +- .../version_1/modular_field_metal.json | 2 +- .../version_1/recipe_modular_field_metal.json | 314 ++---------------- 3 files changed, 24 insertions(+), 294 deletions(-) diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_log.json b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_log.json index 2c2b750eae835..cdc0e4769539a 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_log.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_log.json @@ -3,7 +3,7 @@ "type": "palette", "id": "fbmh_log_palette", "terrain": { ";": "t_dirt", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_wall_log" }, - "furniture": { } + "furniture": { ";": "f_clear", ".": "f_clear", "+": "f_clear", "v": "f_clear", "w": "f_clear" } }, { "type": "mapgen", diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_metal.json b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_metal.json index 48a75f3f60c90..d5caddd691386 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_metal.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_1/modular_field_metal.json @@ -3,7 +3,7 @@ "type": "palette", "id": "fbmh_metal_palette", "terrain": { ";": "t_dirt", ".": "t_scrap_floor", "+": "t_door_metal_c", "v": "t_window_no_curtains", "w": "t_scrap_wall" }, - "furniture": { } + "furniture": { ";": "f_clear", ".": "f_clear", "+": "f_clear", "v": "f_clear", "w": "f_clear" } }, { "type": "mapgen", diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_metal.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_metal.json index 9f0da85be3dd8..4eeaa46026a07 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_metal.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_metal.json @@ -12,16 +12,7 @@ "blueprint_name": "northeast shack", "blueprint_requires": [ { "id": "fbmh_0" } ], "blueprint_provides": [ { "id": "fbmh_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_northeast" } ], - "blueprint_needs": { - "time": "18 h", - "skills": [ [ "fabrication", 5 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 120 ], [ "welder", 600 ], [ "welder_crude", 900 ], [ "toolset", 900 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ] ], - "components": [ [ [ "steel_plate", 24 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast" } ] }, { "type": "recipe", @@ -36,16 +27,7 @@ "blueprint_name": "expand northeast shack", "blueprint_requires": [ { "id": "fbmh_northeast" } ], "blueprint_provides": [ { "id": "fbmh_northeast" } ], - "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "18 h 15 m", - "skills": [ [ "fabrication", 5 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 110 ], [ "welder", 550 ], [ "welder_crude", 825 ], [ "toolset", 825 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ [ [ "2x4", 15 ], [ "log", 2 ] ], [ [ "nail", 30 ] ], [ [ "glass_sheet", 1 ] ], [ [ "steel_plate", 22 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -60,16 +42,7 @@ "blueprint_name": "finish northeast shack", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 2 } ], "blueprint_provides": [ { "id": "fbmh_northeast", "amount": 2 } ], - "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "1 d 30 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 140 ], [ "toolset", 1050 ], [ "welder", 700 ], [ "welder_crude", 1050 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 3 ] ], [ [ "scrap", 48 ], [ "steel_chunk", 16 ] ], [ [ "steel_plate", 30 ] ], [ [ "spike", 8 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -84,24 +57,7 @@ "blueprint_name": "east shack", "blueprint_requires": [ { "id": "fbmh_tent_northeast" }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_east" } ], - "blueprint_needs": { - "time": "3 d 11 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 500 ], [ "toolset", 3750 ], [ "welder", 2500 ], [ "welder_crude", 3750 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 6 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], - [ [ "steel_plate", 104 ] ], - [ [ "spike", 16 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_east" } ] }, { "type": "recipe", @@ -116,24 +72,7 @@ "blueprint_name": "east room", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ], - "blueprint_needs": { - "time": "3 d 5 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 460 ], [ "toolset", 3450 ], [ "welder", 2300 ], [ "welder_crude", 3450 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 6 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], - [ [ "steel_plate", 96 ] ], - [ [ "spike", 16 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ] }, { "type": "recipe", @@ -148,24 +87,7 @@ "blueprint_name": "southeast shack", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southeast" } ], - "blueprint_needs": { - "time": "3 d 11 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 500 ], [ "toolset", 3750 ], [ "welder", 2500 ], [ "welder_crude", 3750 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 6 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], - [ [ "steel_plate", 104 ] ], - [ [ "spike", 16 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southeast" } ] }, { "type": "recipe", @@ -180,24 +102,7 @@ "blueprint_name": "southeast room", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "3 d 5 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 460 ], [ "toolset", 3450 ], [ "welder", 2300 ], [ "welder_crude", 3450 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 6 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], - [ [ "steel_plate", 96 ] ], - [ [ "spike", 16 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -212,24 +117,7 @@ "blueprint_name": "northwest shack", "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_provides": [ { "id": "fbmh_northwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_northwest" } ], - "blueprint_needs": { - "time": "2 d 12 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 370 ], [ "toolset", 2775 ], [ "welder", 1850 ], [ "welder_crude", 2775 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 3 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 48 ], [ "steel_chunk", 16 ] ], - [ [ "steel_plate", 76 ] ], - [ [ "spike", 8 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_northwest" } ] }, { "type": "recipe", @@ -244,24 +132,7 @@ "blueprint_name": "west shack", "blueprint_requires": [ { "id": "fbmh_tent_northwest" } ], "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_west" } ], - "blueprint_needs": { - "time": "3 d 11 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 500 ], [ "toolset", 3750 ], [ "welder", 2500 ], [ "welder_crude", 3750 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 6 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], - [ [ "steel_plate", 104 ] ], - [ [ "spike", 16 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_west" } ] }, { "type": "recipe", @@ -276,24 +147,7 @@ "blueprint_name": "west room", "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ], - "blueprint_needs": { - "time": "3 d 5 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 460 ], [ "toolset", 3450 ], [ "welder", 2300 ], [ "welder_crude", 3450 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 6 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], - [ [ "steel_plate", 96 ] ], - [ [ "spike", 16 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ] }, { "type": "recipe", @@ -308,24 +162,7 @@ "blueprint_name": "southwest shack", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southwest" } ], - "blueprint_needs": { - "time": "3 d 11 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 500 ], [ "toolset", 3750 ], [ "welder", 2500 ], [ "welder_crude", 3750 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 6 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], - [ [ "steel_plate", 104 ] ], - [ [ "spike", 16 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southwest" } ] }, { "type": "recipe", @@ -340,24 +177,7 @@ "blueprint_name": "southwest room", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "3 d 5 h 45 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 460 ], [ "toolset", 3450 ], [ "welder", 2300 ], [ "welder_crude", 3450 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ - [ [ "2x4", 15 ], [ "log", 2 ] ], - [ [ "glass_sheet", 1 ] ], - [ [ "hinge", 6 ] ], - [ [ "nail", 30 ] ], - [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], - [ [ "steel_plate", 96 ] ], - [ [ "spike", 16 ] ] - ] - } - } + "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -372,16 +192,7 @@ "blueprint_name": "central building NE corner", "blueprint_requires": [ { "id": "fbmh_tent_east" } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" } ], - "blueprint_needs": { - "time": "1 d 15 h 30 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 240 ], [ "toolset", 1800 ], [ "welder", 1200 ], [ "welder_crude", 1800 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 3 ] ], [ [ "scrap", 48 ], [ "steel_chunk", 16 ] ], [ [ "steel_plate", 50 ] ], [ [ "spike", 8 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" } ] }, { "type": "recipe", @@ -396,16 +207,7 @@ "blueprint_name": "central building NE corner", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ], - "blueprint_needs": { - "time": "1 d 7 h 30 m", - "skills": [ [ "fabrication", 5 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 210 ], [ "welder", 1050 ], [ "welder_crude", 1575 ], [ "toolset", 1575 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ] ], - "components": [ [ [ "steel_plate", 42 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ] }, { "type": "recipe", @@ -420,16 +222,7 @@ "blueprint_name": "central building NW corner", "blueprint_requires": [ { "id": "fbmh_tent_west" } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_nw_center" } ], - "blueprint_needs": { - "time": "1 d 16 h", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 220 ], [ "toolset", 1650 ], [ "welder", 1100 ], [ "welder_crude", 1650 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 6 ] ], [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], [ [ "steel_plate", 48 ] ], [ [ "spike", 16 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_nw_center" } ] }, { "type": "recipe", @@ -444,16 +237,7 @@ "blueprint_name": "central building NW corner", "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "1 d 8 h", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 190 ], [ "toolset", 1425 ], [ "welder", 950 ], [ "welder_crude", 1425 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 3 ] ], [ [ "scrap", 48 ], [ "steel_chunk", 16 ] ], [ [ "steel_plate", 40 ] ], [ [ "spike", 8 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -468,16 +252,7 @@ "blueprint_name": "central building north half", "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 }, { "id": "fbmh_west", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ], - "blueprint_needs": { - "time": "2 d 15 h 30 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 400 ], [ "toolset", 3000 ], [ "welder", 2000 ], [ "welder_crude", 3000 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 3 ] ], [ [ "scrap", 48 ], [ "steel_chunk", 16 ] ], [ [ "steel_plate", 82 ] ], [ [ "spike", 8 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ] }, { "type": "recipe", @@ -492,16 +267,7 @@ "blueprint_name": "central building SE corner", "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], - "blueprint_excludes": [ { "id": "fbmh_se_south" } ], - "blueprint_needs": { - "time": "1 d 16 h", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 220 ], [ "toolset", 1650 ], [ "welder", 1100 ], [ "welder_crude", 1650 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 6 ] ], [ [ "scrap", 96 ], [ "steel_chunk", 32 ] ], [ [ "steel_plate", 48 ] ], [ [ "spike", 16 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_se_south" } ] }, { "type": "recipe", @@ -516,16 +282,7 @@ "blueprint_name": "central building SE corner", "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], - "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ], - "blueprint_needs": { - "time": "1 d 8 h", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 190 ], [ "toolset", 1425 ], [ "welder", 950 ], [ "welder_crude", 1425 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 3 ] ], [ [ "scrap", 48 ], [ "steel_chunk", 16 ] ], [ [ "steel_plate", 40 ] ], [ [ "spike", 8 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ] }, { "type": "recipe", @@ -540,16 +297,7 @@ "blueprint_name": "central building SW corner", "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmh_sw_south" } ], - "blueprint_needs": { - "time": "1 d 15 h 30 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 240 ], [ "toolset", 1800 ], [ "welder", 1200 ], [ "welder_crude", 1800 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 3 ] ], [ [ "scrap", 48 ], [ "steel_chunk", 16 ] ], [ [ "steel_plate", 50 ] ], [ [ "spike", 8 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_sw_south" } ] }, { "type": "recipe", @@ -564,16 +312,7 @@ "blueprint_name": "central building SW corner", "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ], - "blueprint_needs": { - "time": "1 d 7 h 30 m", - "skills": [ [ "fabrication", 5 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 210 ], [ "welder", 1050 ], [ "welder_crude", 1575 ], [ "toolset", 1575 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ] ], - "components": [ [ [ "steel_plate", 42 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ] }, { "type": "recipe", @@ -593,15 +332,6 @@ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southeast" }, { "id": "fbmh_tent_southwest" } - ], - "blueprint_needs": { - "time": "2 d 15 h 30 m", - "skills": [ [ "fabrication", 7 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 400 ], [ "toolset", 3000 ], [ "welder", 2000 ], [ "welder_crude", 3000 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M" } ], [ { "id": "WRENCH" } ] ], - "components": [ [ [ "hinge", 3 ] ], [ [ "scrap", 48 ], [ "steel_chunk", 16 ] ], [ [ "steel_plate", 82 ] ], [ [ "spike", 8 ] ] ] - } - } + ] } ] From 8c498f6c4d1c34e34c988ca8e1578aa177f92761 Mon Sep 17 00:00:00 2001 From: Kevin Granade Date: Tue, 4 Jan 2022 15:02:51 -0800 Subject: [PATCH 125/154] Correct start of game option descriptions. (#54044) --- src/options.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/options.cpp b/src/options.cpp index 1f3736bf0f189..5d6406d975215 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -2216,12 +2216,12 @@ void options_manager::add_options_world_default() ); add( "INITIAL_DAY", "world_default", to_translation( "Initial day" ), - to_translation( "How many days into the year the Cataclysm occurred. Day 0 is Spring 1. Day -1 randomizes the start date. Can be overridden by scenarios. This does not advance food rot or monster evolution." ), + to_translation( "How many days into the year the Cataclysm ended. Day 0 is Spring 1. Day -1 randomizes the start date. Can be overridden by scenarios. This does not advance food rot or monster evolution." ), -1, 999, 60 ); add( "SPAWN_DELAY", "world_default", to_translation( "Spawn delay" ), - to_translation( "How many days after the Cataclysm the player spawns. Day 0 is the day of the Cataclysm. Can be overridden by scenarios. Increasing this will cause food rot and monster evolution to advance." ), + to_translation( "How many days after the end of the Cataclysm the player spawns. Day 0 is immediately after the end of the Cataclysm. Can be overridden by scenarios. Increasing this will cause food rot and monster evolution to advance." ), 0, 9999, 0 ); From 1d2f4e378d7716bcdf9be2d0e841dfcfedb867ba Mon Sep 17 00:00:00 2001 From: root Date: Tue, 4 Jan 2022 17:33:14 -0500 Subject: [PATCH 126/154] Change keybinding name from "Workout" to "Work Out" This sort of phrase is generally a single word when used as a noun and multiple words when used as a verb. Keybindings are named with a verb when doing so makes sense. --- data/raw/keybindings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/raw/keybindings.json b/data/raw/keybindings.json index ec5cf501361a7..f1ce279f8d384 100644 --- a/data/raw/keybindings.json +++ b/data/raw/keybindings.json @@ -2230,7 +2230,7 @@ }, { "type": "keybinding", - "name": "Workout", + "name": "Work Out", "category": "DEFAULTMODE", "id": "workout" }, From c89f25c8998806ad0c61cf6ea3c5790ef17085b3 Mon Sep 17 00:00:00 2001 From: Drew4484 <57647637+Drew4484@users.noreply.github.com> Date: Tue, 4 Jan 2022 17:11:29 -0800 Subject: [PATCH 127/154] Steel Grades (#53875) * Steel Grades "Budget Steel" as low carbon. "Steel" as high carbon. Adds "Ultra-high Carbon Steel". --- data/json/materials.json | 152 +++++++++++++++++++++++++++++++++------ 1 file changed, 131 insertions(+), 21 deletions(-) diff --git a/data/json/materials.json b/data/json/materials.json index 2614add70845c..455d8e55405a6 100644 --- a/data/json/materials.json +++ b/data/json/materials.json @@ -786,27 +786,6 @@ "cut_dmg_verb": "scratched", "burn_products": [ [ "gold_small", 1 ] ] }, - { - "type": "material", - "id": "hardsteel", - "name": "Hard Steel", - "density": 40, - "specific_heat_liquid": 0.82, - "specific_heat_solid": 0.45, - "latent_heat": 273, - "bash_resist": 10, - "cut_resist": 16, - "bullet_resist": 9, - "acid_resist": 6, - "fire_resist": 3, - "elec_resist": 0, - "chip_resist": 30, - "repaired_with": "scrap", - "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], - "bash_dmg_verb": "dented", - "cut_dmg_verb": "scratched", - "burn_products": [ [ "scrap", 1 ] ] - }, { "type": "material", "id": "hflesh", @@ -1553,6 +1532,116 @@ "bash_dmg_verb": "dented", "cut_dmg_verb": "gouged" }, + { + "type": "material", + "id": "low_steel", + "name": "Low Carbon Steel", + "//": "SAE 1010/UNS 10100, assumes .1% carbon content and zero slag.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 5, + "cut_resist": 5, + "bullet_resist": 3, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 17, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, + { + "type": "material", + "id": "med_steel", + "name": "Medium Carbon Steel", + "//": "SAE 1050/UNS 10500, assumes .50% carbon content and zero slag.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 6, + "cut_resist": 6, + "bullet_resist": 3, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 18, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, + { + "type": "material", + "id": "high_steel", + "name": "High Carbon Steel", + "//": "SAE 1085/UNS 10850, assumes .50% carbon content and zero slag.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 9, + "cut_resist": 9, + "bullet_resist": 5, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 18, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, + { + "type": "material", + "id": "case_hardened_steel", + "name": "Case Hardened Carbon Steel", + "//": "Case hardening based on average between .1 and .95 carbon steel with a 1.25 multiplier.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 9, + "cut_resist": 9, + "bullet_resist": 5, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 20, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, + { + "type": "material", + "id": "tempered_steel", + "name": "Tempered Carbon Steel", + "//": "Quench/tempering based on .6 carbon steel with a 1.5 multiplier.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 10, + "cut_resist": 10, + "bullet_resist": 6, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 20, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, { "type": "material", "id": "steel", @@ -1574,6 +1663,27 @@ "cut_dmg_verb": "scratched", "burn_products": [ [ "scrap", 1 ] ] }, + { + "type": "material", + "id": "hardsteel", + "name": "Hard Steel", + "density": 40, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 10, + "cut_resist": 16, + "bullet_resist": 9, + "acid_resist": 6, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 30, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, { "type": "material", "id": "plut_cell", From 6370da3a9b6d198f0f2e811c688f41c6971ceac8 Mon Sep 17 00:00:00 2001 From: Danylo Rybchynskyi <48766165+ViceroyFaust@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:12:11 -0500 Subject: [PATCH 128/154] Clearly Sorted Sealed Perishables (#54020) * Sealed Items Sort Second-to-Last Co-authored-by: mqrause <38702195+mqrause@users.noreply.github.com> --- src/game_inventory.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game_inventory.cpp b/src/game_inventory.cpp index 2d0ab671fcd31..506ef4cbb3967 100644 --- a/src/game_inventory.cpp +++ b/src/game_inventory.cpp @@ -728,9 +728,12 @@ class comestible_inventory_preset : public inventory_selector_preset if( you.has_trait( trait_SAPROPHAGE ) || you.has_trait( trait_SAPROVORE ) ) { return 1; } else { - return 4; + return 5; } } else if( time == 0_turns ) { + return 4; + } else if( loc.has_parent() && + loc.parent_item()->contained_where( *loc )->spoil_multiplier() == 0.0f ) { return 3; } else { return 2; From 807eb16d6ea499b09e757bd6d6b71b4784ebab0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro?= Date: Wed, 5 Jan 2022 02:16:39 +0100 Subject: [PATCH 129/154] Nerf electricity field damage to players (#54049) --- src/map_field.cpp | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/map_field.cpp b/src/map_field.cpp index fcf6983c6415e..d9aad4f44e613 100644 --- a/src/map_field.cpp +++ b/src/map_field.cpp @@ -670,12 +670,19 @@ static void field_processor_fd_electricity( const tripoint &p, field_entry &cur, } const bool here_impassable = pd.here.impassable( p ); - int grounded_weight = here_impassable ? 2 : 6; - int creature_weight = here_impassable ? 8 : 6; + int grounded_weight = here_impassable ? 1 : 6; + int creature_weight = here_impassable ? 5 : 6; int other_weight = here_impassable ? 0 : 1; std::vector *target_vector = nullptr; while( current_intensity > 0 ) { + + if( here_impassable && one_in( 3 ) ) { + // Electricity in impassable tiles will find a way to the ground sometimes + cur.set_field_intensity( --current_intensity ); + continue; + } + const int vector_choice = bucket_index_from_weight_list( std::vector( { grounded_tiles.empty() ? 0 : grounded_weight, tiles_with_creatures.empty() ? 0 : creature_weight, @@ -685,6 +692,9 @@ static void field_processor_fd_electricity( const tripoint &p, field_entry &cur, switch( vector_choice ) { default: case 0: + if( here_impassable && !one_in( 5 ) ) { + return; + } target_vector = &grounded_tiles; break; case 1: @@ -1662,20 +1672,27 @@ void map::player_in_field( Character &you ) } if( ft == fd_electricity ) { // Small universal damage based on intensity, only if not electroproofed. - if( !you.is_elec_immune() ) { - int total_damage = 0; - for( const bodypart_id &bp : - you.get_all_body_parts( get_body_part_flags::only_main ) ) { - const int dmg = rng( 1, std::max( cur.get_field_intensity(), 4 ) ); - total_damage += you.deal_damage( nullptr, bp, damage_instance( damage_type::ELECTRIC, + if( cur.get_field_intensity() > 0 && !you.is_elec_immune() ) { + const bodypart_id &main_part = bodypart_id( "torso" ); + const int dmg = std::max( 1, rng( cur.get_field_intensity() / 2, cur.get_field_intensity() ) ); + const int main_part_damage = you.deal_damage( nullptr, main_part, + damage_instance( damage_type::ELECTRIC, dmg ) ).total_damage(); - } - if( total_damage > 0 ) { + if( main_part_damage > 0 ) { + for( const bodypart_id &bp : + you.get_all_body_parts( get_body_part_flags::only_main ) ) { + if( bp == main_part ) { + continue; + } + + you.apply_damage( nullptr, bp, dmg, true ); + } + if( you.has_trait( trait_ELECTRORECEPTORS ) ) { you.add_msg_player_or_npc( m_bad, _( "You're painfully electrocuted!" ), _( " is shocked!" ) ); - you.mod_pain( total_damage / 2 ); + you.mod_pain( main_part_damage / 2 ); } else { you.add_msg_player_or_npc( m_bad, _( "You're shocked!" ), _( " is shocked!" ) ); } From 9a985cf34f1da637d0e4ef0ccf5ef3b5c78e5cfd Mon Sep 17 00:00:00 2001 From: Eric <52087122+Ramza13@users.noreply.github.com> Date: Tue, 4 Jan 2022 20:27:53 -0500 Subject: [PATCH 130/154] Fix permanent alien grass (#54051) --- data/json/portal_storm_effect_on_condition.json | 1 + src/npctalk.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/data/json/portal_storm_effect_on_condition.json b/data/json/portal_storm_effect_on_condition.json index 7e0d77e59ab1e..7b7f10083f2a2 100644 --- a/data/json/portal_storm_effect_on_condition.json +++ b/data/json/portal_storm_effect_on_condition.json @@ -655,6 +655,7 @@ "set_queue_effect_on_condition": [ { "id": "EOC_PORTAL_ALIEN_GRASS_CHANGE", + "global": true, "effect": [ { "u_transform_radius": { "global_val": "ps_transform_radius", "default": 5 }, diff --git a/src/npctalk.cpp b/src/npctalk.cpp index 75f9e72326e0b..6b16255393b20 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -2369,7 +2369,17 @@ void talk_effect_fun_t::set_transform_radius( const JsonObject &jo, const std::s talker *target = d.actor( is_npc ); tripoint target_pos = get_tripoint_from_var( target, target_var, type, d.actor( type == var_type::npc ) ); + bool shifted = false; + tripoint_abs_omt origin = get_avatar().global_omt_location(); + if( !get_map().inbounds( get_map().getlocal( target_pos ) ) ) { + const tripoint_abs_ms abs_ms( target_pos ); + g->place_player_overmap( project_to( abs_ms ) ); + shifted = true; + } get_map().transform_radius( transform, iov.evaluate( d.actor( iov.is_npc() ) ), target_pos ); + if( shifted ) { + g->place_player_overmap( origin ); + } }; } From e32549cebc4c4547bac39c3f73925cca1a31e045 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Wed, 5 Jan 2022 20:23:06 +0100 Subject: [PATCH 131/154] Forbidden tome --- data/mods/Magiclysm/items/spellbooks.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 3d50fac2f9c32..42db642609b46 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -433,9 +433,9 @@ "use_action": { "type": "learn_spell", "spells": [ "translocate_self" ] } }, { - "id": "forbbiden_tome", + "id": "forbidden_tome", "type": "BOOK", - "name": { "str": "Forbbiden Tome", "str_pl": "Forbidden Tomes" }, + "name": { "str": "Forbidden Tome", "str_pl": "Forbidden Tomes" }, "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", "description": "A very, very old and heavy tome of various spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", "weight": "2400 g", From ba34415c5337556524c1e05c1376a1974d2088d6 Mon Sep 17 00:00:00 2001 From: GuardianDll <67688115+GuardianDll@users.noreply.github.com> Date: Wed, 5 Jan 2022 21:00:54 +0100 Subject: [PATCH 132/154] Deleted unnecessary plural form --- data/mods/Magiclysm/items/spellbooks.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 42db642609b46..e74cdfa7e81bc 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -435,7 +435,7 @@ { "id": "forbidden_tome", "type": "BOOK", - "name": { "str": "Forbidden Tome", "str_pl": "Forbidden Tomes" }, + "name": { "str": "Forbidden Tome" }, "//": "1 Magus spell, 1 Druid spell, 1 Animist spell", "description": "A very, very old and heavy tome of various spells lost to the ages, either for good reason, or simply through the passage of time. There are very few copies in existance, usually owned by those of great power, and yet all of them seem to have the last dozen pages or so torn out, in haste.", "weight": "2400 g", From 6cabc43615757e6cbbb128edaf2526fe99707f89 Mon Sep 17 00:00:00 2001 From: anoobindisguise <56016372+anoobindisguise@users.noreply.github.com> Date: Wed, 5 Jan 2022 14:16:38 -0800 Subject: [PATCH 133/154] leather belt weight limit + (#54071) --- data/json/items/armor/belts.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/armor/belts.json b/data/json/items/armor/belts.json index fb039ed02acf9..2027dff7af548 100644 --- a/data/json/items/armor/belts.json +++ b/data/json/items/armor/belts.json @@ -119,7 +119,7 @@ { "holster": true, "max_contains_volume": "1 L", - "max_contains_weight": "600 g", + "max_contains_weight": "750 g", "max_item_length": "70 cm", "moves": 60, "flag_restriction": [ "BELT_CLIP" ] From 0b58255cd10a0c1b1b88b7d9236deaa3ca668b23 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Wed, 5 Jan 2022 17:17:29 -0500 Subject: [PATCH 134/154] Convert zone manager to type-safe points (#54068) The zone manager mostly uses absolute coordinates. Convert most of the relevant points to that type. The existence of personal zones makes this messier than it would otherwise have been, but this is still a step in the right direction. A few other random point types across the codebase got converted too. --- src/activity_handlers.cpp | 33 ++------ src/activity_handlers.h | 19 ++++- src/activity_item_handling.cpp | 150 ++++++++++++++++++--------------- src/basecamp.cpp | 5 +- src/basecamp.h | 6 +- src/cata_tiles.cpp | 2 +- src/character.cpp | 7 +- src/clzones.cpp | 115 +++++++++++++------------ src/clzones.h | 86 ++++++++++--------- src/construction.cpp | 10 +-- src/coordinates.h | 8 ++ src/debug_menu.cpp | 3 +- src/faction_camp.cpp | 40 +++++---- src/game.cpp | 80 ++++++++++-------- src/inventory.cpp | 6 +- src/inventory.h | 5 +- src/iuse_actor.cpp | 2 +- src/npcmove.cpp | 6 +- src/npctalk.cpp | 16 ++-- src/vehicle.cpp | 49 ++++++----- src/vehicle_use.cpp | 2 +- tests/clzones_test.cpp | 2 +- 22 files changed, 346 insertions(+), 306 deletions(-) diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 9ee7ef8de068a..d8b21044a1917 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -1581,7 +1581,8 @@ void activity_handlers::forage_finish( player_activity *act, Character *you ) bool next_to_bush = false; map &here = get_map(); for( const tripoint &pnt : here.points_in_radius( you->pos(), 1 ) ) { - if( here.getabs( pnt ) == act->placement ) { + // TODO: fix point types + if( here.getglobal( pnt ) == tripoint_abs_ms( act->placement ) ) { next_to_bush = true; break; } @@ -2887,8 +2888,7 @@ void activity_handlers::travel_do_turn( player_activity *act, Character *you ) waypoint = clamp( cur_omt_mid, project_bounds( next_omt ) ); } map &here = get_map(); - // TODO: fix point types - tripoint centre_sub = here.getlocal( waypoint.raw() ); + tripoint centre_sub = here.getlocal( waypoint ); if( !here.passable( centre_sub ) ) { tripoint_range candidates = here.points_in_radius( centre_sub, 2 ); for( const tripoint &elem : candidates ) { @@ -3699,24 +3699,8 @@ void activity_handlers::fill_pit_finish( player_activity *act, Character *you ) act->set_to_null(); } -std::vector get_sorted_tiles_by_distance( const tripoint &abspos, - const std::unordered_set &tiles ) -{ - const auto cmp = [abspos]( tripoint a, tripoint b ) { - const int da = rl_dist( abspos, a ); - const int db = rl_dist( abspos, b ); - - return da < db; - }; - - std::vector sorted( tiles.begin(), tiles.end() ); - std::sort( sorted.begin(), sorted.end(), cmp ); - - return sorted; -} - template -static void cleanup_tiles( std::unordered_set &tiles, fn &cleanup ) +static void cleanup_tiles( std::unordered_set &tiles, fn &cleanup ) { auto it = tiles.begin(); map &here = get_map(); @@ -3739,15 +3723,16 @@ static void perform_zone_activity_turn( Character *you, { const zone_manager &mgr = zone_manager::get_manager(); map &here = get_map(); - const tripoint abspos = here.getabs( you->pos() ); - std::unordered_set unsorted_tiles = mgr.get_near( ztype, abspos ); + const tripoint_abs_ms abspos = you->get_location(); + std::unordered_set unsorted_tiles = mgr.get_near( ztype, abspos ); cleanup_tiles( unsorted_tiles, tile_filter ); // sort remaining tiles by distance - const std::vector &tiles = get_sorted_tiles_by_distance( abspos, unsorted_tiles ); + const std::vector &tiles = + get_sorted_tiles_by_distance( abspos, unsorted_tiles ); - for( const tripoint &tile : tiles ) { + for( const tripoint_abs_ms &tile : tiles ) { const tripoint &tile_loc = here.getlocal( tile ); std::vector route = here.route( you->pos(), tile_loc, you->get_pathfinding_settings(), diff --git a/src/activity_handlers.h b/src/activity_handlers.h index 5d17075af91cc..afd1bd5c13bce 100644 --- a/src/activity_handlers.h +++ b/src/activity_handlers.h @@ -9,6 +9,7 @@ #include #include +#include "coordinates.h" #include "optional.h" #include "type_id.h" #include "requirements.h" @@ -18,8 +19,22 @@ class item; class player_activity; struct tripoint; -std::vector get_sorted_tiles_by_distance( const tripoint &abspos, - const std::unordered_set &tiles ); +template +std::vector get_sorted_tiles_by_distance( const Point ¢er, const Container &tiles ) +{ + const auto cmp = [center]( const Point & a, const Point & b ) { + const int da = rl_dist( center, a ); + const int db = rl_dist( center, b ); + + return da < db; + }; + + std::vector sorted( tiles.begin(), tiles.end() ); + std::sort( sorted.begin(), sorted.end(), cmp ); + + return sorted; +} + std::vector route_adjacent( const Character &you, const tripoint &dest ); std::vector route_best_workbench( const Character &you, const tripoint &dest ); diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index 895fb99c6c890..cc141e22b44a5 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -1025,7 +1025,7 @@ static bool are_requirements_nearby( const std::vector &loot_spots, // skip tiles in IGNORE zone and tiles on fire // (to prevent taking out wood off the lit brazier) // and inaccessible furniture, like filled charcoal kiln - if( mgr.has( zone_type_LOOT_IGNORE, here.getabs( elem ) ) || + if( mgr.has( zone_type_LOOT_IGNORE, here.getglobal( elem ) ) || here.dangerous_field_at( elem ) || !here.can_put_items_ter_furn( elem ) ) { continue; @@ -1325,8 +1325,8 @@ static activity_reason_info can_do_activity_there( const activity_id &act, Chara return activity_reason_info::fail( do_activity_reason::NO_ZONE ); } if( act == ACT_TIDY_UP ) { - if( mgr.has_near( zone_type_LOOT_UNSORTED, here.getabs( src_loc ), distance ) || - mgr.has_near( zone_type_CAMP_STORAGE, here.getabs( src_loc ), distance ) ) { + if( mgr.has_near( zone_type_LOOT_UNSORTED, here.getglobal( src_loc ), distance ) || + mgr.has_near( zone_type_CAMP_STORAGE, here.getglobal( src_loc ), distance ) ) { return activity_reason_info::ok( do_activity_reason::CAN_DO_FETCH ); } return activity_reason_info::fail( do_activity_reason::NO_ZONE ); @@ -1334,7 +1334,7 @@ static activity_reason_info can_do_activity_there( const activity_id &act, Chara if( act == ACT_MULTIPLE_CONSTRUCTION ) { const std::vector &list_constructions = get_constructions(); zones = mgr.get_zones( zone_type_CONSTRUCTION_BLUEPRINT, - here.getabs( src_loc ) ); + here.getglobal( src_loc ) ); const partial_con *part_con = here.partial_con_at( src_loc ); cata::optional part_con_idx; if( part_con ) { @@ -1357,8 +1357,7 @@ static activity_reason_info can_do_activity_there( const activity_id &act, Chara return act_info; } } else if( act == ACT_MULTIPLE_FARM ) { - zones = mgr.get_zones( zone_type_FARM_PLOT, - here.getabs( src_loc ) ); + zones = mgr.get_zones( zone_type_FARM_PLOT, here.getglobal( src_loc ) ); for( const zone_data &zone : zones ) { if( here.has_flag_furn( ter_furn_flag::TFLAG_GROWTH_HARVEST, src_loc ) ) { // simple work, pulling up plants, nothing else required. @@ -1466,10 +1465,11 @@ static void add_basecamp_storage_to_loot_zone_list( zone_manager &mgr, const tri if( npc *const guy = dynamic_cast( &you ) ) { map &here = get_map(); if( guy->assigned_camp && - mgr.has_near( zone_type_CAMP_STORAGE, here.getabs( src_loc ), ACTIVITY_SEARCH_DISTANCE ) ) { - std::unordered_set bc_storage_set = mgr.get_near( zone_type_CAMP_STORAGE, - here.getabs( src_loc ), ACTIVITY_SEARCH_DISTANCE ); - for( const tripoint &elem : bc_storage_set ) { + mgr.has_near( zone_type_CAMP_STORAGE, here.getglobal( src_loc ), ACTIVITY_SEARCH_DISTANCE ) ) { + std::unordered_set bc_storage_set = + mgr.get_near( zone_type_CAMP_STORAGE, here.getglobal( src_loc ), + ACTIVITY_SEARCH_DISTANCE ); + for( const tripoint_abs_ms &elem : bc_storage_set ) { tripoint here_local = here.getlocal( elem ); // Check that a coordinate is not already in the combined list, otherwise actions @@ -1521,8 +1521,8 @@ static std::vector> requirements_map( Charac already_there_spots.push_back( elem ); combined_spots.push_back( elem ); } - for( const tripoint &elem : mgr.get_point_set_loot( here.getabs( you.pos() ), distance, - you.is_npc() ) ) { + for( const tripoint &elem : mgr.get_point_set_loot( + you.get_location(), distance, you.is_npc() ) ) { // if there is a loot zone that's already near the work spot, we don't want it to be added twice. if( std::find( already_there_spots.begin(), already_there_spots.end(), elem ) != already_there_spots.end() ) { @@ -1810,14 +1810,14 @@ static bool tidy_activity( Character &you, const tripoint &src_loc, { zone_manager &mgr = zone_manager::get_manager(); map &here = get_map(); - tripoint loot_abspos = here.getabs( src_loc ); + tripoint_abs_ms loot_abspos = here.getglobal( src_loc ); tripoint loot_src_lot; const auto &zone_src_set = mgr.get_near( zone_type_LOOT_UNSORTED, loot_abspos, distance ); if( !zone_src_set.empty() ) { - const std::vector &zone_src_sorted = get_sorted_tiles_by_distance( + const std::vector &zone_src_sorted = get_sorted_tiles_by_distance( loot_abspos, zone_src_set ); // Find the nearest unsorted zone to dump objects at - for( const tripoint &src_elem : zone_src_sorted ) { + for( const tripoint_abs_ms &src_elem : zone_src_sorted ) { if( !here.can_put_items_ter_furn( here.getlocal( src_elem ) ) ) { continue; } @@ -1848,7 +1848,7 @@ static bool tidy_activity( Character &you, const tripoint &src_loc, } } // we are adjacent to an unsorted zone, we came here to just drop items we are carrying - if( mgr.has( zone_type_LOOT_UNSORTED, here.getabs( src_loc ) ) ) { + if( mgr.has( zone_type_LOOT_UNSORTED, here.getglobal( src_loc ) ) ) { for( item *inv_elem : you.inv_dump() ) { if( inv_elem->has_var( "activity_var" ) ) { inv_elem->erase_var( "activity_var" ); @@ -2023,27 +2023,37 @@ void activity_on_turn_move_loot( player_activity &act, Character &you ) int &num_processed = act.values[ 0 ]; map &here = get_map(); - const tripoint abspos = here.getabs( you.pos() ); + const tripoint_abs_ms abspos = you.get_location(); auto &mgr = zone_manager::get_manager(); if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { mgr.cache_vzones(); } if( stage == INIT ) { - act.coord_set = mgr.get_near( zone_type_LOOT_UNSORTED, abspos, ACTIVITY_SEARCH_DISTANCE ); + // TODO: fix point types + act.coord_set.clear(); + for( const tripoint_abs_ms &p : + mgr.get_near( zone_type_LOOT_UNSORTED, abspos, ACTIVITY_SEARCH_DISTANCE ) ) { + act.coord_set.insert( p.raw() ); + } stage = THINK; } if( stage == THINK ) { //initialize num_processed num_processed = 0; - const auto &src_set = act.coord_set; + // TODO: fix point types + std::vector src_set; + for( const tripoint &p : act.coord_set ) { + src_set.push_back( tripoint_abs_ms( p ) ); + } // sort source tiles by distance const auto &src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); - for( const tripoint &src : src_sorted ) { - act.placement = src; - act.coord_set.erase( src ); + for( const tripoint_abs_ms &src : src_sorted ) { + // TODO: fix point types + act.placement = src.raw(); + act.coord_set.erase( src.raw() ); const auto &src_loc = here.getlocal( src ); if( !here.inbounds( src_loc ) ) { @@ -2131,8 +2141,9 @@ void activity_on_turn_move_loot( player_activity &act, Character &you ) } } if( stage == DO ) { - const tripoint &src = act.placement; - const tripoint &src_loc = here.getlocal( src ); + // TODO: fix point types + const tripoint_abs_ms src( act.placement ); + const tripoint src_loc = here.getlocal( src ); bool is_adjacent_or_closer = square_dist( you.pos(), src_loc ) <= 1; // before we move any item, check if player is at or @@ -2200,8 +2211,8 @@ void activity_on_turn_move_loot( player_activity &act, Character &you ) continue; } - const std::unordered_set &dest_set = mgr.get_near( id, abspos, ACTIVITY_SEARCH_DISTANCE, - &thisitem ); + const std::unordered_set dest_set = + mgr.get_near( id, abspos, ACTIVITY_SEARCH_DISTANCE, &thisitem ); // if this item isn't going anywhere and its not sealed // then we should unload it and see what is inside @@ -2228,12 +2239,12 @@ void activity_on_turn_move_loot( player_activity &act, Character &you ) return; } - for( const tripoint &dest : dest_set ) { + for( const tripoint_abs_ms &dest : dest_set ) { const tripoint &dest_loc = here.getlocal( dest ); //Check destination for cargo part - if( const cata::optional vp = here.veh_at( dest_loc ).part_with_feature( "CARGO", - false ) ) { + if( const cata::optional vp = + here.veh_at( dest_loc ).part_with_feature( "CARGO", false ) ) { dest_veh = &vp->vehicle(); dest_part = vp->part_index(); } else { @@ -2427,7 +2438,7 @@ static zone_type_id get_zone_for_act( const tripoint &src_loc, const zone_manage ret = zone_type_zone_disassemble; } if( src_loc != tripoint_zero && act_id == ACT_FETCH_REQUIRED ) { - const zone_data *zd = mgr.get_zone_at( get_map().getabs( src_loc ) ); + const zone_data *zd = mgr.get_zone_at( get_map().getglobal( src_loc ) ); if( zd ) { ret = zd->get_type(); } @@ -2437,21 +2448,21 @@ static zone_type_id get_zone_for_act( const tripoint &src_loc, const zone_manage /** Determine all locations for this generic activity */ /** Returns locations */ -static std::unordered_set generic_multi_activity_locations( Character &you, - const activity_id &act_id ) +static std::unordered_set generic_multi_activity_locations( + Character &you, const activity_id &act_id ) { bool dark_capable = false; - std::unordered_set src_set; + std::unordered_set src_set; zone_manager &mgr = zone_manager::get_manager(); const tripoint localpos = you.pos(); map &here = get_map(); - const tripoint abspos = here.getabs( localpos ); + const tripoint_abs_ms abspos = here.getglobal( localpos ); if( act_id == ACT_TIDY_UP ) { dark_capable = true; tripoint unsorted_spot; - std::unordered_set unsorted_set = mgr.get_near( zone_type_LOOT_UNSORTED, abspos, - ACTIVITY_SEARCH_DISTANCE ); + std::unordered_set unsorted_set = + mgr.get_near( zone_type_LOOT_UNSORTED, abspos, ACTIVITY_SEARCH_DISTANCE ); if( !unsorted_set.empty() ) { unsorted_spot = here.getlocal( random_entry( unsorted_set ) ); } @@ -2476,7 +2487,7 @@ static std::unordered_set generic_multi_activity_locations( Character if( stack_elem.has_var( "activity_var" ) && stack_elem.get_var( "activity_var", "" ) == you.name ) { const furn_t &f = here.furn( elem ).obj(); if( !f.has_flag( ter_furn_flag::TFLAG_PLANT ) ) { - src_set.insert( here.getabs( elem ) ); + src_set.insert( here.getglobal( elem ) ); found_one_point = true; // only check for a valid path, as that is all that is needed to tidy something up. if( square_dist( you.pos(), elem ) > 1 ) { @@ -2494,7 +2505,7 @@ static std::unordered_set generic_multi_activity_locations( Character for( const item *inv_elem : you.inv_dump() ) { if( inv_elem->has_var( "activity_var" ) ) { // we've gone to tidy up all the things lying around, now tidy up the things we picked up. - src_set.insert( here.getabs( unsorted_spot ) ); + src_set.insert( here.getglobal( unsorted_spot ) ); break; } } @@ -2507,7 +2518,7 @@ static std::unordered_set generic_multi_activity_locations( Character for( const tripoint &elem : here.points_in_radius( localpos, ACTIVITY_SEARCH_DISTANCE ) ) { partial_con *pc = here.partial_con_at( elem ); if( pc ) { - src_set.insert( here.getabs( elem ) ); + src_set.insert( here.getglobal( elem ) ); } } // farming activities encompass tilling, planting, harvesting. @@ -2523,7 +2534,7 @@ static std::unordered_set generic_multi_activity_locations( Character ACTIVITY_SEARCH_DISTANCE ); for( const auto &elem : mental_map ) { const tripoint &elem_point = std::get<0>( elem ); - src_set.insert( here.getabs( elem_point ) ); + src_set.insert( here.getglobal( elem_point ) ); } } // prune the set to remove tiles that are never gonna work out. @@ -2567,13 +2578,13 @@ static std::unordered_set generic_multi_activity_locations( Character } /** Check if this activity can not be done immediately because it has some requirements */ -static requirement_check_result generic_multi_activity_check_requirement( Character &you, - const activity_id &act_id, activity_reason_info &act_info, - const tripoint &src, const tripoint &src_loc, const std::unordered_set &src_set, - const bool check_only = false ) +static requirement_check_result generic_multi_activity_check_requirement( + Character &you, const activity_id &act_id, activity_reason_info &act_info, + const tripoint_abs_ms &src, const tripoint &src_loc, + const std::unordered_set &src_set, const bool check_only = false ) { map &here = get_map(); - const tripoint abspos = here.getabs( you.pos() ); + const tripoint_abs_ms abspos = here.getglobal( you.pos() ); zone_manager &mgr = zone_manager::get_manager(); bool &can_do_it = act_info.can_do; @@ -2635,8 +2646,8 @@ static requirement_check_result generic_multi_activity_check_requirement( Charac requirement_id what_we_need; std::vector loot_zone_spots; std::vector combined_spots; - for( const tripoint &elem : mgr.get_point_set_loot( abspos, ACTIVITY_SEARCH_DISTANCE, - you.is_npc() ) ) { + for( const tripoint &elem : mgr.get_point_set_loot( + abspos, ACTIVITY_SEARCH_DISTANCE, you.is_npc() ) ) { loot_zone_spots.push_back( elem ); combined_spots.push_back( elem ); } @@ -2749,7 +2760,7 @@ static requirement_check_result generic_multi_activity_check_requirement( Charac if( act_prev.coords.empty() ) { std::vector local_src_set; local_src_set.reserve( src_set.size() ); - for( const tripoint &elem : src_set ) { + for( const tripoint_abs_ms &elem : src_set ) { local_src_set.push_back( here.getlocal( elem ) ); } std::vector candidates; @@ -2770,7 +2781,8 @@ static requirement_check_result generic_multi_activity_check_requirement( Charac act_prev.coords.push_back( here.getabs( candidates[std::max( 0, static_cast( candidates.size() / 2 ) )] ) ); } - act_prev.placement = src; + // TODO: fix point types + act_prev.placement = src.raw(); } return requirement_check_result::RETURN_EARLY; } @@ -2782,7 +2794,7 @@ static requirement_check_result generic_multi_activity_check_requirement( Charac /** Returns true if this multi activity may be processed further */ static bool generic_multi_activity_do( Character &you, const activity_id &act_id, const activity_reason_info &act_info, - const tripoint &src, const tripoint &src_loc ) + const tripoint_abs_ms &src, const tripoint &src_loc ) { // If any of the following activities return without processing // then they MUST return true here, to stop infinite loops. @@ -2801,12 +2813,12 @@ static bool generic_multi_activity_do( Character &you, const activity_id &act_id you.has_quality( qual_DIG, 1 ) && !here.has_furn( src_loc ) ) { you.assign_activity( ACT_CHURN, 18000, -1 ); you.backlog.push_front( player_activity( act_id ) ); - you.activity.placement = src; + // TODO: fix point types + you.activity.placement = src.raw(); return false; } else if( reason == do_activity_reason::NEEDS_PLANTING && here.has_flag_ter_or_furn( ter_furn_flag::TFLAG_PLANTABLE, src_loc ) ) { - std::vector zones = mgr.get_zones( zone_type_FARM_PLOT, - here.getabs( src_loc ) ); + std::vector zones = mgr.get_zones( zone_type_FARM_PLOT, src ); for( const zone_data &zone : zones ) { const itype_id seed = dynamic_cast( zone.get_options() ).get_seed(); @@ -2838,7 +2850,8 @@ static bool generic_multi_activity_do( Character &you, const activity_id &act_id if( here.partial_con_at( src_loc ) ) { you.backlog.push_front( player_activity( act_id ) ); you.assign_activity( ACT_BUILD ); - you.activity.placement = src; + // TODO: fix point types + you.activity.placement = src.raw(); return false; } if( construction_activity( you, zone, src_loc, act_info, act_id ) ) { @@ -2927,7 +2940,7 @@ static bool generic_multi_activity_do( Character &you, const activity_id &act_id bool generic_multi_activity_handler( player_activity &act, Character &you, bool check_only ) { map &here = get_map(); - const tripoint abspos = here.getabs( you.pos() ); + const tripoint_abs_ms abspos = here.getglobal( you.pos() ); // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) activity_id activity_to_restore = act.id(); // Nuke the current activity, leaving the backlog alone @@ -2936,9 +2949,10 @@ bool generic_multi_activity_handler( player_activity &act, Character &you, bool } // now we setup the target spots based on which activity is occurring // the set of target work spots - potentially after we have fetched required tools. - std::unordered_set src_set = generic_multi_activity_locations( you, activity_to_restore ); + std::unordered_set src_set = + generic_multi_activity_locations( you, activity_to_restore ); // now we have our final set of points - std::vector src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); + std::vector src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); // now loop through the work-spot tiles and judge whether its worth traveling to it yet // or if we need to fetch something first. @@ -2948,7 +2962,7 @@ bool generic_multi_activity_handler( player_activity &act, Character &you, bool if( activity_to_restore == activity_id( ACT_FETCH_REQUIRED ) && src_sorted.empty() ) { return true; } - for( const tripoint &src : src_sorted ) { + for( const tripoint_abs_ms &src : src_sorted ) { const tripoint &src_loc = here.getlocal( src ); if( !here.inbounds( src_loc ) && !check_only ) { if( !here.inbounds( you.pos() ) ) { @@ -2971,8 +2985,8 @@ bool generic_multi_activity_handler( player_activity &act, Character &you, bool activity_reason_info act_info = can_do_activity_there( activity_to_restore, you, src_loc, ACTIVITY_SEARCH_DISTANCE ); // see activity_handlers.h enum for requirement_check_result - const requirement_check_result req_res = generic_multi_activity_check_requirement( you, - activity_to_restore, act_info, src, src_loc, src_set, check_only ); + const requirement_check_result req_res = generic_multi_activity_check_requirement( + you, activity_to_restore, act_info, src, src_loc, src_set, check_only ); if( req_res == requirement_check_result::SKIP_LOCATION ) { continue; } else if( req_res == requirement_check_result::RETURN_EARLY ) { @@ -3096,14 +3110,14 @@ static cata::optional find_refuel_spot_zone( const tripoint ¢er ) { const zone_manager &mgr = zone_manager::get_manager(); map &here = get_map(); - const tripoint center_abs = here.getabs( center ); + const tripoint_abs_ms center_abs = here.getglobal( center ); - const std::unordered_set &tiles_abs_unordered = + const std::unordered_set tiles_abs_unordered = mgr.get_near( zone_type_SOURCE_FIREWOOD, center_abs, PICKUP_RANGE ); - const std::vector &tiles_abs = + const std::vector &tiles_abs = get_sorted_tiles_by_distance( center_abs, tiles_abs_unordered ); - for( const tripoint &tile_abs : tiles_abs ) { + for( const tripoint_abs_ms &tile_abs : tiles_abs ) { const tripoint tile = here.getlocal( tile_abs ); if( has_clear_path_to_pickup_items( center, tile ) ) { return tile; @@ -3144,13 +3158,13 @@ int get_auto_consume_moves( Character &you, const bool food ) consume_type_zone = zone_type_AUTO_DRINK; } map &here = get_map(); - const std::unordered_set &dest_set = mgr.get_near( consume_type_zone, here.getabs( pos ), - ACTIVITY_SEARCH_DISTANCE ); + const std::unordered_set &dest_set = + mgr.get_near( consume_type_zone, here.getglobal( pos ), ACTIVITY_SEARCH_DISTANCE ); if( dest_set.empty() ) { return 0; } - for( const tripoint &loc : dest_set ) { - if( loc.z != you.pos().z ) { + for( const tripoint_abs_ms &loc : dest_set ) { + if( loc.z() != you.pos().z ) { continue; } diff --git a/src/basecamp.cpp b/src/basecamp.cpp index e35ba48a14c85..49d6f5c645bcc 100644 --- a/src/basecamp.cpp +++ b/src/basecamp.cpp @@ -605,7 +605,7 @@ std::list basecamp::use_charges( const itype_id &fake_id, int &quantity ) void basecamp::form_crafting_inventory( map &target_map ) { _inv.clear(); - const tripoint &dump_spot = get_dumping_spot(); + const tripoint_abs_ms &dump_spot = get_dumping_spot(); const tripoint &origin = target_map.getlocal( dump_spot ); auto &mgr = zone_manager::get_manager(); map &here = get_map(); @@ -613,7 +613,8 @@ void basecamp::form_crafting_inventory( map &target_map ) mgr.cache_vzones(); } if( mgr.has_near( zone_type_CAMP_STORAGE, dump_spot, 60 ) ) { - std::unordered_set src_set = mgr.get_near( zone_type_CAMP_STORAGE, dump_spot, 60 ); + std::unordered_set src_set = + mgr.get_near( zone_type_CAMP_STORAGE, dump_spot, 60 ); _inv.form_from_zone( target_map, src_set, nullptr, false ); } /* diff --git a/src/basecamp.h b/src/basecamp.h index 634d22e52a970..2a07bf2b4b41d 100644 --- a/src/basecamp.h +++ b/src/basecamp.h @@ -230,11 +230,11 @@ class basecamp * if skill is higher, an item or corpse is spawned */ void hunting_results( int skill, const std::string &task, int attempts, int difficulty ); - inline const tripoint &get_dumping_spot() const { + inline const tripoint_abs_ms &get_dumping_spot() const { return dumping_spot; } // dumping spot in absolute co-ords - inline void set_dumping_spot( const tripoint &spot ) { + inline void set_dumping_spot( const tripoint_abs_ms &spot ) { dumping_spot = spot; } void place_results( const item &result ); @@ -355,7 +355,7 @@ class basecamp tripoint bb_pos; std::map expansions; comp_list camp_workers; // NOLINT(cata-serialize) - tripoint dumping_spot; + tripoint_abs_ms dumping_spot; std::set fuel_types; // NOLINT(cata-serialize) std::vector fuels; // NOLINT(cata-serialize) diff --git a/src/cata_tiles.cpp b/src/cata_tiles.cpp index a3f5e19d9e10a..f0ffaf269c11e 100644 --- a/src/cata_tiles.cpp +++ b/src/cata_tiles.cpp @@ -3484,7 +3484,7 @@ bool cata_tiles::draw_zone_mark( const tripoint &p, lit_level ll, int &height_3d } const zone_manager &mgr = zone_manager::get_manager(); - const tripoint &abs = get_map().getabs( p ); + const tripoint_abs_ms abs = get_map().getglobal( p ); const zone_data *zone = mgr.get_bottom_zone( abs ); if( zone && zone->has_options() ) { diff --git a/src/character.cpp b/src/character.cpp index 0886e663e28f5..5a9c77133c420 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -1087,11 +1087,10 @@ bool Character::overmap_los( const tripoint_abs_omt &omt, int sight_points ) con return false; } - // TODO: fix point types - const std::vector line = line_to( ompos.raw(), omt.raw(), 0, 0 ); + const std::vector line = line_to( ompos, omt ); for( size_t i = 0; i < line.size() && sight_points >= 0; i++ ) { - const tripoint &pt = line[i]; - const oter_id &ter = overmap_buffer.ter( tripoint_abs_omt( pt ) ); + const tripoint_abs_omt &pt = line[i]; + const oter_id &ter = overmap_buffer.ter( pt ); sight_points -= static_cast( ter->get_see_cost() ); if( sight_points < 0 ) { return false; diff --git a/src/clzones.cpp b/src/clzones.cpp index 95d39ab16e5b4..6c45bb4a1c990 100644 --- a/src/clzones.cpp +++ b/src/clzones.cpp @@ -291,9 +291,9 @@ plot_options::query_seed_result plot_options::query_seed() } ); zone_manager &mgr = zone_manager::get_manager(); map &here = get_map(); - const std::unordered_set &zone_src_set = mgr.get_near( zone_type_LOOT_SEEDS, - here.getabs( player_character.pos() ), 60 ); - for( const tripoint &elem : zone_src_set ) { + const std::unordered_set zone_src_set = + mgr.get_near( zone_type_LOOT_SEEDS, here.getglobal( player_character.pos() ), 60 ); + for( const tripoint_abs_ms &elem : zone_src_set ) { tripoint elem_loc = here.getlocal( elem ); for( item &it : here.i_at( elem_loc ) ) { if( it.is_seed() ) { @@ -590,11 +590,9 @@ void zone_data::set_is_vehicle( const bool is_vehicle_arg ) is_vehicle = is_vehicle_arg; } -tripoint zone_data::get_center_point() const +tripoint_abs_ms zone_data::get_center_point() const { - return tripoint( ( get_start_point().x + get_end_point().x ) / 2, - ( get_start_point().y + get_end_point().y ) / 2, - ( get_start_point().z + get_end_point().z ) / 2 ); + return midpoint( get_start_point(), get_end_point() ); } std::string zone_manager::get_name_from_type( const zone_type_id &type ) const @@ -636,8 +634,8 @@ void zone_manager::cache_data() auto &cache = area_cache[type_hash]; // Draw marked area - for( const tripoint &p : tripoint_range( elem.get_start_point(), - elem.get_end_point() ) ) { + for( const tripoint_abs_ms &p : tripoint_range( + elem.get_start_point(), elem.get_end_point() ) ) { cache.insert( p ); } } @@ -659,42 +657,42 @@ void zone_manager::cache_vzones() // TODO: looks very similar to the above cache_data - maybe merge it? // Draw marked area - for( const tripoint &p : tripoint_range( elem->get_start_point(), - elem->get_end_point() ) ) { + for( const tripoint_abs_ms &p : tripoint_range( + elem->get_start_point(), elem->get_end_point() ) ) { cache.insert( p ); } } } -std::unordered_set zone_manager::get_point_set( const zone_type_id &type, +std::unordered_set zone_manager::get_point_set( const zone_type_id &type, const faction_id &fac ) const { const auto &type_iter = area_cache.find( zone_data::make_type_hash( type, fac ) ); if( type_iter == area_cache.end() ) { - return std::unordered_set(); + return std::unordered_set(); } return type_iter->second; } -std::unordered_set zone_manager::get_point_set_loot( const tripoint &where, +std::unordered_set zone_manager::get_point_set_loot( const tripoint_abs_ms &where, int radius, const faction_id &fac ) const { return get_point_set_loot( where, radius, false, fac ); } -std::unordered_set zone_manager::get_point_set_loot( const tripoint &where, +std::unordered_set zone_manager::get_point_set_loot( const tripoint_abs_ms &where, int radius, bool npc_search, const faction_id &/*fac*/ ) const { std::unordered_set res; map &here = get_map(); for( const tripoint &elem : here.points_in_radius( here.getlocal( where ), radius ) ) { - const zone_data *zone = get_zone_at( here.getabs( elem ) ); + const zone_data *zone = get_zone_at( here.getglobal( elem ) ); // if not a LOOT zone if( ( !zone ) || ( zone->get_type().str().substr( 0, 4 ) != "LOOT" ) ) { continue; } - if( npc_search && has( zone_type_NO_NPC_PICKUP, elem ) ) { + if( npc_search && has( zone_type_NO_NPC_PICKUP, where ) ) { continue; } res.insert( elem ); @@ -702,19 +700,19 @@ std::unordered_set zone_manager::get_point_set_loot( const tripoint &w return res; } -std::unordered_set zone_manager::get_vzone_set( const zone_type_id &type, +std::unordered_set zone_manager::get_vzone_set( const zone_type_id &type, const faction_id &fac ) const { //Only regenerate the vehicle zone cache if any vehicles have moved const auto &type_iter = vzone_cache.find( zone_data::make_type_hash( type, fac ) ); if( type_iter == vzone_cache.end() ) { - return std::unordered_set(); + return std::unordered_set(); } return type_iter->second; } -bool zone_manager::has( const zone_type_id &type, const tripoint &where, +bool zone_manager::has( const zone_type_id &type, const tripoint_abs_ms &where, const faction_id &fac ) const { const auto &point_set = get_point_set( type, fac ); @@ -722,12 +720,12 @@ bool zone_manager::has( const zone_type_id &type, const tripoint &where, return point_set.find( where ) != point_set.end() || vzone_set.find( where ) != vzone_set.end(); } -bool zone_manager::has_near( const zone_type_id &type, const tripoint &where, int range, +bool zone_manager::has_near( const zone_type_id &type, const tripoint_abs_ms &where, int range, const faction_id &fac ) const { const auto &point_set = get_point_set( type, fac ); - for( const tripoint &point : point_set ) { - if( point.z == where.z ) { + for( const tripoint_abs_ms &point : point_set ) { + if( point.z() == where.z() ) { if( square_dist( point, where ) <= range ) { return true; } @@ -735,8 +733,8 @@ bool zone_manager::has_near( const zone_type_id &type, const tripoint &where, in } const auto &vzone_set = get_vzone_set( type, fac ); - for( const tripoint &point : vzone_set ) { - if( point.z == where.z ) { + for( const tripoint_abs_ms &point : vzone_set ) { + if( point.z() == where.z() ) { if( square_dist( point, where ) <= range ) { return true; } @@ -746,7 +744,7 @@ bool zone_manager::has_near( const zone_type_id &type, const tripoint &where, in return false; } -bool zone_manager::has_loot_dest_near( const tripoint &where ) const +bool zone_manager::has_loot_dest_near( const tripoint_abs_ms &where ) const { for( const auto &ztype : get_manager().get_types() ) { const zone_type_id &type = ztype.first; @@ -763,7 +761,7 @@ bool zone_manager::has_loot_dest_near( const tripoint &where ) const return false; } -const zone_data *zone_manager::get_zone_at( const tripoint &where, const zone_type_id &type, +const zone_data *zone_manager::get_zone_at( const tripoint_abs_ms &where, const zone_type_id &type, bool cached ) const { for( const zone_data &zone : zones ) { @@ -781,7 +779,7 @@ const zone_data *zone_manager::get_zone_at( const tripoint &where, const zone_ty return nullptr; } -bool zone_manager::custom_loot_has( const tripoint &where, const item *it ) const +bool zone_manager::custom_loot_has( const tripoint_abs_ms &where, const item *it ) const { const zone_data *zone = get_zone_at( where, zone_type_LOOT_CUSTOM, true ); if( !zone || !it ) { @@ -794,13 +792,14 @@ bool zone_manager::custom_loot_has( const tripoint &where, const item *it ) cons return z( *it ); } -std::unordered_set zone_manager::get_near( const zone_type_id &type, - const tripoint &where, int range, const item *it, const faction_id &fac ) const +std::unordered_set zone_manager::get_near( const zone_type_id &type, + const tripoint_abs_ms &where, int range, const item *it, const faction_id &fac ) const { const auto &point_set = get_point_set( type, fac ); - auto near_point_set = std::unordered_set(); - for( const tripoint &point : point_set ) { - if( point.z == where.z ) { + std::unordered_set near_point_set; + + for( const tripoint_abs_ms &point : point_set ) { + if( point.z() == where.z() ) { if( square_dist( point, where ) <= range ) { if( it && has( zone_type_LOOT_CUSTOM, point ) ) { if( custom_loot_has( point, it ) ) { @@ -814,8 +813,8 @@ std::unordered_set zone_manager::get_near( const zone_type_id &type, } const auto &vzone_set = get_vzone_set( type, fac ); - for( const tripoint &point : vzone_set ) { - if( point.z == where.z ) { + for( const tripoint_abs_ms &point : vzone_set ) { + if( point.z() == where.z() ) { if( square_dist( point, where ) <= range ) { if( it && has( zone_type_LOOT_CUSTOM, point ) ) { if( custom_loot_has( point, it ) ) { @@ -831,17 +830,17 @@ std::unordered_set zone_manager::get_near( const zone_type_id &type, return near_point_set; } -cata::optional zone_manager::get_nearest( const zone_type_id &type, const tripoint &where, - int range, const faction_id &fac ) const +cata::optional zone_manager::get_nearest( const zone_type_id &type, + const tripoint_abs_ms &where, int range, const faction_id &fac ) const { if( range < 0 ) { return cata::nullopt; } - tripoint nearest_pos = tripoint( INT_MIN, INT_MIN, INT_MIN ); + tripoint_abs_ms nearest_pos( INT_MIN, INT_MIN, INT_MIN ); int nearest_dist = range + 1; - const std::unordered_set &point_set = get_point_set( type, fac ); - for( const tripoint &p : point_set ) { + const std::unordered_set &point_set = get_point_set( type, fac ); + for( const tripoint_abs_ms &p : point_set ) { int cur_dist = square_dist( p, where ); if( cur_dist < nearest_dist ) { nearest_dist = cur_dist; @@ -852,8 +851,8 @@ cata::optional zone_manager::get_nearest( const zone_type_id &type, co } } - const std::unordered_set &vzone_set = get_vzone_set( type, fac ); - for( const tripoint &p : vzone_set ) { + const std::unordered_set &vzone_set = get_vzone_set( type, fac ); + for( const tripoint_abs_ms &p : vzone_set ) { int cur_dist = square_dist( p, where ); if( cur_dist < nearest_dist ) { nearest_dist = cur_dist; @@ -870,7 +869,7 @@ cata::optional zone_manager::get_nearest( const zone_type_id &type, co } zone_type_id zone_manager::get_near_zone_type_for_item( const item &it, - const tripoint &where, int range ) const + const tripoint_abs_ms &where, int range ) const { const item_category &cat = it.get_category_of_contents(); @@ -950,7 +949,7 @@ zone_type_id zone_manager::get_near_zone_type_for_item( const item &it, } std::vector zone_manager::get_zones( const zone_type_id &type, - const tripoint &where, const faction_id &fac ) const + const tripoint_abs_ms &where, const faction_id &fac ) const { auto zones = std::vector(); @@ -965,7 +964,7 @@ std::vector zone_manager::get_zones( const zone_type_id &type, return zones; } -const zone_data *zone_manager::get_zone_at( const tripoint &where ) const +const zone_data *zone_manager::get_zone_at( const tripoint_abs_ms &where ) const { for( auto it = zones.rbegin(); it != zones.rend(); ++it ) { const auto &zone = *it; @@ -977,8 +976,8 @@ const zone_data *zone_manager::get_zone_at( const tripoint &where ) const return nullptr; } -const zone_data *zone_manager::get_bottom_zone( const tripoint &where, - const faction_id &fac ) const +const zone_data *zone_manager::get_bottom_zone( + const tripoint_abs_ms &where, const faction_id &fac ) const { for( auto it = zones.rbegin(); it != zones.rend(); ++it ) { const auto &zone = *it; @@ -1116,16 +1115,16 @@ void zone_manager::rotate_zones( map &target_map, const int turns ) if( turns == 0 ) { return; } - const tripoint a_start = target_map.getabs( tripoint_zero ); - const tripoint a_end = target_map.getabs( tripoint( 23, 23, 0 ) ); + const tripoint_abs_ms a_start = target_map.getglobal( tripoint_zero ); + const tripoint_abs_ms a_end = target_map.getglobal( tripoint( 23, 23, 0 ) ); const point dim( 24, 24 ); for( zone_data &zone : zones ) { - const tripoint z_start = zone.get_start_point(); - const tripoint z_end = zone.get_end_point(); - if( ( a_start.x <= z_start.x && a_start.y <= z_start.y ) && - ( a_end.x > z_start.x && a_end.y >= z_start.y ) && - ( a_start.x <= z_end.x && a_start.y <= z_end.y ) && - ( a_end.x >= z_end.x && a_end.y >= z_end.y ) ) { + const tripoint_abs_ms z_start = zone.get_start_point(); + const tripoint_abs_ms z_end = zone.get_end_point(); + if( ( a_start.x() <= z_start.x() && a_start.y() <= z_start.y() ) && + ( a_end.x() > z_start.x() && a_end.y() >= z_start.y() ) && + ( a_start.x() <= z_end.x() && a_start.y() <= z_end.y() ) && + ( a_end.x() >= z_end.x() && a_end.y() >= z_end.y() ) ) { tripoint z_l_start3 = target_map.getlocal( z_start ); tripoint z_l_end3 = target_map.getlocal( z_end ); // don't rotate centered squares @@ -1137,9 +1136,9 @@ void zone_manager::rotate_zones( map &target_map, const int turns ) point new_z_start = target_map.getabs( z_l_start ); point new_z_end = target_map.getabs( z_l_end ); tripoint first = tripoint( std::min( new_z_start.x, new_z_end.x ), - std::min( new_z_start.y, new_z_end.y ), a_start.z ); + std::min( new_z_start.y, new_z_end.y ), a_start.z() ); tripoint second = tripoint( std::max( new_z_start.x, new_z_end.x ), - std::max( new_z_start.y, new_z_end.y ), a_end.z ); + std::max( new_z_start.y, new_z_end.y ), a_end.z() ); zone.set_position( std::make_pair( first, second ), false ); } } @@ -1257,7 +1256,7 @@ void zone_data::deserialize( const JsonObject &data ) data.read( "cached_shift", cached_shift ); } else { is_personal = false; - cached_shift = tripoint_zero; + cached_shift = tripoint_abs_ms{}; } //Legacy support if( data.has_member( "start_x" ) ) { diff --git a/src/clzones.h b/src/clzones.h index 3870278107980..ee16155d2e34e 100644 --- a/src/clzones.h +++ b/src/clzones.h @@ -248,7 +248,7 @@ class zone_data //centered on the player bool is_personal; // for personal zones a cached value for the global shift to where the zone was - tripoint cached_shift; + tripoint_abs_ms cached_shift; shared_ptr_fast options; public: @@ -260,7 +260,7 @@ class zone_data is_personal = false; start = tripoint_zero; end = tripoint_zero; - cached_shift = tripoint_zero; + cached_shift = {}; options = nullptr; } @@ -328,25 +328,25 @@ class zone_data bool get_is_personal() const { return is_personal; } - tripoint get_start_point() const { + tripoint_abs_ms get_start_point() const { if( is_personal ) { avatar &player_character = get_avatar(); - return start + get_map().getabs( player_character.pos() ); + return start + player_character.get_location(); } - return start; + return tripoint_abs_ms{ start }; } - tripoint get_end_point() const { + tripoint_abs_ms get_end_point() const { if( is_personal ) { avatar &player_character = get_avatar(); - return end + get_map().getabs( player_character.pos() ); + return end + player_character.get_location(); } - return end; + return tripoint_abs_ms{ end }; } void update_cached_shift() { avatar &player_character = get_avatar(); - cached_shift = get_map().getabs( player_character.pos() ); + cached_shift = player_character.get_location(); } - tripoint get_center_point() const; + tripoint_abs_ms get_center_point() const; bool has_options() const { return options->has_options(); } @@ -360,20 +360,21 @@ class zone_data // if cached is set to true, use the cached location instead of the current player location // for personal zones. This is used when checking for a zone DURING an activity which can otherise // cause issues of zones moving around - bool has_inside( const tripoint &p, bool cached = false ) const { + bool has_inside( const tripoint_abs_ms &p, bool cached = false ) const { // if it is personal then the zone is local if( is_personal ) { - tripoint shift; + tripoint_abs_ms shift; avatar &player_character = get_avatar(); // if we want the cached location vs the current uncached version centered on the player - cached ? shift = cached_shift : shift = get_map().getabs( player_character.pos() ); - return p.x >= start.x + shift.x && p.x <= end.x + shift.x && - p.y >= start.y + shift.y && p.y <= end.y + shift.y && - p.z >= start.z + shift.z && p.z <= end.z + shift.z; + if( cached ) { + shift = cached_shift; + } else { + shift = player_character.get_location(); + } + return inclusive_cuboid( + start + shift, end + shift ).contains( p ); } - return p.x >= start.x && p.x <= end.x && - p.y >= start.y && p.y <= end.y && - p.z >= start.z && p.z <= end.z; + return inclusive_cuboid( start, end ).contains( p.raw() ); } void serialize( JsonOut &json ) const; void deserialize( const JsonObject &data ); @@ -402,12 +403,12 @@ class zone_manager int num_personal_zones = 0; // NOLINT(cata-serialize) // NOLINTNEXTLINE(cata-serialize) - std::unordered_map> area_cache; + std::unordered_map> area_cache; // NOLINTNEXTLINE(cata-serialize) - std::unordered_map> vzone_cache; - std::unordered_set get_point_set( const zone_type_id &type, + std::unordered_map> vzone_cache; + std::unordered_set get_point_set( const zone_type_id &type, const faction_id &fac = your_fac ) const; - std::unordered_set get_vzone_set( const zone_type_id &type, + std::unordered_set get_vzone_set( const zone_type_id &type, const faction_id &fac = your_fac ) const; public: @@ -429,7 +430,7 @@ class zone_manager bool invert, bool enabled, const tripoint &start, const tripoint &end, const shared_ptr_fast &options = nullptr, const bool personal = false ); - const zone_data *get_zone_at( const tripoint &where, const zone_type_id &type, + const zone_data *get_zone_at( const tripoint_abs_ms &where, const zone_type_id &type, bool cached = false ) const; void create_vehicle_loot_zone( class vehicle &vehicle, const point &mount_point, zone_data &new_zone ); @@ -447,32 +448,35 @@ class zone_manager bool has_defined( const zone_type_id &type, const faction_id &fac = your_fac ) const; void cache_data(); void cache_vzones(); - bool has( const zone_type_id &type, const tripoint &where, + bool has( const zone_type_id &type, const tripoint_abs_ms &where, const faction_id &fac = your_fac ) const; - bool has_near( const zone_type_id &type, const tripoint &where, int range = MAX_DISTANCE, - const faction_id &fac = your_fac ) const; - bool has_loot_dest_near( const tripoint &where ) const; - bool custom_loot_has( const tripoint &where, const item *it ) const; - std::unordered_set get_near( const zone_type_id &type, const tripoint &where, - int range = MAX_DISTANCE, const item *it = nullptr, const faction_id &fac = your_fac ) const; - cata::optional get_nearest( const zone_type_id &type, const tripoint &where, - int range = MAX_DISTANCE, const faction_id &fac = your_fac ) const; - zone_type_id get_near_zone_type_for_item( const item &it, const tripoint &where, + bool has_near( const zone_type_id &type, const tripoint_abs_ms &where, + int range = MAX_DISTANCE, const faction_id &fac = your_fac ) const; + bool has_loot_dest_near( const tripoint_abs_ms &where ) const; + bool custom_loot_has( const tripoint_abs_ms &where, const item *it ) const; + std::unordered_set get_near( + const zone_type_id &type, const tripoint_abs_ms &where, int range = MAX_DISTANCE, + const item *it = nullptr, const faction_id &fac = your_fac ) const; + cata::optional get_nearest( + const zone_type_id &type, const tripoint_abs_ms &where, int range = MAX_DISTANCE, + const faction_id &fac = your_fac ) const; + zone_type_id get_near_zone_type_for_item( const item &it, const tripoint_abs_ms &where, int range = MAX_DISTANCE ) const; - std::vector get_zones( const zone_type_id &type, const tripoint &where, + std::vector get_zones( const zone_type_id &type, const tripoint_abs_ms &where, const faction_id &fac = your_fac ) const; - const zone_data *get_zone_at( const tripoint &where ) const; - const zone_data *get_bottom_zone( const tripoint &where, + const zone_data *get_zone_at( const tripoint_abs_ms &where ) const; + const zone_data *get_bottom_zone( const tripoint_abs_ms &where, const faction_id &fac = your_fac ) const; cata::optional query_name( const std::string &default_name = "" ) const; cata::optional query_type( bool personal = false ) const; void swap( zone_data &a, zone_data &b ); void rotate_zones( map &target_map, int turns ); // list of tripoints of zones that are loot zones only - std::unordered_set get_point_set_loot( const tripoint &where, int radius, - const faction_id &fac = your_fac ) const; - std::unordered_set get_point_set_loot( const tripoint &where, int radius, - bool npc_search, const faction_id &fac = your_fac ) const; + std::unordered_set get_point_set_loot( + const tripoint_abs_ms &where, int radius, const faction_id &fac = your_fac ) const; + std::unordered_set get_point_set_loot( + const tripoint_abs_ms &where, int radius, bool npc_search, + const faction_id &fac = your_fac ) const; // 'direct' access to zone_manager::zones, giving direct access was nono std::vector get_zones( const faction_id &fac = your_fac ); diff --git a/src/construction.cpp b/src/construction.cpp index 98277142a19ac..7cd9d55531b6f 100644 --- a/src/construction.cpp +++ b/src/construction.cpp @@ -1433,12 +1433,11 @@ void construct::done_digormine_stair( const tripoint &p, bool dig ) { map &here = get_map(); // TODO: fix point types - const tripoint_abs_ms abs_pos( here.getabs( p ) ); + const tripoint_abs_ms abs_pos = here.getglobal( p ); const tripoint_abs_sm pos_sm = project_to( abs_pos ); tinymap tmpmap; tmpmap.load( pos_sm + tripoint_below, false ); - // TODO: fix point types - const tripoint local_tmp = tmpmap.getlocal( abs_pos.raw() ); + const tripoint local_tmp = tmpmap.getlocal( abs_pos ); Character &player_character = get_player_character(); bool dig_muts = player_character.has_trait( trait_PAINRESIST_TROGLO ) || @@ -1492,12 +1491,11 @@ void construct::done_mine_upstair( const tripoint &p ) { map &here = get_map(); // TODO: fix point types - const tripoint_abs_ms abs_pos( here.getabs( p ) ); + const tripoint_abs_ms abs_pos = here.getglobal( p ); const tripoint_abs_sm pos_sm = project_to( abs_pos ); tinymap tmpmap; tmpmap.load( pos_sm + tripoint_above, false ); - // TODO: fix point types - const tripoint local_tmp = tmpmap.getlocal( abs_pos.raw() ); + const tripoint local_tmp = tmpmap.getlocal( abs_pos ); if( tmpmap.ter( local_tmp ) == t_lava ) { here.ter_set( p.xy(), t_rock_floor ); // You dug a bit before discovering the problem diff --git a/src/coordinates.h b/src/coordinates.h index 21db4ab7638fc..0a7f88c133e92 100644 --- a/src/coordinates.h +++ b/src/coordinates.h @@ -190,6 +190,14 @@ class coord_point return coord_point( l.raw() + r ); } + friend inline coord_point operator+( const point &l, const coord_point &r ) { + return coord_point( l + r.raw() ); + } + + friend inline coord_point operator+( const tripoint &l, const coord_point &r ) { + return coord_point( l + r.raw() ); + } + friend inline coord_point operator-( const coord_point &l, const point &r ) { return coord_point( l.raw() - r ); } diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index 312dbe86a487b..fc350d81fbf3a 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -1148,8 +1148,7 @@ static void spawn_nested_mapgen() map target_map; target_map.load( abs_sub, true ); - // TODO: fix point types - const tripoint local_ms = target_map.getlocal( abs_ms.raw() ); + const tripoint local_ms = target_map.getlocal( abs_ms ); mapgendata md( abs_omt, target_map, 0.0f, calendar::turn, nullptr ); const auto &ptr = nested_mapgens[nest_ids[nest_choice]].funcs().pick(); if( ptr == nullptr ) { diff --git a/src/faction_camp.cpp b/src/faction_camp.cpp index 464bbd9d87970..b05943e52f948 100644 --- a/src/faction_camp.cpp +++ b/src/faction_camp.cpp @@ -742,24 +742,25 @@ void talk_function::basecamp_mission( npc &p ) } basecamp *bcp = *temp_camp; bcp->set_by_radio( get_avatar().dialogue_by_radio ); - if( bcp->get_dumping_spot() == tripoint_zero ) { + if( bcp->get_dumping_spot() == tripoint_abs_ms{} ) { map &here = get_map(); auto &mgr = zone_manager::get_manager(); if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { mgr.cache_vzones(); } tripoint src_loc; - // TODO: fix point types - const tripoint abspos = p.get_location().raw(); + const tripoint_abs_ms abspos = p.get_location(); if( mgr.has_near( zone_type_CAMP_STORAGE, abspos, 60 ) ) { - const std::unordered_set &src_set = mgr.get_near( zone_type_CAMP_STORAGE, abspos ); - const std::vector &src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); + const std::unordered_set &src_set = + mgr.get_near( zone_type_CAMP_STORAGE, abspos ); + const std::vector &src_sorted = + get_sorted_tiles_by_distance( abspos, src_set ); // Find the nearest unsorted zone to dump objects at if( !src_sorted.empty() ) { src_loc = here.getlocal( src_sorted.front() ); } } - bcp->set_dumping_spot( here.getabs( src_loc ) ); + bcp->set_dumping_spot( here.getglobal( src_loc ) ); } bcp->get_available_missions( mission_key ); if( display_and_choose_opts( mission_key, omt_pos, base_camps::id, title ) ) { @@ -3668,7 +3669,7 @@ bool basecamp::validate_sort_points() mgr.cache_vzones(); } tripoint src_loc = here.getlocal( bb_pos ) + point_north; - const tripoint abspos = here.getabs( get_player_character().pos() ); + const tripoint_abs_ms abspos = get_player_character().get_location(); if( !mgr.has_near( zone_type_CAMP_STORAGE, abspos, 60 ) || !mgr.has_near( zone_type_CAMP_FOOD, abspos, 60 ) ) { if( query_yn( _( "You do not have sufficient sort zones. Do you want to add them?" ) ) ) { @@ -3677,14 +3678,16 @@ bool basecamp::validate_sort_points() return false; } } else { - const std::unordered_set &src_set = mgr.get_near( zone_type_CAMP_STORAGE, abspos ); - const std::vector &src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); + const std::unordered_set &src_set = + mgr.get_near( zone_type_CAMP_STORAGE, abspos ); + const std::vector &src_sorted = + get_sorted_tiles_by_distance( abspos, src_set ); // Find the nearest unsorted zone to dump objects at if( !src_sorted.empty() ) { src_loc = here.getlocal( src_sorted.front() ); } } - set_dumping_spot( here.getabs( src_loc ) ); + set_dumping_spot( here.getglobal( src_loc ) ); return true; } @@ -3940,8 +3943,9 @@ bool basecamp::distribute_food() if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { mgr.cache_vzones(); } - const tripoint &abspos = get_dumping_spot(); - const std::unordered_set &z_food = mgr.get_near( zone_type_CAMP_FOOD, abspos, 60 ); + const tripoint_abs_ms &abspos = get_dumping_spot(); + const std::unordered_set &z_food = + mgr.get_near( zone_type_CAMP_FOOD, abspos, 60 ); double quick_rot = 0.6 + ( has_provides( "pantry" ) ? 0.1 : 0 ); double slow_rot = 0.8 + ( has_provides( "pantry" ) ? 0.05 : 0 ); @@ -4017,7 +4021,7 @@ bool basecamp::distribute_food() } return consume_non_recursive( it, container ); }; - for( const tripoint &p_food_stock_abs : z_food ) { + for( const tripoint_abs_ms &p_food_stock_abs : z_food ) { // @FIXME: this will not handle zones in vehicle const tripoint p_food_stock = here.getlocal( p_food_stock_abs ); map_stack items = here.i_at( p_food_stock ); @@ -4071,12 +4075,14 @@ void basecamp::place_results( const item &result ) mgr.cache_vzones(); } Character &player_character = get_player_character(); - const tripoint abspos = here.getabs( player_character.pos() ); + const tripoint_abs_ms abspos = player_character.get_location(); if( mgr.has_near( zone_type_CAMP_STORAGE, abspos ) ) { - const std::unordered_set &src_set = mgr.get_near( zone_type_CAMP_STORAGE, abspos ); - const std::vector &src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); + const std::unordered_set &src_set = + mgr.get_near( zone_type_CAMP_STORAGE, abspos ); + const std::vector &src_sorted = + get_sorted_tiles_by_distance( abspos, src_set ); // Find the nearest unsorted zone to dump objects at - for( const tripoint &src : src_sorted ) { + for( const tripoint_abs_ms &src : src_sorted ) { const tripoint &src_loc = here.getlocal( src ); here.add_item_or_charges( src_loc, result, true ); apply_camp_ownership( src_loc, 10 ); diff --git a/src/game.cpp b/src/game.cpp index 36e31948fa696..1a84d15b12d2c 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -5972,12 +5972,12 @@ void game::print_graffiti_info( const tripoint &lp, const catacurses::window &w_ bool game::check_zone( const zone_type_id &type, const tripoint &where ) const { - return zone_manager::get_manager().has( type, m.getabs( where ) ); + return zone_manager::get_manager().has( type, m.getglobal( where ) ); } bool game::check_near_zone( const zone_type_id &type, const tripoint &where ) const { - return zone_manager::get_manager().has_near( type, m.getabs( where ) ); + return zone_manager::get_manager().has_near( type, m.getglobal( where ) ); } bool game::is_zones_manager_open() const @@ -6139,10 +6139,11 @@ void game::zones_manager() if( show_all_zones ) { zones = mgr.get_zones(); } else { - const tripoint u_abs_pos = m.getabs( u.pos() ); + const tripoint_abs_ms u_abs_pos = u.get_location(); for( zone_manager::ref_zone_data &ref : mgr.get_zones() ) { - const tripoint &zone_abs_pos = ref.get().get_center_point(); - if( u_abs_pos.z == zone_abs_pos.z && rl_dist( u_abs_pos, zone_abs_pos ) <= 50 ) { + const tripoint_abs_ms &zone_abs_pos = ref.get().get_center_point(); + if( u_abs_pos.z() == zone_abs_pos.z() && + rl_dist( u_abs_pos, zone_abs_pos ) <= 50 ) { zones.emplace_back( ref ); } } @@ -6185,6 +6186,10 @@ void game::zones_manager() zone_start, zone_end, zone_blink, zone_cursor ); add_draw_callback( zone_cb ); + // This lambda returns either absolute coordinates or relative-to-player + // corrdinates, depending on whether personal is false or true respectively. + // In C++20 we could have the return type depend on the parameter using + // if constexpr( personal ) but for now it will just return tripoints. auto query_position = [&]( bool personal = false ) -> cata::optional> { on_out_of_scope invalidate_current_ui( [&]() @@ -6205,8 +6210,8 @@ void game::zones_manager() tripoint center = u.pos() + u.view_offset; - const look_around_result first = look_around( /*show_window=*/false, center, center, false, true, - false ); + const look_around_result first = + look_around( /*show_window=*/false, center, center, false, true, false ); if( first.position ) { popup.message( "%s", _( "Select second point." ) ); @@ -6215,30 +6220,30 @@ void game::zones_manager() true, true, false ); if( second.position ) { if( personal ) { - tripoint first_abs = tripoint( std::min( first.position->x - u.posx(), - second.position->x - u.posx() ), - std::min( first.position->y - u.posy(), second.position->y - u.posy() ), - std::min( first.position->z - u.posz(), - second.position->z - u.posz() ) ) ; - tripoint second_abs = tripoint( std::max( first.position->x - u.posx(), - second.position->x - u.posx() ), - std::max( first.position->y - u.posy(), second.position->y - u.posy() ), - std::max( first.position->z - u.posz(), - second.position->z - u.posz() ) ) ; - return std::pair( first_abs, second_abs ); + tripoint first_rel( + std::min( first.position->x - u.posx(), second.position->x - u.posx() ), + std::min( first.position->y - u.posy(), second.position->y - u.posy() ), + std::min( first.position->z - u.posz(), second.position->z - u.posz() ) ) ; + tripoint second_rel( + std::max( first.position->x - u.posx(), second.position->x - u.posx() ), + std::max( first.position->y - u.posy(), second.position->y - u.posy() ), + std::max( first.position->z - u.posz(), second.position->z - u.posz() ) ) ; + return { { first_rel, second_rel } }; } - tripoint first_abs = m.getabs( tripoint( std::min( first.position->x, - second.position->x ), - std::min( first.position->y, second.position->y ), - std::min( first.position->z, - second.position->z ) ) ); - tripoint second_abs = m.getabs( tripoint( std::max( first.position->x, - second.position->x ), - std::max( first.position->y, second.position->y ), - std::max( first.position->z, - second.position->z ) ) ); + tripoint_abs_ms first_abs = + m.getglobal( + tripoint( + std::min( first.position->x, second.position->x ), + std::min( first.position->y, second.position->y ), + std::min( first.position->z, second.position->z ) ) ); + tripoint_abs_ms second_abs = + m.getglobal( + tripoint( + std::max( first.position->x, second.position->x ), + std::max( first.position->y, second.position->y ), + std::max( first.position->z, second.position->z ) ) ); - return std::pair( first_abs, second_abs ); + return { { first_abs.raw(), second_abs.raw() } }; } } @@ -6266,7 +6271,7 @@ void game::zones_manager() int iNum = 0; - tripoint player_absolute_pos = m.getabs( u.pos() ); + tripoint_abs_ms player_absolute_pos = u.get_location(); //Display saved zones for( auto &i : zones ) { @@ -6290,7 +6295,7 @@ void game::zones_manager() mvwprintz( w_zones, point( 20, iNum - start_index ), colorLine, mgr.get_name_from_type( zone.get_type() ) ); - tripoint center = zone.get_center_point(); + tripoint_abs_ms center = zone.get_center_point(); //Draw direction + distance mvwprintz( w_zones, point( 32, iNum - start_index ), colorLine, "%*d %s", @@ -6344,6 +6349,7 @@ void game::zones_manager() break; } + // TODO: fix point types mgr.add( name, id, get_player_character().get_faction()->id, false, true, position->first, position->second, options, false ); @@ -6384,6 +6390,7 @@ void game::zones_manager() } //add a zone that is relative to the avatar position + // TODO: fix point types mgr.add( name, id, get_player_character().get_faction()->id, false, true, position->first, position->second, options, true ); zones = get_zones(); @@ -6471,8 +6478,11 @@ void game::zones_manager() break; case 4: { const auto pos = query_position( zone.get_is_personal() ); - if( pos && ( pos->first != zone.get_start_point() || - pos->second != zone.get_end_point() ) ) { + // FIXME: this comparison is nonsensival in the + // personal zone case because it's between different + // coordinate systems. + if( pos && ( pos->first != zone.get_start_point().raw() || + pos->second != zone.get_end_point().raw() ) ) { zone.set_position( *pos ); stuff_changed = true; } @@ -6504,8 +6514,8 @@ void game::zones_manager() } else if( action == "SHOW_ZONE_ON_MAP" ) { //show zone position on overmap; tripoint_abs_omt player_overmap_position = u.global_omt_location(); - // TODO: fix point types - tripoint_abs_omt zone_overmap( ms_to_omt_copy( zones[active_index].get().get_center_point() ) ); + tripoint_abs_omt zone_overmap = + coords::project_to( zones[active_index].get().get_center_point() ); ui::omap::display_zones( player_overmap_position, zone_overmap, active_index ); } else if( action == "ENABLE_ZONE" ) { diff --git a/src/inventory.cpp b/src/inventory.cpp index b3ad326eca4ab..6bfaf06145323 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -450,12 +450,12 @@ void inventory::form_from_map( const tripoint &origin, int range, const Characte form_from_map( get_map(), origin, range, pl, assign_invlet, clear_path ); } -void inventory::form_from_zone( map &m, std::unordered_set &zone_pts, const Character *pl, - bool assign_invlet ) +void inventory::form_from_zone( map &m, std::unordered_set &zone_pts, + const Character *pl, bool assign_invlet ) { std::vector pts; pts.reserve( zone_pts.size() ); - for( const tripoint &elem : zone_pts ) { + for( const tripoint_abs_ms &elem : zone_pts ) { pts.push_back( m.getlocal( elem ) ); } form_from_map( m, pts, pl, assign_invlet ); diff --git a/src/inventory.h b/src/inventory.h index a13ee63e9bac9..cb2d3c0a80510 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -18,6 +18,7 @@ #include #include "cata_utility.h" +#include "coordinates.h" #include "item.h" #include "magic_enchantment.h" #include "proficiency.h" @@ -131,8 +132,8 @@ class inventory : public visitable * the player's worn items / weapon */ void restack( Character &p ); - void form_from_zone( map &m, std::unordered_set &zone_pts, const Character *pl = nullptr, - bool assign_invlet = true ); + void form_from_zone( map &m, std::unordered_set &zone_pts, + const Character *pl = nullptr, bool assign_invlet = true ); void form_from_map( const tripoint &origin, int range, const Character *pl = nullptr, bool assign_invlet = true, bool clear_path = true ); diff --git a/src/iuse_actor.cpp b/src/iuse_actor.cpp index 600de1cf1d6a6..41092d5cf8051 100644 --- a/src/iuse_actor.cpp +++ b/src/iuse_actor.cpp @@ -1251,7 +1251,7 @@ bool firestarter_actor::prep_firestarter_use( const Character &p, tripoint &pos target_is_firewood = true; } else { zone_manager &mgr = zone_manager::get_manager(); - auto zones = mgr.get_zones( zone_type_SOURCE_FIREWOOD, here.getabs( pos ) ); + auto zones = mgr.get_zones( zone_type_SOURCE_FIREWOOD, here.getglobal( pos ) ); if( !zones.empty() ) { target_is_firewood = true; } diff --git a/src/npcmove.cpp b/src/npcmove.cpp index c7fb4961e6950..fe5af77d66a2c 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -262,10 +262,10 @@ tripoint npc::good_escape_direction( bool include_pos ) map &here = get_map(); if( path.empty() ) { zone_type_id retreat_zone = zone_type_NPC_RETREAT; - const tripoint abs_pos = get_location().raw(); + const tripoint_abs_ms abs_pos = get_location(); const zone_manager &mgr = zone_manager::get_manager(); - cata::optional retreat_target = mgr.get_nearest( retreat_zone, abs_pos, 60, - fac_id ); + cata::optional retreat_target = + mgr.get_nearest( retreat_zone, abs_pos, 60, fac_id ); if( retreat_target && *retreat_target != abs_pos ) { update_path( here.getlocal( *retreat_target ) ); if( !path.empty() ) { diff --git a/src/npctalk.cpp b/src/npctalk.cpp index 6b16255393b20..040ab9bb1ec46 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -835,13 +835,13 @@ void npc::handle_sound( const sounds::sound_t spriority, const std::string &desc int heard_volume, const tripoint &spos ) { const map &here = get_map(); - const tripoint s_abs_pos = here.getabs( spos ); - const tripoint my_abs_pos = here.getabs( pos() ); + const tripoint_abs_ms s_abs_pos = here.getglobal( spos ); + const tripoint_abs_ms my_abs_pos = get_location(); add_msg_debug( debugmode::DF_NPC, "%s heard '%s', priority %d at volume %d from %d:%d, my pos %d:%d", disp_name(), description, static_cast( spriority ), heard_volume, - s_abs_pos.x, s_abs_pos.y, my_abs_pos.x, my_abs_pos.y ); + s_abs_pos.x(), s_abs_pos.y(), my_abs_pos.x(), my_abs_pos.y() ); Character &player_character = get_player_character(); bool player_ally = player_character.pos() == spos && is_player_ally(); @@ -913,14 +913,16 @@ void npc::handle_sound( const sounds::sound_t spriority, const std::string &desc } } if( should_check ) { - add_msg_debug( debugmode::DF_NPC, "%s added noise at pos %d:%d", get_name(), s_abs_pos.x, - s_abs_pos.y ); + add_msg_debug( debugmode::DF_NPC, "%s added noise at pos %d:%d", get_name(), + s_abs_pos.x(), s_abs_pos.y() ); dangerous_sound temp_sound; - temp_sound.abs_pos = s_abs_pos; + // TODO: fix point types + temp_sound.abs_pos = s_abs_pos.raw(); temp_sound.volume = heard_volume; temp_sound.type = spriority; if( !ai_cache.sound_alerts.empty() ) { - if( ai_cache.sound_alerts.back().abs_pos != s_abs_pos ) { + // TODO: fix point types + if( ai_cache.sound_alerts.back().abs_pos != s_abs_pos.raw() ) { ai_cache.sound_alerts.push_back( temp_sound ); } } else { diff --git a/src/vehicle.cpp b/src/vehicle.cpp index b62afe5c3d45b..9f4b92dfb3a37 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -692,42 +692,41 @@ void vehicle::autopilot_patrol() return; } zone_manager &mgr = zone_manager::get_manager(); - const auto &zone_src_set = mgr.get_near( zone_type_VEHICLE_PATROL, - global_square_location().raw(), 60 ); + const auto &zone_src_set = + mgr.get_near( zone_type_VEHICLE_PATROL, global_square_location(), 60 ); if( zone_src_set.empty() ) { is_patrolling = false; return; } // get corners. - tripoint min; - tripoint max; - for( const tripoint &box : zone_src_set ) { - if( min == tripoint_zero ) { + tripoint_abs_ms min; + tripoint_abs_ms max; + for( const tripoint_abs_ms &box : zone_src_set ) { + if( min == tripoint_abs_ms() ) { min = box; max = box; continue; } - min.x = std::min( box.x, min.x ); - min.y = std::min( box.y, min.y ); - min.z = std::min( box.z, min.z ); - max.x = std::max( box.x, max.x ); - max.y = std::max( box.y, max.y ); - max.z = std::max( box.z, max.z ); - } - const bool x_side = ( max.x - min.x ) < ( max.y - min.y ); - const int point_along = x_side ? rng( min.x, max.x ) : rng( min.y, max.y ); - const tripoint max_tri = x_side ? tripoint( point_along, max.y, min.z ) : tripoint( max.x, - point_along, - min.z ); - const tripoint min_tri = x_side ? tripoint( point_along, min.y, min.z ) : tripoint( min.x, - point_along, - min.z ); - tripoint chosen_tri = min_tri; - if( rl_dist( max_tri, global_square_location().raw() ) >= rl_dist( min_tri, - global_square_location().raw() ) ) { + min.x() = std::min( box.x(), min.x() ); + min.y() = std::min( box.y(), min.y() ); + min.z() = std::min( box.z(), min.z() ); + max.x() = std::max( box.x(), max.x() ); + max.y() = std::max( box.y(), max.y() ); + max.z() = std::max( box.z(), max.z() ); + } + const bool x_side = ( max.x() - min.x() ) < ( max.y() - min.y() ); + const int point_along = x_side ? rng( min.x(), max.x() ) : rng( min.y(), max.y() ); + const tripoint_abs_ms max_tri = x_side ? tripoint_abs_ms( point_along, max.y(), min.z() ) : + tripoint_abs_ms( max.x(), point_along, min.z() ); + const tripoint_abs_ms min_tri = x_side ? tripoint_abs_ms( point_along, min.y(), min.z() ) : + tripoint_abs_ms( min.x(), point_along, min.z() ); + tripoint_abs_ms chosen_tri = min_tri; + if( rl_dist( max_tri, global_square_location() ) >= + rl_dist( min_tri, global_square_location() ) ) { chosen_tri = max_tri; } - autodrive_local_target = chosen_tri; + // TODO: fix point types + autodrive_local_target = chosen_tri.raw(); drive_to_local_target( autodrive_local_target, false ); } diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index 1a0cc33838fb1..3b805622ab150 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -554,7 +554,7 @@ std::string vehicle::tracking_toggle_string() void vehicle::autopilot_patrol_check() { zone_manager &mgr = zone_manager::get_manager(); - if( mgr.has_near( zone_type_VEHICLE_PATROL, global_square_location().raw(), 60 ) ) { + if( mgr.has_near( zone_type_VEHICLE_PATROL, global_square_location(), 60 ) ) { enable_patrol(); } else { g->zones_manager(); diff --git a/tests/clzones_test.cpp b/tests/clzones_test.cpp index ffb36644e26bd..a7937f04d9ede 100644 --- a/tests/clzones_test.cpp +++ b/tests/clzones_test.cpp @@ -32,7 +32,7 @@ TEST_CASE( "zone sorting comestibles ", "[zones][items][food][activities]" ) clear_map(); zone_manager &zm = zone_manager::get_manager(); - const tripoint &origin_pos = tripoint_zero; + const tripoint_abs_ms origin_pos; create_tile_zone( "Food", zone_type_LOOT_FOOD, tripoint_east ); create_tile_zone( "Drink", zone_type_LOOT_DRINK, tripoint_west ); From c62e96b5dc4ab06e09dbedc3b7d97e57ba45f344 Mon Sep 17 00:00:00 2001 From: Mikhail Krutov <48674477+mkrutov@users.noreply.github.com> Date: Wed, 5 Jan 2022 23:24:04 +0100 Subject: [PATCH 135/154] Introduce NO_AUTO_CONSUME flag (#54065) * add json flag to avoid auto-eating certain things * add NO_AUTO_EAT to potions * add no_auto_consume flag to caffeine/stimulants stuff Co-authored-by: Zhilkin Serg --- data/json/flags.json | 4 ++++ data/json/items/comestibles/drink.json | 17 +++++++++-------- data/json/items/comestibles/junkfood.json | 2 +- data/json/items/comestibles/med.json | 2 +- data/json/items/comestibles/seed.json | 5 +++-- data/mods/Magiclysm/items/cast_spell_items.json | 4 ++-- doc/JSON_FLAGS.md | 1 + src/activity_item_handling.cpp | 6 ++++++ 8 files changed, 27 insertions(+), 14 deletions(-) diff --git a/data/json/flags.json b/data/json/flags.json index f003633c7312e..f33bafd21d108 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -568,6 +568,10 @@ "type": "json_flag", "info": "This item used to be legal tender before the Cataclysm." }, + { + "id": "NO_AUTO_CONSUME", + "type": "json_flag" + }, { "id": "PALS_SMALL", "type": "json_flag", diff --git a/data/json/items/comestibles/drink.json b/data/json/items/comestibles/drink.json index 568f9f5f12805..3de43141d7c9d 100644 --- a/data/json/items/comestibles/drink.json +++ b/data/json/items/comestibles/drink.json @@ -86,7 +86,7 @@ "description": "This serving of coffee has been created using an atomic coffee pot's FULL NUCLEAR brewing cycle. Every possible microgram of caffeine and flavor has been carefully extracted for your enjoyment, using the power of the atom.", "price": 300, "price_postapoc": 100, - "flags": [ "EATEN_HOT" ], + "flags": [ "EATEN_HOT", "NO_AUTO_CONSUME" ], "fun": 10 }, { @@ -221,7 +221,7 @@ "material": [ "water" ], "volume": "250 ml", "phase": "liquid", - "flags": [ "EATEN_HOT" ], + "flags": [ "EATEN_HOT", "NO_AUTO_CONSUME" ], "fun": 6 }, { @@ -243,7 +243,7 @@ "material": [ "water" ], "volume": "250 ml", "phase": "liquid", - "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], + "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE", "NO_AUTO_CONSUME" ], "fun": -5 }, { @@ -291,7 +291,7 @@ "primary_material": "water", "volume": "250 ml", "phase": "liquid", - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "NO_AUTO_CONSUME" ], "fun": 5 }, { @@ -318,7 +318,7 @@ "primary_material": "water", "volume": "250 ml", "phase": "liquid", - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "NO_AUTO_CONSUME" ], "fun": 5 }, { @@ -345,7 +345,7 @@ "primary_material": "water", "volume": "250 ml", "phase": "liquid", - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "NO_AUTO_CONSUME" ], "fun": 5 }, { @@ -485,7 +485,7 @@ "primary_material": "water", "volume": "250 ml", "phase": "liquid", - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "NO_AUTO_CONSUME" ], "vitamins": [ [ "vitC", 105 ] ], "fun": 5 }, @@ -787,6 +787,7 @@ "volume": "500 ml", "phase": "liquid", "charges": 2, + "flags": [ "NO_AUTO_CONSUME" ], "vitamins": [ [ "vitA", 5 ], [ "vitB", 3 ], [ "vitC", 2 ], [ "calcium", 12 ] ], "fun": 10 }, @@ -986,7 +987,7 @@ "primary_material": "water", "volume": "250 ml", "phase": "liquid", - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "NO_AUTO_CONSUME" ], "fun": 6 }, { diff --git a/data/json/items/comestibles/junkfood.json b/data/json/items/comestibles/junkfood.json index a3a63d8774734..f7150fa53074f 100644 --- a/data/json/items/comestibles/junkfood.json +++ b/data/json/items/comestibles/junkfood.json @@ -649,7 +649,7 @@ "charges": 5, "stack_size": 30, "fun": 2, - "flags": [ "EDIBLE_FROZEN" ] + "flags": [ "EDIBLE_FROZEN", "NO_AUTO_CONSUME" ] }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/med.json b/data/json/items/comestibles/med.json index c1dd1636090a1..2cf228c438057 100644 --- a/data/json/items/comestibles/med.json +++ b/data/json/items/comestibles/med.json @@ -448,7 +448,7 @@ "volume": "250 ml", "phase": "liquid", "charges": 4, - "flags": [ "EATEN_COLD", "WATER_DISSOLVE" ], + "flags": [ "EATEN_COLD", "WATER_DISSOLVE", "NO_AUTO_CONSUME" ], "freezing_point": -45, "fun": 30 }, diff --git a/data/json/items/comestibles/seed.json b/data/json/items/comestibles/seed.json index b22dd870ee79e..81b78bee178bf 100644 --- a/data/json/items/comestibles/seed.json +++ b/data/json/items/comestibles/seed.json @@ -419,6 +419,7 @@ "volume": "100 ml", "stack_size": 10, "fun": 30, + "flags": [ "NO_AUTO_CONSUME" ], "seed_data": { "fruit": "null", "//": "dummy entry, results are hardcoded", "plant_name": "marloss berry", "grow": "91 days" } }, { @@ -725,7 +726,7 @@ "calories": 549, "volume": "250 ml", "vitamins": [ [ "calcium", 4 ], [ "iron", 8 ] ], - "flags": [ "EDIBLE_FROZEN", "RAW" ], + "flags": [ "EDIBLE_FROZEN", "RAW", "NO_AUTO_CONSUME" ], "stack_size": 40, "weight": "106 g" }, @@ -738,7 +739,7 @@ "name": { "str_sp": "roasted coffee beans" }, "description": "Some roasted coffee beans, can be ground into powder.", "addiction_type": "caffeine", - "flags": [ "EDIBLE_FROZEN" ] + "flags": [ "EDIBLE_FROZEN", "NO_AUTO_CONSUME" ] }, { "type": "COMESTIBLE", diff --git a/data/mods/Magiclysm/items/cast_spell_items.json b/data/mods/Magiclysm/items/cast_spell_items.json index bd5f1a5a49a02..5a47fbd6ade99 100644 --- a/data/mods/Magiclysm/items/cast_spell_items.json +++ b/data/mods/Magiclysm/items/cast_spell_items.json @@ -16,7 +16,7 @@ "container": "flask_glass", "color": "light_blue", "comestible_type": "DRINK", - "flags": [ "EATEN_COLD", "NUTRIENT_OVERRIDE" ], + "flags": [ "EATEN_COLD", "NUTRIENT_OVERRIDE", "NO_AUTO_CONSUME" ], "phase": "liquid", "price": 2500, "freezing_point": 4 @@ -53,7 +53,7 @@ "container": "flask_glass", "color": "yellow", "comestible_type": "DRINK", - "flags": [ "EATEN_COLD", "NUTRIENT_OVERRIDE" ], + "flags": [ "EATEN_COLD", "NUTRIENT_OVERRIDE", "NO_AUTO_CONSUME" ], "phase": "liquid", "price": 3000, "freezing_point": 4 diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index 97dfadcb2081e..5afc21451af6f 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -528,6 +528,7 @@ Some armor flags, such as `WATCH` and `ALARMCLOCK` are compatible with other ite - ```MILLABLE``` Can be placed inside a mill, to turn into flour. - ```MYCUS_OK``` Can be eaten by post-threshold Mycus characters. Only applies to mycus fruits by default. - ```NEGATIVE_MONOTONY_OK``` Allows ```negative_monotony``` property to lower comestible fun to negative values. +- ```NO_AUTO_CONSUME``` Consumables with this flag would not get consumed in auto-eat/auto-drink zone - ```NO_INGEST``` Administered by some means other than oral intake. - ```PKILL_1``` Minor painkiller. - ```PKILL_2``` Moderate painkiller. diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index cc141e22b44a5..b5952ea21832c 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -95,6 +95,8 @@ static const activity_id ACT_VEHICLE_REPAIR( "ACT_VEHICLE_REPAIR" ); static const efftype_id effect_incorporeal( "incorporeal" ); +static const flag_id json_flag_NO_AUTO_CONSUME( "NO_AUTO_CONSUME" ); + static const itype_id itype_battery( "battery" ); static const itype_id itype_detergent( "detergent" ); static const itype_id itype_disassembly( "disassembly" ); @@ -3187,6 +3189,10 @@ int get_auto_consume_moves( Character &you, const bool food ) } for( item *it : items_here ) { item &comest = you.get_consumable_from( *it ); + if( comest.has_flag( json_flag_NO_AUTO_CONSUME ) ) { + // ignored due to NO_AUTO_CONSUME flag + continue; + } if( comest.is_null() || comest.is_craft() || !comest.is_food() || you.fun_for( comest ).first < -5 ) { // not good eatings. From 85fc44bc0804806db0a58a40b0fdd7403bced602 Mon Sep 17 00:00:00 2001 From: wwkk222208 <92137695+wwkk222208@users.noreply.github.com> Date: Thu, 6 Jan 2022 06:25:07 +0800 Subject: [PATCH 136/154] Adjust aim threshold (#54059) --- src/ranged.cpp | 2 +- tests/iteminfo_test.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ranged.cpp b/src/ranged.cpp index 3656a14ae649a..1acbe4225950b 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -1713,7 +1713,7 @@ std::vector Character::get_aim_types( const item &gun ) const // at 10%, 5% and 0% of the difference between MAX_RECOIL and sight dispersion. std::vector thresholds = { static_cast( ( ( MAX_RECOIL - sight_dispersion ) / 10.0 ) + sight_dispersion ), - static_cast( ( ( MAX_RECOIL - sight_dispersion ) / 20.0 ) + sight_dispersion ), + static_cast( ( ( MAX_RECOIL - sight_dispersion ) / 40.0 ) + sight_dispersion ), static_cast( sight_dispersion ) }; // Remove duplicate thresholds. diff --git a/tests/iteminfo_test.cpp b/tests/iteminfo_test.cpp index 8fc589e11ca33..b05f23b707e51 100644 --- a/tests/iteminfo_test.cpp +++ b/tests/iteminfo_test.cpp @@ -1473,8 +1473,8 @@ TEST_CASE( "gun or other ranged weapon attributes", "[iteminfo][weapon][gun]" ) "Even chance of good hit at range: 3\n" "Time to reach aim level: 99 moves\n" "Careful\n" - "Even chance of good hit at range: 5\n" - "Time to reach aim level: 135 moves\n" + "Even chance of good hit at range: 6\n" + "Time to reach aim level: 165 moves\n" "Precise\n" "Even chance of good hit at range: 8\n" "Time to reach aim level: 263 moves\n" ); From 4dc667d566fd9e524f04901522bcb0426e8e63b8 Mon Sep 17 00:00:00 2001 From: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Date: Wed, 5 Jan 2022 16:25:21 -0600 Subject: [PATCH 137/154] Update furniture.json (#54054) --- data/mods/Magiclysm/furniture.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/furniture.json b/data/mods/Magiclysm/furniture.json index d09e62981bae9..b90d0af2057f9 100644 --- a/data/mods/Magiclysm/furniture.json +++ b/data/mods/Magiclysm/furniture.json @@ -19,7 +19,7 @@ "symbol": "O", "color": "red", "required_str": -1, - "flags": [ "ALLOW_FIELD_EFFECT" ], + "flags": [ "ALLOW_FIELD_EFFECT", "TRANSPARENT" ], "description": "This is a rough magic circle, carved into the ground and decorated with blood, candles, and other small knick-knacks." }, { From a6bd0554b57033a9228407ff3eae6e59fbf89cff Mon Sep 17 00:00:00 2001 From: Light-Wave <66904273+Light-Wave@users.noreply.github.com> Date: Wed, 5 Jan 2022 23:30:01 +0100 Subject: [PATCH 138/154] New Innawood mod (#53960) * First commit * Fix caves, removes EXONII, hacks itemgroup * Removes new overmap specials, makes sand spawn in plains * Withered plants from young trees, no rebar from pavement in city centers, craft nails without first needing a nail * Adds bog iron and ore processing. Returns ammonia crafting recepie. * glass shards from sand and cattail jelly recipes autolearn * Removes spawnings of newspapers, casings, and random corpses. Makes a cave extra have a wider variety of rock-related drops * Reorganize, deal with spider pits, ants, and hive loot * Readme, makes quicklime, cement, and mortar autolearn and craftable. * Style fixes * Adds start in cave, makes most scenarios possible to start near a river or on an island * Makes file structure ready for merging * Changed mod name from "Untouched Lands" to "Innawood" * Delete TODO.txt * Update data/mods/innawood/items_generic.json Co-authored-by: Anton Burmistrov * Update data/mods/innawood/items_generic.json Co-authored-by: Anton Burmistrov * Update data/mods/innawood/scenarios.json Co-authored-by: Anton Burmistrov * Update modinfo.json * Update trash_and_debris.json * Update data/mods/innawood/modinfo.json Co-authored-by: Binrui Dong * Adds honeydew to ant hill food supply * Removes new bunkers * Increase time cost and output from extracting bog iron * Makes glassware and chemistry sets autolearn * Makes safety glasses craftable from glass * Change mod category to total_conversion * Make metalworking_tongs craftable from lumps * Makes metal fileset craftable from lumps * Makes glass shards craftable with CHEM 1 * Makes ammonia craftable with CHEM 1 ammonia is needed to make glass. Glass is needed to make the CHAM 2 tool. * Adds sulphor drops, makes welding goggles available Co-authored-by: Anton Burmistrov Co-authored-by: Binrui Dong --- data/mods/innawood/construction.json | 27 + data/mods/innawood/construction_group.json | 12 + data/mods/innawood/furniture-tools.json | 24 + data/mods/innawood/innawood_map_settings.json | 544 +++ .../Location_MapExtras_locations.json | 41 + .../itemgroups/monster_drops_lairs.json | 77 + .../innawood/itemgroups/trash_and_debris.json | 31 + data/mods/innawood/items_fake.json | 8 + data/mods/innawood/items_generic.json | 18 + data/mods/innawood/mapgen/ants.json | 46 + data/mods/innawood/mapgen/cave.json | 770 +++++ data/mods/innawood/mapgen/spider_pit.json | 86 + data/mods/innawood/modinfo.json | 13 + data/mods/innawood/overmap/connections.json | 35 + data/mods/innawood/overmap/special_alien.json | 109 + data/mods/innawood/overmap/specials_kept.json | 574 ++++ .../innawood/overmap/specials_removed.json | 3017 +++++++++++++++++ .../innawood/overmap/terrain_hardcoded.json | 42 + data/mods/innawood/readme.md | 20 + data/mods/innawood/recipes/armor_head.json | 44 + .../innawood/recipes/medsandchemicals.json | 33 + .../innawood/recipes/other_materials.json | 114 + data/mods/innawood/recipes/recipe_others.json | 37 + .../innawood/recipes/tools_containers.json | 78 + data/mods/innawood/recipes/tools_hand.json | 43 + data/mods/innawood/scenario_whitelist.json | 24 + data/mods/innawood/scenarios.json | 130 + data/mods/innawood/start_locations.json | 14 + .../innawood/terrain-floors-outdoors.json | 50 + data/mods/innawood/terrain-flora.json | 22 + data/mods/innawood/terrain-walls.json | 31 + 31 files changed, 6114 insertions(+) create mode 100644 data/mods/innawood/construction.json create mode 100644 data/mods/innawood/construction_group.json create mode 100644 data/mods/innawood/furniture-tools.json create mode 100644 data/mods/innawood/innawood_map_settings.json create mode 100644 data/mods/innawood/itemgroups/Location_MapExtras_locations.json create mode 100644 data/mods/innawood/itemgroups/monster_drops_lairs.json create mode 100644 data/mods/innawood/itemgroups/trash_and_debris.json create mode 100644 data/mods/innawood/items_fake.json create mode 100644 data/mods/innawood/items_generic.json create mode 100644 data/mods/innawood/mapgen/ants.json create mode 100644 data/mods/innawood/mapgen/cave.json create mode 100644 data/mods/innawood/mapgen/spider_pit.json create mode 100644 data/mods/innawood/modinfo.json create mode 100644 data/mods/innawood/overmap/connections.json create mode 100644 data/mods/innawood/overmap/special_alien.json create mode 100644 data/mods/innawood/overmap/specials_kept.json create mode 100644 data/mods/innawood/overmap/specials_removed.json create mode 100644 data/mods/innawood/overmap/terrain_hardcoded.json create mode 100644 data/mods/innawood/readme.md create mode 100644 data/mods/innawood/recipes/armor_head.json create mode 100644 data/mods/innawood/recipes/medsandchemicals.json create mode 100644 data/mods/innawood/recipes/other_materials.json create mode 100644 data/mods/innawood/recipes/recipe_others.json create mode 100644 data/mods/innawood/recipes/tools_containers.json create mode 100644 data/mods/innawood/recipes/tools_hand.json create mode 100644 data/mods/innawood/scenario_whitelist.json create mode 100644 data/mods/innawood/scenarios.json create mode 100644 data/mods/innawood/start_locations.json create mode 100644 data/mods/innawood/terrain-floors-outdoors.json create mode 100644 data/mods/innawood/terrain-flora.json create mode 100644 data/mods/innawood/terrain-walls.json diff --git a/data/mods/innawood/construction.json b/data/mods/innawood/construction.json new file mode 100644 index 0000000000000..1ab90c12aa259 --- /dev/null +++ b/data/mods/innawood/construction.json @@ -0,0 +1,27 @@ +[ + { + "type": "construction", + "id": "constr_extract_bog_iron", + "group": "extract_bog_iron", + "category": "OTHER", + "required_skills": [ [ "survival", 0 ] ], + "time": "5 h", + "qualities": [ [ { "id": "DIG", "level": 1 } ] ], + "byproducts": [ { "item": "iron_ore", "count": [ 40, 60 ] } ], + "pre_terrain": "t_bog_iron", + "post_special": "done_extract_maybe_revert_to_dirt" + }, + { + "type": "construction", + "id": "constr_bloomery", + "group": "build_bloomery", + "category": "FURN", + "required_skills": [ [ "fabrication", 5 ] ], + "time": "120 m", + "qualities": [ [ { "id": "DIG", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ] ], + "components": [ [ [ "rock", 30 ] ], [ [ "clay_lump", 10 ] ] ], + "pre_note": "Can be deconstructed without tools.", + "pre_special": "check_empty", + "post_terrain": "f_bloomery" + } +] diff --git a/data/mods/innawood/construction_group.json b/data/mods/innawood/construction_group.json new file mode 100644 index 0000000000000..f74ccf0205481 --- /dev/null +++ b/data/mods/innawood/construction_group.json @@ -0,0 +1,12 @@ +[ + { + "type": "construction_group", + "id": "extract_bog_iron", + "name": "Extract bog iron" + }, + { + "type": "construction_group", + "id": "build_bloomery", + "name": "Build Bloomery" + } +] diff --git a/data/mods/innawood/furniture-tools.json b/data/mods/innawood/furniture-tools.json new file mode 100644 index 0000000000000..b8fcff1a7e131 --- /dev/null +++ b/data/mods/innawood/furniture-tools.json @@ -0,0 +1,24 @@ +[ + { + "type": "furniture", + "id": "f_bloomery", + "name": "bloomery", + "looks_like": "f_forge_rock", + "description": "A type of metallurgical furnace for smelting iron from its oxides.", + "symbol": "U", + "color": "light_red", + "move_cost_mod": -1, + "coverage": 40, + "required_str": -1, + "crafting_pseudo_item": "bloomery", + "flags": [ "SEALED", "CONTAINER", "NOITEM", "EASY_DECONSTRUCT", "MINEABLE" ], + "deconstruct": { "items": [ { "item": "rock", "count": 30 } ] }, + "bash": { + "str_min": 18, + "str_max": 50, + "sound": "crash!", + "sound_fail": "whump.", + "items": [ { "item": "rock", "count": [ 10, 20 ] } ] + } + } +] diff --git a/data/mods/innawood/innawood_map_settings.json b/data/mods/innawood/innawood_map_settings.json new file mode 100644 index 0000000000000..34ab3c6fc1376 --- /dev/null +++ b/data/mods/innawood/innawood_map_settings.json @@ -0,0 +1,544 @@ +[ + { + "type": "region_settings", + "id": "default", + "default_oter": [ + "open_air", + "open_air", + "open_air", + "open_air", + "open_air", + "open_air", + "open_air", + "open_air", + "open_air", + "open_air", + "field", + "solid_earth", + "empty_rock", + "empty_rock", + "deep_rock", + "deep_rock", + "deep_rock", + "deep_rock", + "deep_rock", + "deep_rock", + "deep_rock" + ], + "default_groundcover": [ [ "t_region_groundcover", 1 ] ], + "region_terrain_and_furniture": { + "terrain": { + "t_region_groundcover": { "t_grass": 12000, "t_grass_dead": 2000, "t_dirt": 1000, "t_sand": 1 }, + "t_region_groundcover_urban": { "t_grass": 20, "t_grass_dead": 3 }, + "t_region_groundcover_forest": { "t_grass_long": 5, "t_grass_tall": 1, "t_moss": 1, "t_grass_dead": 3 }, + "t_region_groundcover_swamp": { "t_grass_long": 30, "t_grass_tall": 10, "t_moss": 20, "t_dirt": 20, "t_bog_iron": 1 }, + "t_region_groundcover_barren": { "t_dirt": 30, "t_grass_dead": 2, "t_railroad_rubble": 1 }, + "t_region_grass": { "t_grass": 1 }, + "t_region_soil": { "t_dirt": 1 }, + "t_region_shrub": { + "t_underbrush": 30, + "t_shrub": 10, + "t_fern": 5, + "t_shrub_blueberry": 2, + "t_shrub_strawberry": 2, + "t_shrub_blackberry": 2, + "t_shrub_raspberry": 2, + "t_shrub_huckleberry": 2, + "t_shrub_grape": 1, + "t_shrub_rose": 2, + "t_shrub_hydrangea": 2, + "t_shrub_lilac": 2, + "t_shrub_peanut": 1 + }, + "t_region_shrub_fruit": { + "t_shrub_blueberry": 6, + "t_shrub_strawberry": 6, + "t_shrub_raspberry": 4, + "t_shrub_grape": 4, + "t_shrub_blackberry": 2, + "t_shrub_huckleberry": 2, + "t_shrub_peanut": 1 + }, + "t_region_shrub_decorative": { "t_shrub": 3, "t_fern": 1, "t_shrub_rose": 2, "t_shrub_hydrangea": 2, "t_shrub_lilac": 2 }, + "t_region_tree": { + "t_tree": 128, + "t_tree_young": 128, + "t_tree_birch": 16, + "t_tree_elm": 16, + "t_tree_cottonwood": 16, + "t_tree_alder": 16, + "t_tree_pine": 32, + "t_tree_maple": 32, + "t_tree_willow": 32, + "t_tree_hickory": 16, + "t_tree_walnut": 8, + "t_tree_chestnut": 8, + "t_tree_hazelnut": 2, + "t_tree_beech": 2, + "t_tree_blackjack": 8, + "t_tree_coffee": 2, + "t_tree_apple": 2, + "t_tree_apricot": 2, + "t_tree_cherry": 2, + "t_tree_juniper": 2, + "t_tree_peach": 2, + "t_tree_pear": 2, + "t_tree_plum": 2, + "t_tree_elderberry": 2, + "t_tree_mulberry": 2, + "t_tree_deadpine": 16, + "t_tree_hickory_dead": 16, + "t_tree_dead": 16 + }, + "t_region_tree_shade": { + "t_tree": 64, + "t_tree_young": 32, + "t_tree_birch": 16, + "t_tree_elm": 16, + "t_tree_cottonwood": 16, + "t_tree_alder": 16, + "t_tree_maple": 32, + "t_tree_willow": 32, + "t_tree_hickory": 16, + "t_tree_chestnut": 8, + "t_tree_blackjack": 8, + "t_tree_coffee": 2, + "t_tree_elderberry": 2, + "t_tree_mulberry": 2, + "t_tree_dead": 2 + }, + "t_region_tree_fruit": { + "t_tree_young": 4, + "t_tree_apple": 2, + "t_tree_apricot": 2, + "t_tree_cherry": 2, + "t_tree_peach": 2, + "t_tree_pear": 2, + "t_tree_plum": 2, + "t_tree_elderberry": 2, + "t_tree_mulberry": 2, + "t_tree_dead": 4 + }, + "t_region_tree_nut": { + "t_tree_young": 4, + "t_tree_hickory": 16, + "t_tree_beech": 2, + "t_tree_walnut": 8, + "t_tree_chestnut": 8, + "t_tree_hazelnut": 2, + "t_tree_coffee": 2, + "t_tree_hickory_dead": 16, + "t_tree_dead": 4 + }, + "t_region_tree_evergreen": { "t_tree_pine": 32, "t_tree_juniper": 16, "t_tree_deadpine": 2 } + }, + "furniture": { + "f_region_flower": { + "f_black_eyed_susan": 1, + "f_lily": 1, + "f_flower_tulip": 1, + "f_flower_spurge": 1, + "f_burdock": 1, + "f_chamomile": 1, + "f_dandelion": 1, + "f_datura": 1, + "f_dahlia": 1, + "f_chicory": 1, + "f_bluebell": 1, + "f_sunflower": 1 + }, + "f_region_flower_decorative": { + "f_lily": 4, + "f_flower_tulip": 4, + "f_black_eyed_susan": 3, + "f_dahlia": 2, + "f_bluebell": 2, + "f_flower_spurge": 1, + "f_chicory": 1, + "f_sunflower": 1 + }, + "f_region_weed": { + "f_dandelion": 6, + "f_flower_spurge": 4, + "f_chamomile": 4, + "f_datura": 3, + "f_bluebell": 2, + "f_burdock": 1, + "f_dahlia": 1, + "f_black_eyed_susan": 1, + "f_lily": 1, + "f_flower_tulip": 1, + "f_mutpoppy": 1, + "f_sunflower": 1, + "f_mustard": 1 + }, + "f_region_water_plant": { "f_cattails": 15, "f_lilypad": 1, "f_lotus": 5 } + } + }, + "river_scale": 1.0, + "field_coverage": { + "percent_coverage": 0.2, + "default_ter": "t_shrub", + "other": { + "t_region_tree": 1, + "t_region_shrub": 3, + "f_region_weed": 49, + "f_region_flower": 37, + "f_boulder_small": 5, + "f_boulder_medium": 4, + "f_boulder_large": 1 + }, + "boost_chance": 0.833, + "boosted_percent_coverage": 2.5, + "boosted_other": { + "t_tree_young": 0.2, + "t_tree": 0.1, + "t_tree_birch": 0.05, + "t_tree_elm": 0.05, + "t_tree_cottonwood": 0.05, + "t_tree_alder": 2, + "t_tree_pine": 0.1, + "t_tree_maple": 0.1, + "t_tree_willow": 0.1, + "t_tree_hickory": 0.1, + "t_tree_walnut": 0.05, + "t_tree_chestnut": 0.05, + "t_tree_hazelnut": 0.02, + "t_tree_beech": 0.02, + "t_tree_blackjack": 0.05, + "t_tree_coffee": 0.02, + "t_tree_apple": 0.02, + "t_tree_apricot": 0.02, + "t_tree_cherry": 0.02, + "t_tree_peach": 0.02, + "t_tree_juniper": 0.02, + "t_tree_pear": 0.02, + "t_tree_plum": 0.02, + "t_tree_elderberry": 0.02, + "t_tree_mulberry": 0.02, + "t_tree_deadpine": 0.05, + "t_tree_hickory_dead": 0.05, + "t_tree_dead": 0.05, + "t_shrub_blueberry": 8.0, + "t_shrub_strawberry": 5.0, + "t_shrub_blackberry": 5.0, + "t_shrub_raspberry": 8.0, + "t_shrub_huckleberry": 5.0, + "t_shrub_grape": 5.0, + "t_shrub_rose": 3, + "t_shrub_hydrangea": 3, + "t_shrub_lilac": 3, + "f_black_eyed_susan": 3, + "f_lily": 3, + "f_flower_tulip": 3, + "f_flower_spurge": 3.5, + "f_chicory": 3, + "f_mutpoppy": 3.5, + "f_bluebell": 3.5, + "f_dahlia": 3.5, + "f_datura": 0.2, + "f_dandelion": 5.0, + "f_sunflower": 3.5, + "f_mustard": 0.2 + }, + "boosted_other_percent": 50.0 + }, + "overmap_lake_settings": { + "noise_threshold_lake": 0.25, + "lake_size_min": 20, + "lake_depth": -5, + "shore_extendable_overmap_terrain": [ "forest", "forest_thick", "forest_water", "field" ], + "shore_extendable_overmap_terrain_aliases": [ + { "om_terrain": "island_forest", "om_terrain_match_type": "TYPE", "alias": "forest" }, + { "om_terrain": "island_forest_thick", "om_terrain_match_type": "TYPE", "alias": "forest_thick" }, + { "om_terrain": "island_forest_water", "om_terrain_match_type": "TYPE", "alias": "forest_water" }, + { "om_terrain": "island_field", "om_terrain_match_type": "TYPE", "alias": "field" } + ] + }, + "overmap_ravine_settings": { "num_ravines": 0, "ravine_width": 3, "ravine_range": 45, "ravine_depth": -3 }, + "overmap_forest_settings": { + "noise_threshold_forest": 0.2, + "noise_threshold_forest_thick": 0.25, + "noise_threshold_swamp_adjacent_water": 0.3, + "noise_threshold_swamp_isolated": 0.6, + "river_floodplain_buffer_distance_min": 3, + "river_floodplain_buffer_distance_max": 15 + }, + "forest_mapgen_settings": { + "forest": { + "terrains": [ "forest" ], + "sparseness_adjacency_factor": 3, + "item_group": "forest", + "item_group_chance": 60, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { "t_region_groundcover_forest": 1 }, + "clear_components": false, + "components": { + "trees": { "sequence": 0, "chance": 12, "clear_types": false, "types": { "t_region_tree": 128 } }, + "shrubs_and_flowers": { "sequence": 1, "chance": 10, "clear_types": false, "types": { "t_region_shrub": 100, "f_region_weed": 20 } }, + "clutter": { + "sequence": 2, + "chance": 80, + "clear_types": false, + "types": { + "t_trunk": 128, + "t_dirtmound": 128, + "f_boulder_small": 128, + "f_rubble_rock": 32, + "f_boulder_medium": 8, + "f_boulder_large": 1, + "t_pit": 1, + "t_pit_shallow": 1 + } + }, + "water": { "sequence": 3, "chance": 512, "clear_types": false, "types": { "t_puddle": 1 } } + }, + "clear_terrain_furniture": false, + "terrain_furniture": { } + }, + "forest_thick": { + "terrains": [ + "forest_thick", + "forest_trail_isolated", + "forest_trail_end_north", + "forest_trail_end_east", + "forest_trail_end_south", + "forest_trail_end_west", + "forest_trail_ns", + "forest_trail_ew", + "forest_trail_ne", + "forest_trail_es", + "forest_trail_sw", + "forest_trail_wn", + "forest_trail_new", + "forest_trail_nsw", + "forest_trail_esw", + "forest_trail_nes", + "forest_trail_nesw" + ], + "sparseness_adjacency_factor": 4, + "item_group": "forest", + "item_group_chance": 60, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { "t_region_groundcover_forest": 1 }, + "clear_components": false, + "components": { + "trees": { "sequence": 0, "chance": 5, "clear_types": false, "types": { "t_region_tree": 100 } }, + "shrubs_and_flowers": { "sequence": 1, "chance": 5, "clear_types": false, "types": { "t_region_shrub": 100, "f_region_weed": 20 } }, + "clutter": { + "sequence": 2, + "chance": 64, + "clear_types": false, + "types": { + "t_trunk": 64, + "t_dirtmound": 64, + "f_boulder_small": 32, + "f_rubble_rock": 32, + "f_boulder_medium": 16, + "f_boulder_large": 4, + "t_pit": 1, + "t_pit_shallow": 1 + } + }, + "water": { "sequence": 3, "chance": 512, "clear_types": false, "types": { "t_puddle": 1 } } + }, + "clear_terrain_furniture": false, + "terrain_furniture": { } + }, + "forest_water": { + "terrains": [ "forest_water" ], + "sparseness_adjacency_factor": 2, + "item_group": "forest", + "item_group_chance": 60, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { "t_region_groundcover_swamp": 1 }, + "clear_components": false, + "components": { + "trees": { + "sequence": 0, + "chance": 45, + "clear_types": false, + "types": { + "t_tree": 40, + "t_tree_young": 80, + "t_tree_pine": 40, + "t_tree_birch": 20, + "t_tree_elm": 20, + "t_tree_cottonwood": 20, + "t_tree_alder": 80, + "t_tree_maple": 40, + "t_tree_willow": 40, + "t_tree_walnut": 8, + "t_tree_chestnut": 8, + "t_tree_hazelnut": 2, + "t_tree_beech": 2, + "t_tree_hickory": 8, + "t_tree_apple": 2, + "t_tree_cherry": 2, + "t_tree_juniper": 2, + "t_tree_peach": 2, + "t_tree_pear": 2, + "t_tree_plum": 2, + "t_tree_elderberry": 2, + "t_tree_mulberry": 2, + "t_tree_deadpine": 30, + "t_tree_hickory_dead": 30, + "t_tree_dead": 30 + } + }, + "shrubs_and_flowers": { "sequence": 1, "chance": 15, "clear_types": false, "types": { "t_region_shrub": 80, "f_region_weed": 30 } }, + "clutter": { + "sequence": 2, + "chance": 75, + "clear_types": false, + "types": { "t_trunk": 1, "f_boulder_small": 2, "f_boulder_medium": 1 } + }, + "water": { + "sequence": 3, + "chance": 2, + "clear_types": false, + "types": { "t_swater_sh": 6, "t_swater_dp": 1, "t_water_murky": 12 } + } + }, + "clear_terrain_furniture": false, + "terrain_furniture": { "t_water_murky": { "chance": 2, "clear_furniture": false, "furniture": { "f_region_water_plant": 1 } } } + } + }, + "forest_trail_settings": { + "chance": 2, + "border_point_chance": 2, + "minimum_forest_size": 100, + "random_point_min": 4, + "random_point_max": 50, + "random_point_size_scalar": 100, + "trailhead_chance": 1, + "trailhead_road_distance": 6, + "trail_center_variance": 3, + "trail_width_offset_min": 1, + "trail_width_offset_max": 3, + "clear_trail_terrain": false, + "trail_terrain": { "t_dirt": 1 }, + "trailheads": { "trailhead_basic": 1 } + }, + "map_extras": { + "forest": { + "chance": 20, + "extras": { + "mx_portal": 3, + "mx_crater": 10, + "mx_portal_in": 3, + "mx_grass": 20, + "mx_grass2": 40, + "mx_spider": 200, + "mx_nest_wasp": 100, + "mx_grove": 500, + "mx_shrubbery": 500, + "mx_clearcut": 125, + "mx_pond": 125, + "mx_pond_forest": 125, + "mx_pond_forest_2": 125, + "mx_clay_deposit": 125, + "mx_point_dead_vegetation": 500, + "mx_point_burned_ground": 500 + } + }, + "forest_thick": { + "chance": 20, + "extras": { + "mx_portal": 3, + "mx_crater": 10, + "mx_portal_in": 3, + "mx_grass": 10, + "mx_grass2": 20, + "mx_shia": 1, + "mx_spider": 200, + "mx_nest_wasp": 100, + "mx_jabberwock": 1, + "mx_grove": 500, + "mx_shrubbery": 500, + "mx_clearcut": 125, + "mx_pond": 125, + "mx_pond_forest": 125, + "mx_pond_forest_2": 125, + "mx_clay_deposit": 125, + "mx_point_dead_vegetation": 500, + "mx_point_burned_ground": 500 + } + }, + "forest_water": { + "chance": 20, + "//": "weights normalised to around 1000", + "extras": { + "mx_portal": 8, + "mx_crater": 20, + "mx_portal_in": 7, + "mx_spider": 200, + "mx_grass": 10, + "mx_grass2": 20, + "mx_pond": 240, + "mx_pond_swamp": 240, + "mx_pond_swamp_2": 240, + "mx_clay_deposit": 140, + "mx_point_dead_vegetation": 60, + "mx_nest_dermatik": 50 + } + }, + "field": { + "chance": 6, + "extras": { + "mx_portal": 1, + "mx_crater": 15, + "mx_portal_in": 1, + "mx_point_dead_vegetation": 50, + "mx_grass": 350, + "mx_grass2": 350, + "mx_trees": 50, + "mx_trees2": 80, + "mx_Trapdoor_spider_den": 4, + "mx_pond": 20, + "mx_point_burned_ground": 50, + "mx_nest_wasp": 5 + } + }, + "road": { "chance": 750, "extras": { "mx_bandits_block": 80, "mx_portal": 5, "mx_crater": 10, "mx_portal_in": 4 } }, + "marloss": { "chance": 20, "extras": { "mx_marloss_pilgrimage": 100 } }, + "river": { "chance": 3, "extras": { "mx_reed": 100 } }, + "lake_shore": { "chance": 2, "extras": { "mx_reed": 100 } } + }, + "city": { + "shop_radius": 0, + "shop_sigma": 0, + "park_radius": 0, + "park_sigma": 0, + "houses": { "house_w_1": 50 }, + "parks": { "small_wooded_trail": 300 }, + "shops": { "s_gas": 700 } + }, + "weather": { + "base_temperature": 6.5, + "base_humidity": 70.0, + "base_pressure": 1015.0, + "base_wind": 3.4, + "base_wind_distrib_peaks": 80, + "base_wind_season_variation": 50, + "weather_types": [ + "clear", + "sunny", + "cloudy", + "light_drizzle", + "drizzle", + "rain", + "thunder", + "lightning", + "flurries", + "snowing", + "snowstorm", + "portal_storm" + ] + }, + "overmap_feature_flag_settings": { "clear_blacklist": false, "blacklist": [ "LAB" ], "clear_whitelist": false, "whitelist": [ ] } + } +] diff --git a/data/mods/innawood/itemgroups/Location_MapExtras_locations.json b/data/mods/innawood/itemgroups/Location_MapExtras_locations.json new file mode 100644 index 0000000000000..31e92214aa661 --- /dev/null +++ b/data/mods/innawood/itemgroups/Location_MapExtras_locations.json @@ -0,0 +1,41 @@ +[ + { + "type": "item_group", + "id": "cave_minerals", + "subtype": "distribution", + "entries": [ + { "item": "coal_lump", "prob": 20, "count": [ 1, 10 ] }, + { "item": "rock", "prob": 40, "count": [ 1, 10 ] }, + { "item": "rock_large", "prob": 10, "count": [ 1, 10 ] }, + { "item": "rock_flaking", "prob": 20, "count": [ 1, 10 ] }, + { "item": "material_shrd_limestone", "prob": 40, "count": [ 1, 10 ] }, + { "item": "material_limestone", "prob": 40, "count": [ 1, 10 ] }, + { "item": "material_niter", "prob": 5, "count": [ 1, 10 ] }, + { "item": "chunk_sulfur", "prob": 5, "count": [ 1, 10 ] }, + { "item": "material_rocksalt", "prob": 5, "count": [ 1, 10 ] }, + { "item": "material_rhodonite", "prob": 5, "count": [ 1, 10 ] }, + { "item": "material_zincite", "prob": 5, "count": [ 1, 10 ] } + ] + }, + { + "type": "item_group", + "id": "field", + "items": [ [ "rock", 400000 ], [ "rock_flaking", 100000 ], [ "rock_large", 50000 ], [ "sharp_rock", 50000 ] ] + }, + { + "type": "item_group", + "id": "forest", + "items": [ + [ "rock", 400000 ], + [ "rock_flaking", 50000 ], + [ "rock_large", 50000 ], + [ "stick", 950000 ], + [ "pine_bough", 200000 ], + [ "acorns", 150000 ], + [ "pinecone", 50000 ], + [ "juniper", 50000 ], + [ "hickory_root", 30000 ], + [ "hickory_nut", 50000 ] + ] + } +] diff --git a/data/mods/innawood/itemgroups/monster_drops_lairs.json b/data/mods/innawood/itemgroups/monster_drops_lairs.json new file mode 100644 index 0000000000000..cef9525cfc7cc --- /dev/null +++ b/data/mods/innawood/itemgroups/monster_drops_lairs.json @@ -0,0 +1,77 @@ +[ + { + "type": "item_group", + "id": "ant_food_innawood", + "subtype": "distribution", + "entries": [ + { "item": "meat", "prob": 50 }, + { "item": "veggy", "prob": 30 }, + { "item": "meat_tainted", "prob": 60 }, + { "item": "veggy_tainted", "prob": 35 }, + { "item": "apple", "prob": 70 }, + { "item": "orange", "prob": 65 }, + { "item": "banana", "prob": 40 }, + { "item": "mushroom", "prob": 4 }, + { "item": "blueberries", "prob": 3 }, + { "item": "strawberries", "prob": 2 }, + { "item": "cucumber", "prob": 8 }, + { "item": "tomato", "prob": 9 }, + { "item": "pumpkin", "prob": 8 }, + { "item": "broccoli", "prob": 9 }, + { "item": "zucchini", "prob": 7 }, + { "item": "celery", "prob": 2 }, + { "item": "onion", "prob": 3 }, + { "item": "carrot", "prob": 3 }, + { "item": "potato", "prob": 10 }, + { "item": "pear", "prob": 65 }, + { "item": "grapefruit", "prob": 1 }, + { "item": "cherries", "prob": 5 }, + { "item": "plums", "prob": 9 }, + { "item": "grapes", "prob": 45 }, + { "item": "pineapple", "prob": 2 }, + { "item": "peach", "prob": 1 }, + { "item": "cranberries", "prob": 15 }, + { "item": "watermelon", "prob": 2 }, + { "item": "melon", "prob": 1 }, + { "item": "raspberries", "prob": 3 }, + { "item": "blackberries", "prob": 3 }, + { "item": "mango", "prob": 1 }, + { "item": "pomegranate", "prob": 1 }, + { "item": "rhubarb", "prob": 5 }, + { "item": "papaya", "prob": 1 }, + { "item": "kiwi", "prob": 2 }, + { "item": "apricot", "prob": 1 }, + { "item": "honeycomb", "prob": 10 }, + { "item": "royal_jelly", "prob": 8 }, + { "item": "rock", "prob": 40 }, + { "item": "rock_large", "prob": 5 }, + { "item": "stick", "prob": 95 }, + { "item": "honey_ant", "prob": 30 }, + { "item": "honeydew", "prob": 30 } + ] + }, + { + "type": "item_group", + "id": "spider_innawood", + "magazine": 100, + "subtype": "distribution", + "entries": [ + { "item": "meat", "prob": 50 }, + { "item": "meat_tainted", "prob": 60 }, + { "item": "weed", "prob": 20 }, + { "item": "seed_weed", "prob": 15 }, + { "item": "seed_tobacco", "prob": 5 }, + { "item": "rope_30", "prob": 35 }, + { "item": "stick", "prob": 95 }, + { "item": "bee_sting", "prob": 5 }, + { "item": "chitin_piece", "prob": 10 }, + { "item": "honeycomb", "prob": 10 } + ] + }, + { + "type": "item_group", + "id": "hive", + "subtype": "distribution", + "entries": [ { "item": "honeycomb", "prob": 100000 } ] + } +] diff --git a/data/mods/innawood/itemgroups/trash_and_debris.json b/data/mods/innawood/itemgroups/trash_and_debris.json new file mode 100644 index 0000000000000..ac4896fdb8acd --- /dev/null +++ b/data/mods/innawood/itemgroups/trash_and_debris.json @@ -0,0 +1,31 @@ +[ + { + "type": "item_group", + "id": "trash_forest", + "//": "Naturally occuring glass is considered to be from lightning strikes, maybe?", + "//2": "Naturally occuring metal is considered to be sufficiently pure nuggets", + "items": [ + [ "rock", 80000 ], + [ "rock_flaking", 80000 ], + [ "stick", 80000 ], + [ "acorns", 80000 ], + [ "pinecone", 80000 ], + { "item": "withered", "prob": 80000, "count-min": 1, "count-max": 10 }, + { "item": "plant_fibre", "prob": 80000, "count-min": 1, "count-max": 10 }, + [ "straw_pile", 80000 ], + [ "tanbark", 80000 ], + [ "rock_large", 70000 ], + [ "ceramic_shard", 10000 ], + [ "pine_bough", 70000 ], + [ "splinter", 70000 ], + [ "hickory_root", 65000 ], + [ "hickory_nut", 65000 ], + [ "tinder", 50000 ], + { "item": "feather", "prob": 40000, "count-min": 1, "count-max": 10 }, + [ "bone", 30000 ], + [ "steel_lump", 3000 ], + [ "steel_chunk", 3000 ], + { "item": "glass_shard", "prob": 3000 } + ] + } +] diff --git a/data/mods/innawood/items_fake.json b/data/mods/innawood/items_fake.json new file mode 100644 index 0000000000000..0af464e29c6b4 --- /dev/null +++ b/data/mods/innawood/items_fake.json @@ -0,0 +1,8 @@ +[ + { + "id": "bloomery", + "copy-from": "fake_item", + "type": "TOOL", + "name": { "str": "bloomery" } + } +] diff --git a/data/mods/innawood/items_generic.json b/data/mods/innawood/items_generic.json new file mode 100644 index 0000000000000..88122b84d9097 --- /dev/null +++ b/data/mods/innawood/items_generic.json @@ -0,0 +1,18 @@ +[ + { + "type": "GENERIC", + "id": "iron_ore", + "symbol": ",", + "color": "brown", + "name": { "str": "iron ore" }, + "category": "spare_parts", + "description": "A chunk of iron-rich earth. Could be refined with a bloomery.", + "price": 531, + "bashing": 7, + "price_postapoc": 10, + "material": [ "iron" ], + "weight": "1000 g", + "volume": "235 ml", + "to_hit": -1 + } +] diff --git a/data/mods/innawood/mapgen/ants.json b/data/mods/innawood/mapgen/ants.json new file mode 100644 index 0000000000000..67aadbd67b6c5 --- /dev/null +++ b/data/mods/innawood/mapgen/ants.json @@ -0,0 +1,46 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": "ants_food", + "weight": 5000, + "object": { + "fill_ter": "t_dirt_underground", + "rows": [ + "####### #######", + "####### #######", + "####### #######", + "###### #######", + "####### #######", + "###### ######", + "###### #####", + "##### ####", + "#### #####", + "##### #####", + "#### ####", + "#### ####", + "### ###", + "### ####", + "#### ######", + "####### #####", + "######### ####", + "######## ######", + "####### ######", + "######## #####", + "########## ########", + "############ ##########", + "########################", + "########################" + ], + "terrain": { "#": "t_soil" }, + "place_nested": [ + { "chunks": [ "ant_tunnel_bounds_h" ], "x": [ 4, 6 ], "y": 0 }, + { "chunks": [ "ant_tunnel_bounds_h" ], "x": [ 4, 6 ], "y": 1 }, + { "chunks": [ "ant_tunnel_bounds_h" ], "x": [ 4, 6 ], "y": 2 }, + { "chunks": [ "ant_tunnel_bounds_h" ], "x": [ 4, 6 ], "y": 3 }, + { "chunks": [ "ant_tunnel_bounds_h" ], "x": [ 4, 6 ], "y": 4 } + ], + "items": { " ": { "item": "ant_food_innawood", "chance": 4 } } + } + } +] diff --git a/data/mods/innawood/mapgen/cave.json b/data/mods/innawood/mapgen/cave.json new file mode 100644 index 0000000000000..9d8c050b04efd --- /dev/null +++ b/data/mods/innawood/mapgen/cave.json @@ -0,0 +1,770 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 1000, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........%%%%%%%%%.......", + ".......%%|||||||%%......", + ".......%|||||||||%......", + ".......%||||,,<||%......", + ".......%|||,,||||%......", + ".......%|||,,||||%......", + ".......%%|||,,||%%......", + "........%%%%;;%%%.......", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + ",": "t_rock_roof", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_dirt", + "<": "t_slope_down" + }, + "furniture": { }, + "nested": { "U": { "chunks": [ [ "roof_6x6_garden_1", 50 ], [ "roof_6x6_garden_2", 50 ] ] } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 1000, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "........................", + ".....%%%%%%%%%%%%%%%....", + "....%||||||||||||||%%...", + "....%|,,,,,,,,,,,,||%...", + "....%|,,,||||||||,,|%...", + "....%|,,|||||||||,,|%...", + "....%|<||,,,,||||,,|%...", + "....%|||,,||,,|||,,|%...", + "....%|||,,|||,,,,,,|%...", + "....%|||,,||||||||||%...", + "....%|||,,,,,,||||||%...", + "....%|||,,|||,,|||||%...", + "....%|||,,||||,,||||%...", + "....%||,,,|||||,,|||%...", + "....%|,,,,|||||,,|||%...", + "....%||||||,,,,,,|||%...", + "....%|||||,,||||||||%...", + "....%%|||;;||||||||%%...", + ".....%%%%;;%%%%%%%%%....", + "........................", + "........................", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_dirt", + ",": "t_rock_roof", + "<": "t_slope_down" + }, + "furniture": { } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 1000, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "........................", + ".....%%%%%%%%%%%%%%%....", + "....%||||||||||||||%%...", + "....%|,,,WW,,,,WW,||%...", + "....%|,,,||||||||,,|%...", + "....%|WW|||||||||,,|%...", + "....%|<||W,,,||||,,|%...", + "....%|||,W||,,|||,,|%...", + "....%|||,,|||,,,W,,|%...", + "....%|||,,||||||||||%...", + "....%|||,,,W,,||||||%...", + "....%|||,,|||,,|||||%...", + "....%|||,,||||,W||||%...", + "....%||WWW|||||W,|||%...", + "....%|WWWW|||||,,|||%...", + "....%||||||,,,,,,|||%...", + "....%|||||,,||||||||%...", + "....%%|||;;||||||||%%...", + ".....%%%%;;%%%%%%%%%....", + "........................", + "........................", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_dirt", + ",": "t_rock_roof", + "W": "t_rock_roof", + "<": "t_slope_down" + }, + "furniture": { }, + "fields": { "W": { "field": "fd_web", "intensity": 2, "age": 10 } }, + "monsters": { "W": { "monster": "GROUP_SPIDER", "chance": 2, "density": 0.01 } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 1000, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "........................", + ".....%%%%%%%%%%%%%%%....", + "....%||||||||||||||%%...", + "....%|,||||,,,W,||||%...", + "....%|,,||,,|||,,|||%...", + "....%||,,,,|||||,,||%...", + "....%||||||||,,W,,||%...", + "....%|,|,,,,||||,,||%...", + "....%|,|W||,,||||,,,;...", + "....%,,|,,||,<|||,,,;...", + "....%|W||,,||||,,,||%...", + "....%|,,||,,|||,,|||%...", + "....%||,,||,,W,,||,|%...", + "....%|||,,|,|||,||,|%...", + "....%||||,,,|||,,W,|%...", + "....%||||,||||||||||%...", + "....%|||,,,,W,,,,,||%...", + "....%%|||||||||||||%%...", + ".....%%%%%%%%%%%%%%%....", + "........................", + "........................", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_dirt", + ",": "t_rock_roof", + "W": "t_rock_roof", + "<": "t_slope_down" + }, + "fields": { "W": { "field": "fd_web", "intensity": 1, "age": 10 } }, + "furniture": { } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 1000, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "........................", + ".....%%%%%%%%%%%%%%%....", + "....%||||||||||||||%%...", + "....%|,||||,,,,B||||%...", + "....%|,,||BB|||B,|||%...", + "....%||,,,,|||||,,||%...", + "....%||||||||,,B,,||%...", + "....%|,|,,,,||||,,||%...", + "....%|,|,||,,||||,,,;...", + "....%,,|BB||,<|||,,,;...", + "....%|,||,,||||,,,||%...", + "....%|,B||,,|||,,|||%...", + "....%||,,||,BBB,||,|%...", + "....%|||,,|,|||,||,|%...", + "....%||||,,,|||,,,,|%...", + "....%||||,||||||||||%...", + "....%|||BB,,,,,,,,||%...", + "....%%|||||||||||||%%...", + ".....%%%%%%%%%%%%%%%....", + "........................", + "........................", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_dirt", + ",": "t_rock_roof", + "B": "t_rock_roof", + "<": "t_slope_down" + }, + "furniture": { }, + "monster": { "B": { "monster": "mon_bat" } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 1000, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "........................", + ".....%%%%%%%%%%%%%%%....", + "....%||||||||||||||%%...", + "....%|,||||,,W,,||||%...", + "....%|,,||,,|||,,|||%...", + "....%||,,W,|||||,,||%...", + "....%||||||||,,,,,||%...", + "....%|,|,,,,||||,,||%...", + "....%|W|,||,B||||,,,;...", + "....%,,|,,||,<|||,,,;...", + "....%|,||,,||||,,,||%...", + "....%|,,||,,|||,,|||%...", + "....%||,,||,,,,,||,|%...", + "....%|||,,|,|||W||,|%...", + "....%||||,W,|||,,,,|%...", + "....%||||,||||||||||%...", + "....%|||,,,,,,,W,,||%...", + "....%%|||||||||||||%%...", + ".....%%%%%%%%%%%%%%%....", + "........................", + "........................", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_dirt", + ",": "t_rock_roof", + "B": "t_rock_roof", + "W": "t_rock_roof", + "<": "t_slope_down" + }, + "furniture": { }, + "fields": { "W": { "field": "fd_web", "intensity": 1, "age": 10 } }, + "monster": { "B": { "monster": "mon_bear" } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 1000, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + ".........%%%%%%%........", + "........%|||||||%.......", + ".......%|||||||||%......", + "......%|||||,,,,||%.....", + ".....%||||||W||,,||%....", + "....%||,,,,,,|||,,||%...", + "...%||,,||||,,|||,,||%..", + "..%|||W||||||,,|||,,||%.", + ".%||||,,,,,|||,,|||<||%.", + ".%|||||||||||||,,|||||%.", + ".%||||,,,,,,W,,,,,,,,,;.", + ".%|||,,|||,||,,,,,,,,,;.", + ".%||,,||||,|||,,,,,|||%.", + ".%||W|||||,||||,,,||||%.", + "..%|||,|||W|||||,|||||%.", + "...%||,,||,,,||||||||%..", + "....%||,,|||,,||||||%...", + ".....%||,,|||,,||||%....", + "......%||,,|||,,||%.....", + ".......%||,,W,,||%......", + "........%|||||||%.......", + ".........%%%%%%%........", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_dirt", + ",": "t_rock_roof", + "B": "t_rock_roof", + "W": "t_rock_roof", + "<": "t_slope_down" + }, + "fields": { "W": { "field": "fd_web", "intensity": 1, "age": 10 } }, + "furniture": { } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 1000, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + ".........%%%%%%%........", + "........%|||||||%.......", + ".......%|||||||||%......", + "......%|||||,,W,||%.....", + ".....%||||||,||,,||%....", + "....%||,,W,,,|||,,||%...", + "...%||,,||||,,|||,W||%..", + "..%|||,||||||,,|||,,||%.", + ".%||||,,W,,|||,,|||<||%.", + ".%|||||||||||||,,|||||%.", + ".%||||,,,,,W,,,,,,,,,,;.", + ".%|||,,|||,||,,,,,,,,,;.", + ".%||,,||||,|||,,,,,|||%.", + ".%||W|||||,||||,B,||||%.", + "..%|||,|||,|||||B|||||%.", + "...%||,,||,W,||||||||%..", + "....%||,,|||,,||||||%...", + ".....%||,,|||,,||||%....", + "......%||,,|||,,||%.....", + ".......%||,,W,,||%......", + "........%|||||||%.......", + ".........%%%%%%%........", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_dirt", + ",": "t_rock_roof", + "B": "t_rock_roof", + "W": "t_rock_roof", + "<": "t_slope_down" + }, + "furniture": { }, + "fields": { "W": { "field": "fd_web", "intensity": 1, "age": 10 } }, + "monster": { "B": { "monster": "mon_cougar" } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_innawood" ], + "weight": 50, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "........................", + "........................", + "........................", + ".....%%%%%%%%%%%%%%%....", + "....%%||||||||||||||%...", + "....%|||,,,,,,||||||%...", + "....%|||,,|||,,|||||%...", + "....%|||,,||||,,||||%...", + "....%||,,,|||||,,|||%...", + "....%||,,,|||||,,|||%...", + "....%||||||,,,,,q|||%...", + "....%|||||,,||||||||%...", + "....%%|||;;||||||||%%...", + ".....%;;|;;;;;%%%%%%....", + "......~!?~~!RR?R!.......", + ".....RR~~RR.?!~~R.......", + "....!.??!~~RR~?!!.......", + ".....~.RR?RR?~R.?.......", + ".....!?RR~~~R!RRR.......", + ".....RR~?R!~~?..........", + "......!.................", + "........................" + ], + "terrain": { + ".": [ [ "t_region_groundcover_forest", 4 ], [ "t_region_tree", 1 ] ], + "|": "t_rock", + "%": [ "t_rock", "t_region_groundcover_forest" ], + ";": "t_rock_floor_no_roof", + "!": "t_rock_floor_no_roof", + "?": "t_rock_floor_no_roof", + "#": "t_rock_floor_no_roof", + "~": "t_rock_floor_no_roof", + "@": "t_rock_roof", + ",": "t_rock_roof", + "q": "t_rock_roof", + "R": "t_rock_floor_no_roof" + }, + "furniture": { "R": [ [ "f_boulder_small", 1 ], [ "f_null", 10 ] ] }, + "item": { "~": { "item": "bone", "chance": 50, "repeat": [ 1, 3 ] } }, + "fields": { + "!": { "field": "fd_gibs_flesh", "intensity": 2, "age": 10 }, + "?": { "field": "fd_blood", "intensity": 2, "age": 10 }, + "#": { "field": "fd_blood", "intensity": 3, "age": 10 } + }, + "monster": { "q": { "monster": "mon_rabbit_dreadful" } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_underground_innawood" ], + "weight": 50, + "object": { + "rotation": [ 0, 3 ], + "rows": [ + "........................", + ".......~~~~~~~~~~~......", + "......~~~~~~~~~~~~~.....", + "......~~~~~~~~~~~~~.....", + "......~~~~......~~~.....", + ".....~~~~~~.....~~~.....", + "....~~~~~~~~....~~~~....", + "......~~~~~~~..~~~~~....", + "....~~~~~~~~..~~~~~~....", + "....~~~~~~~~..~~~~~.....", + ".....~~~~~~~..~~~~~.....", + "..............~~~~~~....", + "............~~~~~~~.....", + "...........~~~~~~~......", + "....~~~~~~~~~~~~~~~~....", + ".....~~~~~~~~~~~~~~.....", + ".......~~~~~~~~~~~......", + ".......~~~~~~~~~~~......", + "........~~~~~~~~~~......", + ".........~~~~~~~~.......", + "..........~~~~~~~.......", + "............,...........", + "............,...........", + "............>..........." + ], + "terrain": { ".": "t_soil", ",": "t_dirt_underground", "W": "t_dirt_underground", ">": "t_slope_up", "~": "t_water_dp" }, + "furniture": { "W": "f_boulder_small" }, + "monster": { + "~": [ + { "monster": "mon_sewer_fish", "chance": 1 }, + { "monster": "mon_mutant_salmon", "chance": 1 }, + { "monster": "mon_mutant_carp", "chance": 1 } + ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_underground_innawood" ], + "weight": 1000, + "object": { + "fill_ter": "t_dirt_underground", + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "...............~~~~~~...", + "..............~~~~~~~~..", + "..............~~~~~~~~..", + "............~~~~~~~~~~..", + "...........~~~~~~~~~~~..", + "...........~~~~~~~~~~~..", + "...........~~~~~~~~~~...", + ".........~~~~~~~~.......", + "..~~~~~~~~~~~~~~~.......", + "....~~~~~~~~~~~~~~~~~~..", + "..~~~~~~~~~~~~~~~~~~~~~.", + "..~~~~~~~~~~~~~~~~~~~~~.", + "...~~~~~~~~~~~~~~~~~~~..", + "....~~~~~~~~~~~~........", + "....~~~~~.,,,,,.........", + "..~~~~~~~..,,,..........", + "..~~~~~~~...,...........", + "...~~~~~~...,...........", + ".....~~~....,...........", + "............,...........", + "............,...........", + "............>..........." + ], + "terrain": { ".": "t_soil", ",": "t_dirt_underground", ">": "t_slope_up" }, + "furniture": { }, + "items": { "~": [ { "item": "monparts", "chance": 2 }, { "item": "trash_forest", "chance": 2 } ] } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_underground_innawood" ], + "weight": 800, + "object": { + "fill_ter": "t_dirt_underground", + "rotation": [ 0, 3 ], + "rows": [ + "........................", + ".......... .....", + "... ... ....... ....", + "... .. .. .. .. ...", + "... ... .. .. ..", + "... .... ... M .. ..", + "... .... .. .. ..", + ".... .... .. .. ..", + "..... .... ...... ...", + "...... .... ....", + "....... ...............", + "....... ......", + ".... ........ .....", + ".... ............. ....", + ".... .............. ...", + ".. .............. ...", + ".. .. ............. ...", + ".. ... ...... ...", + ".. .......... .... ...", + ".. .......... ....", + "... ........ .........", + ".... ..........", + "............ ...........", + "............>..........." + ], + "terrain": { ".": "t_soil", " ": "t_dirt_underground", ">": "t_slope_up" }, + "furniture": { }, + "monster": { "M": { "monster": "mon_nakedmolerat_giant" }, " ": { "monster": "mon_nakedmolerat_giant", "chance": 2 } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_underground_innawood" ], + "weight": 500, + "object": { + "fill_ter": "t_dirt_underground", + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "...........!!!!!!.......", + ".........!!!!!!!!!......", + ".........!!!!!!!!!......", + ".........!!!!!!!!!......", + ".......!!!,,,,,,!.......", + "........!!!!..,,,!......", + ".........!!,..,,,!!.....", + "..........,,,,,,,!......", + "..........,,,,,,,.......", + "..........,,,,,,,.......", + "..........,,,,,,,.......", + ".........,,,,.,,,.......", + ".........,,,,...,.......", + ".........,,,,...,.......", + ".........,,,,...,.......", + ".........,,,,...,.......", + ".........,,,,...,.......", + ".........,,,,..,,.......", + ".........,,,..,,........", + "..........,,.,,.........", + "...........,,,..........", + "............>..........." + ], + "terrain": { ".": "t_soil", ",": "t_dirt_underground", "!": "t_dirt_underground", ">": "t_slope_up" }, + "furniture": { } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_underground_innawood" ], + "weight": 250, + "object": { + "fill_ter": "t_dirt_underground", + "rotation": [ 0, 3 ], + "rows": [ + "........................", + "........................", + "..... 11 13 1111111..", + "...11 ......... ..", + "...11 ......... ...", + "....1 ..........1111..", + "....... ..........4....", + "........ ...... ....", + "..........2..... ......", + "..........1.... .......", + "......... ....1........", + "........ .....5........", + ".......11......1........", + ".... ..... .11...", + "... .... ..", + "...11 ... ...", + "..... ........ ..", + "...111111............ .", + "... ..... ... .", + ".... ..... .", + "............ .... .", + "............6.... .", + "............ .... . .", + "............>..........." + ], + "terrain": { ".": "t_soil", " ": "t_dirt_underground", ">": "t_slope_up" }, + "furniture": { }, + "fields": { + "1": { "field": "fd_web", "intensity": 1, "age": 10 }, + "2": { "field": "fd_web", "intensity": 1, "age": 10 }, + "3": { "field": "fd_web", "intensity": 1, "age": 10 }, + "4": { "field": "fd_web", "intensity": 1, "age": 10 }, + "5": { "field": "fd_web", "intensity": 1, "age": 10 }, + "6": { "field": "fd_web", "intensity": 1, "age": 10 } + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_underground_innawood" ], + "weight": 700, + "object": { + "fill_ter": "t_dirt_underground", + "rotation": [ 0, 3 ], + "rows": [ + "........................", + ".......11111111111......", + ".....111 1111....", + ".....111 111....", + "....111 111....", + "...11 11...", + "...11 11...", + "...11 11...", + "...11 11...", + "...11 11...", + "...11111 1111...", + "......11 1......", + "........ .......", + "........ .......", + "........ .......", + "........ .......", + ".......... .........", + "........... ..........", + "........... ..........", + "........... ..........", + "........... ..........", + "........... ..........", + "........... ..........", + "............>..........." + ], + "terrain": { ".": "t_soil", " ": "t_dirt_underground", ">": "t_slope_up", "2": "t_railroad_track_small" }, + "furniture": { }, + "items": { "1": { "item": "cave_minerals", "chance": 40, "repeat": [ 1, 3 ] } }, + "monsters": { " ": { "monster": "GROUP_CAVE", "chance": 2 } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_rat_underground_innawood" ], + "object": { + "fill_ter": "t_dirt_underground", + "rotation": [ 0, 3 ], + "rows": [ + "1...........2...........", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........... ............", + "........... ............", + "........... ............", + "...... >............", + "3...........4...........", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "...................... ", + "...................... <" + ], + "terrain": { ".": "t_soil", " ": "t_dirt_underground", ">": "t_slope_up", "<": "t_slope_down" }, + "furniture": { }, + "nested": { + "1": { "chunks": [ "cave_nw" ] }, + "2": { "chunks": [ "cave_ne" ] }, + "3": { "chunks": [ "cave_sw" ] }, + "4": { "chunks": [ "cave_se" ] } + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "cave_rat_innawood" ], + "object": { + "fill_ter": "t_rock_floor", + "rotation": [ 0, 3 ], + "rows": [ + "........................", + ".........%%%%%%%........", + "........%%%%%%%%%.......", + ".......%%%.....%%%......", + "......%%%%.lll.%%%%.....", + ".....%%%%%.l l.%%%%%....", + "....%%%%%%.l l.%%%%%%...", + "...%%%||||.. ..||||%%%..", + "..%%%||||||. .||||||%%%.", + ".%%%%||||rr rr||||%%%.", + ".%%%%||||rr rr||||%%%.", + ".%%%%|||| ||||%%%.", + ".%%%%|||| K ||||%%%.", + ".%%%%|||| ||||%%%.", + ".%%%%||||rr rr||||%%%.", + "..%%%||||rr rr||||%%%.", + "...%%%||||| |||||%%%..", + "....%%%|||| ||||%%%...", + ".....%%%%%% %%%%%%....", + "......%%%%%%<%%%%%%.....", + ".......%%%%%%%%%%%......", + "........%%%%%%%%%.......", + ".........%%%%%%%........", + "........................" + ], + "terrain": { + " ": "t_rock_floor", + ".": "t_rock", + "|": [ [ "t_rock", 20 ], [ "t_rock_floor", 80 ] ], + "%": [ "t_rock", "t_rock_floor" ], + "<": "t_slope_up" + }, + "furniture": { }, + "monster": { "K": { "monster": "mon_rat_king" }, "r": { "monster": "mon_sewer_rat" } }, + "item": { "l": { "item": "bone", "chance": 50, "repeat": [ 1, 3 ] } } + } + }, + { + "id": "archeology_tools", + "type": "item_group", + "subtype": "collection", + "entries": [ { "item": "bone", "prob": 75 } ] + } +] diff --git a/data/mods/innawood/mapgen/spider_pit.json b/data/mods/innawood/mapgen/spider_pit.json new file mode 100644 index 0000000000000..2d820afbabb68 --- /dev/null +++ b/data/mods/innawood/mapgen/spider_pit.json @@ -0,0 +1,86 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "spider_pit" ], + "weight": 250, + "object": { + "rows": [ + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "............>...........", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................" + ], + "terrain": { ".": [ [ "t_region_groundcover_forest", 50 ], [ "t_region_shrub", 2 ], "t_region_tree" ], ">": "t_slope_down" }, + "traps": { ".": [ [ "tr_null", 20 ], "tr_sinkhole" ] }, + "items": { ".": { "item": "forest", "chance": 2 } }, + "place_fields": [ + { "field": "fd_web", "x": [ 1, 22 ], "y": [ 1, 22 ], "repeat": 60 }, + { "field": "fd_web", "x": [ 8, 15 ], "y": [ 8, 15 ], "repeat": 60 } + ], + "place_monsters": [ { "monster": "GROUP_SPIDER", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.5 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "spider_pit_under" ], + "weight": 250, + "object": { + "rows": [ + "########################", + "##????????????????????##", + "#??????????????????????#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??.........<........??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??..................??#", + "#??????????????????????#", + "##????????????????????##", + "########################" + ], + "terrain": { "#": "t_rock", "?": [ [ "t_rock", 2 ], "t_rock_floor" ], ".": "t_rock_floor", "<": "t_slope_up" }, + "furniture": { ".": [ [ "f_null", 20 ], "f_egg_sackws" ] }, + "items": { ".": { "item": "spider", "chance": 2 } }, + "place_fields": [ + { "field": "fd_web", "x": [ 3, 20 ], "y": [ 3, 20 ], "repeat": 60 }, + { "field": "fd_web", "x": [ 8, 15 ], "y": [ 8, 15 ], "repeat": 60 } + ], + "place_monsters": [ { "monster": "GROUP_SPIDER", "x": [ 3, 20 ], "y": [ 3, 20 ], "density": 1 } ] + } + } +] diff --git a/data/mods/innawood/modinfo.json b/data/mods/innawood/modinfo.json new file mode 100644 index 0000000000000..2d49f2c392e90 --- /dev/null +++ b/data/mods/innawood/modinfo.json @@ -0,0 +1,13 @@ +[ + { + "type": "MOD_INFO", + "id": "innawood", + "name": "Innawood", + "authors": [ "Lightwave" ], + "maintainers": [ "Lightwave" ], + "description": "An untouched land that mankind has yet to reach. Disables most traces of civilization for that 'innawood' experience. Recommend size of cities be set to 0.", + "category": "total_conversion", + "dependencies": [ "dda" ], + "obsolete": false + } +] diff --git a/data/mods/innawood/overmap/connections.json b/data/mods/innawood/overmap/connections.json new file mode 100644 index 0000000000000..d14cb218020d9 --- /dev/null +++ b/data/mods/innawood/overmap/connections.json @@ -0,0 +1,35 @@ +[ + { + "type": "overmap_connection", + "id": "local_road", + "subtypes": [ { "terrain": "road", "locations": [ "railroad" ] } ] + }, + { + "type": "overmap_connection", + "id": "sewer_tunnel", + "subtypes": [ { "terrain": "sewer", "locations": [ "railroad" ], "flags": [ "ORTHOGONAL" ] } ] + }, + { + "type": "overmap_connection", + "id": "subway_tunnel", + "subtypes": [ + { "terrain": "subway", "locations": [ "railroad" ], "flags": [ "ORTHOGONAL" ] }, + { "terrain": "lab_subway", "locations": [ "railroad" ], "flags": [ "ORTHOGONAL" ] } + ] + }, + { + "type": "overmap_connection", + "id": "forest_trail", + "subtypes": [ { "terrain": "forest_trail", "locations": [ "railroad" ], "basic_cost": 0 } ] + }, + { + "type": "overmap_connection", + "id": "local_railroad", + "subtypes": [ { "terrain": "railroad", "locations": [ "railroad" ], "basic_cost": 1, "flags": [ "ORTHOGONAL" ] } ] + }, + { + "type": "overmap_connection", + "id": "hidden_lab_basement", + "subtypes": [ { "terrain": "basement", "locations": [ "railroad" ], "basic_cost": 0 } ] + } +] diff --git a/data/mods/innawood/overmap/special_alien.json b/data/mods/innawood/overmap/special_alien.json new file mode 100644 index 0000000000000..9151c0fd0266a --- /dev/null +++ b/data/mods/innawood/overmap/special_alien.json @@ -0,0 +1,109 @@ +[ + { + "type": "overmap_special", + "id": "Out-of-place Stone Barn", + "//": "Exodii safehouse built in a medieval stone barn", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "exo_safehouse_stone_0_north" }, + { "point": [ 0, 0, 1 ], "overmap": "exo_safehouse_stone_1_north" }, + { "point": [ 0, 0, 2 ], "overmap": "exo_safehouse_stone_2_north" } + ], + "locations": [ "forest_without_trail", "land", "wilderness" ], + "city_distance": [ 0, 30 ], + "city_sizes": [ 0, 16 ], + "occurrences": [ 0, 0 ], + "flags": [ "EXODII", "CBM" ] + }, + { + "type": "overmap_special", + "id": "exodii_base", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "exodii_base_x0y0z0_north" }, + { "point": [ 1, 0, 0 ], "overmap": "exodii_base_x1y0z0_north" }, + { "point": [ 2, 0, 0 ], "overmap": "exodii_base_x2y0z0_north" }, + { "point": [ 3, 0, 0 ], "overmap": "exodii_base_x3y0z0_north" }, + { "point": [ 0, 1, 0 ], "overmap": "exodii_base_x0y1z0_north" }, + { "point": [ 1, 1, 0 ], "overmap": "exodii_base_x1y1z0_north" }, + { "point": [ 2, 1, 0 ], "overmap": "exodii_base_x2y1z0_north" }, + { "point": [ 3, 1, 0 ], "overmap": "exodii_base_x3y1z0_north" }, + { "point": [ 0, 2, 0 ], "overmap": "exodii_base_x0y2z0_north" }, + { "point": [ 1, 2, 0 ], "overmap": "exodii_base_x1y2z0_north" }, + { "point": [ 2, 2, 0 ], "overmap": "exodii_base_x2y2z0_north" }, + { "point": [ 3, 2, 0 ], "overmap": "exodii_base_x3y2z0_north" }, + { "point": [ 0, 3, 0 ], "overmap": "exodii_base_x0y3z0_north" }, + { "point": [ 1, 3, 0 ], "overmap": "exodii_base_x1y3z0_north" }, + { "point": [ 2, 3, 0 ], "overmap": "exodii_base_x2y3z0_north" }, + { "point": [ 3, 3, 0 ], "overmap": "exodii_base_x3y3z0_north" }, + { "point": [ 0, 0, 1 ], "overmap": "exodii_base_x0y0z1_north" }, + { "point": [ 1, 0, 1 ], "overmap": "exodii_base_x1y0z1_north" }, + { "point": [ 2, 0, 1 ], "overmap": "exodii_base_x2y0z1_north" }, + { "point": [ 3, 0, 1 ], "overmap": "exodii_base_x3y0z1_north" }, + { "point": [ 0, 1, 1 ], "overmap": "exodii_base_x0y1z1_north" }, + { "point": [ 1, 1, 1 ], "overmap": "exodii_base_x1y1z1_north" }, + { "point": [ 2, 1, 1 ], "overmap": "exodii_base_x2y1z1_north" }, + { "point": [ 3, 1, 1 ], "overmap": "exodii_base_x3y1z1_north" }, + { "point": [ 0, 2, 1 ], "overmap": "exodii_base_x0y2z1_north" }, + { "point": [ 1, 2, 1 ], "overmap": "exodii_base_x1y2z1_north" }, + { "point": [ 2, 2, 1 ], "overmap": "exodii_base_x2y2z1_north" }, + { "point": [ 3, 2, 1 ], "overmap": "exodii_base_x3y2z1_north" }, + { "point": [ 0, 3, 1 ], "overmap": "exodii_base_x0y3z1_north" }, + { "point": [ 1, 3, 1 ], "overmap": "exodii_base_x1y3z1_north" }, + { "point": [ 2, 3, 1 ], "overmap": "exodii_base_x2y3z1_north" }, + { "point": [ 3, 3, 1 ], "overmap": "exodii_base_x3y3z1_north" }, + { "point": [ 0, 0, 2 ], "overmap": "exodii_base_x0y0z2_north" }, + { "point": [ 1, 0, 2 ], "overmap": "exodii_base_x1y0z2_north" }, + { "point": [ 2, 0, 2 ], "overmap": "exodii_base_x2y0z2_north" }, + { "point": [ 3, 0, 2 ], "overmap": "exodii_base_x3y0z2_north" }, + { "point": [ 0, 1, 2 ], "overmap": "exodii_base_x0y1z2_north" }, + { "point": [ 1, 1, 2 ], "overmap": "exodii_base_x1y1z2_north" }, + { "point": [ 2, 1, 2 ], "overmap": "exodii_base_x2y1z2_north" }, + { "point": [ 3, 1, 2 ], "overmap": "exodii_base_x3y1z2_north" }, + { "point": [ 0, 2, 2 ], "overmap": "exodii_base_x0y2z2_north" }, + { "point": [ 1, 2, 2 ], "overmap": "exodii_base_x1y2z2_north" }, + { "point": [ 2, 2, 2 ], "overmap": "exodii_base_x2y2z2_north" }, + { "point": [ 3, 2, 2 ], "overmap": "exodii_base_x3y2z2_north" }, + { "point": [ 0, 3, 2 ], "overmap": "exodii_base_x0y3z2_north" }, + { "point": [ 1, 3, 2 ], "overmap": "exodii_base_x1y3z2_north" }, + { "point": [ 2, 3, 2 ], "overmap": "exodii_base_x2y3z2_north" }, + { "point": [ 3, 3, 2 ], "overmap": "exodii_base_x3y3z2_north" }, + { "point": [ 0, 0, 3 ], "overmap": "exodii_base_x0y0z3_north" }, + { "point": [ 1, 0, 3 ], "overmap": "exodii_base_x1y0z3_north" }, + { "point": [ 2, 0, 3 ], "overmap": "exodii_base_x2y0z3_north" }, + { "point": [ 3, 0, 3 ], "overmap": "exodii_base_x3y0z3_north" }, + { "point": [ 0, 1, 3 ], "overmap": "exodii_base_x0y1z3_north" }, + { "point": [ 1, 1, 3 ], "overmap": "exodii_base_x1y1z3_north" }, + { "point": [ 2, 1, 3 ], "overmap": "exodii_base_x2y1z3_north" }, + { "point": [ 3, 1, 3 ], "overmap": "exodii_base_x3y1z3_north" }, + { "point": [ 0, 2, 3 ], "overmap": "exodii_base_x0y2z3_north" }, + { "point": [ 1, 2, 3 ], "overmap": "exodii_base_x1y2z3_north" }, + { "point": [ 2, 2, 3 ], "overmap": "exodii_base_x2y2z3_north" }, + { "point": [ 3, 2, 3 ], "overmap": "exodii_base_x3y2z3_north" }, + { "point": [ 0, 3, 3 ], "overmap": "exodii_base_x0y3z3_north" }, + { "point": [ 1, 3, 3 ], "overmap": "exodii_base_x1y3z3_north" }, + { "point": [ 2, 3, 3 ], "overmap": "exodii_base_x2y3z3_north" }, + { "point": [ 3, 3, 3 ], "overmap": "exodii_base_x3y3z3_north" }, + { "point": [ 0, 0, 4 ], "overmap": "exodii_base_x0y0z4_north" }, + { "point": [ 1, 0, 4 ], "overmap": "exodii_base_x1y0z4_north" }, + { "point": [ 2, 0, 4 ], "overmap": "exodii_base_x2y0z4_north" }, + { "point": [ 3, 0, 4 ], "overmap": "exodii_base_x3y0z4_north" }, + { "point": [ 0, 1, 4 ], "overmap": "exodii_base_x0y1z4_north" }, + { "point": [ 1, 1, 4 ], "overmap": "exodii_base_x1y1z4_north" }, + { "point": [ 2, 1, 4 ], "overmap": "exodii_base_x2y1z4_north" }, + { "point": [ 3, 1, 4 ], "overmap": "exodii_base_x3y1z4_north" }, + { "point": [ 0, 2, 4 ], "overmap": "exodii_base_x0y2z4_north" }, + { "point": [ 1, 2, 4 ], "overmap": "exodii_base_x1y2z4_north" }, + { "point": [ 2, 2, 4 ], "overmap": "exodii_base_x2y2z4_north" }, + { "point": [ 3, 2, 4 ], "overmap": "exodii_base_x3y2z4_north" }, + { "point": [ 0, 3, 4 ], "overmap": "exodii_base_x0y3z4_north" }, + { "point": [ 1, 3, 4 ], "overmap": "exodii_base_x1y3z4_north" }, + { "point": [ 2, 3, 4 ], "overmap": "exodii_base_x2y3z4_north" }, + { "point": [ 3, 3, 4 ], "overmap": "exodii_base_x3y3z4_north" } + ], + "locations": [ "land", "swamp", "forest" ], + "city_distance": [ 2, 120 ], + "city_sizes": [ 1, 12 ], + "//": "Occurences should drop a lot once we have some breadcrumbs leading to the base, but until then this is going to be the only way to get CBMs.", + "occurrences": [ 0, 0 ], + "flags": [ "UNIQUE" ] + } +] diff --git a/data/mods/innawood/overmap/specials_kept.json b/data/mods/innawood/overmap/specials_kept.json new file mode 100644 index 0000000000000..4096ae1fa71ba --- /dev/null +++ b/data/mods/innawood/overmap/specials_kept.json @@ -0,0 +1,574 @@ +[ + { + "type": "overmap_special", + "id": "Strangle Temple", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "temple_stairs" }, + { "point": [ 0, 0, -1 ], "overmap": "temple_stairs" }, + { "point": [ 0, 0, -2 ], "overmap": "temple_stairs" }, + { "point": [ 0, 0, -3 ], "overmap": "temple_stairs" }, + { "point": [ 0, 0, -4 ], "overmap": "temple_stairs" }, + { "point": [ 0, 0, -5 ], "overmap": "temple_finale" } + ], + "locations": [ "forest" ], + "city_distance": [ 40, -1 ], + "occurrences": [ 10, 100 ], + "rotate": false, + "flags": [ "WILDERNESS", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Standing stones", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "standing_stones" } ], + "locations": [ "forest" ], + "city_distance": [ 40, -1 ], + "occurrences": [ 10, 100 ], + "rotate": false, + "flags": [ "WILDERNESS", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Spider Pit", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "spider_pit_north" }, + { "point": [ 0, 0, -1 ], "overmap": "spider_pit_under_north" } + ], + "locations": [ "forest" ], + "city_sizes": [ 0, 12 ], + "occurrences": [ 33, 100 ], + "rotate": false, + "flags": [ "WILDERNESS", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Cave", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "cave_innawood" }, + { "point": [ 0, 0, -1 ], "overmap": "cave_underground_innawood" } + ], + "locations": [ "forest" ], + "city_distance": [ 8, -1 ], + "occurrences": [ 0, 10 ], + "flags": [ "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Rat Cave", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "cave_innawood" }, + { "point": [ 0, 0, -1 ], "overmap": "cave_rat_underground_innawood" }, + { "point": [ 0, 0, -2 ], "overmap": "cave_rat_innawood" } + ], + "locations": [ "forest" ], + "city_distance": [ 8, -1 ], + "occurrences": [ 10, 100 ], + "flags": [ "WILDERNESS", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Pond", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "pond_field_north" } ], + "locations": [ "field" ], + "city_distance": [ 15, -1 ], + "occurrences": [ 0, 5 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Hot Springs", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "hot_springs_north" } ], + "locations": [ "field" ], + "city_distance": [ 15, -1 ], + "occurrences": [ 0, 2 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "ws_giant_sinkhole", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "ws_giant_sinkhole_1_north" }, + { "point": [ 0, 0, -1 ], "overmap": "ws_giant_sinkhole_2_north" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 15, -1 ], + "occurrences": [ 10, 100 ], + "flags": [ "CLASSIC", "WILDERNESS", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Island", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "forest_water" }, + { "point": [ 3, 3, 0 ], "overmap": "island_forest_thick_north" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 5, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island Forest", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "island_forest_north" }, + { "point": [ 3, 3, 0 ], "overmap": "island_forest_thick_north" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 5, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Sandy Island", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "island_sand_north" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 2, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island_1", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "forest" }, + { "point": [ 3, 2, 0 ], "overmap": "forest_thick" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 3, 0 ], "overmap": "island_forest_thick_north" }, + { "point": [ 4, 3, 0 ], "overmap": "island_forest_north" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 5, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island_2", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 5, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island_3", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "forest" }, + { "point": [ 3, 2, 0 ], "overmap": "island_field_north" }, + { "point": [ 4, 2, 0 ], "overmap": "island_forest_north" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 3, 0 ], "overmap": "forest_water" }, + { "point": [ 4, 3, 0 ], "overmap": "island_forest_water_north" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 5, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island_4", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "forest" }, + { "point": [ 3, 2, 0 ], "overmap": "island_forest_thick_north" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 3, 0 ], "overmap": "forest_thick" }, + { "point": [ 4, 3, 0 ], "overmap": "island_forest_thick_north" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 4, 0 ], "overmap": "forest" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 6, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 5, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 5, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 5, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 6, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 6, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 6, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 6, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 6, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 6, 0 ], "overmap": "lake_surface" }, + { "point": [ 6, 6, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island_5_swamp", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "island_forest_water_north" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island_5_forest", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "island_forest_north" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island_5_forest_thick", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "island_forest_thick_north" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Island_5_field", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "island_field_north" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + } +] diff --git a/data/mods/innawood/overmap/specials_removed.json b/data/mods/innawood/overmap/specials_removed.json new file mode 100644 index 0000000000000..16aefb701caad --- /dev/null +++ b/data/mods/innawood/overmap/specials_removed.json @@ -0,0 +1,3017 @@ +[ + { + "type": "overmap_special", + "id": "Riverside Dwelling", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "riverside_dwelling_north" } ], + "locations": [ "water" ], + "city_distance": [ 4, 60 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Pottery Cottage", + "overmaps": [ + { "point": [ 0, -1, 0 ], "overmap": "pottery_cottage_field_north" }, + { "point": [ 0, 0, 0 ], "overmap": "pottery_cottage_north" }, + { "point": [ 0, 0, -1 ], "overmap": "pottery_cottage_basement_north" }, + { "point": [ 0, -1, 1 ], "overmap": "pottery_cottage_field_2nd_north" }, + { "point": [ 0, 0, 1 ], "overmap": "pottery_cottage_2nd_north" }, + { "point": [ 0, -1, 2 ], "overmap": "pottery_cottage_field_roof_north" }, + { "point": [ 0, 0, 2 ], "overmap": "pottery_cottage_roof_north" } + ], + "locations": [ "water" ], + "city_distance": [ -1, 25 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Shipwreck", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "shipwreck_river_1_north" }, + { "point": [ 1, 0, 0 ], "overmap": "shipwreck_river_2_north" }, + { "point": [ 0, 0, -1 ], "overmap": "shipwreck_river_3_north" }, + { "point": [ 1, 0, -1 ], "overmap": "shipwreck_river_4_north" } + ], + "locations": [ "water" ], + "occurrences": [ 0, 0 ], + "spawns": { "group": "GROUP_RAZORCLAW", "population": [ 30, 60 ], "radius": [ 2, 10 ] } + }, + { + "type": "overmap_special", + "id": "LMOE Shelter", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lmoe_north" }, + { "point": [ 0, 0, 1 ], "overmap": "lmoe_roof_north" }, + { "point": [ 0, 0, -1 ], "overmap": "lmoe_under_empty_north" } + ], + "locations": [ "forest_without_trail" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "Cabin", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "cabin_north" }, { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Cabin_1", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "cabin_1_north" }, { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_1_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Cabin_2", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "cabin_2_north" }, { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_2_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Cabin_3", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "cabin_3_north" }, { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_3_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Cabin_4", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "cabin_4_north" }, { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_4_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Cabin_5", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "cabin_5_north" }, { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_5_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Cabin_6", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "cabin_6_north" }, { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_6_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Cabin_7", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "cabin_7_north" }, { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_7_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Cabin_Lapin", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "cabin_lapin_north" }, + { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_lapin_north" } + ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "occurrences": [ 0, 0 ], + "//": "Inflated chance, effective rate ~40%", + "flags": [ "WILDERNESS", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Strange Cabin", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "cabin_strange_north" }, + { "point": [ 0, 0, 1 ], "overmap": "cabin_strange_roof_north" }, + { "point": [ 0, 0, -1 ], "overmap": "cabin_strange_b_north" } + ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "FEMA Camp", + "overmaps": [ + { "point": [ 1, -1, 0 ], "overmap": "road_end_north" }, + { "point": [ 0, 0, 0 ], "overmap": "fema_north" }, + { "point": [ 1, 0, 0 ], "overmap": "fema_entrance_north" }, + { "point": [ 2, 0, 0 ], "overmap": "fema_1_3_north" }, + { "point": [ 0, 1, 0 ], "overmap": "fema_2_1_north" }, + { "point": [ 1, 1, 0 ], "overmap": "fema_2_2_north" }, + { "point": [ 2, 1, 0 ], "overmap": "fema_2_3_north" }, + { "point": [ 0, 2, 0 ], "overmap": "fema_3_1_north" }, + { "point": [ 1, 2, 0 ], "overmap": "fema_3_2_north" }, + { "point": [ 2, 2, 0 ], "overmap": "fema_3_3_north" } + ], + "connections": [ { "point": [ 1, -1, 0 ] } ], + "locations": [ "wilderness" ], + "city_distance": [ 5, 20 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "military_bunker", + "overmaps": [ + { "point": [ 0, -1, 0 ], "overmap": "road_end_north" }, + { "point": [ 0, 0, 0 ], "overmap": "bunker_south" }, + { "point": [ 0, 0, -1 ], "overmap": "bunker_basement" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "from": [ 0, 0, 0 ] } ], + "locations": [ "forest" ], + "city_distance": [ 20, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "MILITARY", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "military_bunker_1", + "overmaps": [ + { "point": [ 0, -1, 0 ], "overmap": "road_end_north" }, + { "point": [ 0, 0, 0 ], "overmap": "bunker_south" }, + { "point": [ 0, 0, -1 ], "overmap": "bunker_basement_1" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "from": [ 0, 0, 0 ] } ], + "locations": [ "forest" ], + "city_distance": [ 20, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "MILITARY", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "military_outpost", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "outpost_north" } ], + "locations": [ "wilderness" ], + "city_distance": [ 15, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "MILITARY", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "military_outpost_cross", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "outpost_cross_north" } ], + "locations": [ "wilderness" ], + "city_distance": [ 15, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "MILITARY", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Prison", + "overmaps": [ + { "point": [ 0, -1, 0 ], "overmap": "road_end_north" }, + { "point": [ -1, 0, 0 ], "overmap": "prison_1_3_north" }, + { "point": [ 0, 0, 0 ], "overmap": "prison_1_2_north" }, + { "point": [ 1, 0, 0 ], "overmap": "prison_1_1_north" }, + { "point": [ -1, 1, 0 ], "overmap": "prison_1_6_north" }, + { "point": [ 0, 1, 0 ], "overmap": "prison_1_5_north" }, + { "point": [ 1, 1, 0 ], "overmap": "prison_1_4_north" }, + { "point": [ -1, 2, 0 ], "overmap": "prison_1_9_north" }, + { "point": [ 0, 2, 0 ], "overmap": "prison_1_8_north" }, + { "point": [ 1, 2, 0 ], "overmap": "prison_1_7_north" }, + { "point": [ -1, 0, -1 ], "overmap": "prison_1_b_3_north" }, + { "point": [ 0, 0, -1 ], "overmap": "prison_1_b_2_north" }, + { "point": [ 1, 0, -1 ], "overmap": "prison_1_b_1_north" }, + { "point": [ -1, 1, -1 ], "overmap": "prison_1_b_6_north" }, + { "point": [ 0, 1, -1 ], "overmap": "prison_1_b_5_north" }, + { "point": [ 1, 1, -1 ], "overmap": "prison_1_b_4_north" }, + { "point": [ -1, 2, -1 ], "overmap": "prison_1_b_9_north" }, + { "point": [ 0, 2, -1 ], "overmap": "prison_1_b_8_north" }, + { "point": [ 1, 2, -1 ], "overmap": "prison_1_b_7_north" }, + { "point": [ -1, 0, 1 ], "overmap": "prison_1_2f_3_north" }, + { "point": [ 0, 0, 1 ], "overmap": "prison_1_2f_2_north" }, + { "point": [ 1, 0, 1 ], "overmap": "prison_1_2f_1_north" }, + { "point": [ -1, 1, 1 ], "overmap": "prison_1_2f_6_north" }, + { "point": [ 0, 1, 1 ], "overmap": "prison_1_2f_5_north" }, + { "point": [ 1, 1, 1 ], "overmap": "prison_1_2f_4_north" }, + { "point": [ -1, 2, 1 ], "overmap": "prison_1_2f_9_north" }, + { "point": [ 0, 2, 1 ], "overmap": "prison_1_2f_8_north" }, + { "point": [ 1, 2, 1 ], "overmap": "prison_1_2f_7_north" }, + { "point": [ -1, 0, 2 ], "overmap": "prison_1_3f_3_north" }, + { "point": [ 0, 0, 2 ], "overmap": "prison_1_3f_2_north" }, + { "point": [ 1, 0, 2 ], "overmap": "prison_1_3f_1_north" }, + { "point": [ -1, 1, 2 ], "overmap": "prison_1_3f_6_north" }, + { "point": [ 0, 1, 2 ], "overmap": "prison_1_3f_5_north" }, + { "point": [ 1, 1, 2 ], "overmap": "prison_1_3f_4_north" }, + { "point": [ -1, 2, 2 ], "overmap": "prison_1_3f_9_north" }, + { "point": [ 0, 2, 2 ], "overmap": "prison_1_3f_8_north" }, + { "point": [ 1, 2, 2 ], "overmap": "prison_1_3f_7_north" } + ], + "connections": [ { "point": [ 0, -1, 0 ] } ], + "locations": [ "land" ], + "city_distance": [ 5, 40 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Alcatraz Prison", + "overmaps": [ + { "point": [ -1, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ -1, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ -1, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ -1, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ -1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "prison_alcatraz_1_north" }, + { "point": [ 3, 0, 0 ], "overmap": "prison_alcatraz_2_north" }, + { "point": [ 2, 0, 0 ], "overmap": "prison_alcatraz_3_north" }, + { "point": [ 1, 0, 0 ], "overmap": "prison_alcatraz_4_north" }, + { "point": [ 0, 0, 0 ], "overmap": "prison_alcatraz_5_north" }, + { "point": [ 4, 1, 0 ], "overmap": "prison_alcatraz_6_north" }, + { "point": [ 3, 1, 0 ], "overmap": "prison_alcatraz_7_north" }, + { "point": [ 2, 1, 0 ], "overmap": "prison_alcatraz_8_north" }, + { "point": [ 1, 1, 0 ], "overmap": "prison_alcatraz_9_north" }, + { "point": [ 0, 1, 0 ], "overmap": "prison_alcatraz_10_north" }, + { "point": [ 4, 2, 0 ], "overmap": "prison_alcatraz_11_north" }, + { "point": [ 3, 2, 0 ], "overmap": "prison_alcatraz_12_north" }, + { "point": [ 2, 2, 0 ], "overmap": "prison_alcatraz_13_north" }, + { "point": [ 1, 2, 0 ], "overmap": "prison_alcatraz_14_north" }, + { "point": [ 0, 2, 0 ], "overmap": "prison_alcatraz_15_north" }, + { "point": [ 4, 0, 1 ], "overmap": "prison_alcatraz_1_2f_north" }, + { "point": [ 3, 0, 1 ], "overmap": "prison_alcatraz_2_2f_north" }, + { "point": [ 2, 0, 1 ], "overmap": "prison_alcatraz_3_2f_north" }, + { "point": [ 1, 0, 1 ], "overmap": "prison_alcatraz_4_2f_north" }, + { "point": [ 0, 0, 1 ], "overmap": "prison_alcatraz_5_2f_north" }, + { "point": [ 4, 1, 1 ], "overmap": "prison_alcatraz_6_2f_north" }, + { "point": [ 3, 1, 1 ], "overmap": "prison_alcatraz_7_2f_north" }, + { "point": [ 2, 1, 1 ], "overmap": "prison_alcatraz_8_2f_north" }, + { "point": [ 1, 1, 1 ], "overmap": "prison_alcatraz_9_2f_north" }, + { "point": [ 0, 1, 1 ], "overmap": "prison_alcatraz_10_2f_north" }, + { "point": [ 4, 2, 1 ], "overmap": "prison_alcatraz_11_2f_north" }, + { "point": [ 3, 2, 1 ], "overmap": "prison_alcatraz_12_2f_north" }, + { "point": [ 2, 2, 1 ], "overmap": "prison_alcatraz_13_2f_north" }, + { "point": [ 1, 2, 1 ], "overmap": "prison_alcatraz_14_2f_north" }, + { "point": [ 0, 2, 1 ], "overmap": "prison_alcatraz_15_2f_north" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "LAKE", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Island prison", + "overmaps": [ + { "point": [ -1, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, -1, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ -1, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ -1, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ -1, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ -1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 0, 0 ], "overmap": "prison_island_1_1_north" }, + { "point": [ 1, 0, 0 ], "overmap": "prison_island_1_2_north" }, + { "point": [ 2, 0, 0 ], "overmap": "prison_island_1_3_north" }, + { "point": [ 3, 0, 0 ], "overmap": "prison_island_1_4_north" }, + { "point": [ 4, 0, 0 ], "overmap": "prison_island_1_5_north" }, + { "point": [ 0, 1, 0 ], "overmap": "prison_island_1_6_north" }, + { "point": [ 1, 1, 0 ], "overmap": "prison_island_1_7_north" }, + { "point": [ 2, 1, 0 ], "overmap": "prison_island_1_8_north" }, + { "point": [ 3, 1, 0 ], "overmap": "prison_island_1_9_north" }, + { "point": [ 4, 1, 0 ], "overmap": "prison_island_1_10_north" }, + { "point": [ 0, 2, 0 ], "overmap": "prison_island_1_11_north" }, + { "point": [ 1, 2, 0 ], "overmap": "prison_island_1_12_north" }, + { "point": [ 2, 2, 0 ], "overmap": "prison_island_1_13_north" }, + { "point": [ 3, 2, 0 ], "overmap": "prison_island_1_14_north" }, + { "point": [ 4, 2, 0 ], "overmap": "prison_island_1_15_north" }, + { "point": [ 0, 0, 1 ], "overmap": "prison_island_1_2f_1_north" }, + { "point": [ 1, 0, 1 ], "overmap": "prison_island_1_2f_2_north" }, + { "point": [ 2, 0, 1 ], "overmap": "prison_island_1_2f_3_north" }, + { "point": [ 3, 0, 1 ], "overmap": "prison_island_1_2f_4_north" }, + { "point": [ 4, 0, 1 ], "overmap": "prison_island_1_2f_5_north" }, + { "point": [ 0, 1, 1 ], "overmap": "prison_island_1_2f_6_north" }, + { "point": [ 1, 1, 1 ], "overmap": "prison_island_1_2f_7_north" }, + { "point": [ 2, 1, 1 ], "overmap": "prison_island_1_2f_8_north" }, + { "point": [ 3, 1, 1 ], "overmap": "prison_island_1_2f_9_north" }, + { "point": [ 4, 1, 1 ], "overmap": "prison_island_1_2f_10_north" }, + { "point": [ 0, 2, 1 ], "overmap": "prison_island_1_2f_11_north" }, + { "point": [ 1, 2, 1 ], "overmap": "prison_island_1_2f_12_north" }, + { "point": [ 2, 2, 1 ], "overmap": "prison_island_1_2f_13_north" }, + { "point": [ 3, 2, 1 ], "overmap": "prison_island_1_2f_14_north" }, + { "point": [ 4, 2, 1 ], "overmap": "prison_island_1_2f_15_north" }, + { "point": [ 0, 0, -1 ], "overmap": "prison_island_1_ug_1_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 1, 0, -1 ], "overmap": "prison_island_1_ug_2_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 2, 0, -1 ], "overmap": "prison_island_1_ug_3_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 3, 0, -1 ], "overmap": "prison_island_1_ug_4_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 4, 0, -1 ], "overmap": "prison_island_1_ug_5_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 0, 1, -1 ], "overmap": "prison_island_1_ug_6_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 1, 1, -1 ], "overmap": "prison_island_1_ug_7_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 2, 1, -1 ], "overmap": "prison_island_1_ug_8_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 3, 1, -1 ], "overmap": "prison_island_1_ug_9_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 4, 1, -1 ], "overmap": "prison_island_1_ug_10_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 0, 2, -1 ], "overmap": "prison_island_1_ug_11_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 1, 2, -1 ], "overmap": "prison_island_1_ug_12_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 2, 2, -1 ], "overmap": "prison_island_1_ug_13_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 3, 2, -1 ], "overmap": "prison_island_1_ug_14_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 4, 2, -1 ], "overmap": "prison_island_1_ug_15_north", "locations": [ "lake_water_cube" ] } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "LAKE", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Toxic Waste Dump", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "toxic_dump_north" } ], + "locations": [ "land" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 8, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "Hazardous Waste Sarcophagus", + "overmaps": [ + { "point": [ 1, -1, 0 ], "overmap": "road_end_north" }, + { "point": [ 1, 0, 0 ], "overmap": "haz_sar_1_1_north" }, + { "point": [ 0, 0, 0 ], "overmap": "haz_sar_1_2_north" }, + { "point": [ 1, 1, 0 ], "overmap": "haz_sar_1_3_north" }, + { "point": [ 0, 1, 0 ], "overmap": "haz_sar_1_4_north" }, + { "point": [ 1, 0, -2 ], "overmap": "haz_sar_b_1_north" }, + { "point": [ 0, 0, -2 ], "overmap": "haz_sar_b_2_north" }, + { "point": [ 1, 1, -2 ], "overmap": "haz_sar_b_3_north" }, + { "point": [ 0, 1, -2 ], "overmap": "haz_sar_b_4_north" } + ], + "connections": [ { "point": [ 1, -1, 0 ] } ], + "locations": [ "wilderness" ], + "city_distance": [ 15, -1 ], + "city_sizes": [ 6, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "evac_center", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "refctr_NW1a_north" }, + { "point": [ 1, 0, 0 ], "overmap": "refctr_NW2a_north" }, + { "point": [ 2, 0, 0 ], "overmap": "refctr_NW3a_north" }, + { "point": [ 3, 0, 0 ], "overmap": "refctr_NW4a_north" }, + { "point": [ 4, 0, 0 ], "overmap": "refctr_NW5a_north" }, + { "point": [ 0, 1, 0 ], "overmap": "refctr_NW1b_north" }, + { "point": [ 1, 1, 0 ], "overmap": "refctr_NW2b_north" }, + { "point": [ 2, 1, 0 ], "overmap": "refctr_NW3b_north" }, + { "point": [ 3, 1, 0 ], "overmap": "refctr_NW4b_north" }, + { "point": [ 4, 1, 0 ], "overmap": "refctr_NW5b_north" }, + { "point": [ 0, 2, 0 ], "overmap": "refctr_NW1c_north" }, + { "point": [ 1, 2, 0 ], "overmap": "refctr_NW2c_north" }, + { "point": [ 2, 2, 0 ], "overmap": "refctr_NW3c_north" }, + { "point": [ 3, 2, 0 ], "overmap": "refctr_NW4c_north" }, + { "point": [ 4, 2, 0 ], "overmap": "refctr_NW5c_north" }, + { "point": [ 0, 3, 0 ], "overmap": "refctr_NW1d_north" }, + { "point": [ 1, 3, 0 ], "overmap": "refctr_NW2d_north" }, + { "point": [ 2, 3, 0 ], "overmap": "refctr_NW3d_north" }, + { "point": [ 3, 3, 0 ], "overmap": "refctr_NW4d_north" }, + { "point": [ 4, 3, 0 ], "overmap": "refctr_NW5d_north" }, + { "point": [ 0, 4, 0 ], "overmap": "refctr_NW1e_north" }, + { "point": [ 1, 4, 0 ], "overmap": "refctr_NW2e_north" }, + { "point": [ 2, 4, 0 ], "overmap": "refctr_NW3e_north" }, + { "point": [ 3, 4, 0 ], "overmap": "refctr_NW4e_north" }, + { "point": [ 4, 4, 0 ], "overmap": "refctr_NW5e_north" }, + { "point": [ 5, 0, 0 ], "overmap": "refctr_N1a_north" }, + { "point": [ 6, 0, 0 ], "overmap": "refctr_N2a_north" }, + { "point": [ 7, 0, 0 ], "overmap": "refctr_N3a_north" }, + { "point": [ 8, 0, 0 ], "overmap": "refctr_N4a_north" }, + { "point": [ 9, 0, 0 ], "overmap": "refctr_N5a_north" }, + { "point": [ 5, 1, 0 ], "overmap": "refctr_N1b_north" }, + { "point": [ 6, 1, 0 ], "overmap": "refctr_N2b_north" }, + { "point": [ 7, 1, 0 ], "overmap": "refctr_N3b_north" }, + { "point": [ 8, 1, 0 ], "overmap": "refctr_N4b_north" }, + { "point": [ 9, 1, 0 ], "overmap": "refctr_N5b_north" }, + { "point": [ 5, 2, 0 ], "overmap": "refctr_N1c_north" }, + { "point": [ 6, 2, 0 ], "overmap": "refctr_N2c_north" }, + { "point": [ 7, 2, 0 ], "overmap": "refctr_N3c_north" }, + { "point": [ 8, 2, 0 ], "overmap": "refctr_N4c_north" }, + { "point": [ 9, 2, 0 ], "overmap": "refctr_N5c_north" }, + { "point": [ 5, 3, 0 ], "overmap": "refctr_N1d_north" }, + { "point": [ 6, 3, 0 ], "overmap": "refctr_N2d_north" }, + { "point": [ 7, 3, 0 ], "overmap": "refctr_N3d_north" }, + { "point": [ 8, 3, 0 ], "overmap": "refctr_N4d_north" }, + { "point": [ 9, 3, 0 ], "overmap": "refctr_N5d_north" }, + { "point": [ 5, 4, 0 ], "overmap": "refctr_N1e_north" }, + { "point": [ 6, 4, 0 ], "overmap": "refctr_N2e_north" }, + { "point": [ 7, 4, 0 ], "overmap": "refctr_N3e_north" }, + { "point": [ 8, 4, 0 ], "overmap": "refctr_N4e_north" }, + { "point": [ 9, 4, 0 ], "overmap": "refctr_N5e_north" }, + { "point": [ 10, 0, 0 ], "overmap": "refctr_NE1a_north" }, + { "point": [ 11, 0, 0 ], "overmap": "refctr_NE2a_north" }, + { "point": [ 12, 0, 0 ], "overmap": "refctr_NE3a_north" }, + { "point": [ 13, 0, 0 ], "overmap": "refctr_NE4a_north" }, + { "point": [ 14, 0, 0 ], "overmap": "refctr_NE5a_north" }, + { "point": [ 10, 1, 0 ], "overmap": "refctr_NE1b_north" }, + { "point": [ 11, 1, 0 ], "overmap": "refctr_NE2b_north" }, + { "point": [ 12, 1, 0 ], "overmap": "refctr_NE3b_north" }, + { "point": [ 13, 1, 0 ], "overmap": "refctr_NE4b_north" }, + { "point": [ 14, 1, 0 ], "overmap": "refctr_NE5b_north" }, + { "point": [ 10, 2, 0 ], "overmap": "refctr_NE1c_north" }, + { "point": [ 11, 2, 0 ], "overmap": "refctr_NE2c_north" }, + { "point": [ 12, 2, 0 ], "overmap": "refctr_NE3c_north" }, + { "point": [ 13, 2, 0 ], "overmap": "refctr_NE4c_north" }, + { "point": [ 14, 2, 0 ], "overmap": "refctr_NE5c_north" }, + { "point": [ 10, 3, 0 ], "overmap": "refctr_NE1d_north" }, + { "point": [ 11, 3, 0 ], "overmap": "refctr_NE2d_north" }, + { "point": [ 12, 3, 0 ], "overmap": "refctr_NE3d_north" }, + { "point": [ 13, 3, 0 ], "overmap": "refctr_NE4d_north" }, + { "point": [ 14, 3, 0 ], "overmap": "refctr_NE5d_north" }, + { "point": [ 10, 4, 0 ], "overmap": "refctr_NE1e_north" }, + { "point": [ 11, 4, 0 ], "overmap": "refctr_NE2e_north" }, + { "point": [ 12, 4, 0 ], "overmap": "refctr_NE3e_north" }, + { "point": [ 13, 4, 0 ], "overmap": "refctr_NE4e_north" }, + { "point": [ 14, 4, 0 ], "overmap": "refctr_NE5e_north" }, + { "point": [ 0, 5, 0 ], "overmap": "refctr_W1a_north" }, + { "point": [ 1, 5, 0 ], "overmap": "refctr_W2a_north" }, + { "point": [ 2, 5, 0 ], "overmap": "refctr_W3a_north" }, + { "point": [ 3, 5, 0 ], "overmap": "refctr_W4a_north" }, + { "point": [ 4, 5, 0 ], "overmap": "refctr_W5a_north" }, + { "point": [ 0, 6, 0 ], "overmap": "refctr_W1b_north" }, + { "point": [ 1, 6, 0 ], "overmap": "refctr_W2b_north" }, + { "point": [ 2, 6, 0 ], "overmap": "refctr_W3b_north" }, + { "point": [ 3, 6, 0 ], "overmap": "refctr_W4b_north" }, + { "point": [ 4, 6, 0 ], "overmap": "refctr_W5b_north" }, + { "point": [ 0, 7, 0 ], "overmap": "refctr_W1c_north" }, + { "point": [ 1, 7, 0 ], "overmap": "refctr_W2c_north" }, + { "point": [ 2, 7, 0 ], "overmap": "refctr_W3c_north" }, + { "point": [ 3, 7, 0 ], "overmap": "refctr_W4c_north" }, + { "point": [ 4, 7, 0 ], "overmap": "refctr_W5c_north" }, + { "point": [ 0, 8, 0 ], "overmap": "refctr_W1d_north" }, + { "point": [ 1, 8, 0 ], "overmap": "refctr_W2d_north" }, + { "point": [ 2, 8, 0 ], "overmap": "refctr_W3d_north" }, + { "point": [ 3, 8, 0 ], "overmap": "refctr_W4d_north" }, + { "point": [ 4, 8, 0 ], "overmap": "refctr_W5d_north" }, + { "point": [ 0, 9, 0 ], "overmap": "refctr_W1e_north" }, + { "point": [ 1, 9, 0 ], "overmap": "refctr_W2e_north" }, + { "point": [ 2, 9, 0 ], "overmap": "refctr_W3e_north" }, + { "point": [ 3, 9, 0 ], "overmap": "refctr_W4e_north" }, + { "point": [ 4, 9, 0 ], "overmap": "refctr_W5e_north" }, + { "point": [ 5, 5, 0 ], "overmap": "evac_center_1_north" }, + { "point": [ 6, 5, 0 ], "overmap": "evac_center_2_north" }, + { "point": [ 7, 5, 0 ], "overmap": "evac_center_3_north" }, + { "point": [ 8, 5, 0 ], "overmap": "evac_center_4_north" }, + { "point": [ 9, 5, 0 ], "overmap": "evac_center_5_north" }, + { "point": [ 5, 6, 0 ], "overmap": "evac_center_6_north" }, + { "point": [ 6, 6, 0 ], "overmap": "evac_center_7_north" }, + { "point": [ 7, 6, 0 ], "overmap": "evac_center_8_north" }, + { "point": [ 8, 6, 0 ], "overmap": "evac_center_9_north" }, + { "point": [ 9, 6, 0 ], "overmap": "evac_center_10_north" }, + { "point": [ 5, 7, 0 ], "overmap": "evac_center_11_north" }, + { "point": [ 6, 7, 0 ], "overmap": "evac_center_12_north" }, + { "point": [ 7, 7, 0 ], "overmap": "evac_center_13_north" }, + { "point": [ 8, 7, 0 ], "overmap": "evac_center_14_north" }, + { "point": [ 9, 7, 0 ], "overmap": "evac_center_15_north" }, + { "point": [ 5, 8, 0 ], "overmap": "evac_center_16_north" }, + { "point": [ 6, 8, 0 ], "overmap": "evac_center_17_north" }, + { "point": [ 7, 8, 0 ], "overmap": "evac_center_18_north" }, + { "point": [ 8, 8, 0 ], "overmap": "evac_center_19_north" }, + { "point": [ 9, 8, 0 ], "overmap": "evac_center_20_north" }, + { "point": [ 5, 9, 0 ], "overmap": "evac_center_21_north" }, + { "point": [ 6, 9, 0 ], "overmap": "evac_center_22_north" }, + { "point": [ 7, 9, 0 ], "overmap": "evac_center_23_north" }, + { "point": [ 8, 9, 0 ], "overmap": "evac_center_24_north" }, + { "point": [ 9, 9, 0 ], "overmap": "evac_center_25_north" }, + { "point": [ 10, 5, 0 ], "overmap": "refctr_E1a_north" }, + { "point": [ 11, 5, 0 ], "overmap": "refctr_E2a_north" }, + { "point": [ 12, 5, 0 ], "overmap": "refctr_E3a_north" }, + { "point": [ 13, 5, 0 ], "overmap": "refctr_E4a_north" }, + { "point": [ 14, 5, 0 ], "overmap": "refctr_E5a_north" }, + { "point": [ 10, 6, 0 ], "overmap": "refctr_E1b_north" }, + { "point": [ 11, 6, 0 ], "overmap": "refctr_E2b_north" }, + { "point": [ 12, 6, 0 ], "overmap": "refctr_E3b_north" }, + { "point": [ 13, 6, 0 ], "overmap": "refctr_E4b_north" }, + { "point": [ 14, 6, 0 ], "overmap": "refctr_E5b_north" }, + { "point": [ 10, 7, 0 ], "overmap": "refctr_E1c_north" }, + { "point": [ 11, 7, 0 ], "overmap": "refctr_E2c_north" }, + { "point": [ 12, 7, 0 ], "overmap": "refctr_E3c_north" }, + { "point": [ 13, 7, 0 ], "overmap": "refctr_E4c_north" }, + { "point": [ 14, 7, 0 ], "overmap": "refctr_E5c_north" }, + { "point": [ 10, 8, 0 ], "overmap": "refctr_E1d_north" }, + { "point": [ 11, 8, 0 ], "overmap": "refctr_E2d_north" }, + { "point": [ 12, 8, 0 ], "overmap": "refctr_E3d_north" }, + { "point": [ 13, 8, 0 ], "overmap": "refctr_E4d_north" }, + { "point": [ 14, 8, 0 ], "overmap": "refctr_E5d_north" }, + { "point": [ 10, 9, 0 ], "overmap": "refctr_E1e_north" }, + { "point": [ 11, 9, 0 ], "overmap": "refctr_E2e_north" }, + { "point": [ 12, 9, 0 ], "overmap": "refctr_E3e_north" }, + { "point": [ 13, 9, 0 ], "overmap": "refctr_E4e_north" }, + { "point": [ 14, 9, 0 ], "overmap": "refctr_E5e_north" }, + { "point": [ 0, 10, 0 ], "overmap": "refctr_SW1a_north" }, + { "point": [ 1, 10, 0 ], "overmap": "refctr_SW2a_north" }, + { "point": [ 2, 10, 0 ], "overmap": "refctr_SW3a_north" }, + { "point": [ 3, 10, 0 ], "overmap": "refctr_SW4a_north" }, + { "point": [ 4, 10, 0 ], "overmap": "refctr_SW5a_north" }, + { "point": [ 0, 11, 0 ], "overmap": "refctr_SW1b_north" }, + { "point": [ 1, 11, 0 ], "overmap": "refctr_SW2b_north" }, + { "point": [ 2, 11, 0 ], "overmap": "refctr_SW3b_north" }, + { "point": [ 3, 11, 0 ], "overmap": "refctr_SW4b_north" }, + { "point": [ 4, 11, 0 ], "overmap": "refctr_SW5b_north" }, + { "point": [ 0, 12, 0 ], "overmap": "refctr_SW1c_north" }, + { "point": [ 1, 12, 0 ], "overmap": "refctr_SW2c_north" }, + { "point": [ 2, 12, 0 ], "overmap": "refctr_SW3c_north" }, + { "point": [ 3, 12, 0 ], "overmap": "refctr_SW4c_north" }, + { "point": [ 4, 12, 0 ], "overmap": "refctr_SW5c_north" }, + { "point": [ 0, 13, 0 ], "overmap": "refctr_SW1d_north" }, + { "point": [ 1, 13, 0 ], "overmap": "refctr_SW2d_north" }, + { "point": [ 2, 13, 0 ], "overmap": "refctr_SW3d_north" }, + { "point": [ 3, 13, 0 ], "overmap": "refctr_SW4d_north" }, + { "point": [ 4, 13, 0 ], "overmap": "refctr_SW5d_north" }, + { "point": [ 0, 14, 0 ], "overmap": "refctr_SW1e_north" }, + { "point": [ 1, 14, 0 ], "overmap": "refctr_SW2e_north" }, + { "point": [ 2, 14, 0 ], "overmap": "refctr_SW3e_north" }, + { "point": [ 3, 14, 0 ], "overmap": "refctr_SW4e_north" }, + { "point": [ 4, 14, 0 ], "overmap": "refctr_SW5e_north" }, + { "point": [ 5, 10, 0 ], "overmap": "refctr_S1a_north" }, + { "point": [ 6, 10, 0 ], "overmap": "refctr_S2a_north" }, + { "point": [ 7, 10, 0 ], "overmap": "refctr_S3a_north" }, + { "point": [ 8, 10, 0 ], "overmap": "refctr_S4a_north" }, + { "point": [ 9, 10, 0 ], "overmap": "refctr_S5a_north" }, + { "point": [ 5, 11, 0 ], "overmap": "refctr_S1b_north" }, + { "point": [ 6, 11, 0 ], "overmap": "refctr_S2b_north" }, + { "point": [ 7, 11, 0 ], "overmap": "refctr_S3b_north" }, + { "point": [ 8, 11, 0 ], "overmap": "refctr_S4b_north" }, + { "point": [ 9, 11, 0 ], "overmap": "refctr_S5b_north" }, + { "point": [ 5, 12, 0 ], "overmap": "refctr_S1c_north" }, + { "point": [ 6, 12, 0 ], "overmap": "refctr_S2c_north" }, + { "point": [ 7, 12, 0 ], "overmap": "refctr_S3c_north" }, + { "point": [ 8, 12, 0 ], "overmap": "refctr_S4c_north" }, + { "point": [ 9, 12, 0 ], "overmap": "refctr_S5c_north" }, + { "point": [ 5, 13, 0 ], "overmap": "refctr_S1d_north" }, + { "point": [ 6, 13, 0 ], "overmap": "refctr_S2d_north" }, + { "point": [ 7, 13, 0 ], "overmap": "refctr_S3d_north" }, + { "point": [ 8, 13, 0 ], "overmap": "refctr_S4d_north" }, + { "point": [ 9, 13, 0 ], "overmap": "refctr_S5d_north" }, + { "point": [ 5, 14, 0 ], "overmap": "refctr_S1e_north" }, + { "point": [ 6, 14, 0 ], "overmap": "refctr_S2e_north" }, + { "point": [ 7, 14, 0 ], "overmap": "refctr_S3e_north" }, + { "point": [ 8, 14, 0 ], "overmap": "refctr_S4e_north" }, + { "point": [ 9, 14, 0 ], "overmap": "refctr_S5e_north" }, + { "point": [ 10, 10, 0 ], "overmap": "refctr_SE1a_north" }, + { "point": [ 11, 10, 0 ], "overmap": "refctr_SE2a_north" }, + { "point": [ 12, 10, 0 ], "overmap": "refctr_SE3a_north" }, + { "point": [ 13, 10, 0 ], "overmap": "refctr_SE4a_north" }, + { "point": [ 14, 10, 0 ], "overmap": "refctr_SE5a_north" }, + { "point": [ 10, 11, 0 ], "overmap": "refctr_SE1b_north" }, + { "point": [ 11, 11, 0 ], "overmap": "refctr_SE2b_north" }, + { "point": [ 12, 11, 0 ], "overmap": "refctr_SE3b_north" }, + { "point": [ 13, 11, 0 ], "overmap": "refctr_SE4b_north" }, + { "point": [ 14, 11, 0 ], "overmap": "refctr_SE5b_north" }, + { "point": [ 10, 12, 0 ], "overmap": "refctr_SE1c_north" }, + { "point": [ 11, 12, 0 ], "overmap": "refctr_SE2c_north" }, + { "point": [ 12, 12, 0 ], "overmap": "refctr_SE3c_north" }, + { "point": [ 13, 12, 0 ], "overmap": "refctr_SE4c_north" }, + { "point": [ 14, 12, 0 ], "overmap": "refctr_SE5c_north" }, + { "point": [ 10, 13, 0 ], "overmap": "refctr_SE1d_north" }, + { "point": [ 11, 13, 0 ], "overmap": "refctr_SE2d_north" }, + { "point": [ 12, 13, 0 ], "overmap": "refctr_SE3d_north" }, + { "point": [ 13, 13, 0 ], "overmap": "refctr_SE4d_north" }, + { "point": [ 14, 13, 0 ], "overmap": "refctr_SE5d_north" }, + { "point": [ 10, 14, 0 ], "overmap": "refctr_SE1e_north" }, + { "point": [ 11, 14, 0 ], "overmap": "refctr_SE2e_north" }, + { "point": [ 12, 14, 0 ], "overmap": "refctr_SE3e_north" }, + { "point": [ 13, 14, 0 ], "overmap": "refctr_SE4e_north" }, + { "point": [ 14, 14, 0 ], "overmap": "refctr_SE5e_north" }, + { "point": [ 0, 0, 1 ], "overmap": "refctr_NW1a_z1_north" }, + { "point": [ 1, 0, 1 ], "overmap": "refctr_NW2a_z1_north" }, + { "point": [ 2, 0, 1 ], "overmap": "refctr_NW3a_z1_north" }, + { "point": [ 3, 0, 1 ], "overmap": "refctr_NW4a_z1_north" }, + { "point": [ 4, 0, 1 ], "overmap": "refctr_NW5a_z1_north" }, + { "point": [ 0, 1, 1 ], "overmap": "refctr_NW1b_z1_north" }, + { "point": [ 1, 1, 1 ], "overmap": "refctr_NW2b_z1_north" }, + { "point": [ 2, 1, 1 ], "overmap": "refctr_NW3b_z1_north" }, + { "point": [ 3, 1, 1 ], "overmap": "refctr_NW4b_z1_north" }, + { "point": [ 4, 1, 1 ], "overmap": "refctr_NW5b_z1_north" }, + { "point": [ 0, 2, 1 ], "overmap": "refctr_NW1c_z1_north" }, + { "point": [ 1, 2, 1 ], "overmap": "refctr_NW2c_z1_north" }, + { "point": [ 2, 2, 1 ], "overmap": "refctr_NW3c_z1_north" }, + { "point": [ 3, 2, 1 ], "overmap": "refctr_NW4c_z1_north" }, + { "point": [ 4, 2, 1 ], "overmap": "refctr_NW5c_z1_north" }, + { "point": [ 0, 3, 1 ], "overmap": "refctr_NW1d_z1_north" }, + { "point": [ 1, 3, 1 ], "overmap": "refctr_NW2d_z1_north" }, + { "point": [ 2, 3, 1 ], "overmap": "refctr_NW3d_z1_north" }, + { "point": [ 3, 3, 1 ], "overmap": "refctr_NW4d_z1_north" }, + { "point": [ 4, 3, 1 ], "overmap": "refctr_NW5d_z1_north" }, + { "point": [ 0, 4, 1 ], "overmap": "refctr_NW1e_z1_north" }, + { "point": [ 1, 4, 1 ], "overmap": "refctr_NW2e_z1_north" }, + { "point": [ 2, 4, 1 ], "overmap": "refctr_NW3e_z1_north" }, + { "point": [ 3, 4, 1 ], "overmap": "refctr_NW4e_z1_north" }, + { "point": [ 4, 4, 1 ], "overmap": "refctr_NW5e_z1_north" }, + { "point": [ 5, 0, 1 ], "overmap": "refctr_N1a_z1_north" }, + { "point": [ 6, 0, 1 ], "overmap": "refctr_N2a_z1_north" }, + { "point": [ 7, 0, 1 ], "overmap": "refctr_N3a_z1_north" }, + { "point": [ 8, 0, 1 ], "overmap": "refctr_N4a_z1_north" }, + { "point": [ 9, 0, 1 ], "overmap": "refctr_N5a_z1_north" }, + { "point": [ 5, 1, 1 ], "overmap": "refctr_N1b_z1_north" }, + { "point": [ 6, 1, 1 ], "overmap": "refctr_N2b_z1_north" }, + { "point": [ 7, 1, 1 ], "overmap": "refctr_N3b_z1_north" }, + { "point": [ 8, 1, 1 ], "overmap": "refctr_N4b_z1_north" }, + { "point": [ 9, 1, 1 ], "overmap": "refctr_N5b_z1_north" }, + { "point": [ 5, 2, 1 ], "overmap": "refctr_N1c_z1_north" }, + { "point": [ 6, 2, 1 ], "overmap": "refctr_N2c_z1_north" }, + { "point": [ 7, 2, 1 ], "overmap": "refctr_N3c_z1_north" }, + { "point": [ 8, 2, 1 ], "overmap": "refctr_N4c_z1_north" }, + { "point": [ 9, 2, 1 ], "overmap": "refctr_N5c_z1_north" }, + { "point": [ 5, 3, 1 ], "overmap": "refctr_N1d_z1_north" }, + { "point": [ 6, 3, 1 ], "overmap": "refctr_N2d_z1_north" }, + { "point": [ 7, 3, 1 ], "overmap": "refctr_N3d_z1_north" }, + { "point": [ 8, 3, 1 ], "overmap": "refctr_N4d_z1_north" }, + { "point": [ 9, 3, 1 ], "overmap": "refctr_N5d_z1_north" }, + { "point": [ 5, 4, 1 ], "overmap": "refctr_N1e_z1_north" }, + { "point": [ 6, 4, 1 ], "overmap": "refctr_N2e_z1_north" }, + { "point": [ 7, 4, 1 ], "overmap": "refctr_N3e_z1_north" }, + { "point": [ 8, 4, 1 ], "overmap": "refctr_N4e_z1_north" }, + { "point": [ 9, 4, 1 ], "overmap": "refctr_N5e_z1_north" }, + { "point": [ 10, 0, 1 ], "overmap": "refctr_NE1a_z1_north" }, + { "point": [ 11, 0, 1 ], "overmap": "refctr_NE2a_z1_north" }, + { "point": [ 12, 0, 1 ], "overmap": "refctr_NE3a_z1_north" }, + { "point": [ 13, 0, 1 ], "overmap": "refctr_NE4a_z1_north" }, + { "point": [ 14, 0, 1 ], "overmap": "refctr_NE5a_z1_north" }, + { "point": [ 10, 1, 1 ], "overmap": "refctr_NE1b_z1_north" }, + { "point": [ 11, 1, 1 ], "overmap": "refctr_NE2b_z1_north" }, + { "point": [ 12, 1, 1 ], "overmap": "refctr_NE3b_z1_north" }, + { "point": [ 13, 1, 1 ], "overmap": "refctr_NE4b_z1_north" }, + { "point": [ 14, 1, 1 ], "overmap": "refctr_NE5b_z1_north" }, + { "point": [ 10, 2, 1 ], "overmap": "refctr_NE1c_z1_north" }, + { "point": [ 11, 2, 1 ], "overmap": "refctr_NE2c_z1_north" }, + { "point": [ 12, 2, 1 ], "overmap": "refctr_NE3c_z1_north" }, + { "point": [ 13, 2, 1 ], "overmap": "refctr_NE4c_z1_north" }, + { "point": [ 14, 2, 1 ], "overmap": "refctr_NE5c_z1_north" }, + { "point": [ 10, 3, 1 ], "overmap": "refctr_NE1d_z1_north" }, + { "point": [ 11, 3, 1 ], "overmap": "refctr_NE2d_z1_north" }, + { "point": [ 12, 3, 1 ], "overmap": "refctr_NE3d_z1_north" }, + { "point": [ 13, 3, 1 ], "overmap": "refctr_NE4d_z1_north" }, + { "point": [ 14, 3, 1 ], "overmap": "refctr_NE5d_z1_north" }, + { "point": [ 10, 4, 1 ], "overmap": "refctr_NE1e_z1_north" }, + { "point": [ 11, 4, 1 ], "overmap": "refctr_NE2e_z1_north" }, + { "point": [ 12, 4, 1 ], "overmap": "refctr_NE3e_z1_north" }, + { "point": [ 13, 4, 1 ], "overmap": "refctr_NE4e_z1_north" }, + { "point": [ 14, 4, 1 ], "overmap": "refctr_NE5e_z1_north" }, + { "point": [ 0, 5, 1 ], "overmap": "refctr_W1a_z1_north" }, + { "point": [ 1, 5, 1 ], "overmap": "refctr_W2a_z1_north" }, + { "point": [ 2, 5, 1 ], "overmap": "refctr_W3a_z1_north" }, + { "point": [ 3, 5, 1 ], "overmap": "refctr_W4a_z1_north" }, + { "point": [ 4, 5, 1 ], "overmap": "refctr_W5a_z1_north" }, + { "point": [ 0, 6, 1 ], "overmap": "refctr_W1b_z1_north" }, + { "point": [ 1, 6, 1 ], "overmap": "refctr_W2b_z1_north" }, + { "point": [ 2, 6, 1 ], "overmap": "refctr_W3b_z1_north" }, + { "point": [ 3, 6, 1 ], "overmap": "refctr_W4b_z1_north" }, + { "point": [ 4, 6, 1 ], "overmap": "refctr_W5b_z1_north" }, + { "point": [ 0, 7, 1 ], "overmap": "refctr_W1c_z1_north" }, + { "point": [ 1, 7, 1 ], "overmap": "refctr_W2c_z1_north" }, + { "point": [ 2, 7, 1 ], "overmap": "refctr_W3c_z1_north" }, + { "point": [ 3, 7, 1 ], "overmap": "refctr_W4c_z1_north" }, + { "point": [ 4, 7, 1 ], "overmap": "refctr_W5c_z1_north" }, + { "point": [ 0, 8, 1 ], "overmap": "refctr_W1d_z1_north" }, + { "point": [ 1, 8, 1 ], "overmap": "refctr_W2d_z1_north" }, + { "point": [ 2, 8, 1 ], "overmap": "refctr_W3d_z1_north" }, + { "point": [ 3, 8, 1 ], "overmap": "refctr_W4d_z1_north" }, + { "point": [ 4, 8, 1 ], "overmap": "refctr_W5d_z1_north" }, + { "point": [ 0, 9, 1 ], "overmap": "refctr_W1e_z1_north" }, + { "point": [ 1, 9, 1 ], "overmap": "refctr_W2e_z1_north" }, + { "point": [ 2, 9, 1 ], "overmap": "refctr_W3e_z1_north" }, + { "point": [ 3, 9, 1 ], "overmap": "refctr_W4e_z1_north" }, + { "point": [ 4, 9, 1 ], "overmap": "refctr_W5e_z1_north" }, + { "point": [ 5, 5, 1 ], "overmap": "evac_center_1_z1_north" }, + { "point": [ 6, 5, 1 ], "overmap": "evac_center_2_z1_north" }, + { "point": [ 7, 5, 1 ], "overmap": "evac_center_3_z1_north" }, + { "point": [ 8, 5, 1 ], "overmap": "evac_center_4_z1_north" }, + { "point": [ 9, 5, 1 ], "overmap": "evac_center_5_z1_north" }, + { "point": [ 5, 6, 1 ], "overmap": "evac_center_6_z1_north" }, + { "point": [ 6, 6, 1 ], "overmap": "evac_center_7_z1_north" }, + { "point": [ 7, 6, 1 ], "overmap": "evac_center_8_z1_north" }, + { "point": [ 8, 6, 1 ], "overmap": "evac_center_9_z1_north" }, + { "point": [ 9, 6, 1 ], "overmap": "evac_center_10_z1_north" }, + { "point": [ 5, 7, 1 ], "overmap": "evac_center_11_z1_north" }, + { "point": [ 6, 7, 1 ], "overmap": "evac_center_12_z1_north" }, + { "point": [ 7, 7, 1 ], "overmap": "evac_center_13_z1_north" }, + { "point": [ 8, 7, 1 ], "overmap": "evac_center_14_z1_north" }, + { "point": [ 9, 7, 1 ], "overmap": "evac_center_15_z1_north" }, + { "point": [ 5, 8, 1 ], "overmap": "evac_center_16_z1_north" }, + { "point": [ 6, 8, 1 ], "overmap": "evac_center_17_z1_north" }, + { "point": [ 7, 8, 1 ], "overmap": "evac_center_18_z1_north" }, + { "point": [ 8, 8, 1 ], "overmap": "evac_center_19_z1_north" }, + { "point": [ 9, 8, 1 ], "overmap": "evac_center_20_z1_north" }, + { "point": [ 5, 9, 1 ], "overmap": "evac_center_21_z1_north" }, + { "point": [ 6, 9, 1 ], "overmap": "evac_center_22_z1_north" }, + { "point": [ 7, 9, 1 ], "overmap": "evac_center_23_z1_north" }, + { "point": [ 8, 9, 1 ], "overmap": "evac_center_24_z1_north" }, + { "point": [ 9, 9, 1 ], "overmap": "evac_center_25_z1_north" }, + { "point": [ 10, 5, 1 ], "overmap": "refctr_E1a_z1_north" }, + { "point": [ 11, 5, 1 ], "overmap": "refctr_E2a_z1_north" }, + { "point": [ 12, 5, 1 ], "overmap": "refctr_E3a_z1_north" }, + { "point": [ 13, 5, 1 ], "overmap": "refctr_E4a_z1_north" }, + { "point": [ 14, 5, 1 ], "overmap": "refctr_E5a_z1_north" }, + { "point": [ 10, 6, 1 ], "overmap": "refctr_E1b_z1_north" }, + { "point": [ 11, 6, 1 ], "overmap": "refctr_E2b_z1_north" }, + { "point": [ 12, 6, 1 ], "overmap": "refctr_E3b_z1_north" }, + { "point": [ 13, 6, 1 ], "overmap": "refctr_E4b_z1_north" }, + { "point": [ 14, 6, 1 ], "overmap": "refctr_E5b_z1_north" }, + { "point": [ 10, 7, 1 ], "overmap": "refctr_E1c_z1_north" }, + { "point": [ 11, 7, 1 ], "overmap": "refctr_E2c_z1_north" }, + { "point": [ 12, 7, 1 ], "overmap": "refctr_E3c_z1_north" }, + { "point": [ 13, 7, 1 ], "overmap": "refctr_E4c_z1_north" }, + { "point": [ 14, 7, 1 ], "overmap": "refctr_E5c_z1_north" }, + { "point": [ 10, 8, 1 ], "overmap": "refctr_E1d_z1_north" }, + { "point": [ 11, 8, 1 ], "overmap": "refctr_E2d_z1_north" }, + { "point": [ 12, 8, 1 ], "overmap": "refctr_E3d_z1_north" }, + { "point": [ 13, 8, 1 ], "overmap": "refctr_E4d_z1_north" }, + { "point": [ 14, 8, 1 ], "overmap": "refctr_E5d_z1_north" }, + { "point": [ 10, 9, 1 ], "overmap": "refctr_E1e_z1_north" }, + { "point": [ 11, 9, 1 ], "overmap": "refctr_E2e_z1_north" }, + { "point": [ 12, 9, 1 ], "overmap": "refctr_E3e_z1_north" }, + { "point": [ 13, 9, 1 ], "overmap": "refctr_E4e_z1_north" }, + { "point": [ 14, 9, 1 ], "overmap": "refctr_E5e_z1_north" }, + { "point": [ 0, 10, 1 ], "overmap": "refctr_SW1a_z1_north" }, + { "point": [ 1, 10, 1 ], "overmap": "refctr_SW2a_z1_north" }, + { "point": [ 2, 10, 1 ], "overmap": "refctr_SW3a_z1_north" }, + { "point": [ 3, 10, 1 ], "overmap": "refctr_SW4a_z1_north" }, + { "point": [ 4, 10, 1 ], "overmap": "refctr_SW5a_z1_north" }, + { "point": [ 0, 11, 1 ], "overmap": "refctr_SW1b_z1_north" }, + { "point": [ 1, 11, 1 ], "overmap": "refctr_SW2b_z1_north" }, + { "point": [ 2, 11, 1 ], "overmap": "refctr_SW3b_z1_north" }, + { "point": [ 3, 11, 1 ], "overmap": "refctr_SW4b_z1_north" }, + { "point": [ 4, 11, 1 ], "overmap": "refctr_SW5b_z1_north" }, + { "point": [ 0, 12, 1 ], "overmap": "refctr_SW1c_z1_north" }, + { "point": [ 1, 12, 1 ], "overmap": "refctr_SW2c_z1_north" }, + { "point": [ 2, 12, 1 ], "overmap": "refctr_SW3c_z1_north" }, + { "point": [ 3, 12, 1 ], "overmap": "refctr_SW4c_z1_north" }, + { "point": [ 4, 12, 1 ], "overmap": "refctr_SW5c_z1_north" }, + { "point": [ 0, 13, 1 ], "overmap": "refctr_SW1d_z1_north" }, + { "point": [ 1, 13, 1 ], "overmap": "refctr_SW2d_z1_north" }, + { "point": [ 2, 13, 1 ], "overmap": "refctr_SW3d_z1_north" }, + { "point": [ 3, 13, 1 ], "overmap": "refctr_SW4d_z1_north" }, + { "point": [ 4, 13, 1 ], "overmap": "refctr_SW5d_z1_north" }, + { "point": [ 0, 14, 1 ], "overmap": "refctr_SW1e_z1_north" }, + { "point": [ 1, 14, 1 ], "overmap": "refctr_SW2e_z1_north" }, + { "point": [ 2, 14, 1 ], "overmap": "refctr_SW3e_z1_north" }, + { "point": [ 3, 14, 1 ], "overmap": "refctr_SW4e_z1_north" }, + { "point": [ 4, 14, 1 ], "overmap": "refctr_SW5e_z1_north" }, + { "point": [ 5, 10, 1 ], "overmap": "refctr_S1a_z1_north" }, + { "point": [ 6, 10, 1 ], "overmap": "refctr_S2a_z1_north" }, + { "point": [ 7, 10, 1 ], "overmap": "refctr_S3a_z1_north" }, + { "point": [ 8, 10, 1 ], "overmap": "refctr_S4a_z1_north" }, + { "point": [ 9, 10, 1 ], "overmap": "refctr_S5a_z1_north" }, + { "point": [ 5, 11, 1 ], "overmap": "refctr_S1b_z1_north" }, + { "point": [ 6, 11, 1 ], "overmap": "refctr_S2b_z1_north" }, + { "point": [ 7, 11, 1 ], "overmap": "refctr_S3b_z1_north" }, + { "point": [ 8, 11, 1 ], "overmap": "refctr_S4b_z1_north" }, + { "point": [ 9, 11, 1 ], "overmap": "refctr_S5b_z1_north" }, + { "point": [ 5, 12, 1 ], "overmap": "refctr_S1c_z1_north" }, + { "point": [ 6, 12, 1 ], "overmap": "refctr_S2c_z1_north" }, + { "point": [ 7, 12, 1 ], "overmap": "refctr_S3c_z1_north" }, + { "point": [ 8, 12, 1 ], "overmap": "refctr_S4c_z1_north" }, + { "point": [ 9, 12, 1 ], "overmap": "refctr_S5c_z1_north" }, + { "point": [ 5, 13, 1 ], "overmap": "refctr_S1d_z1_north" }, + { "point": [ 6, 13, 1 ], "overmap": "refctr_S2d_z1_north" }, + { "point": [ 7, 13, 1 ], "overmap": "refctr_S3d_z1_north" }, + { "point": [ 8, 13, 1 ], "overmap": "refctr_S4d_z1_north" }, + { "point": [ 9, 13, 1 ], "overmap": "refctr_S5d_z1_north" }, + { "point": [ 5, 14, 1 ], "overmap": "refctr_S1e_z1_north" }, + { "point": [ 6, 14, 1 ], "overmap": "refctr_S2e_z1_north" }, + { "point": [ 7, 14, 1 ], "overmap": "refctr_S3e_z1_north" }, + { "point": [ 8, 14, 1 ], "overmap": "refctr_S4e_z1_north" }, + { "point": [ 9, 14, 1 ], "overmap": "refctr_S5e_z1_north" }, + { "point": [ 10, 10, 1 ], "overmap": "refctr_SE1a_z1_north" }, + { "point": [ 11, 10, 1 ], "overmap": "refctr_SE2a_z1_north" }, + { "point": [ 12, 10, 1 ], "overmap": "refctr_SE3a_z1_north" }, + { "point": [ 13, 10, 1 ], "overmap": "refctr_SE4a_z1_north" }, + { "point": [ 14, 10, 1 ], "overmap": "refctr_SE5a_z1_north" }, + { "point": [ 10, 11, 1 ], "overmap": "refctr_SE1b_z1_north" }, + { "point": [ 11, 11, 1 ], "overmap": "refctr_SE2b_z1_north" }, + { "point": [ 12, 11, 1 ], "overmap": "refctr_SE3b_z1_north" }, + { "point": [ 13, 11, 1 ], "overmap": "refctr_SE4b_z1_north" }, + { "point": [ 14, 11, 1 ], "overmap": "refctr_SE5b_z1_north" }, + { "point": [ 10, 12, 1 ], "overmap": "refctr_SE1c_z1_north" }, + { "point": [ 11, 12, 1 ], "overmap": "refctr_SE2c_z1_north" }, + { "point": [ 12, 12, 1 ], "overmap": "refctr_SE3c_z1_north" }, + { "point": [ 13, 12, 1 ], "overmap": "refctr_SE4c_z1_north" }, + { "point": [ 14, 12, 1 ], "overmap": "refctr_SE5c_z1_north" }, + { "point": [ 10, 13, 1 ], "overmap": "refctr_SE1d_z1_north" }, + { "point": [ 11, 13, 1 ], "overmap": "refctr_SE2d_z1_north" }, + { "point": [ 12, 13, 1 ], "overmap": "refctr_SE3d_z1_north" }, + { "point": [ 13, 13, 1 ], "overmap": "refctr_SE4d_z1_north" }, + { "point": [ 14, 13, 1 ], "overmap": "refctr_SE5d_z1_north" }, + { "point": [ 10, 14, 1 ], "overmap": "refctr_SE1e_z1_north" }, + { "point": [ 11, 14, 1 ], "overmap": "refctr_SE2e_z1_north" }, + { "point": [ 12, 14, 1 ], "overmap": "refctr_SE3e_z1_north" }, + { "point": [ 13, 14, 1 ], "overmap": "refctr_SE4e_z1_north" }, + { "point": [ 14, 14, 1 ], "overmap": "refctr_SE5e_z1_north" }, + { "point": [ 0, 0, 2 ], "overmap": "refctr_NW1a_z2_north" }, + { "point": [ 1, 0, 2 ], "overmap": "refctr_NW2a_z2_north" }, + { "point": [ 2, 0, 2 ], "overmap": "refctr_NW3a_z2_north" }, + { "point": [ 3, 0, 2 ], "overmap": "refctr_NW4a_z2_north" }, + { "point": [ 4, 0, 2 ], "overmap": "refctr_NW5a_z2_north" }, + { "point": [ 0, 1, 2 ], "overmap": "refctr_NW1b_z2_north" }, + { "point": [ 1, 1, 2 ], "overmap": "refctr_NW2b_z2_north" }, + { "point": [ 2, 1, 2 ], "overmap": "refctr_NW3b_z2_north" }, + { "point": [ 3, 1, 2 ], "overmap": "refctr_NW4b_z2_north" }, + { "point": [ 4, 1, 2 ], "overmap": "refctr_NW5b_z2_north" }, + { "point": [ 0, 2, 2 ], "overmap": "refctr_NW1c_z2_north" }, + { "point": [ 1, 2, 2 ], "overmap": "refctr_NW2c_z2_north" }, + { "point": [ 2, 2, 2 ], "overmap": "refctr_NW3c_z2_north" }, + { "point": [ 3, 2, 2 ], "overmap": "refctr_NW4c_z2_north" }, + { "point": [ 4, 2, 2 ], "overmap": "refctr_NW5c_z2_north" }, + { "point": [ 0, 3, 2 ], "overmap": "refctr_NW1d_z2_north" }, + { "point": [ 1, 3, 2 ], "overmap": "refctr_NW2d_z2_north" }, + { "point": [ 2, 3, 2 ], "overmap": "refctr_NW3d_z2_north" }, + { "point": [ 3, 3, 2 ], "overmap": "refctr_NW4d_z2_north" }, + { "point": [ 4, 3, 2 ], "overmap": "refctr_NW5d_z2_north" }, + { "point": [ 0, 4, 2 ], "overmap": "refctr_NW1e_z2_north" }, + { "point": [ 1, 4, 2 ], "overmap": "refctr_NW2e_z2_north" }, + { "point": [ 2, 4, 2 ], "overmap": "refctr_NW3e_z2_north" }, + { "point": [ 3, 4, 2 ], "overmap": "refctr_NW4e_z2_north" }, + { "point": [ 4, 4, 2 ], "overmap": "refctr_NW5e_z2_north" }, + { "point": [ 5, 0, 2 ], "overmap": "refctr_N1a_z2_north" }, + { "point": [ 6, 0, 2 ], "overmap": "refctr_N2a_z2_north" }, + { "point": [ 7, 0, 2 ], "overmap": "refctr_N3a_z2_north" }, + { "point": [ 8, 0, 2 ], "overmap": "refctr_N4a_z2_north" }, + { "point": [ 9, 0, 2 ], "overmap": "refctr_N5a_z2_north" }, + { "point": [ 5, 1, 2 ], "overmap": "refctr_N1b_z2_north" }, + { "point": [ 6, 1, 2 ], "overmap": "refctr_N2b_z2_north" }, + { "point": [ 7, 1, 2 ], "overmap": "refctr_N3b_z2_north" }, + { "point": [ 8, 1, 2 ], "overmap": "refctr_N4b_z2_north" }, + { "point": [ 9, 1, 2 ], "overmap": "refctr_N5b_z2_north" }, + { "point": [ 5, 2, 2 ], "overmap": "refctr_N1c_z2_north" }, + { "point": [ 6, 2, 2 ], "overmap": "refctr_N2c_z2_north" }, + { "point": [ 7, 2, 2 ], "overmap": "refctr_N3c_z2_north" }, + { "point": [ 8, 2, 2 ], "overmap": "refctr_N4c_z2_north" }, + { "point": [ 9, 2, 2 ], "overmap": "refctr_N5c_z2_north" }, + { "point": [ 5, 3, 2 ], "overmap": "refctr_N1d_z2_north" }, + { "point": [ 6, 3, 2 ], "overmap": "refctr_N2d_z2_north" }, + { "point": [ 7, 3, 2 ], "overmap": "refctr_N3d_z2_north" }, + { "point": [ 8, 3, 2 ], "overmap": "refctr_N4d_z2_north" }, + { "point": [ 9, 3, 2 ], "overmap": "refctr_N5d_z2_north" }, + { "point": [ 5, 4, 2 ], "overmap": "refctr_N1e_z2_north" }, + { "point": [ 6, 4, 2 ], "overmap": "refctr_N2e_z2_north" }, + { "point": [ 7, 4, 2 ], "overmap": "refctr_N3e_z2_north" }, + { "point": [ 8, 4, 2 ], "overmap": "refctr_N4e_z2_north" }, + { "point": [ 9, 4, 2 ], "overmap": "refctr_N5e_z2_north" }, + { "point": [ 10, 0, 2 ], "overmap": "refctr_NE1a_z2_north" }, + { "point": [ 11, 0, 2 ], "overmap": "refctr_NE2a_z2_north" }, + { "point": [ 12, 0, 2 ], "overmap": "refctr_NE3a_z2_north" }, + { "point": [ 13, 0, 2 ], "overmap": "refctr_NE4a_z2_north" }, + { "point": [ 14, 0, 2 ], "overmap": "refctr_NE5a_z2_north" }, + { "point": [ 10, 1, 2 ], "overmap": "refctr_NE1b_z2_north" }, + { "point": [ 11, 1, 2 ], "overmap": "refctr_NE2b_z2_north" }, + { "point": [ 12, 1, 2 ], "overmap": "refctr_NE3b_z2_north" }, + { "point": [ 13, 1, 2 ], "overmap": "refctr_NE4b_z2_north" }, + { "point": [ 14, 1, 2 ], "overmap": "refctr_NE5b_z2_north" }, + { "point": [ 10, 2, 2 ], "overmap": "refctr_NE1c_z2_north" }, + { "point": [ 11, 2, 2 ], "overmap": "refctr_NE2c_z2_north" }, + { "point": [ 12, 2, 2 ], "overmap": "refctr_NE3c_z2_north" }, + { "point": [ 13, 2, 2 ], "overmap": "refctr_NE4c_z2_north" }, + { "point": [ 14, 2, 2 ], "overmap": "refctr_NE5c_z2_north" }, + { "point": [ 10, 3, 2 ], "overmap": "refctr_NE1d_z2_north" }, + { "point": [ 11, 3, 2 ], "overmap": "refctr_NE2d_z2_north" }, + { "point": [ 12, 3, 2 ], "overmap": "refctr_NE3d_z2_north" }, + { "point": [ 13, 3, 2 ], "overmap": "refctr_NE4d_z2_north" }, + { "point": [ 14, 3, 2 ], "overmap": "refctr_NE5d_z2_north" }, + { "point": [ 10, 4, 2 ], "overmap": "refctr_NE1e_z2_north" }, + { "point": [ 11, 4, 2 ], "overmap": "refctr_NE2e_z2_north" }, + { "point": [ 12, 4, 2 ], "overmap": "refctr_NE3e_z2_north" }, + { "point": [ 13, 4, 2 ], "overmap": "refctr_NE4e_z2_north" }, + { "point": [ 14, 4, 2 ], "overmap": "refctr_NE5e_z2_north" }, + { "point": [ 0, 5, 2 ], "overmap": "refctr_W1a_z2_north" }, + { "point": [ 1, 5, 2 ], "overmap": "refctr_W2a_z2_north" }, + { "point": [ 2, 5, 2 ], "overmap": "refctr_W3a_z2_north" }, + { "point": [ 3, 5, 2 ], "overmap": "refctr_W4a_z2_north" }, + { "point": [ 4, 5, 2 ], "overmap": "refctr_W5a_z2_north" }, + { "point": [ 0, 6, 2 ], "overmap": "refctr_W1b_z2_north" }, + { "point": [ 1, 6, 2 ], "overmap": "refctr_W2b_z2_north" }, + { "point": [ 2, 6, 2 ], "overmap": "refctr_W3b_z2_north" }, + { "point": [ 3, 6, 2 ], "overmap": "refctr_W4b_z2_north" }, + { "point": [ 4, 6, 2 ], "overmap": "refctr_W5b_z2_north" }, + { "point": [ 0, 7, 2 ], "overmap": "refctr_W1c_z2_north" }, + { "point": [ 1, 7, 2 ], "overmap": "refctr_W2c_z2_north" }, + { "point": [ 2, 7, 2 ], "overmap": "refctr_W3c_z2_north" }, + { "point": [ 3, 7, 2 ], "overmap": "refctr_W4c_z2_north" }, + { "point": [ 4, 7, 2 ], "overmap": "refctr_W5c_z2_north" }, + { "point": [ 0, 8, 2 ], "overmap": "refctr_W1d_z2_north" }, + { "point": [ 1, 8, 2 ], "overmap": "refctr_W2d_z2_north" }, + { "point": [ 2, 8, 2 ], "overmap": "refctr_W3d_z2_north" }, + { "point": [ 3, 8, 2 ], "overmap": "refctr_W4d_z2_north" }, + { "point": [ 4, 8, 2 ], "overmap": "refctr_W5d_z2_north" }, + { "point": [ 0, 9, 2 ], "overmap": "refctr_W1e_z2_north" }, + { "point": [ 1, 9, 2 ], "overmap": "refctr_W2e_z2_north" }, + { "point": [ 2, 9, 2 ], "overmap": "refctr_W3e_z2_north" }, + { "point": [ 3, 9, 2 ], "overmap": "refctr_W4e_z2_north" }, + { "point": [ 4, 9, 2 ], "overmap": "refctr_W5e_z2_north" }, + { "point": [ 5, 5, 2 ], "overmap": "evac_center_1_z2_north" }, + { "point": [ 6, 5, 2 ], "overmap": "evac_center_2_z2_north" }, + { "point": [ 7, 5, 2 ], "overmap": "evac_center_3_z2_north" }, + { "point": [ 8, 5, 2 ], "overmap": "evac_center_4_z2_north" }, + { "point": [ 9, 5, 2 ], "overmap": "evac_center_5_z2_north" }, + { "point": [ 5, 6, 2 ], "overmap": "evac_center_6_z2_north" }, + { "point": [ 6, 6, 2 ], "overmap": "evac_center_7_z2_north" }, + { "point": [ 7, 6, 2 ], "overmap": "evac_center_8_z2_north" }, + { "point": [ 8, 6, 2 ], "overmap": "evac_center_9_z2_north" }, + { "point": [ 9, 6, 2 ], "overmap": "evac_center_10_z2_north" }, + { "point": [ 5, 7, 2 ], "overmap": "evac_center_11_z2_north" }, + { "point": [ 6, 7, 2 ], "overmap": "evac_center_12_z2_north" }, + { "point": [ 7, 7, 2 ], "overmap": "evac_center_13_z2_north" }, + { "point": [ 8, 7, 2 ], "overmap": "evac_center_14_z2_north" }, + { "point": [ 9, 7, 2 ], "overmap": "evac_center_15_z2_north" }, + { "point": [ 5, 8, 2 ], "overmap": "evac_center_16_z2_north" }, + { "point": [ 6, 8, 2 ], "overmap": "evac_center_17_z2_north" }, + { "point": [ 7, 8, 2 ], "overmap": "evac_center_18_z2_north" }, + { "point": [ 8, 8, 2 ], "overmap": "evac_center_19_z2_north" }, + { "point": [ 9, 8, 2 ], "overmap": "evac_center_20_z2_north" }, + { "point": [ 5, 9, 2 ], "overmap": "evac_center_21_z2_north" }, + { "point": [ 6, 9, 2 ], "overmap": "evac_center_22_z2_north" }, + { "point": [ 7, 9, 2 ], "overmap": "evac_center_23_z2_north" }, + { "point": [ 8, 9, 2 ], "overmap": "evac_center_24_z2_north" }, + { "point": [ 9, 9, 2 ], "overmap": "evac_center_25_z2_north" }, + { "point": [ 10, 5, 2 ], "overmap": "refctr_E1a_z2_north" }, + { "point": [ 11, 5, 2 ], "overmap": "refctr_E2a_z2_north" }, + { "point": [ 12, 5, 2 ], "overmap": "refctr_E3a_z2_north" }, + { "point": [ 13, 5, 2 ], "overmap": "refctr_E4a_z2_north" }, + { "point": [ 14, 5, 2 ], "overmap": "refctr_E5a_z2_north" }, + { "point": [ 10, 6, 2 ], "overmap": "refctr_E1b_z2_north" }, + { "point": [ 11, 6, 2 ], "overmap": "refctr_E2b_z2_north" }, + { "point": [ 12, 6, 2 ], "overmap": "refctr_E3b_z2_north" }, + { "point": [ 13, 6, 2 ], "overmap": "refctr_E4b_z2_north" }, + { "point": [ 14, 6, 2 ], "overmap": "refctr_E5b_z2_north" }, + { "point": [ 10, 7, 2 ], "overmap": "refctr_E1c_z2_north" }, + { "point": [ 11, 7, 2 ], "overmap": "refctr_E2c_z2_north" }, + { "point": [ 12, 7, 2 ], "overmap": "refctr_E3c_z2_north" }, + { "point": [ 13, 7, 2 ], "overmap": "refctr_E4c_z2_north" }, + { "point": [ 14, 7, 2 ], "overmap": "refctr_E5c_z2_north" }, + { "point": [ 10, 8, 2 ], "overmap": "refctr_E1d_z2_north" }, + { "point": [ 11, 8, 2 ], "overmap": "refctr_E2d_z2_north" }, + { "point": [ 12, 8, 2 ], "overmap": "refctr_E3d_z2_north" }, + { "point": [ 13, 8, 2 ], "overmap": "refctr_E4d_z2_north" }, + { "point": [ 14, 8, 2 ], "overmap": "refctr_E5d_z2_north" }, + { "point": [ 10, 9, 2 ], "overmap": "refctr_E1e_z2_north" }, + { "point": [ 11, 9, 2 ], "overmap": "refctr_E2e_z2_north" }, + { "point": [ 12, 9, 2 ], "overmap": "refctr_E3e_z2_north" }, + { "point": [ 13, 9, 2 ], "overmap": "refctr_E4e_z2_north" }, + { "point": [ 14, 9, 2 ], "overmap": "refctr_E5e_z2_north" }, + { "point": [ 0, 10, 2 ], "overmap": "refctr_SW1a_z2_north" }, + { "point": [ 1, 10, 2 ], "overmap": "refctr_SW2a_z2_north" }, + { "point": [ 2, 10, 2 ], "overmap": "refctr_SW3a_z2_north" }, + { "point": [ 3, 10, 2 ], "overmap": "refctr_SW4a_z2_north" }, + { "point": [ 4, 10, 2 ], "overmap": "refctr_SW5a_z2_north" }, + { "point": [ 0, 11, 2 ], "overmap": "refctr_SW1b_z2_north" }, + { "point": [ 1, 11, 2 ], "overmap": "refctr_SW2b_z2_north" }, + { "point": [ 2, 11, 2 ], "overmap": "refctr_SW3b_z2_north" }, + { "point": [ 3, 11, 2 ], "overmap": "refctr_SW4b_z2_north" }, + { "point": [ 4, 11, 2 ], "overmap": "refctr_SW5b_z2_north" }, + { "point": [ 0, 12, 2 ], "overmap": "refctr_SW1c_z2_north" }, + { "point": [ 1, 12, 2 ], "overmap": "refctr_SW2c_z2_north" }, + { "point": [ 2, 12, 2 ], "overmap": "refctr_SW3c_z2_north" }, + { "point": [ 3, 12, 2 ], "overmap": "refctr_SW4c_z2_north" }, + { "point": [ 4, 12, 2 ], "overmap": "refctr_SW5c_z2_north" }, + { "point": [ 0, 13, 2 ], "overmap": "refctr_SW1d_z2_north" }, + { "point": [ 1, 13, 2 ], "overmap": "refctr_SW2d_z2_north" }, + { "point": [ 2, 13, 2 ], "overmap": "refctr_SW3d_z2_north" }, + { "point": [ 3, 13, 2 ], "overmap": "refctr_SW4d_z2_north" }, + { "point": [ 4, 13, 2 ], "overmap": "refctr_SW5d_z2_north" }, + { "point": [ 0, 14, 2 ], "overmap": "refctr_SW1e_z2_north" }, + { "point": [ 1, 14, 2 ], "overmap": "refctr_SW2e_z2_north" }, + { "point": [ 2, 14, 2 ], "overmap": "refctr_SW3e_z2_north" }, + { "point": [ 3, 14, 2 ], "overmap": "refctr_SW4e_z2_north" }, + { "point": [ 4, 14, 2 ], "overmap": "refctr_SW5e_z2_north" }, + { "point": [ 5, 10, 2 ], "overmap": "refctr_S1a_z2_north" }, + { "point": [ 6, 10, 2 ], "overmap": "refctr_S2a_z2_north" }, + { "point": [ 7, 10, 2 ], "overmap": "refctr_S3a_z2_north" }, + { "point": [ 8, 10, 2 ], "overmap": "refctr_S4a_z2_north" }, + { "point": [ 9, 10, 2 ], "overmap": "refctr_S5a_z2_north" }, + { "point": [ 5, 11, 2 ], "overmap": "refctr_S1b_z2_north" }, + { "point": [ 6, 11, 2 ], "overmap": "refctr_S2b_z2_north" }, + { "point": [ 7, 11, 2 ], "overmap": "refctr_S3b_z2_north" }, + { "point": [ 8, 11, 2 ], "overmap": "refctr_S4b_z2_north" }, + { "point": [ 9, 11, 2 ], "overmap": "refctr_S5b_z2_north" }, + { "point": [ 5, 12, 2 ], "overmap": "refctr_S1c_z2_north" }, + { "point": [ 6, 12, 2 ], "overmap": "refctr_S2c_z2_north" }, + { "point": [ 7, 12, 2 ], "overmap": "refctr_S3c_z2_north" }, + { "point": [ 8, 12, 2 ], "overmap": "refctr_S4c_z2_north" }, + { "point": [ 9, 12, 2 ], "overmap": "refctr_S5c_z2_north" }, + { "point": [ 5, 13, 2 ], "overmap": "refctr_S1d_z2_north" }, + { "point": [ 6, 13, 2 ], "overmap": "refctr_S2d_z2_north" }, + { "point": [ 7, 13, 2 ], "overmap": "refctr_S3d_z2_north" }, + { "point": [ 8, 13, 2 ], "overmap": "refctr_S4d_z2_north" }, + { "point": [ 9, 13, 2 ], "overmap": "refctr_S5d_z2_north" }, + { "point": [ 5, 14, 2 ], "overmap": "refctr_S1e_z2_north" }, + { "point": [ 6, 14, 2 ], "overmap": "refctr_S2e_z2_north" }, + { "point": [ 7, 14, 2 ], "overmap": "refctr_S3e_z2_north" }, + { "point": [ 8, 14, 2 ], "overmap": "refctr_S4e_z2_north" }, + { "point": [ 9, 14, 2 ], "overmap": "refctr_S5e_z2_north" }, + { "point": [ 10, 10, 2 ], "overmap": "refctr_SE1a_z2_north" }, + { "point": [ 11, 10, 2 ], "overmap": "refctr_SE2a_z2_north" }, + { "point": [ 12, 10, 2 ], "overmap": "refctr_SE3a_z2_north" }, + { "point": [ 13, 10, 2 ], "overmap": "refctr_SE4a_z2_north" }, + { "point": [ 14, 10, 2 ], "overmap": "refctr_SE5a_z2_north" }, + { "point": [ 10, 11, 2 ], "overmap": "refctr_SE1b_z2_north" }, + { "point": [ 11, 11, 2 ], "overmap": "refctr_SE2b_z2_north" }, + { "point": [ 12, 11, 2 ], "overmap": "refctr_SE3b_z2_north" }, + { "point": [ 13, 11, 2 ], "overmap": "refctr_SE4b_z2_north" }, + { "point": [ 14, 11, 2 ], "overmap": "refctr_SE5b_z2_north" }, + { "point": [ 10, 12, 2 ], "overmap": "refctr_SE1c_z2_north" }, + { "point": [ 11, 12, 2 ], "overmap": "refctr_SE2c_z2_north" }, + { "point": [ 12, 12, 2 ], "overmap": "refctr_SE3c_z2_north" }, + { "point": [ 13, 12, 2 ], "overmap": "refctr_SE4c_z2_north" }, + { "point": [ 14, 12, 2 ], "overmap": "refctr_SE5c_z2_north" }, + { "point": [ 10, 13, 2 ], "overmap": "refctr_SE1d_z2_north" }, + { "point": [ 11, 13, 2 ], "overmap": "refctr_SE2d_z2_north" }, + { "point": [ 12, 13, 2 ], "overmap": "refctr_SE3d_z2_north" }, + { "point": [ 13, 13, 2 ], "overmap": "refctr_SE4d_z2_north" }, + { "point": [ 14, 13, 2 ], "overmap": "refctr_SE5d_z2_north" }, + { "point": [ 10, 14, 2 ], "overmap": "refctr_SE1e_z2_north" }, + { "point": [ 11, 14, 2 ], "overmap": "refctr_SE2e_z2_north" }, + { "point": [ 12, 14, 2 ], "overmap": "refctr_SE3e_z2_north" }, + { "point": [ 13, 14, 2 ], "overmap": "refctr_SE4e_z2_north" }, + { "point": [ 14, 14, 2 ], "overmap": "refctr_SE5e_z2_north" }, + { "point": [ 0, 0, -1 ], "overmap": "refctr_NW1a_z-1_north" }, + { "point": [ 1, 0, -1 ], "overmap": "refctr_NW2a_z-1_north" }, + { "point": [ 2, 0, -1 ], "overmap": "refctr_NW3a_z-1_north" }, + { "point": [ 3, 0, -1 ], "overmap": "refctr_NW4a_z-1_north" }, + { "point": [ 4, 0, -1 ], "overmap": "refctr_NW5a_z-1_north" }, + { "point": [ 0, 1, -1 ], "overmap": "refctr_NW1b_z-1_north" }, + { "point": [ 1, 1, -1 ], "overmap": "refctr_NW2b_z-1_north" }, + { "point": [ 2, 1, -1 ], "overmap": "refctr_NW3b_z-1_north" }, + { "point": [ 3, 1, -1 ], "overmap": "refctr_NW4b_z-1_north" }, + { "point": [ 4, 1, -1 ], "overmap": "refctr_NW5b_z-1_north" }, + { "point": [ 0, 2, -1 ], "overmap": "refctr_NW1c_z-1_north" }, + { "point": [ 1, 2, -1 ], "overmap": "refctr_NW2c_z-1_north" }, + { "point": [ 2, 2, -1 ], "overmap": "refctr_NW3c_z-1_north" }, + { "point": [ 3, 2, -1 ], "overmap": "refctr_NW4c_z-1_north" }, + { "point": [ 4, 2, -1 ], "overmap": "refctr_NW5c_z-1_north" }, + { "point": [ 0, 3, -1 ], "overmap": "refctr_NW1d_z-1_north" }, + { "point": [ 1, 3, -1 ], "overmap": "refctr_NW2d_z-1_north" }, + { "point": [ 2, 3, -1 ], "overmap": "refctr_NW3d_z-1_north" }, + { "point": [ 3, 3, -1 ], "overmap": "refctr_NW4d_z-1_north" }, + { "point": [ 4, 3, -1 ], "overmap": "refctr_NW5d_z-1_north" }, + { "point": [ 0, 4, -1 ], "overmap": "refctr_NW1e_z-1_north" }, + { "point": [ 1, 4, -1 ], "overmap": "refctr_NW2e_z-1_north" }, + { "point": [ 2, 4, -1 ], "overmap": "refctr_NW3e_z-1_north" }, + { "point": [ 3, 4, -1 ], "overmap": "refctr_NW4e_z-1_north" }, + { "point": [ 4, 4, -1 ], "overmap": "refctr_NW5e_z-1_north" }, + { "point": [ 5, 0, -1 ], "overmap": "refctr_N1a_z-1_north" }, + { "point": [ 6, 0, -1 ], "overmap": "refctr_N2a_z-1_north" }, + { "point": [ 7, 0, -1 ], "overmap": "refctr_N3a_z-1_north" }, + { "point": [ 8, 0, -1 ], "overmap": "refctr_N4a_z-1_north" }, + { "point": [ 9, 0, -1 ], "overmap": "refctr_N5a_z-1_north" }, + { "point": [ 5, 1, -1 ], "overmap": "refctr_N1b_z-1_north" }, + { "point": [ 6, 1, -1 ], "overmap": "refctr_N2b_z-1_north" }, + { "point": [ 7, 1, -1 ], "overmap": "refctr_N3b_z-1_north" }, + { "point": [ 8, 1, -1 ], "overmap": "refctr_N4b_z-1_north" }, + { "point": [ 9, 1, -1 ], "overmap": "refctr_N5b_z-1_north" }, + { "point": [ 5, 2, -1 ], "overmap": "refctr_N1c_z-1_north" }, + { "point": [ 6, 2, -1 ], "overmap": "refctr_N2c_z-1_north" }, + { "point": [ 7, 2, -1 ], "overmap": "refctr_N3c_z-1_north" }, + { "point": [ 8, 2, -1 ], "overmap": "refctr_N4c_z-1_north" }, + { "point": [ 9, 2, -1 ], "overmap": "refctr_N5c_z-1_north" }, + { "point": [ 5, 3, -1 ], "overmap": "refctr_N1d_z-1_north" }, + { "point": [ 6, 3, -1 ], "overmap": "refctr_N2d_z-1_north" }, + { "point": [ 7, 3, -1 ], "overmap": "refctr_N3d_z-1_north" }, + { "point": [ 8, 3, -1 ], "overmap": "refctr_N4d_z-1_north" }, + { "point": [ 9, 3, -1 ], "overmap": "refctr_N5d_z-1_north" }, + { "point": [ 5, 4, -1 ], "overmap": "refctr_N1e_z-1_north" }, + { "point": [ 6, 4, -1 ], "overmap": "refctr_N2e_z-1_north" }, + { "point": [ 7, 4, -1 ], "overmap": "refctr_N3e_z-1_north" }, + { "point": [ 8, 4, -1 ], "overmap": "refctr_N4e_z-1_north" }, + { "point": [ 9, 4, -1 ], "overmap": "refctr_N5e_z-1_north" }, + { "point": [ 10, 0, -1 ], "overmap": "refctr_NE1a_z-1_north" }, + { "point": [ 11, 0, -1 ], "overmap": "refctr_NE2a_z-1_north" }, + { "point": [ 12, 0, -1 ], "overmap": "refctr_NE3a_z-1_north" }, + { "point": [ 13, 0, -1 ], "overmap": "refctr_NE4a_z-1_north" }, + { "point": [ 14, 0, -1 ], "overmap": "refctr_NE5a_z-1_north" }, + { "point": [ 10, 1, -1 ], "overmap": "refctr_NE1b_z-1_north" }, + { "point": [ 11, 1, -1 ], "overmap": "refctr_NE2b_z-1_north" }, + { "point": [ 12, 1, -1 ], "overmap": "refctr_NE3b_z-1_north" }, + { "point": [ 13, 1, -1 ], "overmap": "refctr_NE4b_z-1_north" }, + { "point": [ 14, 1, -1 ], "overmap": "refctr_NE5b_z-1_north" }, + { "point": [ 10, 2, -1 ], "overmap": "refctr_NE1c_z-1_north" }, + { "point": [ 11, 2, -1 ], "overmap": "refctr_NE2c_z-1_north" }, + { "point": [ 12, 2, -1 ], "overmap": "refctr_NE3c_z-1_north" }, + { "point": [ 13, 2, -1 ], "overmap": "refctr_NE4c_z-1_north" }, + { "point": [ 14, 2, -1 ], "overmap": "refctr_NE5c_z-1_north" }, + { "point": [ 10, 3, -1 ], "overmap": "refctr_NE1d_z-1_north" }, + { "point": [ 11, 3, -1 ], "overmap": "refctr_NE2d_z-1_north" }, + { "point": [ 12, 3, -1 ], "overmap": "refctr_NE3d_z-1_north" }, + { "point": [ 13, 3, -1 ], "overmap": "refctr_NE4d_z-1_north" }, + { "point": [ 14, 3, -1 ], "overmap": "refctr_NE5d_z-1_north" }, + { "point": [ 10, 4, -1 ], "overmap": "refctr_NE1e_z-1_north" }, + { "point": [ 11, 4, -1 ], "overmap": "refctr_NE2e_z-1_north" }, + { "point": [ 12, 4, -1 ], "overmap": "refctr_NE3e_z-1_north" }, + { "point": [ 13, 4, -1 ], "overmap": "refctr_NE4e_z-1_north" }, + { "point": [ 14, 4, -1 ], "overmap": "refctr_NE5e_z-1_north" }, + { "point": [ 0, 5, -1 ], "overmap": "refctr_W1a_z-1_north" }, + { "point": [ 1, 5, -1 ], "overmap": "refctr_W2a_z-1_north" }, + { "point": [ 2, 5, -1 ], "overmap": "refctr_W3a_z-1_north" }, + { "point": [ 3, 5, -1 ], "overmap": "refctr_W4a_z-1_north" }, + { "point": [ 4, 5, -1 ], "overmap": "refctr_W5a_z-1_north" }, + { "point": [ 0, 6, -1 ], "overmap": "refctr_W1b_z-1_north" }, + { "point": [ 1, 6, -1 ], "overmap": "refctr_W2b_z-1_north" }, + { "point": [ 2, 6, -1 ], "overmap": "refctr_W3b_z-1_north" }, + { "point": [ 3, 6, -1 ], "overmap": "refctr_W4b_z-1_north" }, + { "point": [ 4, 6, -1 ], "overmap": "refctr_W5b_z-1_north" }, + { "point": [ 0, 7, -1 ], "overmap": "refctr_W1c_z-1_north" }, + { "point": [ 1, 7, -1 ], "overmap": "refctr_W2c_z-1_north" }, + { "point": [ 2, 7, -1 ], "overmap": "refctr_W3c_z-1_north" }, + { "point": [ 3, 7, -1 ], "overmap": "refctr_W4c_z-1_north" }, + { "point": [ 4, 7, -1 ], "overmap": "refctr_W5c_z-1_north" }, + { "point": [ 0, 8, -1 ], "overmap": "refctr_W1d_z-1_north" }, + { "point": [ 1, 8, -1 ], "overmap": "refctr_W2d_z-1_north" }, + { "point": [ 2, 8, -1 ], "overmap": "refctr_W3d_z-1_north" }, + { "point": [ 3, 8, -1 ], "overmap": "refctr_W4d_z-1_north" }, + { "point": [ 4, 8, -1 ], "overmap": "refctr_W5d_z-1_north" }, + { "point": [ 0, 9, -1 ], "overmap": "refctr_W1e_z-1_north" }, + { "point": [ 1, 9, -1 ], "overmap": "refctr_W2e_z-1_north" }, + { "point": [ 2, 9, -1 ], "overmap": "refctr_W3e_z-1_north" }, + { "point": [ 3, 9, -1 ], "overmap": "refctr_W4e_z-1_north" }, + { "point": [ 4, 9, -1 ], "overmap": "refctr_W5e_z-1_north" }, + { "point": [ 5, 5, -1 ], "overmap": "evac_center_1_z-1_north" }, + { "point": [ 6, 5, -1 ], "overmap": "evac_center_2_z-1_north" }, + { "point": [ 7, 5, -1 ], "overmap": "evac_center_3_z-1_north" }, + { "point": [ 8, 5, -1 ], "overmap": "evac_center_4_z-1_north" }, + { "point": [ 9, 5, -1 ], "overmap": "evac_center_5_z-1_north" }, + { "point": [ 5, 6, -1 ], "overmap": "evac_center_6_z-1_north" }, + { "point": [ 6, 6, -1 ], "overmap": "evac_center_7_z-1_north" }, + { "point": [ 7, 6, -1 ], "overmap": "evac_center_8_z-1_north" }, + { "point": [ 8, 6, -1 ], "overmap": "evac_center_9_z-1_north" }, + { "point": [ 9, 6, -1 ], "overmap": "evac_center_10_z-1_north" }, + { "point": [ 5, 7, -1 ], "overmap": "evac_center_11_z-1_north" }, + { "point": [ 6, 7, -1 ], "overmap": "evac_center_12_z-1_north" }, + { "point": [ 7, 7, -1 ], "overmap": "evac_center_13_z-1_north" }, + { "point": [ 8, 7, -1 ], "overmap": "evac_center_14_z-1_north" }, + { "point": [ 9, 7, -1 ], "overmap": "evac_center_15_z-1_north" }, + { "point": [ 5, 8, -1 ], "overmap": "evac_center_16_z-1_north" }, + { "point": [ 6, 8, -1 ], "overmap": "evac_center_17_z-1_north" }, + { "point": [ 7, 8, -1 ], "overmap": "evac_center_18_z-1_north" }, + { "point": [ 8, 8, -1 ], "overmap": "evac_center_19_z-1_north" }, + { "point": [ 9, 8, -1 ], "overmap": "evac_center_20_z-1_north" }, + { "point": [ 5, 9, -1 ], "overmap": "evac_center_21_z-1_north" }, + { "point": [ 6, 9, -1 ], "overmap": "evac_center_22_z-1_north" }, + { "point": [ 7, 9, -1 ], "overmap": "evac_center_23_z-1_north" }, + { "point": [ 8, 9, -1 ], "overmap": "evac_center_24_z-1_north" }, + { "point": [ 9, 9, -1 ], "overmap": "evac_center_25_z-1_north" }, + { "point": [ 10, 5, -1 ], "overmap": "refctr_E1a_z-1_north" }, + { "point": [ 11, 5, -1 ], "overmap": "refctr_E2a_z-1_north" }, + { "point": [ 12, 5, -1 ], "overmap": "refctr_E3a_z-1_north" }, + { "point": [ 13, 5, -1 ], "overmap": "refctr_E4a_z-1_north" }, + { "point": [ 14, 5, -1 ], "overmap": "refctr_E5a_z-1_north" }, + { "point": [ 10, 6, -1 ], "overmap": "refctr_E1b_z-1_north" }, + { "point": [ 11, 6, -1 ], "overmap": "refctr_E2b_z-1_north" }, + { "point": [ 12, 6, -1 ], "overmap": "refctr_E3b_z-1_north" }, + { "point": [ 13, 6, -1 ], "overmap": "refctr_E4b_z-1_north" }, + { "point": [ 14, 6, -1 ], "overmap": "refctr_E5b_z-1_north" }, + { "point": [ 10, 7, -1 ], "overmap": "refctr_E1c_z-1_north" }, + { "point": [ 11, 7, -1 ], "overmap": "refctr_E2c_z-1_north" }, + { "point": [ 12, 7, -1 ], "overmap": "refctr_E3c_z-1_north" }, + { "point": [ 13, 7, -1 ], "overmap": "refctr_E4c_z-1_north" }, + { "point": [ 14, 7, -1 ], "overmap": "refctr_E5c_z-1_north" }, + { "point": [ 10, 8, -1 ], "overmap": "refctr_E1d_z-1_north" }, + { "point": [ 11, 8, -1 ], "overmap": "refctr_E2d_z-1_north" }, + { "point": [ 12, 8, -1 ], "overmap": "refctr_E3d_z-1_north" }, + { "point": [ 13, 8, -1 ], "overmap": "refctr_E4d_z-1_north" }, + { "point": [ 14, 8, -1 ], "overmap": "refctr_E5d_z-1_north" }, + { "point": [ 10, 9, -1 ], "overmap": "refctr_E1e_z-1_north" }, + { "point": [ 11, 9, -1 ], "overmap": "refctr_E2e_z-1_north" }, + { "point": [ 12, 9, -1 ], "overmap": "refctr_E3e_z-1_north" }, + { "point": [ 13, 9, -1 ], "overmap": "refctr_E4e_z-1_north" }, + { "point": [ 14, 9, -1 ], "overmap": "refctr_E5e_z-1_north" }, + { "point": [ 0, 10, -1 ], "overmap": "refctr_SW1a_z-1_north" }, + { "point": [ 1, 10, -1 ], "overmap": "refctr_SW2a_z-1_north" }, + { "point": [ 2, 10, -1 ], "overmap": "refctr_SW3a_z-1_north" }, + { "point": [ 3, 10, -1 ], "overmap": "refctr_SW4a_z-1_north" }, + { "point": [ 4, 10, -1 ], "overmap": "refctr_SW5a_z-1_north" }, + { "point": [ 0, 11, -1 ], "overmap": "refctr_SW1b_z-1_north" }, + { "point": [ 1, 11, -1 ], "overmap": "refctr_SW2b_z-1_north" }, + { "point": [ 2, 11, -1 ], "overmap": "refctr_SW3b_z-1_north" }, + { "point": [ 3, 11, -1 ], "overmap": "refctr_SW4b_z-1_north" }, + { "point": [ 4, 11, -1 ], "overmap": "refctr_SW5b_z-1_north" }, + { "point": [ 0, 12, -1 ], "overmap": "refctr_SW1c_z-1_north" }, + { "point": [ 1, 12, -1 ], "overmap": "refctr_SW2c_z-1_north" }, + { "point": [ 2, 12, -1 ], "overmap": "refctr_SW3c_z-1_north" }, + { "point": [ 3, 12, -1 ], "overmap": "refctr_SW4c_z-1_north" }, + { "point": [ 4, 12, -1 ], "overmap": "refctr_SW5c_z-1_north" }, + { "point": [ 0, 13, -1 ], "overmap": "refctr_SW1d_z-1_north" }, + { "point": [ 1, 13, -1 ], "overmap": "refctr_SW2d_z-1_north" }, + { "point": [ 2, 13, -1 ], "overmap": "refctr_SW3d_z-1_north" }, + { "point": [ 3, 13, -1 ], "overmap": "refctr_SW4d_z-1_north" }, + { "point": [ 4, 13, -1 ], "overmap": "refctr_SW5d_z-1_north" }, + { "point": [ 0, 14, -1 ], "overmap": "refctr_SW1e_z-1_north" }, + { "point": [ 1, 14, -1 ], "overmap": "refctr_SW2e_z-1_north" }, + { "point": [ 2, 14, -1 ], "overmap": "refctr_SW3e_z-1_north" }, + { "point": [ 3, 14, -1 ], "overmap": "refctr_SW4e_z-1_north" }, + { "point": [ 4, 14, -1 ], "overmap": "refctr_SW5e_z-1_north" }, + { "point": [ 5, 10, -1 ], "overmap": "refctr_S1a_z-1_north" }, + { "point": [ 6, 10, -1 ], "overmap": "refctr_S2a_z-1_north" }, + { "point": [ 7, 10, -1 ], "overmap": "refctr_S3a_z-1_north" }, + { "point": [ 8, 10, -1 ], "overmap": "refctr_S4a_z-1_north" }, + { "point": [ 9, 10, -1 ], "overmap": "refctr_S5a_z-1_north" }, + { "point": [ 5, 11, -1 ], "overmap": "refctr_S1b_z-1_north" }, + { "point": [ 6, 11, -1 ], "overmap": "refctr_S2b_z-1_north" }, + { "point": [ 7, 11, -1 ], "overmap": "refctr_S3b_z-1_north" }, + { "point": [ 8, 11, -1 ], "overmap": "refctr_S4b_z-1_north" }, + { "point": [ 9, 11, -1 ], "overmap": "refctr_S5b_z-1_north" }, + { "point": [ 5, 12, -1 ], "overmap": "refctr_S1c_z-1_north" }, + { "point": [ 6, 12, -1 ], "overmap": "refctr_S2c_z-1_north" }, + { "point": [ 7, 12, -1 ], "overmap": "refctr_S3c_z-1_north" }, + { "point": [ 8, 12, -1 ], "overmap": "refctr_S4c_z-1_north" }, + { "point": [ 9, 12, -1 ], "overmap": "refctr_S5c_z-1_north" }, + { "point": [ 5, 13, -1 ], "overmap": "refctr_S1d_z-1_north" }, + { "point": [ 6, 13, -1 ], "overmap": "refctr_S2d_z-1_north" }, + { "point": [ 7, 13, -1 ], "overmap": "refctr_S3d_z-1_north" }, + { "point": [ 8, 13, -1 ], "overmap": "refctr_S4d_z-1_north" }, + { "point": [ 9, 13, -1 ], "overmap": "refctr_S5d_z-1_north" }, + { "point": [ 5, 14, -1 ], "overmap": "refctr_S1e_z-1_north" }, + { "point": [ 6, 14, -1 ], "overmap": "refctr_S2e_z-1_north" }, + { "point": [ 7, 14, -1 ], "overmap": "refctr_S3e_z-1_north" }, + { "point": [ 8, 14, -1 ], "overmap": "refctr_S4e_z-1_north" }, + { "point": [ 9, 14, -1 ], "overmap": "refctr_S5e_z-1_north" }, + { "point": [ 10, 10, -1 ], "overmap": "refctr_SE1a_z-1_north" }, + { "point": [ 11, 10, -1 ], "overmap": "refctr_SE2a_z-1_north" }, + { "point": [ 12, 10, -1 ], "overmap": "refctr_SE3a_z-1_north" }, + { "point": [ 13, 10, -1 ], "overmap": "refctr_SE4a_z-1_north" }, + { "point": [ 14, 10, -1 ], "overmap": "refctr_SE5a_z-1_north" }, + { "point": [ 10, 11, -1 ], "overmap": "refctr_SE1b_z-1_north" }, + { "point": [ 11, 11, -1 ], "overmap": "refctr_SE2b_z-1_north" }, + { "point": [ 12, 11, -1 ], "overmap": "refctr_SE3b_z-1_north" }, + { "point": [ 13, 11, -1 ], "overmap": "refctr_SE4b_z-1_north" }, + { "point": [ 14, 11, -1 ], "overmap": "refctr_SE5b_z-1_north" }, + { "point": [ 10, 12, -1 ], "overmap": "refctr_SE1c_z-1_north" }, + { "point": [ 11, 12, -1 ], "overmap": "refctr_SE2c_z-1_north" }, + { "point": [ 12, 12, -1 ], "overmap": "refctr_SE3c_z-1_north" }, + { "point": [ 13, 12, -1 ], "overmap": "refctr_SE4c_z-1_north" }, + { "point": [ 14, 12, -1 ], "overmap": "refctr_SE5c_z-1_north" }, + { "point": [ 10, 13, -1 ], "overmap": "refctr_SE1d_z-1_north" }, + { "point": [ 11, 13, -1 ], "overmap": "refctr_SE2d_z-1_north" }, + { "point": [ 12, 13, -1 ], "overmap": "refctr_SE3d_z-1_north" }, + { "point": [ 13, 13, -1 ], "overmap": "refctr_SE4d_z-1_north" }, + { "point": [ 14, 13, -1 ], "overmap": "refctr_SE5d_z-1_north" }, + { "point": [ 10, 14, -1 ], "overmap": "refctr_SE1e_z-1_north" }, + { "point": [ 11, 14, -1 ], "overmap": "refctr_SE2e_z-1_north" }, + { "point": [ 12, 14, -1 ], "overmap": "refctr_SE3e_z-1_north" }, + { "point": [ 13, 14, -1 ], "overmap": "refctr_SE4e_z-1_north" }, + { "point": [ 14, 14, -1 ], "overmap": "refctr_SE5e_z-1_north" }, + { "point": [ 0, 0, -2 ], "overmap": "refctr_NW1a_z-2_north" }, + { "point": [ 1, 0, -2 ], "overmap": "refctr_NW2a_z-2_north" }, + { "point": [ 2, 0, -2 ], "overmap": "refctr_NW3a_z-2_north" }, + { "point": [ 3, 0, -2 ], "overmap": "refctr_NW4a_z-2_north" }, + { "point": [ 4, 0, -2 ], "overmap": "refctr_NW5a_z-2_north" }, + { "point": [ 0, 1, -2 ], "overmap": "refctr_NW1b_z-2_north" }, + { "point": [ 1, 1, -2 ], "overmap": "refctr_NW2b_z-2_north" }, + { "point": [ 2, 1, -2 ], "overmap": "refctr_NW3b_z-2_north" }, + { "point": [ 3, 1, -2 ], "overmap": "refctr_NW4b_z-2_north" }, + { "point": [ 4, 1, -2 ], "overmap": "refctr_NW5b_z-2_north" }, + { "point": [ 0, 2, -2 ], "overmap": "refctr_NW1c_z-2_north" }, + { "point": [ 1, 2, -2 ], "overmap": "refctr_NW2c_z-2_north" }, + { "point": [ 2, 2, -2 ], "overmap": "refctr_NW3c_z-2_north" }, + { "point": [ 3, 2, -2 ], "overmap": "refctr_NW4c_z-2_north" }, + { "point": [ 4, 2, -2 ], "overmap": "refctr_NW5c_z-2_north" }, + { "point": [ 0, 3, -2 ], "overmap": "refctr_NW1d_z-2_north" }, + { "point": [ 1, 3, -2 ], "overmap": "refctr_NW2d_z-2_north" }, + { "point": [ 2, 3, -2 ], "overmap": "refctr_NW3d_z-2_north" }, + { "point": [ 3, 3, -2 ], "overmap": "refctr_NW4d_z-2_north" }, + { "point": [ 4, 3, -2 ], "overmap": "refctr_NW5d_z-2_north" }, + { "point": [ 0, 4, -2 ], "overmap": "refctr_NW1e_z-2_north" }, + { "point": [ 1, 4, -2 ], "overmap": "refctr_NW2e_z-2_north" }, + { "point": [ 2, 4, -2 ], "overmap": "refctr_NW3e_z-2_north" }, + { "point": [ 3, 4, -2 ], "overmap": "refctr_NW4e_z-2_north" }, + { "point": [ 4, 4, -2 ], "overmap": "refctr_NW5e_z-2_north" }, + { "point": [ 5, 0, -2 ], "overmap": "refctr_N1a_z-2_north" }, + { "point": [ 6, 0, -2 ], "overmap": "refctr_N2a_z-2_north" }, + { "point": [ 7, 0, -2 ], "overmap": "refctr_N3a_z-2_north" }, + { "point": [ 8, 0, -2 ], "overmap": "refctr_N4a_z-2_north" }, + { "point": [ 9, 0, -2 ], "overmap": "refctr_N5a_z-2_north" }, + { "point": [ 5, 1, -2 ], "overmap": "refctr_N1b_z-2_north" }, + { "point": [ 6, 1, -2 ], "overmap": "refctr_N2b_z-2_north" }, + { "point": [ 7, 1, -2 ], "overmap": "refctr_N3b_z-2_north" }, + { "point": [ 8, 1, -2 ], "overmap": "refctr_N4b_z-2_north" }, + { "point": [ 9, 1, -2 ], "overmap": "refctr_N5b_z-2_north" }, + { "point": [ 5, 2, -2 ], "overmap": "refctr_N1c_z-2_north" }, + { "point": [ 6, 2, -2 ], "overmap": "refctr_N2c_z-2_north" }, + { "point": [ 7, 2, -2 ], "overmap": "refctr_N3c_z-2_north" }, + { "point": [ 8, 2, -2 ], "overmap": "refctr_N4c_z-2_north" }, + { "point": [ 9, 2, -2 ], "overmap": "refctr_N5c_z-2_north" }, + { "point": [ 5, 3, -2 ], "overmap": "refctr_N1d_z-2_north" }, + { "point": [ 6, 3, -2 ], "overmap": "refctr_N2d_z-2_north" }, + { "point": [ 7, 3, -2 ], "overmap": "refctr_N3d_z-2_north" }, + { "point": [ 8, 3, -2 ], "overmap": "refctr_N4d_z-2_north" }, + { "point": [ 9, 3, -2 ], "overmap": "refctr_N5d_z-2_north" }, + { "point": [ 5, 4, -2 ], "overmap": "refctr_N1e_z-2_north" }, + { "point": [ 6, 4, -2 ], "overmap": "refctr_N2e_z-2_north" }, + { "point": [ 7, 4, -2 ], "overmap": "refctr_N3e_z-2_north" }, + { "point": [ 8, 4, -2 ], "overmap": "refctr_N4e_z-2_north" }, + { "point": [ 9, 4, -2 ], "overmap": "refctr_N5e_z-2_north" }, + { "point": [ 10, 0, -2 ], "overmap": "refctr_NE1a_z-2_north" }, + { "point": [ 11, 0, -2 ], "overmap": "refctr_NE2a_z-2_north" }, + { "point": [ 12, 0, -2 ], "overmap": "refctr_NE3a_z-2_north" }, + { "point": [ 13, 0, -2 ], "overmap": "refctr_NE4a_z-2_north" }, + { "point": [ 14, 0, -2 ], "overmap": "refctr_NE5a_z-2_north" }, + { "point": [ 10, 1, -2 ], "overmap": "refctr_NE1b_z-2_north" }, + { "point": [ 11, 1, -2 ], "overmap": "refctr_NE2b_z-2_north" }, + { "point": [ 12, 1, -2 ], "overmap": "refctr_NE3b_z-2_north" }, + { "point": [ 13, 1, -2 ], "overmap": "refctr_NE4b_z-2_north" }, + { "point": [ 14, 1, -2 ], "overmap": "refctr_NE5b_z-2_north" }, + { "point": [ 10, 2, -2 ], "overmap": "refctr_NE1c_z-2_north" }, + { "point": [ 11, 2, -2 ], "overmap": "refctr_NE2c_z-2_north" }, + { "point": [ 12, 2, -2 ], "overmap": "refctr_NE3c_z-2_north" }, + { "point": [ 13, 2, -2 ], "overmap": "refctr_NE4c_z-2_north" }, + { "point": [ 14, 2, -2 ], "overmap": "refctr_NE5c_z-2_north" }, + { "point": [ 10, 3, -2 ], "overmap": "refctr_NE1d_z-2_north" }, + { "point": [ 11, 3, -2 ], "overmap": "refctr_NE2d_z-2_north" }, + { "point": [ 12, 3, -2 ], "overmap": "refctr_NE3d_z-2_north" }, + { "point": [ 13, 3, -2 ], "overmap": "refctr_NE4d_z-2_north" }, + { "point": [ 14, 3, -2 ], "overmap": "refctr_NE5d_z-2_north" }, + { "point": [ 10, 4, -2 ], "overmap": "refctr_NE1e_z-2_north" }, + { "point": [ 11, 4, -2 ], "overmap": "refctr_NE2e_z-2_north" }, + { "point": [ 12, 4, -2 ], "overmap": "refctr_NE3e_z-2_north" }, + { "point": [ 13, 4, -2 ], "overmap": "refctr_NE4e_z-2_north" }, + { "point": [ 14, 4, -2 ], "overmap": "refctr_NE5e_z-2_north" }, + { "point": [ 0, 5, -2 ], "overmap": "refctr_W1a_z-2_north" }, + { "point": [ 1, 5, -2 ], "overmap": "refctr_W2a_z-2_north" }, + { "point": [ 2, 5, -2 ], "overmap": "refctr_W3a_z-2_north" }, + { "point": [ 3, 5, -2 ], "overmap": "refctr_W4a_z-2_north" }, + { "point": [ 4, 5, -2 ], "overmap": "refctr_W5a_z-2_north" }, + { "point": [ 0, 6, -2 ], "overmap": "refctr_W1b_z-2_north" }, + { "point": [ 1, 6, -2 ], "overmap": "refctr_W2b_z-2_north" }, + { "point": [ 2, 6, -2 ], "overmap": "refctr_W3b_z-2_north" }, + { "point": [ 3, 6, -2 ], "overmap": "refctr_W4b_z-2_north" }, + { "point": [ 4, 6, -2 ], "overmap": "refctr_W5b_z-2_north" }, + { "point": [ 0, 7, -2 ], "overmap": "refctr_W1c_z-2_north" }, + { "point": [ 1, 7, -2 ], "overmap": "refctr_W2c_z-2_north" }, + { "point": [ 2, 7, -2 ], "overmap": "refctr_W3c_z-2_north" }, + { "point": [ 3, 7, -2 ], "overmap": "refctr_W4c_z-2_north" }, + { "point": [ 4, 7, -2 ], "overmap": "refctr_W5c_z-2_north" }, + { "point": [ 0, 8, -2 ], "overmap": "refctr_W1d_z-2_north" }, + { "point": [ 1, 8, -2 ], "overmap": "refctr_W2d_z-2_north" }, + { "point": [ 2, 8, -2 ], "overmap": "refctr_W3d_z-2_north" }, + { "point": [ 3, 8, -2 ], "overmap": "refctr_W4d_z-2_north" }, + { "point": [ 4, 8, -2 ], "overmap": "refctr_W5d_z-2_north" }, + { "point": [ 0, 9, -2 ], "overmap": "refctr_W1e_z-2_north" }, + { "point": [ 1, 9, -2 ], "overmap": "refctr_W2e_z-2_north" }, + { "point": [ 2, 9, -2 ], "overmap": "refctr_W3e_z-2_north" }, + { "point": [ 3, 9, -2 ], "overmap": "refctr_W4e_z-2_north" }, + { "point": [ 4, 9, -2 ], "overmap": "refctr_W5e_z-2_north" }, + { "point": [ 5, 5, -2 ], "overmap": "evac_center_1_z-2_north" }, + { "point": [ 6, 5, -2 ], "overmap": "evac_center_2_z-2_north" }, + { "point": [ 7, 5, -2 ], "overmap": "evac_center_3_z-2_north" }, + { "point": [ 8, 5, -2 ], "overmap": "evac_center_4_z-2_north" }, + { "point": [ 9, 5, -2 ], "overmap": "evac_center_5_z-2_north" }, + { "point": [ 5, 6, -2 ], "overmap": "evac_center_6_z-2_north" }, + { "point": [ 6, 6, -2 ], "overmap": "evac_center_7_z-2_north" }, + { "point": [ 7, 6, -2 ], "overmap": "evac_center_8_z-2_north" }, + { "point": [ 8, 6, -2 ], "overmap": "evac_center_9_z-2_north" }, + { "point": [ 9, 6, -2 ], "overmap": "evac_center_10_z-2_north" }, + { "point": [ 5, 7, -2 ], "overmap": "evac_center_11_z-2_north" }, + { "point": [ 6, 7, -2 ], "overmap": "evac_center_12_z-2_north" }, + { "point": [ 7, 7, -2 ], "overmap": "evac_center_13_z-2_north" }, + { "point": [ 8, 7, -2 ], "overmap": "evac_center_14_z-2_north" }, + { "point": [ 9, 7, -2 ], "overmap": "evac_center_15_z-2_north" }, + { "point": [ 5, 8, -2 ], "overmap": "evac_center_16_z-2_north" }, + { "point": [ 6, 8, -2 ], "overmap": "evac_center_17_z-2_north" }, + { "point": [ 7, 8, -2 ], "overmap": "evac_center_18_z-2_north" }, + { "point": [ 8, 8, -2 ], "overmap": "evac_center_19_z-2_north" }, + { "point": [ 9, 8, -2 ], "overmap": "evac_center_20_z-2_north" }, + { "point": [ 5, 9, -2 ], "overmap": "evac_center_21_z-2_north" }, + { "point": [ 6, 9, -2 ], "overmap": "evac_center_22_z-2_north" }, + { "point": [ 7, 9, -2 ], "overmap": "evac_center_23_z-2_north" }, + { "point": [ 8, 9, -2 ], "overmap": "evac_center_24_z-2_north" }, + { "point": [ 9, 9, -2 ], "overmap": "evac_center_25_z-2_north" }, + { "point": [ 10, 5, -2 ], "overmap": "refctr_E1a_z-2_north" }, + { "point": [ 11, 5, -2 ], "overmap": "refctr_E2a_z-2_north" }, + { "point": [ 12, 5, -2 ], "overmap": "refctr_E3a_z-2_north" }, + { "point": [ 13, 5, -2 ], "overmap": "refctr_E4a_z-2_north" }, + { "point": [ 14, 5, -2 ], "overmap": "refctr_E5a_z-2_north" }, + { "point": [ 10, 6, -2 ], "overmap": "refctr_E1b_z-2_north" }, + { "point": [ 11, 6, -2 ], "overmap": "refctr_E2b_z-2_north" }, + { "point": [ 12, 6, -2 ], "overmap": "refctr_E3b_z-2_north" }, + { "point": [ 13, 6, -2 ], "overmap": "refctr_E4b_z-2_north" }, + { "point": [ 14, 6, -2 ], "overmap": "refctr_E5b_z-2_north" }, + { "point": [ 10, 7, -2 ], "overmap": "refctr_E1c_z-2_north" }, + { "point": [ 11, 7, -2 ], "overmap": "refctr_E2c_z-2_north" }, + { "point": [ 12, 7, -2 ], "overmap": "refctr_E3c_z-2_north" }, + { "point": [ 13, 7, -2 ], "overmap": "refctr_E4c_z-2_north" }, + { "point": [ 14, 7, -2 ], "overmap": "refctr_E5c_z-2_north" }, + { "point": [ 10, 8, -2 ], "overmap": "refctr_E1d_z-2_north" }, + { "point": [ 11, 8, -2 ], "overmap": "refctr_E2d_z-2_north" }, + { "point": [ 12, 8, -2 ], "overmap": "refctr_E3d_z-2_north" }, + { "point": [ 13, 8, -2 ], "overmap": "refctr_E4d_z-2_north" }, + { "point": [ 14, 8, -2 ], "overmap": "refctr_E5d_z-2_north" }, + { "point": [ 10, 9, -2 ], "overmap": "refctr_E1e_z-2_north" }, + { "point": [ 11, 9, -2 ], "overmap": "refctr_E2e_z-2_north" }, + { "point": [ 12, 9, -2 ], "overmap": "refctr_E3e_z-2_north" }, + { "point": [ 13, 9, -2 ], "overmap": "refctr_E4e_z-2_north" }, + { "point": [ 14, 9, -2 ], "overmap": "refctr_E5e_z-2_north" }, + { "point": [ 0, 10, -2 ], "overmap": "refctr_SW1a_z-2_north" }, + { "point": [ 1, 10, -2 ], "overmap": "refctr_SW2a_z-2_north" }, + { "point": [ 2, 10, -2 ], "overmap": "refctr_SW3a_z-2_north" }, + { "point": [ 3, 10, -2 ], "overmap": "refctr_SW4a_z-2_north" }, + { "point": [ 4, 10, -2 ], "overmap": "refctr_SW5a_z-2_north" }, + { "point": [ 0, 11, -2 ], "overmap": "refctr_SW1b_z-2_north" }, + { "point": [ 1, 11, -2 ], "overmap": "refctr_SW2b_z-2_north" }, + { "point": [ 2, 11, -2 ], "overmap": "refctr_SW3b_z-2_north" }, + { "point": [ 3, 11, -2 ], "overmap": "refctr_SW4b_z-2_north" }, + { "point": [ 4, 11, -2 ], "overmap": "refctr_SW5b_z-2_north" }, + { "point": [ 0, 12, -2 ], "overmap": "refctr_SW1c_z-2_north" }, + { "point": [ 1, 12, -2 ], "overmap": "refctr_SW2c_z-2_north" }, + { "point": [ 2, 12, -2 ], "overmap": "refctr_SW3c_z-2_north" }, + { "point": [ 3, 12, -2 ], "overmap": "refctr_SW4c_z-2_north" }, + { "point": [ 4, 12, -2 ], "overmap": "refctr_SW5c_z-2_north" }, + { "point": [ 0, 13, -2 ], "overmap": "refctr_SW1d_z-2_north" }, + { "point": [ 1, 13, -2 ], "overmap": "refctr_SW2d_z-2_north" }, + { "point": [ 2, 13, -2 ], "overmap": "refctr_SW3d_z-2_north" }, + { "point": [ 3, 13, -2 ], "overmap": "refctr_SW4d_z-2_north" }, + { "point": [ 4, 13, -2 ], "overmap": "refctr_SW5d_z-2_north" }, + { "point": [ 0, 14, -2 ], "overmap": "refctr_SW1e_z-2_north" }, + { "point": [ 1, 14, -2 ], "overmap": "refctr_SW2e_z-2_north" }, + { "point": [ 2, 14, -2 ], "overmap": "refctr_SW3e_z-2_north" }, + { "point": [ 3, 14, -2 ], "overmap": "refctr_SW4e_z-2_north" }, + { "point": [ 4, 14, -2 ], "overmap": "refctr_SW5e_z-2_north" }, + { "point": [ 5, 10, -2 ], "overmap": "refctr_S1a_z-2_north" }, + { "point": [ 6, 10, -2 ], "overmap": "refctr_S2a_z-2_north" }, + { "point": [ 7, 10, -2 ], "overmap": "refctr_S3a_z-2_north" }, + { "point": [ 8, 10, -2 ], "overmap": "refctr_S4a_z-2_north" }, + { "point": [ 9, 10, -2 ], "overmap": "refctr_S5a_z-2_north" }, + { "point": [ 5, 11, -2 ], "overmap": "refctr_S1b_z-2_north" }, + { "point": [ 6, 11, -2 ], "overmap": "refctr_S2b_z-2_north" }, + { "point": [ 7, 11, -2 ], "overmap": "refctr_S3b_z-2_north" }, + { "point": [ 8, 11, -2 ], "overmap": "refctr_S4b_z-2_north" }, + { "point": [ 9, 11, -2 ], "overmap": "refctr_S5b_z-2_north" }, + { "point": [ 5, 12, -2 ], "overmap": "refctr_S1c_z-2_north" }, + { "point": [ 6, 12, -2 ], "overmap": "refctr_S2c_z-2_north" }, + { "point": [ 7, 12, -2 ], "overmap": "refctr_S3c_z-2_north" }, + { "point": [ 8, 12, -2 ], "overmap": "refctr_S4c_z-2_north" }, + { "point": [ 9, 12, -2 ], "overmap": "refctr_S5c_z-2_north" }, + { "point": [ 5, 13, -2 ], "overmap": "refctr_S1d_z-2_north" }, + { "point": [ 6, 13, -2 ], "overmap": "refctr_S2d_z-2_north" }, + { "point": [ 7, 13, -2 ], "overmap": "refctr_S3d_z-2_north" }, + { "point": [ 8, 13, -2 ], "overmap": "refctr_S4d_z-2_north" }, + { "point": [ 9, 13, -2 ], "overmap": "refctr_S5d_z-2_north" }, + { "point": [ 5, 14, -2 ], "overmap": "refctr_S1e_z-2_north" }, + { "point": [ 6, 14, -2 ], "overmap": "refctr_S2e_z-2_north" }, + { "point": [ 7, 14, -2 ], "overmap": "refctr_S3e_z-2_north" }, + { "point": [ 8, 14, -2 ], "overmap": "refctr_S4e_z-2_north" }, + { "point": [ 9, 14, -2 ], "overmap": "refctr_S5e_z-2_north" }, + { "point": [ 10, 10, -2 ], "overmap": "refctr_SE1a_z-2_north" }, + { "point": [ 11, 10, -2 ], "overmap": "refctr_SE2a_z-2_north" }, + { "point": [ 12, 10, -2 ], "overmap": "refctr_SE3a_z-2_north" }, + { "point": [ 13, 10, -2 ], "overmap": "refctr_SE4a_z-2_north" }, + { "point": [ 14, 10, -2 ], "overmap": "refctr_SE5a_z-2_north" }, + { "point": [ 10, 11, -2 ], "overmap": "refctr_SE1b_z-2_north" }, + { "point": [ 11, 11, -2 ], "overmap": "refctr_SE2b_z-2_north" }, + { "point": [ 12, 11, -2 ], "overmap": "refctr_SE3b_z-2_north" }, + { "point": [ 13, 11, -2 ], "overmap": "refctr_SE4b_z-2_north" }, + { "point": [ 14, 11, -2 ], "overmap": "refctr_SE5b_z-2_north" }, + { "point": [ 10, 12, -2 ], "overmap": "refctr_SE1c_z-2_north" }, + { "point": [ 11, 12, -2 ], "overmap": "refctr_SE2c_z-2_north" }, + { "point": [ 12, 12, -2 ], "overmap": "refctr_SE3c_z-2_north" }, + { "point": [ 13, 12, -2 ], "overmap": "refctr_SE4c_z-2_north" }, + { "point": [ 14, 12, -2 ], "overmap": "refctr_SE5c_z-2_north" }, + { "point": [ 10, 13, -2 ], "overmap": "refctr_SE1d_z-2_north" }, + { "point": [ 11, 13, -2 ], "overmap": "refctr_SE2d_z-2_north" }, + { "point": [ 12, 13, -2 ], "overmap": "refctr_SE3d_z-2_north" }, + { "point": [ 13, 13, -2 ], "overmap": "refctr_SE4d_z-2_north" }, + { "point": [ 14, 13, -2 ], "overmap": "refctr_SE5d_z-2_north" }, + { "point": [ 10, 14, -2 ], "overmap": "refctr_SE1e_z-2_north" }, + { "point": [ 11, 14, -2 ], "overmap": "refctr_SE2e_z-2_north" }, + { "point": [ 12, 14, -2 ], "overmap": "refctr_SE3e_z-2_north" }, + { "point": [ 13, 14, -2 ], "overmap": "refctr_SE4e_z-2_north" }, + { "point": [ 14, 14, -2 ], "overmap": "refctr_SE5e_z-2_north" }, + { "point": [ 0, 0, -3 ], "overmap": "refctr_NW1a_z-3_north" }, + { "point": [ 1, 0, -3 ], "overmap": "refctr_NW2a_z-3_north" }, + { "point": [ 2, 0, -3 ], "overmap": "refctr_NW3a_z-3_north" }, + { "point": [ 3, 0, -3 ], "overmap": "refctr_NW4a_z-3_north" }, + { "point": [ 4, 0, -3 ], "overmap": "refctr_NW5a_z-3_north" }, + { "point": [ 0, 1, -3 ], "overmap": "refctr_NW1b_z-3_north" }, + { "point": [ 1, 1, -3 ], "overmap": "refctr_NW2b_z-3_north" }, + { "point": [ 2, 1, -3 ], "overmap": "refctr_NW3b_z-3_north" }, + { "point": [ 3, 1, -3 ], "overmap": "refctr_NW4b_z-3_north" }, + { "point": [ 4, 1, -3 ], "overmap": "refctr_NW5b_z-3_north" }, + { "point": [ 0, 2, -3 ], "overmap": "refctr_NW1c_z-3_north" }, + { "point": [ 1, 2, -3 ], "overmap": "refctr_NW2c_z-3_north" }, + { "point": [ 2, 2, -3 ], "overmap": "refctr_NW3c_z-3_north" }, + { "point": [ 3, 2, -3 ], "overmap": "refctr_NW4c_z-3_north" }, + { "point": [ 4, 2, -3 ], "overmap": "refctr_NW5c_z-3_north" }, + { "point": [ 0, 3, -3 ], "overmap": "refctr_NW1d_z-3_north" }, + { "point": [ 1, 3, -3 ], "overmap": "refctr_NW2d_z-3_north" }, + { "point": [ 2, 3, -3 ], "overmap": "refctr_NW3d_z-3_north" }, + { "point": [ 3, 3, -3 ], "overmap": "refctr_NW4d_z-3_north" }, + { "point": [ 4, 3, -3 ], "overmap": "refctr_NW5d_z-3_north" }, + { "point": [ 0, 4, -3 ], "overmap": "refctr_NW1e_z-3_north" }, + { "point": [ 1, 4, -3 ], "overmap": "refctr_NW2e_z-3_north" }, + { "point": [ 2, 4, -3 ], "overmap": "refctr_NW3e_z-3_north" }, + { "point": [ 3, 4, -3 ], "overmap": "refctr_NW4e_z-3_north" }, + { "point": [ 4, 4, -3 ], "overmap": "refctr_NW5e_z-3_north" }, + { "point": [ 5, 0, -3 ], "overmap": "refctr_N1a_z-3_north" }, + { "point": [ 6, 0, -3 ], "overmap": "refctr_N2a_z-3_north" }, + { "point": [ 7, 0, -3 ], "overmap": "refctr_N3a_z-3_north" }, + { "point": [ 8, 0, -3 ], "overmap": "refctr_N4a_z-3_north" }, + { "point": [ 9, 0, -3 ], "overmap": "refctr_N5a_z-3_north" }, + { "point": [ 5, 1, -3 ], "overmap": "refctr_N1b_z-3_north" }, + { "point": [ 6, 1, -3 ], "overmap": "refctr_N2b_z-3_north" }, + { "point": [ 7, 1, -3 ], "overmap": "refctr_N3b_z-3_north" }, + { "point": [ 8, 1, -3 ], "overmap": "refctr_N4b_z-3_north" }, + { "point": [ 9, 1, -3 ], "overmap": "refctr_N5b_z-3_north" }, + { "point": [ 5, 2, -3 ], "overmap": "refctr_N1c_z-3_north" }, + { "point": [ 6, 2, -3 ], "overmap": "refctr_N2c_z-3_north" }, + { "point": [ 7, 2, -3 ], "overmap": "refctr_N3c_z-3_north" }, + { "point": [ 8, 2, -3 ], "overmap": "refctr_N4c_z-3_north" }, + { "point": [ 9, 2, -3 ], "overmap": "refctr_N5c_z-3_north" }, + { "point": [ 5, 3, -3 ], "overmap": "refctr_N1d_z-3_north" }, + { "point": [ 6, 3, -3 ], "overmap": "refctr_N2d_z-3_north" }, + { "point": [ 7, 3, -3 ], "overmap": "refctr_N3d_z-3_north" }, + { "point": [ 8, 3, -3 ], "overmap": "refctr_N4d_z-3_north" }, + { "point": [ 9, 3, -3 ], "overmap": "refctr_N5d_z-3_north" }, + { "point": [ 5, 4, -3 ], "overmap": "refctr_N1e_z-3_north" }, + { "point": [ 6, 4, -3 ], "overmap": "refctr_N2e_z-3_north" }, + { "point": [ 7, 4, -3 ], "overmap": "refctr_N3e_z-3_north" }, + { "point": [ 8, 4, -3 ], "overmap": "refctr_N4e_z-3_north" }, + { "point": [ 9, 4, -3 ], "overmap": "refctr_N5e_z-3_north" }, + { "point": [ 10, 0, -3 ], "overmap": "refctr_NE1a_z-3_north" }, + { "point": [ 11, 0, -3 ], "overmap": "refctr_NE2a_z-3_north" }, + { "point": [ 12, 0, -3 ], "overmap": "refctr_NE3a_z-3_north" }, + { "point": [ 13, 0, -3 ], "overmap": "refctr_NE4a_z-3_north" }, + { "point": [ 14, 0, -3 ], "overmap": "refctr_NE5a_z-3_north" }, + { "point": [ 10, 1, -3 ], "overmap": "refctr_NE1b_z-3_north" }, + { "point": [ 11, 1, -3 ], "overmap": "refctr_NE2b_z-3_north" }, + { "point": [ 12, 1, -3 ], "overmap": "refctr_NE3b_z-3_north" }, + { "point": [ 13, 1, -3 ], "overmap": "refctr_NE4b_z-3_north" }, + { "point": [ 14, 1, -3 ], "overmap": "refctr_NE5b_z-3_north" }, + { "point": [ 10, 2, -3 ], "overmap": "refctr_NE1c_z-3_north" }, + { "point": [ 11, 2, -3 ], "overmap": "refctr_NE2c_z-3_north" }, + { "point": [ 12, 2, -3 ], "overmap": "refctr_NE3c_z-3_north" }, + { "point": [ 13, 2, -3 ], "overmap": "refctr_NE4c_z-3_north" }, + { "point": [ 14, 2, -3 ], "overmap": "refctr_NE5c_z-3_north" }, + { "point": [ 10, 3, -3 ], "overmap": "refctr_NE1d_z-3_north" }, + { "point": [ 11, 3, -3 ], "overmap": "refctr_NE2d_z-3_north" }, + { "point": [ 12, 3, -3 ], "overmap": "refctr_NE3d_z-3_north" }, + { "point": [ 13, 3, -3 ], "overmap": "refctr_NE4d_z-3_north" }, + { "point": [ 14, 3, -3 ], "overmap": "refctr_NE5d_z-3_north" }, + { "point": [ 10, 4, -3 ], "overmap": "refctr_NE1e_z-3_north" }, + { "point": [ 11, 4, -3 ], "overmap": "refctr_NE2e_z-3_north" }, + { "point": [ 12, 4, -3 ], "overmap": "refctr_NE3e_z-3_north" }, + { "point": [ 13, 4, -3 ], "overmap": "refctr_NE4e_z-3_north" }, + { "point": [ 14, 4, -3 ], "overmap": "refctr_NE5e_z-3_north" }, + { "point": [ 0, 5, -3 ], "overmap": "refctr_W1a_z-3_north" }, + { "point": [ 1, 5, -3 ], "overmap": "refctr_W2a_z-3_north" }, + { "point": [ 2, 5, -3 ], "overmap": "refctr_W3a_z-3_north" }, + { "point": [ 3, 5, -3 ], "overmap": "refctr_W4a_z-3_north" }, + { "point": [ 4, 5, -3 ], "overmap": "refctr_W5a_z-3_north" }, + { "point": [ 0, 6, -3 ], "overmap": "refctr_W1b_z-3_north" }, + { "point": [ 1, 6, -3 ], "overmap": "refctr_W2b_z-3_north" }, + { "point": [ 2, 6, -3 ], "overmap": "refctr_W3b_z-3_north" }, + { "point": [ 3, 6, -3 ], "overmap": "refctr_W4b_z-3_north" }, + { "point": [ 4, 6, -3 ], "overmap": "refctr_W5b_z-3_north" }, + { "point": [ 0, 7, -3 ], "overmap": "refctr_W1c_z-3_north" }, + { "point": [ 1, 7, -3 ], "overmap": "refctr_W2c_z-3_north" }, + { "point": [ 2, 7, -3 ], "overmap": "refctr_W3c_z-3_north" }, + { "point": [ 3, 7, -3 ], "overmap": "refctr_W4c_z-3_north" }, + { "point": [ 4, 7, -3 ], "overmap": "refctr_W5c_z-3_north" }, + { "point": [ 0, 8, -3 ], "overmap": "refctr_W1d_z-3_north" }, + { "point": [ 1, 8, -3 ], "overmap": "refctr_W2d_z-3_north" }, + { "point": [ 2, 8, -3 ], "overmap": "refctr_W3d_z-3_north" }, + { "point": [ 3, 8, -3 ], "overmap": "refctr_W4d_z-3_north" }, + { "point": [ 4, 8, -3 ], "overmap": "refctr_W5d_z-3_north" }, + { "point": [ 0, 9, -3 ], "overmap": "refctr_W1e_z-3_north" }, + { "point": [ 1, 9, -3 ], "overmap": "refctr_W2e_z-3_north" }, + { "point": [ 2, 9, -3 ], "overmap": "refctr_W3e_z-3_north" }, + { "point": [ 3, 9, -3 ], "overmap": "refctr_W4e_z-3_north" }, + { "point": [ 4, 9, -3 ], "overmap": "refctr_W5e_z-3_north" }, + { "point": [ 5, 5, -3 ], "overmap": "evac_center_1_z-3_north" }, + { "point": [ 6, 5, -3 ], "overmap": "evac_center_2_z-3_north" }, + { "point": [ 7, 5, -3 ], "overmap": "evac_center_3_z-3_north" }, + { "point": [ 8, 5, -3 ], "overmap": "evac_center_4_z-3_north" }, + { "point": [ 9, 5, -3 ], "overmap": "evac_center_5_z-3_north" }, + { "point": [ 5, 6, -3 ], "overmap": "evac_center_6_z-3_north" }, + { "point": [ 6, 6, -3 ], "overmap": "evac_center_7_z-3_north" }, + { "point": [ 7, 6, -3 ], "overmap": "evac_center_8_z-3_north" }, + { "point": [ 8, 6, -3 ], "overmap": "evac_center_9_z-3_north" }, + { "point": [ 9, 6, -3 ], "overmap": "evac_center_10_z-3_north" }, + { "point": [ 5, 7, -3 ], "overmap": "evac_center_11_z-3_north" }, + { "point": [ 6, 7, -3 ], "overmap": "evac_center_12_z-3_north" }, + { "point": [ 7, 7, -3 ], "overmap": "evac_center_13_z-3_north" }, + { "point": [ 8, 7, -3 ], "overmap": "evac_center_14_z-3_north" }, + { "point": [ 9, 7, -3 ], "overmap": "evac_center_15_z-3_north" }, + { "point": [ 5, 8, -3 ], "overmap": "evac_center_16_z-3_north" }, + { "point": [ 6, 8, -3 ], "overmap": "evac_center_17_z-3_north" }, + { "point": [ 7, 8, -3 ], "overmap": "evac_center_18_z-3_north" }, + { "point": [ 8, 8, -3 ], "overmap": "evac_center_19_z-3_north" }, + { "point": [ 9, 8, -3 ], "overmap": "evac_center_20_z-3_north" }, + { "point": [ 5, 9, -3 ], "overmap": "evac_center_21_z-3_north" }, + { "point": [ 6, 9, -3 ], "overmap": "evac_center_22_z-3_north" }, + { "point": [ 7, 9, -3 ], "overmap": "evac_center_23_z-3_north" }, + { "point": [ 8, 9, -3 ], "overmap": "evac_center_24_z-3_north" }, + { "point": [ 9, 9, -3 ], "overmap": "evac_center_25_z-3_north" }, + { "point": [ 10, 5, -3 ], "overmap": "refctr_E1a_z-3_north" }, + { "point": [ 11, 5, -3 ], "overmap": "refctr_E2a_z-3_north" }, + { "point": [ 12, 5, -3 ], "overmap": "refctr_E3a_z-3_north" }, + { "point": [ 13, 5, -3 ], "overmap": "refctr_E4a_z-3_north" }, + { "point": [ 14, 5, -3 ], "overmap": "refctr_E5a_z-3_north" }, + { "point": [ 10, 6, -3 ], "overmap": "refctr_E1b_z-3_north" }, + { "point": [ 11, 6, -3 ], "overmap": "refctr_E2b_z-3_north" }, + { "point": [ 12, 6, -3 ], "overmap": "refctr_E3b_z-3_north" }, + { "point": [ 13, 6, -3 ], "overmap": "refctr_E4b_z-3_north" }, + { "point": [ 14, 6, -3 ], "overmap": "refctr_E5b_z-3_north" }, + { "point": [ 10, 7, -3 ], "overmap": "refctr_E1c_z-3_north" }, + { "point": [ 11, 7, -3 ], "overmap": "refctr_E2c_z-3_north" }, + { "point": [ 12, 7, -3 ], "overmap": "refctr_E3c_z-3_north" }, + { "point": [ 13, 7, -3 ], "overmap": "refctr_E4c_z-3_north" }, + { "point": [ 14, 7, -3 ], "overmap": "refctr_E5c_z-3_north" }, + { "point": [ 10, 8, -3 ], "overmap": "refctr_E1d_z-3_north" }, + { "point": [ 11, 8, -3 ], "overmap": "refctr_E2d_z-3_north" }, + { "point": [ 12, 8, -3 ], "overmap": "refctr_E3d_z-3_north" }, + { "point": [ 13, 8, -3 ], "overmap": "refctr_E4d_z-3_north" }, + { "point": [ 14, 8, -3 ], "overmap": "refctr_E5d_z-3_north" }, + { "point": [ 10, 9, -3 ], "overmap": "refctr_E1e_z-3_north" }, + { "point": [ 11, 9, -3 ], "overmap": "refctr_E2e_z-3_north" }, + { "point": [ 12, 9, -3 ], "overmap": "refctr_E3e_z-3_north" }, + { "point": [ 13, 9, -3 ], "overmap": "refctr_E4e_z-3_north" }, + { "point": [ 14, 9, -3 ], "overmap": "refctr_E5e_z-3_north" }, + { "point": [ 0, 10, -3 ], "overmap": "refctr_SW1a_z-3_north" }, + { "point": [ 1, 10, -3 ], "overmap": "refctr_SW2a_z-3_north" }, + { "point": [ 2, 10, -3 ], "overmap": "refctr_SW3a_z-3_north" }, + { "point": [ 3, 10, -3 ], "overmap": "refctr_SW4a_z-3_north" }, + { "point": [ 4, 10, -3 ], "overmap": "refctr_SW5a_z-3_north" }, + { "point": [ 0, 11, -3 ], "overmap": "refctr_SW1b_z-3_north" }, + { "point": [ 1, 11, -3 ], "overmap": "refctr_SW2b_z-3_north" }, + { "point": [ 2, 11, -3 ], "overmap": "refctr_SW3b_z-3_north" }, + { "point": [ 3, 11, -3 ], "overmap": "refctr_SW4b_z-3_north" }, + { "point": [ 4, 11, -3 ], "overmap": "refctr_SW5b_z-3_north" }, + { "point": [ 0, 12, -3 ], "overmap": "refctr_SW1c_z-3_north" }, + { "point": [ 1, 12, -3 ], "overmap": "refctr_SW2c_z-3_north" }, + { "point": [ 2, 12, -3 ], "overmap": "refctr_SW3c_z-3_north" }, + { "point": [ 3, 12, -3 ], "overmap": "refctr_SW4c_z-3_north" }, + { "point": [ 4, 12, -3 ], "overmap": "refctr_SW5c_z-3_north" }, + { "point": [ 0, 13, -3 ], "overmap": "refctr_SW1d_z-3_north" }, + { "point": [ 1, 13, -3 ], "overmap": "refctr_SW2d_z-3_north" }, + { "point": [ 2, 13, -3 ], "overmap": "refctr_SW3d_z-3_north" }, + { "point": [ 3, 13, -3 ], "overmap": "refctr_SW4d_z-3_north" }, + { "point": [ 4, 13, -3 ], "overmap": "refctr_SW5d_z-3_north" }, + { "point": [ 0, 14, -3 ], "overmap": "refctr_SW1e_z-3_north" }, + { "point": [ 1, 14, -3 ], "overmap": "refctr_SW2e_z-3_north" }, + { "point": [ 2, 14, -3 ], "overmap": "refctr_SW3e_z-3_north" }, + { "point": [ 3, 14, -3 ], "overmap": "refctr_SW4e_z-3_north" }, + { "point": [ 4, 14, -3 ], "overmap": "refctr_SW5e_z-3_north" }, + { "point": [ 5, 10, -3 ], "overmap": "refctr_S1a_z-3_north" }, + { "point": [ 6, 10, -3 ], "overmap": "refctr_S2a_z-3_north" }, + { "point": [ 7, 10, -3 ], "overmap": "refctr_S3a_z-3_north" }, + { "point": [ 8, 10, -3 ], "overmap": "refctr_S4a_z-3_north" }, + { "point": [ 9, 10, -3 ], "overmap": "refctr_S5a_z-3_north" }, + { "point": [ 5, 11, -3 ], "overmap": "refctr_S1b_z-3_north" }, + { "point": [ 6, 11, -3 ], "overmap": "refctr_S2b_z-3_north" }, + { "point": [ 7, 11, -3 ], "overmap": "refctr_S3b_z-3_north" }, + { "point": [ 8, 11, -3 ], "overmap": "refctr_S4b_z-3_north" }, + { "point": [ 9, 11, -3 ], "overmap": "refctr_S5b_z-3_north" }, + { "point": [ 5, 12, -3 ], "overmap": "refctr_S1c_z-3_north" }, + { "point": [ 6, 12, -3 ], "overmap": "refctr_S2c_z-3_north" }, + { "point": [ 7, 12, -3 ], "overmap": "refctr_S3c_z-3_north" }, + { "point": [ 8, 12, -3 ], "overmap": "refctr_S4c_z-3_north" }, + { "point": [ 9, 12, -3 ], "overmap": "refctr_S5c_z-3_north" }, + { "point": [ 5, 13, -3 ], "overmap": "refctr_S1d_z-3_north" }, + { "point": [ 6, 13, -3 ], "overmap": "refctr_S2d_z-3_north" }, + { "point": [ 7, 13, -3 ], "overmap": "refctr_S3d_z-3_north" }, + { "point": [ 8, 13, -3 ], "overmap": "refctr_S4d_z-3_north" }, + { "point": [ 9, 13, -3 ], "overmap": "refctr_S5d_z-3_north" }, + { "point": [ 5, 14, -3 ], "overmap": "refctr_S1e_z-3_north" }, + { "point": [ 6, 14, -3 ], "overmap": "refctr_S2e_z-3_north" }, + { "point": [ 7, 14, -3 ], "overmap": "refctr_S3e_z-3_north" }, + { "point": [ 8, 14, -3 ], "overmap": "refctr_S4e_z-3_north" }, + { "point": [ 9, 14, -3 ], "overmap": "refctr_S5e_z-3_north" }, + { "point": [ 10, 10, -3 ], "overmap": "refctr_SE1a_z-3_north" }, + { "point": [ 11, 10, -3 ], "overmap": "refctr_SE2a_z-3_north" }, + { "point": [ 12, 10, -3 ], "overmap": "refctr_SE3a_z-3_north" }, + { "point": [ 13, 10, -3 ], "overmap": "refctr_SE4a_z-3_north" }, + { "point": [ 14, 10, -3 ], "overmap": "refctr_SE5a_z-3_north" }, + { "point": [ 10, 11, -3 ], "overmap": "refctr_SE1b_z-3_north" }, + { "point": [ 11, 11, -3 ], "overmap": "refctr_SE2b_z-3_north" }, + { "point": [ 12, 11, -3 ], "overmap": "refctr_SE3b_z-3_north" }, + { "point": [ 13, 11, -3 ], "overmap": "refctr_SE4b_z-3_north" }, + { "point": [ 14, 11, -3 ], "overmap": "refctr_SE5b_z-3_north" }, + { "point": [ 10, 12, -3 ], "overmap": "refctr_SE1c_z-3_north" }, + { "point": [ 11, 12, -3 ], "overmap": "refctr_SE2c_z-3_north" }, + { "point": [ 12, 12, -3 ], "overmap": "refctr_SE3c_z-3_north" }, + { "point": [ 13, 12, -3 ], "overmap": "refctr_SE4c_z-3_north" }, + { "point": [ 14, 12, -3 ], "overmap": "refctr_SE5c_z-3_north" }, + { "point": [ 10, 13, -3 ], "overmap": "refctr_SE1d_z-3_north" }, + { "point": [ 11, 13, -3 ], "overmap": "refctr_SE2d_z-3_north" }, + { "point": [ 12, 13, -3 ], "overmap": "refctr_SE3d_z-3_north" }, + { "point": [ 13, 13, -3 ], "overmap": "refctr_SE4d_z-3_north" }, + { "point": [ 14, 13, -3 ], "overmap": "refctr_SE5d_z-3_north" }, + { "point": [ 10, 14, -3 ], "overmap": "refctr_SE1e_z-3_north" }, + { "point": [ 11, 14, -3 ], "overmap": "refctr_SE2e_z-3_north" }, + { "point": [ 12, 14, -3 ], "overmap": "refctr_SE3e_z-3_north" }, + { "point": [ 13, 14, -3 ], "overmap": "refctr_SE4e_z-3_north" }, + { "point": [ 14, 14, -3 ], "overmap": "refctr_SE5e_z-3_north" }, + { "point": [ 0, 0, -4 ], "overmap": "refctr_NW1a_z-4_north" }, + { "point": [ 1, 0, -4 ], "overmap": "refctr_NW2a_z-4_north" }, + { "point": [ 2, 0, -4 ], "overmap": "refctr_NW3a_z-4_north" }, + { "point": [ 3, 0, -4 ], "overmap": "refctr_NW4a_z-4_north" }, + { "point": [ 4, 0, -4 ], "overmap": "refctr_NW5a_z-4_north" }, + { "point": [ 0, 1, -4 ], "overmap": "refctr_NW1b_z-4_north" }, + { "point": [ 1, 1, -4 ], "overmap": "refctr_NW2b_z-4_north" }, + { "point": [ 2, 1, -4 ], "overmap": "refctr_NW3b_z-4_north" }, + { "point": [ 3, 1, -4 ], "overmap": "refctr_NW4b_z-4_north" }, + { "point": [ 4, 1, -4 ], "overmap": "refctr_NW5b_z-4_north" }, + { "point": [ 0, 2, -4 ], "overmap": "refctr_NW1c_z-4_north" }, + { "point": [ 1, 2, -4 ], "overmap": "refctr_NW2c_z-4_north" }, + { "point": [ 2, 2, -4 ], "overmap": "refctr_NW3c_z-4_north" }, + { "point": [ 3, 2, -4 ], "overmap": "refctr_NW4c_z-4_north" }, + { "point": [ 4, 2, -4 ], "overmap": "refctr_NW5c_z-4_north" }, + { "point": [ 0, 3, -4 ], "overmap": "refctr_NW1d_z-4_north" }, + { "point": [ 1, 3, -4 ], "overmap": "refctr_NW2d_z-4_north" }, + { "point": [ 2, 3, -4 ], "overmap": "refctr_NW3d_z-4_north" }, + { "point": [ 3, 3, -4 ], "overmap": "refctr_NW4d_z-4_north" }, + { "point": [ 4, 3, -4 ], "overmap": "refctr_NW5d_z-4_north" }, + { "point": [ 0, 4, -4 ], "overmap": "refctr_NW1e_z-4_north" }, + { "point": [ 1, 4, -4 ], "overmap": "refctr_NW2e_z-4_north" }, + { "point": [ 2, 4, -4 ], "overmap": "refctr_NW3e_z-4_north" }, + { "point": [ 3, 4, -4 ], "overmap": "refctr_NW4e_z-4_north" }, + { "point": [ 4, 4, -4 ], "overmap": "refctr_NW5e_z-4_north" }, + { "point": [ 5, 0, -4 ], "overmap": "refctr_N1a_z-4_north" }, + { "point": [ 6, 0, -4 ], "overmap": "refctr_N2a_z-4_north" }, + { "point": [ 7, 0, -4 ], "overmap": "refctr_N3a_z-4_north" }, + { "point": [ 8, 0, -4 ], "overmap": "refctr_N4a_z-4_north" }, + { "point": [ 9, 0, -4 ], "overmap": "refctr_N5a_z-4_north" }, + { "point": [ 5, 1, -4 ], "overmap": "refctr_N1b_z-4_north" }, + { "point": [ 6, 1, -4 ], "overmap": "refctr_N2b_z-4_north" }, + { "point": [ 7, 1, -4 ], "overmap": "refctr_N3b_z-4_north" }, + { "point": [ 8, 1, -4 ], "overmap": "refctr_N4b_z-4_north" }, + { "point": [ 9, 1, -4 ], "overmap": "refctr_N5b_z-4_north" }, + { "point": [ 5, 2, -4 ], "overmap": "refctr_N1c_z-4_north" }, + { "point": [ 6, 2, -4 ], "overmap": "refctr_N2c_z-4_north" }, + { "point": [ 7, 2, -4 ], "overmap": "refctr_N3c_z-4_north" }, + { "point": [ 8, 2, -4 ], "overmap": "refctr_N4c_z-4_north" }, + { "point": [ 9, 2, -4 ], "overmap": "refctr_N5c_z-4_north" }, + { "point": [ 5, 3, -4 ], "overmap": "refctr_N1d_z-4_north" }, + { "point": [ 6, 3, -4 ], "overmap": "refctr_N2d_z-4_north" }, + { "point": [ 7, 3, -4 ], "overmap": "refctr_N3d_z-4_north" }, + { "point": [ 8, 3, -4 ], "overmap": "refctr_N4d_z-4_north" }, + { "point": [ 9, 3, -4 ], "overmap": "refctr_N5d_z-4_north" }, + { "point": [ 5, 4, -4 ], "overmap": "refctr_N1e_z-4_north" }, + { "point": [ 6, 4, -4 ], "overmap": "refctr_N2e_z-4_north" }, + { "point": [ 7, 4, -4 ], "overmap": "refctr_N3e_z-4_north" }, + { "point": [ 8, 4, -4 ], "overmap": "refctr_N4e_z-4_north" }, + { "point": [ 9, 4, -4 ], "overmap": "refctr_N5e_z-4_north" }, + { "point": [ 10, 0, -4 ], "overmap": "refctr_NE1a_z-4_north" }, + { "point": [ 11, 0, -4 ], "overmap": "refctr_NE2a_z-4_north" }, + { "point": [ 12, 0, -4 ], "overmap": "refctr_NE3a_z-4_north" }, + { "point": [ 13, 0, -4 ], "overmap": "refctr_NE4a_z-4_north" }, + { "point": [ 14, 0, -4 ], "overmap": "refctr_NE5a_z-4_north" }, + { "point": [ 10, 1, -4 ], "overmap": "refctr_NE1b_z-4_north" }, + { "point": [ 11, 1, -4 ], "overmap": "refctr_NE2b_z-4_north" }, + { "point": [ 12, 1, -4 ], "overmap": "refctr_NE3b_z-4_north" }, + { "point": [ 13, 1, -4 ], "overmap": "refctr_NE4b_z-4_north" }, + { "point": [ 14, 1, -4 ], "overmap": "refctr_NE5b_z-4_north" }, + { "point": [ 10, 2, -4 ], "overmap": "refctr_NE1c_z-4_north" }, + { "point": [ 11, 2, -4 ], "overmap": "refctr_NE2c_z-4_north" }, + { "point": [ 12, 2, -4 ], "overmap": "refctr_NE3c_z-4_north" }, + { "point": [ 13, 2, -4 ], "overmap": "refctr_NE4c_z-4_north" }, + { "point": [ 14, 2, -4 ], "overmap": "refctr_NE5c_z-4_north" }, + { "point": [ 10, 3, -4 ], "overmap": "refctr_NE1d_z-4_north" }, + { "point": [ 11, 3, -4 ], "overmap": "refctr_NE2d_z-4_north" }, + { "point": [ 12, 3, -4 ], "overmap": "refctr_NE3d_z-4_north" }, + { "point": [ 13, 3, -4 ], "overmap": "refctr_NE4d_z-4_north" }, + { "point": [ 14, 3, -4 ], "overmap": "refctr_NE5d_z-4_north" }, + { "point": [ 10, 4, -4 ], "overmap": "refctr_NE1e_z-4_north" }, + { "point": [ 11, 4, -4 ], "overmap": "refctr_NE2e_z-4_north" }, + { "point": [ 12, 4, -4 ], "overmap": "refctr_NE3e_z-4_north" }, + { "point": [ 13, 4, -4 ], "overmap": "refctr_NE4e_z-4_north" }, + { "point": [ 14, 4, -4 ], "overmap": "refctr_NE5e_z-4_north" }, + { "point": [ 0, 5, -4 ], "overmap": "refctr_W1a_z-4_north" }, + { "point": [ 1, 5, -4 ], "overmap": "refctr_W2a_z-4_north" }, + { "point": [ 2, 5, -4 ], "overmap": "refctr_W3a_z-4_north" }, + { "point": [ 3, 5, -4 ], "overmap": "refctr_W4a_z-4_north" }, + { "point": [ 4, 5, -4 ], "overmap": "refctr_W5a_z-4_north" }, + { "point": [ 0, 6, -4 ], "overmap": "refctr_W1b_z-4_north" }, + { "point": [ 1, 6, -4 ], "overmap": "refctr_W2b_z-4_north" }, + { "point": [ 2, 6, -4 ], "overmap": "refctr_W3b_z-4_north" }, + { "point": [ 3, 6, -4 ], "overmap": "refctr_W4b_z-4_north" }, + { "point": [ 4, 6, -4 ], "overmap": "refctr_W5b_z-4_north" }, + { "point": [ 0, 7, -4 ], "overmap": "refctr_W1c_z-4_north" }, + { "point": [ 1, 7, -4 ], "overmap": "refctr_W2c_z-4_north" }, + { "point": [ 2, 7, -4 ], "overmap": "refctr_W3c_z-4_north" }, + { "point": [ 3, 7, -4 ], "overmap": "refctr_W4c_z-4_north" }, + { "point": [ 4, 7, -4 ], "overmap": "refctr_W5c_z-4_north" }, + { "point": [ 0, 8, -4 ], "overmap": "refctr_W1d_z-4_north" }, + { "point": [ 1, 8, -4 ], "overmap": "refctr_W2d_z-4_north" }, + { "point": [ 2, 8, -4 ], "overmap": "refctr_W3d_z-4_north" }, + { "point": [ 3, 8, -4 ], "overmap": "refctr_W4d_z-4_north" }, + { "point": [ 4, 8, -4 ], "overmap": "refctr_W5d_z-4_north" }, + { "point": [ 0, 9, -4 ], "overmap": "refctr_W1e_z-4_north" }, + { "point": [ 1, 9, -4 ], "overmap": "refctr_W2e_z-4_north" }, + { "point": [ 2, 9, -4 ], "overmap": "refctr_W3e_z-4_north" }, + { "point": [ 3, 9, -4 ], "overmap": "refctr_W4e_z-4_north" }, + { "point": [ 4, 9, -4 ], "overmap": "refctr_W5e_z-4_north" }, + { "point": [ 5, 5, -4 ], "overmap": "evac_center_1_z-4_north" }, + { "point": [ 6, 5, -4 ], "overmap": "evac_center_2_z-4_north" }, + { "point": [ 7, 5, -4 ], "overmap": "evac_center_3_z-4_north" }, + { "point": [ 8, 5, -4 ], "overmap": "evac_center_4_z-4_north" }, + { "point": [ 9, 5, -4 ], "overmap": "evac_center_5_z-4_north" }, + { "point": [ 5, 6, -4 ], "overmap": "evac_center_6_z-4_north" }, + { "point": [ 6, 6, -4 ], "overmap": "evac_center_7_z-4_north" }, + { "point": [ 7, 6, -4 ], "overmap": "evac_center_8_z-4_north" }, + { "point": [ 8, 6, -4 ], "overmap": "evac_center_9_z-4_north" }, + { "point": [ 9, 6, -4 ], "overmap": "evac_center_10_z-4_north" }, + { "point": [ 5, 7, -4 ], "overmap": "evac_center_11_z-4_north" }, + { "point": [ 6, 7, -4 ], "overmap": "evac_center_12_z-4_north" }, + { "point": [ 7, 7, -4 ], "overmap": "evac_center_13_z-4_north" }, + { "point": [ 8, 7, -4 ], "overmap": "evac_center_14_z-4_north" }, + { "point": [ 9, 7, -4 ], "overmap": "evac_center_15_z-4_north" }, + { "point": [ 5, 8, -4 ], "overmap": "evac_center_16_z-4_north" }, + { "point": [ 6, 8, -4 ], "overmap": "evac_center_17_z-4_north" }, + { "point": [ 7, 8, -4 ], "overmap": "evac_center_18_z-4_north" }, + { "point": [ 8, 8, -4 ], "overmap": "evac_center_19_z-4_north" }, + { "point": [ 9, 8, -4 ], "overmap": "evac_center_20_z-4_north" }, + { "point": [ 5, 9, -4 ], "overmap": "evac_center_21_z-4_north" }, + { "point": [ 6, 9, -4 ], "overmap": "evac_center_22_z-4_north" }, + { "point": [ 7, 9, -4 ], "overmap": "evac_center_23_z-4_north" }, + { "point": [ 8, 9, -4 ], "overmap": "evac_center_24_z-4_north" }, + { "point": [ 9, 9, -4 ], "overmap": "evac_center_25_z-4_north" }, + { "point": [ 10, 5, -4 ], "overmap": "refctr_E1a_z-4_north" }, + { "point": [ 11, 5, -4 ], "overmap": "refctr_E2a_z-4_north" }, + { "point": [ 12, 5, -4 ], "overmap": "refctr_E3a_z-4_north" }, + { "point": [ 13, 5, -4 ], "overmap": "refctr_E4a_z-4_north" }, + { "point": [ 14, 5, -4 ], "overmap": "refctr_E5a_z-4_north" }, + { "point": [ 10, 6, -4 ], "overmap": "refctr_E1b_z-4_north" }, + { "point": [ 11, 6, -4 ], "overmap": "refctr_E2b_z-4_north" }, + { "point": [ 12, 6, -4 ], "overmap": "refctr_E3b_z-4_north" }, + { "point": [ 13, 6, -4 ], "overmap": "refctr_E4b_z-4_north" }, + { "point": [ 14, 6, -4 ], "overmap": "refctr_E5b_z-4_north" }, + { "point": [ 10, 7, -4 ], "overmap": "refctr_E1c_z-4_north" }, + { "point": [ 11, 7, -4 ], "overmap": "refctr_E2c_z-4_north" }, + { "point": [ 12, 7, -4 ], "overmap": "refctr_E3c_z-4_north" }, + { "point": [ 13, 7, -4 ], "overmap": "refctr_E4c_z-4_north" }, + { "point": [ 14, 7, -4 ], "overmap": "refctr_E5c_z-4_north" }, + { "point": [ 10, 8, -4 ], "overmap": "refctr_E1d_z-4_north" }, + { "point": [ 11, 8, -4 ], "overmap": "refctr_E2d_z-4_north" }, + { "point": [ 12, 8, -4 ], "overmap": "refctr_E3d_z-4_north" }, + { "point": [ 13, 8, -4 ], "overmap": "refctr_E4d_z-4_north" }, + { "point": [ 14, 8, -4 ], "overmap": "refctr_E5d_z-4_north" }, + { "point": [ 10, 9, -4 ], "overmap": "refctr_E1e_z-4_north" }, + { "point": [ 11, 9, -4 ], "overmap": "refctr_E2e_z-4_north" }, + { "point": [ 12, 9, -4 ], "overmap": "refctr_E3e_z-4_north" }, + { "point": [ 13, 9, -4 ], "overmap": "refctr_E4e_z-4_north" }, + { "point": [ 14, 9, -4 ], "overmap": "refctr_E5e_z-4_north" }, + { "point": [ 0, 10, -4 ], "overmap": "refctr_SW1a_z-4_north" }, + { "point": [ 1, 10, -4 ], "overmap": "refctr_SW2a_z-4_north" }, + { "point": [ 2, 10, -4 ], "overmap": "refctr_SW3a_z-4_north" }, + { "point": [ 3, 10, -4 ], "overmap": "refctr_SW4a_z-4_north" }, + { "point": [ 4, 10, -4 ], "overmap": "refctr_SW5a_z-4_north" }, + { "point": [ 0, 11, -4 ], "overmap": "refctr_SW1b_z-4_north" }, + { "point": [ 1, 11, -4 ], "overmap": "refctr_SW2b_z-4_north" }, + { "point": [ 2, 11, -4 ], "overmap": "refctr_SW3b_z-4_north" }, + { "point": [ 3, 11, -4 ], "overmap": "refctr_SW4b_z-4_north" }, + { "point": [ 4, 11, -4 ], "overmap": "refctr_SW5b_z-4_north" }, + { "point": [ 0, 12, -4 ], "overmap": "refctr_SW1c_z-4_north" }, + { "point": [ 1, 12, -4 ], "overmap": "refctr_SW2c_z-4_north" }, + { "point": [ 2, 12, -4 ], "overmap": "refctr_SW3c_z-4_north" }, + { "point": [ 3, 12, -4 ], "overmap": "refctr_SW4c_z-4_north" }, + { "point": [ 4, 12, -4 ], "overmap": "refctr_SW5c_z-4_north" }, + { "point": [ 0, 13, -4 ], "overmap": "refctr_SW1d_z-4_north" }, + { "point": [ 1, 13, -4 ], "overmap": "refctr_SW2d_z-4_north" }, + { "point": [ 2, 13, -4 ], "overmap": "refctr_SW3d_z-4_north" }, + { "point": [ 3, 13, -4 ], "overmap": "refctr_SW4d_z-4_north" }, + { "point": [ 4, 13, -4 ], "overmap": "refctr_SW5d_z-4_north" }, + { "point": [ 0, 14, -4 ], "overmap": "refctr_SW1e_z-4_north" }, + { "point": [ 1, 14, -4 ], "overmap": "refctr_SW2e_z-4_north" }, + { "point": [ 2, 14, -4 ], "overmap": "refctr_SW3e_z-4_north" }, + { "point": [ 3, 14, -4 ], "overmap": "refctr_SW4e_z-4_north" }, + { "point": [ 4, 14, -4 ], "overmap": "refctr_SW5e_z-4_north" }, + { "point": [ 5, 10, -4 ], "overmap": "refctr_S1a_z-4_north" }, + { "point": [ 6, 10, -4 ], "overmap": "refctr_S2a_z-4_north" }, + { "point": [ 7, 10, -4 ], "overmap": "refctr_S3a_z-4_north" }, + { "point": [ 8, 10, -4 ], "overmap": "refctr_S4a_z-4_north" }, + { "point": [ 9, 10, -4 ], "overmap": "refctr_S5a_z-4_north" }, + { "point": [ 5, 11, -4 ], "overmap": "refctr_S1b_z-4_north" }, + { "point": [ 6, 11, -4 ], "overmap": "refctr_S2b_z-4_north" }, + { "point": [ 7, 11, -4 ], "overmap": "refctr_S3b_z-4_north" }, + { "point": [ 8, 11, -4 ], "overmap": "refctr_S4b_z-4_north" }, + { "point": [ 9, 11, -4 ], "overmap": "refctr_S5b_z-4_north" }, + { "point": [ 5, 12, -4 ], "overmap": "refctr_S1c_z-4_north" }, + { "point": [ 6, 12, -4 ], "overmap": "refctr_S2c_z-4_north" }, + { "point": [ 7, 12, -4 ], "overmap": "refctr_S3c_z-4_north" }, + { "point": [ 8, 12, -4 ], "overmap": "refctr_S4c_z-4_north" }, + { "point": [ 9, 12, -4 ], "overmap": "refctr_S5c_z-4_north" }, + { "point": [ 5, 13, -4 ], "overmap": "refctr_S1d_z-4_north" }, + { "point": [ 6, 13, -4 ], "overmap": "refctr_S2d_z-4_north" }, + { "point": [ 7, 13, -4 ], "overmap": "refctr_S3d_z-4_north" }, + { "point": [ 8, 13, -4 ], "overmap": "refctr_S4d_z-4_north" }, + { "point": [ 9, 13, -4 ], "overmap": "refctr_S5d_z-4_north" }, + { "point": [ 5, 14, -4 ], "overmap": "refctr_S1e_z-4_north" }, + { "point": [ 6, 14, -4 ], "overmap": "refctr_S2e_z-4_north" }, + { "point": [ 7, 14, -4 ], "overmap": "refctr_S3e_z-4_north" }, + { "point": [ 8, 14, -4 ], "overmap": "refctr_S4e_z-4_north" }, + { "point": [ 9, 14, -4 ], "overmap": "refctr_S5e_z-4_north" }, + { "point": [ 10, 10, -4 ], "overmap": "refctr_SE1a_z-4_north" }, + { "point": [ 11, 10, -4 ], "overmap": "refctr_SE2a_z-4_north" }, + { "point": [ 12, 10, -4 ], "overmap": "refctr_SE3a_z-4_north" }, + { "point": [ 13, 10, -4 ], "overmap": "refctr_SE4a_z-4_north" }, + { "point": [ 14, 10, -4 ], "overmap": "refctr_SE5a_z-4_north" }, + { "point": [ 10, 11, -4 ], "overmap": "refctr_SE1b_z-4_north" }, + { "point": [ 11, 11, -4 ], "overmap": "refctr_SE2b_z-4_north" }, + { "point": [ 12, 11, -4 ], "overmap": "refctr_SE3b_z-4_north" }, + { "point": [ 13, 11, -4 ], "overmap": "refctr_SE4b_z-4_north" }, + { "point": [ 14, 11, -4 ], "overmap": "refctr_SE5b_z-4_north" }, + { "point": [ 10, 12, -4 ], "overmap": "refctr_SE1c_z-4_north" }, + { "point": [ 11, 12, -4 ], "overmap": "refctr_SE2c_z-4_north" }, + { "point": [ 12, 12, -4 ], "overmap": "refctr_SE3c_z-4_north" }, + { "point": [ 13, 12, -4 ], "overmap": "refctr_SE4c_z-4_north" }, + { "point": [ 14, 12, -4 ], "overmap": "refctr_SE5c_z-4_north" }, + { "point": [ 10, 13, -4 ], "overmap": "refctr_SE1d_z-4_north" }, + { "point": [ 11, 13, -4 ], "overmap": "refctr_SE2d_z-4_north" }, + { "point": [ 12, 13, -4 ], "overmap": "refctr_SE3d_z-4_north" }, + { "point": [ 13, 13, -4 ], "overmap": "refctr_SE4d_z-4_north" }, + { "point": [ 14, 13, -4 ], "overmap": "refctr_SE5d_z-4_north" }, + { "point": [ 10, 14, -4 ], "overmap": "refctr_SE1e_z-4_north" }, + { "point": [ 11, 14, -4 ], "overmap": "refctr_SE2e_z-4_north" }, + { "point": [ 12, 14, -4 ], "overmap": "refctr_SE3e_z-4_north" }, + { "point": [ 13, 14, -4 ], "overmap": "refctr_SE4e_z-4_north" }, + { "point": [ 14, 14, -4 ], "overmap": "refctr_SE5e_z-4_north" }, + { "point": [ 7, 15, 0 ], "overmap": "road_end_south" } + ], + "connections": [ { "point": [ 7, 15, 0 ] } ], + "locations": [ "wilderness" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "UNIQUE", "SAFE_AT_WORLDGEN" ] + }, + { + "type": "overmap_special", + "id": "bandit_cabin", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "bandit_cabin_north" } ], + "locations": [ "forest" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS", "UNIQUE", "SAFE_AT_WORLDGEN" ] + }, + { + "type": "overmap_special", + "id": "bandit_camp", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "bandit_camp_1_north" }, + { "point": [ 1, 0, 0 ], "overmap": "bandit_camp_2_north" }, + { "point": [ 0, 1, 0 ], "overmap": "bandit_camp_3_north" }, + { "point": [ 1, 1, 0 ], "overmap": "bandit_camp_4_north" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS", "UNIQUE", "SAFE_AT_WORLDGEN" ] + }, + { + "type": "overmap_special", + "id": "ranch_camp", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "ranch_camp_1_north" }, + { "point": [ 1, 0, 0 ], "overmap": "ranch_camp_2_north" }, + { "point": [ 2, 0, 0 ], "overmap": "ranch_camp_3_north" }, + { "point": [ 3, 0, 0 ], "overmap": "ranch_camp_4_north" }, + { "point": [ 4, 0, 0 ], "overmap": "ranch_camp_5_north" }, + { "point": [ 5, 0, 0 ], "overmap": "ranch_camp_6_north" }, + { "point": [ 6, 0, 0 ], "overmap": "ranch_camp_7_north" }, + { "point": [ 7, 0, 0 ], "overmap": "ranch_camp_8_north" }, + { "point": [ 8, 0, 0 ], "overmap": "ranch_camp_9_north" }, + { "point": [ 0, 1, 0 ], "overmap": "ranch_camp_10_north" }, + { "point": [ 1, 1, 0 ], "overmap": "ranch_camp_11_north" }, + { "point": [ 2, 1, 0 ], "overmap": "ranch_camp_12_north" }, + { "point": [ 3, 1, 0 ], "overmap": "ranch_camp_13_north" }, + { "point": [ 4, 1, 0 ], "overmap": "ranch_camp_14_north" }, + { "point": [ 5, 1, 0 ], "overmap": "ranch_camp_15_north" }, + { "point": [ 6, 1, 0 ], "overmap": "ranch_camp_16_north" }, + { "point": [ 7, 1, 0 ], "overmap": "ranch_camp_17_north" }, + { "point": [ 8, 1, 0 ], "overmap": "ranch_camp_18_north" }, + { "point": [ 0, 2, 0 ], "overmap": "ranch_camp_19_north" }, + { "point": [ 1, 2, 0 ], "overmap": "ranch_camp_20_north" }, + { "point": [ 2, 2, 0 ], "overmap": "ranch_camp_21_north" }, + { "point": [ 3, 2, 0 ], "overmap": "ranch_camp_22_north" }, + { "point": [ 4, 2, 0 ], "overmap": "ranch_camp_23_north" }, + { "point": [ 5, 2, 0 ], "overmap": "ranch_camp_24_north" }, + { "point": [ 6, 2, 0 ], "overmap": "ranch_camp_25_north" }, + { "point": [ 7, 2, 0 ], "overmap": "ranch_camp_26_north" }, + { "point": [ 8, 2, 0 ], "overmap": "ranch_camp_27_north" }, + { "point": [ 0, 3, 0 ], "overmap": "ranch_camp_28_north" }, + { "point": [ 1, 3, 0 ], "overmap": "ranch_camp_29_north" }, + { "point": [ 2, 3, 0 ], "overmap": "ranch_camp_30_north" }, + { "point": [ 3, 3, 0 ], "overmap": "ranch_camp_31_north" }, + { "point": [ 4, 3, 0 ], "overmap": "ranch_camp_32_north" }, + { "point": [ 5, 3, 0 ], "overmap": "ranch_camp_33_north" }, + { "point": [ 6, 3, 0 ], "overmap": "ranch_camp_34_north" }, + { "point": [ 7, 3, 0 ], "overmap": "ranch_camp_35_north" }, + { "point": [ 8, 3, 0 ], "overmap": "ranch_camp_36_north" }, + { "point": [ 0, 4, 0 ], "overmap": "ranch_camp_37_north" }, + { "point": [ 1, 4, 0 ], "overmap": "ranch_camp_38_north" }, + { "point": [ 2, 4, 0 ], "overmap": "ranch_camp_39_north" }, + { "point": [ 3, 4, 0 ], "overmap": "ranch_camp_40_north" }, + { "point": [ 4, 4, 0 ], "overmap": "ranch_camp_41_north" }, + { "point": [ 5, 4, 0 ], "overmap": "ranch_camp_42_north" }, + { "point": [ 6, 4, 0 ], "overmap": "ranch_camp_43_north" }, + { "point": [ 7, 4, 0 ], "overmap": "ranch_camp_44_north" }, + { "point": [ 8, 4, 0 ], "overmap": "ranch_camp_45_north" }, + { "point": [ 0, 5, 0 ], "overmap": "ranch_camp_46_north" }, + { "point": [ 1, 5, 0 ], "overmap": "ranch_camp_47_north" }, + { "point": [ 2, 5, 0 ], "overmap": "ranch_camp_48_north" }, + { "point": [ 3, 5, 0 ], "overmap": "ranch_camp_49_north" }, + { "point": [ 4, 5, 0 ], "overmap": "ranch_camp_50_north" }, + { "point": [ 5, 5, 0 ], "overmap": "ranch_camp_51_north" }, + { "point": [ 6, 5, 0 ], "overmap": "ranch_camp_52_north" }, + { "point": [ 7, 5, 0 ], "overmap": "ranch_camp_53_north" }, + { "point": [ 8, 5, 0 ], "overmap": "ranch_camp_54_north" }, + { "point": [ 0, 6, 0 ], "overmap": "ranch_camp_55_north" }, + { "point": [ 1, 6, 0 ], "overmap": "ranch_camp_56_north" }, + { "point": [ 2, 6, 0 ], "overmap": "ranch_camp_57_north" }, + { "point": [ 2, 6, 1 ], "overmap": "ranch_camp_57_roof_north" }, + { "point": [ 2, 6, 2 ], "overmap": "ranch_camp_57_silo_north" }, + { "point": [ 2, 6, 3 ], "overmap": "ranch_camp_57_silocap_north" }, + { "point": [ 3, 6, 0 ], "overmap": "ranch_camp_58_north" }, + { "point": [ 4, 6, 0 ], "overmap": "ranch_camp_59_north" }, + { "point": [ 5, 6, 0 ], "overmap": "ranch_camp_60_north" }, + { "point": [ 6, 6, 0 ], "overmap": "ranch_camp_61_north" }, + { "point": [ 7, 6, 0 ], "overmap": "ranch_camp_62_north" }, + { "point": [ 8, 6, 0 ], "overmap": "ranch_camp_63_north" }, + { "point": [ 0, 7, 0 ], "overmap": "ranch_camp_64_north" }, + { "point": [ 1, 7, 0 ], "overmap": "ranch_camp_65_north" }, + { "point": [ 1, 7, 1 ], "overmap": "ranch_camp_65_roof_north" }, + { "point": [ 2, 7, 0 ], "overmap": "ranch_camp_66_north" }, + { "point": [ 2, 7, 1 ], "overmap": "ranch_camp_66_roof_north" }, + { "point": [ 3, 7, 0 ], "overmap": "ranch_camp_67_north" }, + { "point": [ 3, 7, 1 ], "overmap": "ranch_camp_67_roof_north" }, + { "point": [ 4, 7, 0 ], "overmap": "ranch_camp_68_north" }, + { "point": [ 4, 7, 1 ], "overmap": "ranch_camp_68_roof_north" }, + { "point": [ 4, 7, -1 ], "overmap": "ranch_camp_68_basement_north" }, + { "point": [ 5, 7, 0 ], "overmap": "ranch_camp_69_north" }, + { "point": [ 6, 7, 0 ], "overmap": "ranch_camp_70_north" }, + { "point": [ 7, 7, 0 ], "overmap": "ranch_camp_71_north" }, + { "point": [ 8, 7, 0 ], "overmap": "ranch_camp_72_north" }, + { "point": [ 0, 8, 0 ], "overmap": "ranch_camp_73_north" }, + { "point": [ 1, 8, 0 ], "overmap": "ranch_camp_74_north" }, + { "point": [ 1, 8, 1 ], "overmap": "ranch_camp_74_roof_north" }, + { "point": [ 2, 8, 0 ], "overmap": "ranch_camp_75_north" }, + { "point": [ 2, 8, 1 ], "overmap": "ranch_camp_75_roof_north" }, + { "point": [ 3, 8, 0 ], "overmap": "ranch_camp_76_north" }, + { "point": [ 4, 8, 0 ], "overmap": "ranch_camp_77_north" }, + { "point": [ 5, 8, 0 ], "overmap": "ranch_camp_78_north" }, + { "point": [ 6, 8, 0 ], "overmap": "ranch_camp_79_north" }, + { "point": [ 7, 8, 0 ], "overmap": "ranch_camp_80_north" }, + { "point": [ 8, 8, 0 ], "overmap": "ranch_camp_81_north" }, + { "point": [ 4, 9, 0 ], "overmap": "road_end_south" } + ], + "connections": [ { "point": [ 4, 9, 0 ] } ], + "locations": [ "wilderness" ], + "city_distance": [ 3, -1 ], + "rotate": false, + "occurrences": [ 0, 0 ], + "flags": [ "UNIQUE", "SAFE_AT_WORLDGEN" ] + }, + { + "type": "overmap_special", + "id": "campsite", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "campsite_north" } ], + "locations": [ "forest" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "campsite_cabin_incomplete", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "campsite_cabin_incomplete_north" } ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "campsite_field_biker", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "campsite_field_biker_north" } ], + "locations": [ "field" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "campsite_a", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "campsite_a_north" } ], + "locations": [ "forest" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "campsite_field_biker_destroyed", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "campsite_field_biker_destroyed_north" } ], + "locations": [ "field" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "cemetery_religious", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "cemetery_4square_00_north" }, + { "point": [ 1, 0, 0 ], "overmap": "cemetery_4square_10_north" }, + { "point": [ 0, 1, 0 ], "overmap": "cemetery_4square_01_north" }, + { "point": [ 1, 1, 0 ], "overmap": "cemetery_4square_11_north" }, + { "point": [ 0, 2, 0 ], "overmap": "road_end_south" } + ], + "connections": [ { "point": [ 0, 2, 0 ] } ], + "locations": [ "wilderness" ], + "city_distance": [ 2, 5 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "Swamp Shack", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "hunter_shack_north" }, + { "point": [ 0, 0, 1 ], "overmap": "hunter_shack_roof_north" } + ], + "locations": [ "swamp" ], + "city_distance": [ 10, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Swamp Shack 1", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "hunter_shack_1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "hunter_shack_roof_1_north" } + ], + "locations": [ "swamp" ], + "city_distance": [ 10, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Derelict Property", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "derelict_property_north" } ], + "locations": [ "wilderness" ], + "city_distance": [ 1, 10 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Hunting Blind", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "hunting_blind_north" } ], + "locations": [ "wilderness" ], + "city_distance": [ 10, 40 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Mansion_Wild", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "mansion_c3_north" }, + { "point": [ 0, 0, 2 ], "overmap": "mansion_c3_roof_north" }, + { "point": [ 1, 0, 0 ], "overmap": "mansion_e1_north" }, + { "point": [ 1, 0, 2 ], "overmap": "mansion_e1_roof_north" }, + { "point": [ 2, 0, 0 ], "overmap": "mansion_c1_east" }, + { "point": [ 2, 0, 2 ], "overmap": "mansion_c1_roof_east" }, + { "point": [ 0, 1, 0 ], "overmap": "mansion_t4_east" }, + { "point": [ 0, 1, 2 ], "overmap": "mansion_t4_roof_east" }, + { "point": [ 1, 1, 0 ], "overmap": "mansion_+4_north" }, + { "point": [ 1, 1, 2 ], "overmap": "mansion_+4_roof_north" }, + { "point": [ 2, 1, 0 ], "overmap": "mansion_t2_west" }, + { "point": [ 2, 1, 2 ], "overmap": "mansion_t2_roof_west" }, + { "point": [ 0, 2, 0 ], "overmap": "mansion_c2_west" }, + { "point": [ 0, 2, 2 ], "overmap": "mansion_c2_roof_west" }, + { "point": [ 1, 2, 0 ], "overmap": "mansion_t2_north" }, + { "point": [ 1, 2, 2 ], "overmap": "mansion_t2_roof_north" }, + { "point": [ 2, 2, 0 ], "overmap": "mansion_c4_south" }, + { "point": [ 2, 2, 2 ], "overmap": "mansion_c4_roof_south" }, + { "point": [ 0, 0, 1 ], "overmap": "mansion_c3u_north" }, + { "point": [ 1, 0, 1 ], "overmap": "mansion_e1u_north" }, + { "point": [ 2, 0, 1 ], "overmap": "mansion_c1u_east" }, + { "point": [ 0, 1, 1 ], "overmap": "mansion_t4u_east" }, + { "point": [ 1, 1, 1 ], "overmap": "mansion_+4u_north" }, + { "point": [ 2, 1, 1 ], "overmap": "mansion_t2u_west" }, + { "point": [ 0, 2, 1 ], "overmap": "mansion_c2u_west" }, + { "point": [ 1, 2, 1 ], "overmap": "mansion_t2u_north" }, + { "point": [ 2, 2, 1 ], "overmap": "mansion_c4u_south" }, + { "point": [ 0, 0, -1 ], "overmap": "mansion_c3d_north" }, + { "point": [ 1, 0, -1 ], "overmap": "mansion_e1d_north" }, + { "point": [ 2, 0, -1 ], "overmap": "mansion_c1d_east" }, + { "point": [ 0, 1, -1 ], "overmap": "mansion_t4d_east" }, + { "point": [ 1, 1, -1 ], "overmap": "mansion_+4d_north" }, + { "point": [ 2, 1, -1 ], "overmap": "mansion_t2d_west" }, + { "point": [ 0, 2, -1 ], "overmap": "mansion_c2d_west" }, + { "point": [ 1, 2, -1 ], "overmap": "mansion_t2d_north" }, + { "point": [ 2, 2, -1 ], "overmap": "mansion_c4d_south" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 15, 50 ], + "occurrences": [ 0, 0 ], + "flags": [ "UNIQUE", "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "Mansion_WildAlt", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "mansion_c2_north" }, + { "point": [ 0, 0, 2 ], "overmap": "mansion_c2_roof_north" }, + { "point": [ 1, 0, 0 ], "overmap": "mansion_e2_north" }, + { "point": [ 1, 0, 2 ], "overmap": "mansion_e2_roof_north" }, + { "point": [ 2, 0, 0 ], "overmap": "mansion_c5_east" }, + { "point": [ 2, 0, 2 ], "overmap": "mansion_c5_roof_east" }, + { "point": [ 0, 1, 0 ], "overmap": "mansion_t1_east" }, + { "point": [ 0, 1, 2 ], "overmap": "mansion_t1_roof_east" }, + { "point": [ 1, 1, 0 ], "overmap": "mansion_+3_north" }, + { "point": [ 1, 1, 2 ], "overmap": "mansion_+3_roof_north" }, + { "point": [ 2, 1, 0 ], "overmap": "mansion_t6_west" }, + { "point": [ 2, 1, 2 ], "overmap": "mansion_t6_roof_west" }, + { "point": [ 0, 2, 0 ], "overmap": "mansion_c4_west" }, + { "point": [ 0, 2, 2 ], "overmap": "mansion_c4_roof_west" }, + { "point": [ 1, 2, 0 ], "overmap": "mansion_t7_north" }, + { "point": [ 1, 2, 2 ], "overmap": "mansion_t7_roof_north" }, + { "point": [ 2, 2, 0 ], "overmap": "mansion_c3_south" }, + { "point": [ 2, 2, 2 ], "overmap": "mansion_c3_roof_south" }, + { "point": [ 0, 0, 1 ], "overmap": "mansion_c2u_north" }, + { "point": [ 1, 0, 1 ], "overmap": "mansion_e2u_north" }, + { "point": [ 2, 0, 1 ], "overmap": "mansion_c5u_east" }, + { "point": [ 0, 1, 1 ], "overmap": "mansion_t1u_east" }, + { "point": [ 1, 1, 1 ], "overmap": "mansion_+3u_north" }, + { "point": [ 2, 1, 1 ], "overmap": "mansion_t6u_west" }, + { "point": [ 0, 2, 1 ], "overmap": "mansion_c4u_west" }, + { "point": [ 1, 2, 1 ], "overmap": "mansion_t7u_north" }, + { "point": [ 2, 2, 1 ], "overmap": "mansion_c3u_south" }, + { "point": [ 0, 0, -1 ], "overmap": "mansion_c2d_north" }, + { "point": [ 1, 0, -1 ], "overmap": "mansion_e2d_north" }, + { "point": [ 2, 0, -1 ], "overmap": "mansion_c5d_east" }, + { "point": [ 0, 1, -1 ], "overmap": "mansion_t1d_east" }, + { "point": [ 1, 1, -1 ], "overmap": "mansion_+2d_north" }, + { "point": [ 2, 1, -1 ], "overmap": "mansion_t6d_west" }, + { "point": [ 0, 2, -1 ], "overmap": "mansion_c4d_west" }, + { "point": [ 1, 2, -1 ], "overmap": "mansion_t7d_north" }, + { "point": [ 2, 2, -1 ], "overmap": "mansion_c3d_south" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 15, 50 ], + "occurrences": [ 0, 0 ], + "flags": [ "UNIQUE", "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "desolate barn", + "locations": [ "land" ], + "city_distance": [ 10, 40 ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "desolatebarn_north" } ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Homeless Camp", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "homelesscamp_north" } ], + "locations": [ "land" ], + "city_distance": [ 3, 10 ], + "city_sizes": [ 8, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "URBAN" ] + }, + { + "type": "overmap_special", + "id": "Moonshine Still", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "moonshine_still_north" }, + { "point": [ 0, 0, 1 ], "overmap": "moonshine_still_roof_north" } + ], + "locations": [ "forest" ], + "city_distance": [ 20, 60 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Moonshine Still 1", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "moonshine_still_1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "moonshine_still_roof_1_north" } + ], + "locations": [ "forest" ], + "city_distance": [ 20, 60 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Moonshine Still 2", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "moonshine_still_2_north" }, + { "point": [ 0, 0, 1 ], "overmap": "moonshine_still_roof_2_north" } + ], + "locations": [ "forest" ], + "city_distance": [ 20, 60 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "ws_survivor_bunker_place", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "ws_survivor_bunker_f0_north" }, + { "point": [ 0, 0, -1 ], "overmap": "ws_survivor_bunker_f-1_north" } + ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "ws_survivor_camp_place", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "ws_survivor_camp_north" } ], + "locations": [ "wilderness" ], + "city_distance": [ 25, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "ws_fire_lookout_tower", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "ws_fire_lookout_tower_base_north" }, + { "point": [ 0, 0, 1 ], "overmap": "ws_fire_lookout_tower_f1_north" }, + { "point": [ 0, 0, 2 ], "overmap": "ws_fire_lookout_tower_f2_north" }, + { "point": [ 0, 0, 3 ], "overmap": "ws_fire_lookout_tower_f3_north" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 0, 0 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "lake_shore_dock_small", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface", "locations": [ "lake_surface" ] }, + { "point": [ 1, 0, 0 ], "overmap": "lake_dock_small_north", "locations": [ "lake_surface" ] }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface", "locations": [ "lake_surface" ] }, + { "point": [ 0, 1, 0 ], "overmap": "lake_shore", "locations": [ "lake_shore" ] }, + { "point": [ 1, 1, 0 ], "overmap": "lake_shore_dock_small_north", "locations": [ "lake_shore" ] }, + { "point": [ 2, 1, 0 ], "overmap": "lake_shore", "locations": [ "lake_shore" ] } + ], + "city_sizes": [ 1, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "LAKE" ] + }, + { + "type": "overmap_special", + "id": "Island", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "forest_water" }, + { "point": [ 3, 3, 0 ], "overmap": "island_forest_thick_north" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 5, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Lighthouse Island", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_cabin_water_north" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 0 ], "overmap": "lighthouse_ground_north" }, + { "point": [ 1, 1, 1 ], "overmap": "lighthouse_z1_north" }, + { "point": [ 1, 1, 2 ], "overmap": "lighthouse_z2_north" }, + { "point": [ 1, 1, 3 ], "overmap": "lighthouse_z3_north" }, + { "point": [ 1, 1, 4 ], "overmap": "lighthouse_z4_north" }, + { "point": [ 1, 1, 5 ], "overmap": "lighthouse_z5_north" }, + { "point": [ 1, 1, 6 ], "overmap": "lighthouse_roof_north" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_cabin_water_north" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 2, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "LAKE" ] + }, + { + "type": "overmap_special", + "id": "Lake Cabin", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_cabin_water_north" }, + { "point": [ 1, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 2, 0 ], "overmap": "lake_cabin_boathouse_north" }, + { "point": [ 3, 2, 1 ], "overmap": "lake_cabin_boathouse_roof_north" }, + { "point": [ 4, 2, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 3, 0 ], "overmap": "cabin_lake_north" }, + { "point": [ 2, 3, 1 ], "overmap": "cabin_lake_roof_north" }, + { "point": [ 3, 3, 0 ], "overmap": "forest_thick" }, + { "point": [ 4, 3, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 3, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 3, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, + { "point": [ 5, 4, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 3, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 4, 5, 0 ], "overmap": "lake_surface" }, + { "point": [ 5, 5, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 4, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] + }, + { + "id": "airliner_crashed", + "type": "overmap_special", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "airliner_1a_north" }, + { "point": [ 1, 0, 0 ], "overmap": "airliner_2a_north" }, + { "point": [ 2, 0, 0 ], "overmap": "airliner_3a_north" }, + { "point": [ 0, 1, 0 ], "overmap": "airliner_1b_north" }, + { "point": [ 1, 1, 0 ], "overmap": "airliner_2b_north" }, + { "point": [ 2, 1, 0 ], "overmap": "airliner_3b_north" }, + { "point": [ 0, 2, 0 ], "overmap": "airliner_1c_north" }, + { "point": [ 1, 2, 0 ], "overmap": "airliner_2c_north" }, + { "point": [ 2, 2, 0 ], "overmap": "airliner_3c_north" }, + { "point": [ 0, 3, 0 ], "overmap": "airliner_1d_north" }, + { "point": [ 1, 3, 0 ], "overmap": "airliner_2d_north" }, + { "point": [ 2, 3, 0 ], "overmap": "airliner_3d_north" }, + { "point": [ 0, 4, 0 ], "overmap": "airliner_1e_north" }, + { "point": [ 1, 4, 0 ], "overmap": "airliner_2e_north" }, + { "point": [ 2, 4, 0 ], "overmap": "airliner_3e_north" }, + { "point": [ 0, 5, 0 ], "overmap": "airliner_1f_north" }, + { "point": [ 1, 5, 0 ], "overmap": "airliner_2f_north" }, + { "point": [ 2, 5, 0 ], "overmap": "airliner_3f_north" }, + { "point": [ 0, 6, 0 ], "overmap": "airliner_1g_north" }, + { "point": [ 1, 6, 0 ], "overmap": "airliner_2g_north" }, + { "point": [ 2, 6, 0 ], "overmap": "airliner_3g_north" }, + { "point": [ 0, 7, 0 ], "overmap": "airliner_1h_north" }, + { "point": [ 1, 7, 0 ], "overmap": "airliner_2h_north" }, + { "point": [ 2, 7, 0 ], "overmap": "airliner_3h_north" }, + { "point": [ 0, 8, 0 ], "overmap": "airliner_1i_north" }, + { "point": [ 1, 8, 0 ], "overmap": "airliner_2i_north" }, + { "point": [ 2, 8, 0 ], "overmap": "airliner_3i_north" }, + { "point": [ 0, 9, 0 ], "overmap": "airliner_1j_north" }, + { "point": [ 1, 9, 0 ], "overmap": "airliner_2j_north" }, + { "point": [ 2, 9, 0 ], "overmap": "airliner_3j_north" }, + { "point": [ 1, 0, 1 ], "overmap": "airliner_2a_1_north" }, + { "point": [ 1, 1, 1 ], "overmap": "airliner_2b_1_north" }, + { "point": [ 1, 2, 1 ], "overmap": "airliner_2c_1_north" }, + { "point": [ 1, 1, -1 ], "overmap": "airliner_2b_-1_north" }, + { "point": [ 1, 2, -1 ], "overmap": "airliner_2c_-1_north" } + ], + "locations": [ "land" ], + "city_distance": [ 6, -1 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "mil_base", + "overmaps": [ + { "point": [ 3, -2, 0 ], "overmap": "road_end_north" }, + { "point": [ 0, 0, 0 ], "overmap": "mil_base_1a_north" }, + { "point": [ 1, 0, 0 ], "overmap": "mil_base_2a_north" }, + { "point": [ 2, 0, 0 ], "overmap": "mil_base_3a_north" }, + { "point": [ 3, 0, 0 ], "overmap": "mil_base_4a_north" }, + { "point": [ 4, 0, 0 ], "overmap": "mil_base_5a_north" }, + { "point": [ 5, 0, 0 ], "overmap": "mil_base_6a_north" }, + { "point": [ 6, 0, 0 ], "overmap": "mil_base_7a_north" }, + { "point": [ 7, 0, 0 ], "overmap": "mil_base_8a_north" }, + { "point": [ 0, 1, 0 ], "overmap": "mil_base_1b_north" }, + { "point": [ 1, 1, 0 ], "overmap": "mil_base_2b_north" }, + { "point": [ 2, 1, 0 ], "overmap": "mil_base_3b_north" }, + { "point": [ 3, 1, 0 ], "overmap": "mil_base_4b_north" }, + { "point": [ 4, 1, 0 ], "overmap": "mil_base_5b_north" }, + { "point": [ 5, 1, 0 ], "overmap": "mil_base_6b_north" }, + { "point": [ 6, 1, 0 ], "overmap": "mil_base_7b_north" }, + { "point": [ 7, 1, 0 ], "overmap": "mil_base_8b_north" }, + { "point": [ 0, 2, 0 ], "overmap": "mil_base_1c_north" }, + { "point": [ 1, 2, 0 ], "overmap": "mil_base_2c_north" }, + { "point": [ 2, 2, 0 ], "overmap": "mil_base_3c_north" }, + { "point": [ 3, 2, 0 ], "overmap": "mil_base_4c_north" }, + { "point": [ 4, 2, 0 ], "overmap": "mil_base_5c_north" }, + { "point": [ 5, 2, 0 ], "overmap": "mil_base_6c_north" }, + { "point": [ 6, 2, 0 ], "overmap": "mil_base_7c_north" }, + { "point": [ 7, 2, 0 ], "overmap": "mil_base_8c_north" }, + { "point": [ 0, 3, 0 ], "overmap": "mil_base_1d_north" }, + { "point": [ 1, 3, 0 ], "overmap": "mil_base_2d_north" }, + { "point": [ 2, 3, 0 ], "overmap": "mil_base_3d_north" }, + { "point": [ 3, 3, 0 ], "overmap": "mil_base_4d_north" }, + { "point": [ 4, 3, 0 ], "overmap": "mil_base_5d_north" }, + { "point": [ 5, 3, 0 ], "overmap": "mil_base_6d_north" }, + { "point": [ 6, 3, 0 ], "overmap": "mil_base_7d_north" }, + { "point": [ 7, 3, 0 ], "overmap": "mil_base_8d_north" }, + { "point": [ 0, 4, 0 ], "overmap": "mil_base_1e_north" }, + { "point": [ 1, 4, 0 ], "overmap": "mil_base_2e_north" }, + { "point": [ 2, 4, 0 ], "overmap": "mil_base_3e_north" }, + { "point": [ 3, 4, 0 ], "overmap": "mil_base_4e_north" }, + { "point": [ 4, 4, 0 ], "overmap": "mil_base_5e_north" }, + { "point": [ 5, 4, 0 ], "overmap": "mil_base_6e_north" }, + { "point": [ 6, 4, 0 ], "overmap": "mil_base_7e_north" }, + { "point": [ 7, 4, 0 ], "overmap": "mil_base_8e_north" }, + { "point": [ 0, 5, 0 ], "overmap": "mil_base_1f_north" }, + { "point": [ 1, 5, 0 ], "overmap": "mil_base_2f_north" }, + { "point": [ 2, 5, 0 ], "overmap": "mil_base_3f_north" }, + { "point": [ 3, 5, 0 ], "overmap": "mil_base_4f_north" }, + { "point": [ 4, 5, 0 ], "overmap": "mil_base_5f_north" }, + { "point": [ 5, 5, 0 ], "overmap": "mil_base_6f_north" }, + { "point": [ 6, 5, 0 ], "overmap": "mil_base_7f_north" }, + { "point": [ 7, 5, 0 ], "overmap": "mil_base_8f_north" }, + { "point": [ 0, 6, 0 ], "overmap": "mil_base_1g_north" }, + { "point": [ 1, 6, 0 ], "overmap": "mil_base_2g_north" }, + { "point": [ 2, 6, 0 ], "overmap": "mil_base_3g_north" }, + { "point": [ 3, 6, 0 ], "overmap": "mil_base_4g_north" }, + { "point": [ 4, 6, 0 ], "overmap": "mil_base_5g_north" }, + { "point": [ 5, 6, 0 ], "overmap": "mil_base_6g_north" }, + { "point": [ 6, 6, 0 ], "overmap": "mil_base_7g_north" }, + { "point": [ 7, 6, 0 ], "overmap": "mil_base_8g_north" }, + { "point": [ 0, 7, 0 ], "overmap": "mil_base_1h_north" }, + { "point": [ 1, 7, 0 ], "overmap": "mil_base_2h_north" }, + { "point": [ 2, 7, 0 ], "overmap": "mil_base_3h_north" }, + { "point": [ 3, 7, 0 ], "overmap": "mil_base_4h_north" }, + { "point": [ 4, 7, 0 ], "overmap": "mil_base_5h_north" }, + { "point": [ 5, 7, 0 ], "overmap": "mil_base_6h_north" }, + { "point": [ 6, 7, 0 ], "overmap": "mil_base_7h_north" }, + { "point": [ 7, 7, 0 ], "overmap": "mil_base_8h_north" }, + { "point": [ 0, 8, 0 ], "overmap": "mil_base_1i_north" }, + { "point": [ 1, 8, 0 ], "overmap": "mil_base_2i_north" }, + { "point": [ 2, 8, 0 ], "overmap": "mil_base_3i_north" }, + { "point": [ 3, 8, 0 ], "overmap": "mil_base_4i_north" }, + { "point": [ 4, 8, 0 ], "overmap": "mil_base_5i_north" }, + { "point": [ 5, 8, 0 ], "overmap": "mil_base_6i_north" }, + { "point": [ 6, 8, 0 ], "overmap": "mil_base_7i_north" }, + { "point": [ 7, 8, 0 ], "overmap": "mil_base_8i_north" }, + { "point": [ 0, 9, 0 ], "overmap": "mil_base_1j_north" }, + { "point": [ 1, 9, 0 ], "overmap": "mil_base_2j_north" }, + { "point": [ 2, 9, 0 ], "overmap": "mil_base_3j_north" }, + { "point": [ 3, 9, 0 ], "overmap": "mil_base_4j_north" }, + { "point": [ 4, 9, 0 ], "overmap": "mil_base_5j_north" }, + { "point": [ 5, 9, 0 ], "overmap": "mil_base_6j_north" }, + { "point": [ 6, 9, 0 ], "overmap": "mil_base_7j_north" }, + { "point": [ 7, 9, 0 ], "overmap": "mil_base_8j_north" }, + { "point": [ 0, 10, 0 ], "overmap": "mil_base_1k_north" }, + { "point": [ 1, 10, 0 ], "overmap": "mil_base_2k_north" }, + { "point": [ 2, 10, 0 ], "overmap": "mil_base_3k_north" }, + { "point": [ 3, 10, 0 ], "overmap": "mil_base_4k_north" }, + { "point": [ 4, 10, 0 ], "overmap": "mil_base_5k_north" }, + { "point": [ 5, 10, 0 ], "overmap": "mil_base_6k_north" }, + { "point": [ 6, 10, 0 ], "overmap": "mil_base_7k_north" }, + { "point": [ 7, 10, 0 ], "overmap": "mil_base_8k_north" }, + { "point": [ 0, -1, 0 ], "overmap": "mil_base_minefield_n_north" }, + { "point": [ 1, -1, 0 ], "overmap": "mil_base_minefield_n_north" }, + { "point": [ 2, -1, 0 ], "overmap": "mil_base_minefield_ne_north" }, + { "point": [ 3, -1, 0 ], "overmap": "mil_base_road_entrance_north" }, + { "point": [ 4, -1, 0 ], "overmap": "mil_base_minefield_nw_north" }, + { "point": [ 5, -1, 0 ], "overmap": "mil_base_minefield_n_north" }, + { "point": [ 6, -1, 0 ], "overmap": "mil_base_minefield_n_north" }, + { "point": [ 7, -1, 0 ], "overmap": "mil_base_minefield_n_north" }, + { "point": [ 8, -1, 0 ], "overmap": "mil_base_minefield_ne_north" }, + { "point": [ 8, 0, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 1, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 2, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 3, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 4, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 5, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 6, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 7, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 8, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 9, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 10, 0 ], "overmap": "mil_base_minefield_e_north" }, + { "point": [ 8, 11, 0 ], "overmap": "mil_base_minefield_se_north" }, + { "point": [ 7, 11, 0 ], "overmap": "mil_base_minefield_s_north" }, + { "point": [ 6, 11, 0 ], "overmap": "mil_base_minefield_s_north" }, + { "point": [ 5, 11, 0 ], "overmap": "mil_base_minefield_s_north" }, + { "point": [ 4, 11, 0 ], "overmap": "mil_base_minefield_s_north" }, + { "point": [ 3, 11, 0 ], "overmap": "mil_base_minefield_s_north" }, + { "point": [ 2, 11, 0 ], "overmap": "mil_base_minefield_s_north" }, + { "point": [ 1, 11, 0 ], "overmap": "mil_base_minefield_s_north" }, + { "point": [ 0, 11, 0 ], "overmap": "mil_base_minefield_s_north" }, + { "point": [ -1, 11, 0 ], "overmap": "mil_base_minefield_sw_north" }, + { "point": [ -1, 10, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 9, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 8, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 7, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 6, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 5, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 4, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 3, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 2, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 1, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, 0, 0 ], "overmap": "mil_base_minefield_w_north" }, + { "point": [ -1, -1, 0 ], "overmap": "mil_base_minefield_nw_north" }, + { "point": [ 5, 4, -1 ], "overmap": "mil_base_tunnels_a_north" }, + { "point": [ 5, 5, -1 ], "overmap": "mil_base_tunnels_b_north" }, + { "point": [ 5, 6, -1 ], "overmap": "mil_base_tunnels_c_north" }, + { "point": [ 5, 7, -1 ], "overmap": "mil_base_tunnels_b_north" }, + { "point": [ 5, 8, -1 ], "overmap": "mil_base_tunnels_d_north" }, + { "point": [ 4, 6, -1 ], "overmap": "mil_base_tunnels_e_north" }, + { "point": [ 4, 7, -1 ], "overmap": "mil_base_tunnels_f_north" }, + { "point": [ 3, 6, -1 ], "overmap": "mil_base_tunnels_g_north" }, + { "point": [ 2, 6, -1 ], "overmap": "mil_base_tunnels_h_north" }, + { "point": [ 6, 4, -1 ], "overmap": "mil_base_tunnels_i_north" }, + { "point": [ 0, 0, 1 ], "overmap": "mil_base_1a1_north" }, + { "point": [ 1, 0, 1 ], "overmap": "mil_base_2a1_north" }, + { "point": [ 2, 0, 1 ], "overmap": "mil_base_3a1_north" }, + { "point": [ 3, 0, 1 ], "overmap": "mil_base_4a1_north" }, + { "point": [ 4, 0, 1 ], "overmap": "mil_base_5a1_north" }, + { "point": [ 5, 0, 1 ], "overmap": "mil_base_6a1_north" }, + { "point": [ 6, 0, 1 ], "overmap": "mil_base_7a1_north" }, + { "point": [ 7, 0, 1 ], "overmap": "mil_base_8a1_north" }, + { "point": [ 0, 1, 1 ], "overmap": "mil_base_1b1_north" }, + { "point": [ 1, 1, 1 ], "overmap": "mil_base_2b1_north" }, + { "point": [ 2, 1, 1 ], "overmap": "mil_base_3b1_north" }, + { "point": [ 3, 1, 1 ], "overmap": "mil_base_4b1_north" }, + { "point": [ 4, 1, 1 ], "overmap": "mil_base_5b1_north" }, + { "point": [ 5, 1, 1 ], "overmap": "mil_base_6b1_north" }, + { "point": [ 6, 1, 1 ], "overmap": "mil_base_7b1_north" }, + { "point": [ 7, 1, 1 ], "overmap": "mil_base_8b1_north" }, + { "point": [ 0, 2, 1 ], "overmap": "mil_base_1c1_north" }, + { "point": [ 1, 2, 1 ], "overmap": "mil_base_2c1_north" }, + { "point": [ 2, 2, 1 ], "overmap": "mil_base_3c1_north" }, + { "point": [ 3, 2, 1 ], "overmap": "mil_base_4c1_north" }, + { "point": [ 4, 2, 1 ], "overmap": "mil_base_5c1_north" }, + { "point": [ 5, 2, 1 ], "overmap": "mil_base_6c1_north" }, + { "point": [ 6, 2, 1 ], "overmap": "mil_base_7c1_north" }, + { "point": [ 7, 2, 1 ], "overmap": "mil_base_8c1_north" }, + { "point": [ 0, 3, 1 ], "overmap": "mil_base_1d1_north" }, + { "point": [ 1, 3, 1 ], "overmap": "mil_base_2d1_north" }, + { "point": [ 2, 3, 1 ], "overmap": "mil_base_3d1_north" }, + { "point": [ 3, 3, 1 ], "overmap": "mil_base_4d1_north" }, + { "point": [ 4, 3, 1 ], "overmap": "mil_base_5d1_north" }, + { "point": [ 5, 3, 1 ], "overmap": "mil_base_6d1_north" }, + { "point": [ 6, 3, 1 ], "overmap": "mil_base_7d1_north" }, + { "point": [ 7, 3, 1 ], "overmap": "mil_base_8d1_north" }, + { "point": [ 0, 4, 1 ], "overmap": "mil_base_1e1_north" }, + { "point": [ 1, 4, 1 ], "overmap": "mil_base_2e1_north" }, + { "point": [ 2, 4, 1 ], "overmap": "mil_base_3e1_north" }, + { "point": [ 3, 4, 1 ], "overmap": "mil_base_4e1_north" }, + { "point": [ 4, 4, 1 ], "overmap": "mil_base_5e1_north" }, + { "point": [ 5, 4, 1 ], "overmap": "mil_base_6e1_north" }, + { "point": [ 6, 4, 1 ], "overmap": "mil_base_7e1_north" }, + { "point": [ 7, 4, 1 ], "overmap": "mil_base_8e1_north" }, + { "point": [ 0, 5, 1 ], "overmap": "mil_base_1f1_north" }, + { "point": [ 1, 5, 1 ], "overmap": "mil_base_2f1_north" }, + { "point": [ 2, 5, 1 ], "overmap": "mil_base_3f1_north" }, + { "point": [ 3, 5, 1 ], "overmap": "mil_base_4f1_north" }, + { "point": [ 4, 5, 1 ], "overmap": "mil_base_5f1_north" }, + { "point": [ 5, 5, 1 ], "overmap": "mil_base_6f1_north" }, + { "point": [ 6, 5, 1 ], "overmap": "mil_base_7f1_north" }, + { "point": [ 7, 5, 1 ], "overmap": "mil_base_8f1_north" }, + { "point": [ 0, 6, 1 ], "overmap": "mil_base_1g1_north" }, + { "point": [ 1, 6, 1 ], "overmap": "mil_base_2g1_north" }, + { "point": [ 2, 6, 1 ], "overmap": "mil_base_3g1_north" }, + { "point": [ 3, 6, 1 ], "overmap": "mil_base_4g1_north" }, + { "point": [ 4, 6, 1 ], "overmap": "mil_base_5g1_north" }, + { "point": [ 5, 6, 1 ], "overmap": "mil_base_6g1_north" }, + { "point": [ 6, 6, 1 ], "overmap": "mil_base_7g1_north" }, + { "point": [ 7, 6, 1 ], "overmap": "mil_base_8g1_north" }, + { "point": [ 0, 7, 1 ], "overmap": "mil_base_1h1_north" }, + { "point": [ 1, 7, 1 ], "overmap": "mil_base_2h1_north" }, + { "point": [ 2, 7, 1 ], "overmap": "mil_base_3h1_north" }, + { "point": [ 3, 7, 1 ], "overmap": "mil_base_4h1_north" }, + { "point": [ 4, 7, 1 ], "overmap": "mil_base_5h1_north" }, + { "point": [ 5, 7, 1 ], "overmap": "mil_base_6h1_north" }, + { "point": [ 6, 7, 1 ], "overmap": "mil_base_7h1_north" }, + { "point": [ 7, 7, 1 ], "overmap": "mil_base_8h1_north" }, + { "point": [ 0, 8, 1 ], "overmap": "mil_base_1i1_north" }, + { "point": [ 1, 8, 1 ], "overmap": "mil_base_2i1_north" }, + { "point": [ 2, 8, 1 ], "overmap": "mil_base_3i1_north" }, + { "point": [ 3, 8, 1 ], "overmap": "mil_base_4i1_north" }, + { "point": [ 4, 8, 1 ], "overmap": "mil_base_5i1_north" }, + { "point": [ 5, 8, 1 ], "overmap": "mil_base_6i1_north" }, + { "point": [ 6, 8, 1 ], "overmap": "mil_base_7i1_north" }, + { "point": [ 7, 8, 1 ], "overmap": "mil_base_8i1_north" }, + { "point": [ 0, 9, 1 ], "overmap": "mil_base_1j1_north" }, + { "point": [ 1, 9, 1 ], "overmap": "mil_base_2j1_north" }, + { "point": [ 2, 9, 1 ], "overmap": "mil_base_3j1_north" }, + { "point": [ 3, 9, 1 ], "overmap": "mil_base_4j1_north" }, + { "point": [ 4, 9, 1 ], "overmap": "mil_base_5j1_north" }, + { "point": [ 5, 9, 1 ], "overmap": "mil_base_6j1_north" }, + { "point": [ 6, 9, 1 ], "overmap": "mil_base_7j1_north" }, + { "point": [ 7, 9, 1 ], "overmap": "mil_base_8j1_north" }, + { "point": [ 0, 10, 1 ], "overmap": "mil_base_1k1_north" }, + { "point": [ 1, 10, 1 ], "overmap": "mil_base_2k1_north" }, + { "point": [ 2, 10, 1 ], "overmap": "mil_base_3k1_north" }, + { "point": [ 3, 10, 1 ], "overmap": "mil_base_4k1_north" }, + { "point": [ 4, 10, 1 ], "overmap": "mil_base_5k1_north" }, + { "point": [ 5, 10, 1 ], "overmap": "mil_base_6k1_north" }, + { "point": [ 6, 10, 1 ], "overmap": "mil_base_7k1_north" }, + { "point": [ 7, 10, 1 ], "overmap": "mil_base_8k1_north" }, + { "point": [ 2, 8, 2 ], "overmap": "mil_base_3i2_north" }, + { "point": [ 2, 8, 3 ], "overmap": "mil_base_3i3_north" }, + { "point": [ 2, 8, 4 ], "overmap": "mil_base_3i4_north" } + ], + "locations": [ "field" ], + "connections": [ { "point": [ 3, -2, 0 ] } ], + "city_distance": [ 5, -1 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 0 ], + "//": "Inflated chance, in effect ~10%", + "flags": [ "MILITARY", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Freshwater Research Station", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 1, 1 ], "overmap": "sealab_small_roof_north" }, + { "point": [ 1, 1, 0 ], "overmap": "sealab_small_surface_north" }, + { "point": [ 1, 1, -1 ], "overmap": "sealab_small_-1_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 1, 1, -2 ], "overmap": "sealab_small_-2_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 1, 1, -3 ], "overmap": "sealab_small_-3_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 1, 1, -4 ], "overmap": "sealab_small_-4_north", "locations": [ "lake_water_cube" ] }, + { "point": [ 1, 1, -5 ], "overmap": "sealab_small_-5_north", "locations": [ "lake_bed" ] }, + { "point": [ 2, 1, 0 ], "overmap": "lake_surface" }, + { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 1, 2, 0 ], "overmap": "lake_surface" }, + { "point": [ 2, 2, 0 ], "overmap": "lake_surface" } + ], + "locations": [ "lake_surface" ], + "city_sizes": [ 1, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "LAKE" ] + }, + { + "type": "overmap_special", + "id": "Bastion Fort", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "fort_1a_north" }, + { "point": [ 1, 0, 0 ], "overmap": "fort_2a_north" }, + { "point": [ 2, 0, 0 ], "overmap": "fort_3a_north" }, + { "point": [ 3, 0, 0 ], "overmap": "fort_4a_north" }, + { "point": [ 0, 1, 0 ], "overmap": "fort_1b_north" }, + { "point": [ 1, 1, 0 ], "overmap": "fort_2b_north" }, + { "point": [ 2, 1, 0 ], "overmap": "fort_3b_north" }, + { "point": [ 3, 1, 0 ], "overmap": "fort_4b_north" }, + { "point": [ 0, 2, 0 ], "overmap": "fort_1c_north" }, + { "point": [ 1, 2, 0 ], "overmap": "fort_2c_north" }, + { "point": [ 2, 2, 0 ], "overmap": "fort_3c_north" }, + { "point": [ 3, 2, 0 ], "overmap": "fort_4c_north" }, + { "point": [ 0, 0, 1 ], "overmap": "fort_1a_1_north" }, + { "point": [ 1, 0, 1 ], "overmap": "fort_2a_1_north" }, + { "point": [ 2, 0, 1 ], "overmap": "fort_3a_1_north" }, + { "point": [ 3, 0, 1 ], "overmap": "fort_4a_1_north" }, + { "point": [ 0, 1, 1 ], "overmap": "fort_1b_1_north" }, + { "point": [ 1, 1, 1 ], "overmap": "fort_2b_1_north" }, + { "point": [ 2, 1, 1 ], "overmap": "fort_3b_1_north" }, + { "point": [ 3, 1, 1 ], "overmap": "fort_4b_1_north" }, + { "point": [ 0, 2, 1 ], "overmap": "fort_1c_1_north" }, + { "point": [ 1, 2, 1 ], "overmap": "fort_2c_1_north" }, + { "point": [ 2, 2, 1 ], "overmap": "fort_3c_1_north" }, + { "point": [ 3, 2, 1 ], "overmap": "fort_4c_1_north" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 10, 100 ], + "city_sizes": [ 0, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "Occupied LMOE Shelter", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lmoe_zombie_north" }, + { "point": [ 0, 0, 1 ], "overmap": "lmoe_roof_north" }, + { "point": [ 0, 0, -1 ], "overmap": "lmoe_zombie_under_empty_north" } + ], + "locations": [ "forest_without_trail" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "Cabin_prepper", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "cabin_prepper_north" }, + { "point": [ 0, 0, 1 ], "overmap": "cabin_roof_1_north" }, + { "point": [ 0, 0, -1 ], "overmap": "cabin_prepper_shelter_north" } + ], + "locations": [ "forest" ], + "city_distance": [ 25, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "Hunting Lodge", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lodge_ground1_north" }, + { "point": [ 1, 0, 0 ], "overmap": "lodge_ground2_north" }, + { "point": [ 0, 0, 1 ], "overmap": "lodge_2ndfloor1_north" }, + { "point": [ 1, 0, 1 ], "overmap": "lodge_2ndfloor2_north" }, + { "point": [ 0, 0, -1 ], "overmap": "lodge_basement_residential1_north" }, + { "point": [ 1, 0, -1 ], "overmap": "lodge_basement_residential2_north" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true } ], + "locations": [ "land", "swamp" ], + "city_distance": [ 15, -1 ], + "city_sizes": [ 0, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "bunker shop", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "bunker_shop_g_south" }, + { "point": [ 0, 0, -1 ], "overmap": "bunker_shop_b_south" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true, "connection": "local_road", "from": [ 0, 0, 0 ] } ], + "locations": [ "wilderness" ], + "city_distance": [ 10, -1 ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "UNIQUE", "WILDERNESS" ] + }, + { + "type": "overmap_special", + "id": "gas station bunker", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_gas_g0_south" }, + { "point": [ 0, 1, 0 ], "overmap": "s_gas_g1_south" }, + { "point": [ 0, 1, -1 ], "overmap": "s_gas_b11_south" }, + { "point": [ 0, 0, -2 ], "overmap": "s_gas_b20_south" }, + { "point": [ 0, 1, -2 ], "overmap": "s_gas_b21_south" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true, "connection": "local_road", "from": [ 0, 0, 0 ] } ], + "locations": [ "wilderness" ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC", "UNIQUE" ] + } +] diff --git a/data/mods/innawood/overmap/terrain_hardcoded.json b/data/mods/innawood/overmap/terrain_hardcoded.json new file mode 100644 index 0000000000000..4fcb4346196d3 --- /dev/null +++ b/data/mods/innawood/overmap/terrain_hardcoded.json @@ -0,0 +1,42 @@ +[ + { + "type": "overmap_terrain", + "id": "cave_innawood", + "name": "cave", + "looks_like": "cave", + "sym": "C", + "color": "brown", + "see_cost": 2, + "flags": [ "NO_ROTATE", "SOURCE_SAFETY" ] + }, + { + "type": "overmap_terrain", + "id": "cave_underground_innawood", + "name": "cave", + "looks_like": "cave_underground", + "sym": "C", + "color": "brown", + "see_cost": 2, + "flags": [ "NO_ROTATE", "SOURCE_SAFETY" ] + }, + { + "type": "overmap_terrain", + "id": "cave_rat_underground_innawood", + "name": "rat cave", + "looks_like": "cave_rat_underground", + "sym": "C", + "color": "brown", + "see_cost": 2, + "flags": [ "NO_ROTATE", "SOURCE_SAFETY" ] + }, + { + "type": "overmap_terrain", + "id": "cave_rat_innawood", + "name": "rat cave", + "looks_like": "cave_rat", + "sym": "C", + "color": "dark_gray", + "see_cost": 2, + "flags": [ "KNOWN_DOWN", "NO_ROTATE", "SOURCE_SAFETY" ] + } +] diff --git a/data/mods/innawood/readme.md b/data/mods/innawood/readme.md new file mode 100644 index 0000000000000..7667946e8cece --- /dev/null +++ b/data/mods/innawood/readme.md @@ -0,0 +1,20 @@ +# Goal + +The goal of the mod is to create a 'innawood' experience, where the player can experience exploring an untouched land, and have to craft rather than loot everything they want to use. +- Removal of manmade items: The goal is to remove the spawning of all man made items and structures. Especially if they could give the survivor an edge. +- Make the game more 'innawood' friendly: Several recipes have been added or tweaked. The goal is to make it possible to get to at least around late medieval technology on your own. +- A shift towards a longer, less eventful, more stationary lifestyle. It might take a third of a season to get enough metal to even craft an anvil. Hopefully this will encourage players to plant crops and make plans for surviving the winter. + +# Changes + +- Cities, roads, cabins, and most other man made structures have been removed. +- Caves and monster locations that spawned cool loot now mostly spawn natural items instead. +- Sand spawns somewhat commonly in plains. +- Get a lot of withered plants from smashing young trees. +- Bog iron can be extracted and refined to allow metalworking. +- The old ammonia recipe is back. +- Ammonia, glass from sand, cattail jelly, quicklime, cement, and mortar are auto learned. +- Mortar can be made without a cement mixer, but now requires water. +- Man made junk found on the ground or though foraging is removed. +- You can make nails without first needing a nail. + diff --git a/data/mods/innawood/recipes/armor_head.json b/data/mods/innawood/recipes/armor_head.json new file mode 100644 index 0000000000000..449e2bdfeed42 --- /dev/null +++ b/data/mods/innawood/recipes/armor_head.json @@ -0,0 +1,44 @@ +[ + { + "result": "glasses_safety", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 5, + "time": "2 h", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "tools": [ + [ [ "tongs", -1 ] ], + [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], + [ [ "sheet_metal", -1 ], [ "sheet_metal_small", -1 ] ], + [ [ "forge", 25 ] ] + ], + "components": [ + [ [ "cordage", 1, "LIST" ] ], + [ [ "glass_shard", 3 ], [ "pipe_glass", 1 ], [ "flask_glass", 3 ], [ "test_tube", 6 ], [ "marble", 75 ] ] + ], + "proficiencies": [ { "proficiency": "prof_glassblowing" } ] + }, + { + "result": "goggles_welding", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "mechanics", + "difficulty": 2, + "skills_required": [ "fabrication", 1 ], + "time": "1 h", + "autolearn": true, + "book_learn": [ [ "textbook_fabrication", 3 ], [ "welding_book", 3 ] ], + "components": [ + [ [ "goggles_ski", 1 ], [ "goggles_swim", 1 ], [ "glasses_safety", 1 ] ], + [ [ "eclipse_glasses", 1 ], [ "glass_tinted", 3 ] ], + [ [ "duct_tape", 40 ], [ "medical_tape", 40 ], [ "superglue", 2 ] ] + ], + "proficiencies": [ { "proficiency": "prof_plasticworking" } ] + } +] diff --git a/data/mods/innawood/recipes/medsandchemicals.json b/data/mods/innawood/recipes/medsandchemicals.json new file mode 100644 index 0000000000000..943a621ca058e --- /dev/null +++ b/data/mods/innawood/recipes/medsandchemicals.json @@ -0,0 +1,33 @@ +[ + { + "type": "recipe", + "result": "ammonia", + "category": "CC_CHEM", + "subcategory": "CSC_CHEM_CHEMICALS", + "skill_used": "chemistry", + "difficulty": 5, + "time": "36 m", + "autolearn": true, + "qualities": [ { "id": "CHEM", "level": 1 } ], + "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], + "components": [ + [ [ "water_clean", 1 ], [ "water", 1 ] ], + [ [ "scrap", 1 ] ], + [ [ "charcoal", 5 ], [ "coal_lump", 5 ], [ "lye_powder", 20 ] ] + ] + }, + { + "result": "cattail_jelly", + "byproducts": [ [ "plant_fibre" ] ], + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MEDICAL", + "skill_used": "survival", + "difficulty": 1, + "time": "5 m", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 2 } ], + "components": [ [ [ "cattail_stalk", 4 ] ] ] + } +] diff --git a/data/mods/innawood/recipes/other_materials.json b/data/mods/innawood/recipes/other_materials.json new file mode 100644 index 0000000000000..024171763ba41 --- /dev/null +++ b/data/mods/innawood/recipes/other_materials.json @@ -0,0 +1,114 @@ +[ + { + "type": "recipe", + "activity_level": "fake", + "result": "material_quicklime", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "skills_required": [ "chemistry", 2 ], + "difficulty": 3, + "time": "1 h", + "autolearn": true, + "batch_time_factors": [ 75, 4 ], + "tools": [ [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 250 ], [ "oxy_torch", 50 ] ] ], + "components": [ [ [ "material_limestone", 50 ] ] ] + }, + { + "type": "recipe", + "activity_level": "fake", + "result": "material_cement", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "skills_required": [ "chemistry", 3 ], + "difficulty": 4, + "time": "1 h 30 m", + "autolearn": true, + "batch_time_factors": [ 75, 3 ], + "tools": [ [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 250 ], [ "oxy_torch", 50 ] ] ], + "components": [ [ [ "material_quicklime", 50 ] ], [ [ "material_sand", 50 ], [ "material_gravel", 50 ] ] ] + }, + { + "type": "recipe", + "activity_level": "fake", + "result": "mortar_build", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_OTHER", + "skill_used": "fabrication", + "difficulty": 2, + "time": "10 m", + "autolearn": true, + "batch_time_factors": [ 75, 3 ], + "qualities": [ { "id": "CONTAIN", "level": 1 } ], + "components": [ [ [ "material_cement", 50 ] ], [ [ "material_sand", 150 ] ], [ [ "water", 5 ], [ "water_clean", 5 ] ] ] + }, + { + "result": "steel_lump", + "type": "recipe", + "id_suffix": "from ore", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "proficiencies": [ { "proficiency": "prof_metallurgy" } ], + "difficulty": 1, + "result_mult": 4, + "time": "9 h", + "batch_time_factors": [ 90, 4 ], + "reversible": true, + "autolearn": true, + "tools": [ [ [ "bloomery", -1 ] ] ], + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "iron_ore", 68 ] ], [ [ "charcoal", 165 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "glass_shard", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "skills_required": [ "chemistry", 4 ], + "difficulty": 4, + "time": "30 m", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_glassblowing" } ], + "result_mult": 4, + "qualities": [ { "id": "CHEM", "level": 1 } ], + "tools": [ + [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], + [ [ "sheet_metal", -1 ] ], + [ [ "forge", 25 ] ], + [ [ "surface_heat", 15, "LIST" ] ] + ], + "components": [ + [ [ "material_sand", 10 ] ], + [ [ "ammonia", 1 ] ], + [ [ "salt", 20 ], [ "salt_water", 2 ], [ "saline", 10 ] ], + [ [ "water", 2 ], [ "water_clean", 2 ], [ "salt_water", 2 ], [ "saline", 10 ] ], + [ [ "material_quicklime", 2 ], [ "bone_meal_any", 1, "LIST" ] ] + ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "glass_tinted", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "difficulty": 4, + "time": "30 m", + "autolearn": true, + "batch_time_factors": [ 90, 2 ], + "proficiencies": [ { "proficiency": "prof_glassblowing" } ], + "qualities": [ { "id": "CHEM", "level": 1 } ], + "tools": [ + [ [ "tongs", -1 ] ], + [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], + [ [ "sheet_metal_small", -1 ], [ "sheet_metal", -1 ] ], + [ [ "forge", 60 ] ] + ], + "components": [ [ [ "glass_shard", 2 ] ], [ [ "chem_sulphur", 1 ] ], [ [ "scrap", 1 ] ], [ [ "charcoal", 1 ] ] ] + } +] diff --git a/data/mods/innawood/recipes/recipe_others.json b/data/mods/innawood/recipes/recipe_others.json new file mode 100644 index 0000000000000..a95e1b2012f9b --- /dev/null +++ b/data/mods/innawood/recipes/recipe_others.json @@ -0,0 +1,37 @@ +[ + { + "type": "recipe", + "activity_level": "fake", + "result": "chemistry_set_basic", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_TOOLS", + "skill_used": "fabrication", + "skills_required": [ "chemistry", 2 ], + "time": "2 m", + "reversible": true, + "decomp_learn": 0, + "flags": [ "BLIND_EASY" ], + "autolearn": true, + "components": [ + [ [ "glasses_safety", 1 ] ], + [ [ "hose", 3 ], [ "makeshift_hose", 3 ] ], + [ [ "flask_glass", 4 ], [ "jar_glass_sealed", 4 ], [ "bottle_glass", 4 ], [ "test_tube", 20 ] ], + [ [ "box_small", 1 ], [ "bag_canvas", 1 ], [ "backpack", 1 ], [ "backpack_leather", 1 ], [ "rucksack", 1 ] ] + ] + }, + { + "type": "recipe", + "activity_level": "fake", + "result": "chemistry_set", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_TOOLS", + "skill_used": "fabrication", + "skills_required": [ "chemistry", 2 ], + "time": "3 m", + "reversible": true, + "decomp_learn": 0, + "flags": [ "BLIND_HARD" ], + "autolearn": true, + "components": [ [ [ "cable", 10 ], [ "wire", 1 ] ], [ [ "hotplate", 1 ] ], [ [ "chemistry_set_basic", 1 ] ] ] + } +] diff --git a/data/mods/innawood/recipes/tools_containers.json b/data/mods/innawood/recipes/tools_containers.json new file mode 100644 index 0000000000000..50769c2443401 --- /dev/null +++ b/data/mods/innawood/recipes/tools_containers.json @@ -0,0 +1,78 @@ +[ + { + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "result": "jar_3l_glass_sealed", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_CONTAINERS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "1 h 30 m", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_glassblowing" } ], + "qualities": [ { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "pipe", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 150 ] ] ], + "components": [ [ [ "glass_shard", 5 ], [ "flask_glass", 5 ], [ "test_tube", 10 ], [ "marble", 125 ] ] ] + }, + { + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "result": "bottle_glass", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_CONTAINERS", + "skill_used": "fabrication", + "difficulty": 6, + "time": "1 h", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_glassblowing" } ], + "qualities": [ { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "pipe", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 75 ] ] ], + "components": [ [ [ "glass_shard", 3 ], [ "pipe_glass", 1 ], [ "flask_glass", 3 ], [ "test_tube", 6 ], [ "marble", 75 ] ] ] + }, + { + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "result": "jar_glass_sealed", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_CONTAINERS", + "skill_used": "fabrication", + "difficulty": 5, + "time": "40 m", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_glassblowing" } ], + "qualities": [ { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "pipe", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 50 ] ] ], + "components": [ [ [ "glass_shard", 2 ], [ "flask_glass", 2 ], [ "test_tube", 4 ], [ "marble", 50 ] ] ] + }, + { + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "result": "flask_glass", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_CONTAINERS", + "skill_used": "fabrication", + "difficulty": 4, + "time": "20 m", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_glassblowing" } ], + "qualities": [ { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "pipe", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 25 ] ] ], + "components": [ [ [ "glass_shard", 1 ], [ "test_tube", 2 ], [ "marble", 25 ] ] ] + }, + { + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "result": "test_tube", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_CONTAINERS", + "skill_used": "fabrication", + "difficulty": 4, + "time": "4 m", + "autolearn": true, + "proficiencies": [ { "proficiency": "prof_glassblowing" } ], + "result_mult": 2, + "qualities": [ { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "pipe", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 5 ] ] ], + "components": [ [ [ "glass_shard", 1 ], [ "flask_glass", 1 ], [ "marble", 25 ] ] ] + } +] diff --git a/data/mods/innawood/recipes/tools_hand.json b/data/mods/innawood/recipes/tools_hand.json new file mode 100644 index 0000000000000..c1336957f19d9 --- /dev/null +++ b/data/mods/innawood/recipes/tools_hand.json @@ -0,0 +1,43 @@ +[ + { + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "result": "metalworking_tongs", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_TOOLS", + "skill_used": "fabrication", + "difficulty": 2, + "time": "60 m", + "autolearn": true, + "qualities": [ { "id": "ANVIL", "level": 1 }, { "id": "HAMMER", "level": 2 } ], + "tools": [ [ [ "forge", 150 ], [ "oxy_torch", 30 ] ] ], + "proficiencies": [ + { "proficiency": "prof_metalworking" }, + { "proficiency": "prof_blacksmithing" }, + { "proficiency": "prof_toolsmithing" } + ], + "components": [ + [ [ "steel_lump", 1 ], [ "pipe", 2 ], [ "rebar", 2 ] ], + [ [ "nail", 1 ], [ "steel_chunk", 2 ], [ "scrap", 6 ], [ "steel_lump", 1 ] ] + ] + }, + { + "type": "recipe", + "activity_level": "BRISK_EXERCISE", + "result": "metal_file", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_TOOLS", + "skill_used": "fabrication", + "difficulty": 4, + "time": "2 h", + "autolearn": true, + "proficiencies": [ + { "proficiency": "prof_metalworking" }, + { "proficiency": "prof_blacksmithing" }, + { "proficiency": "prof_toolsmithing" } + ], + "qualities": [ { "id": "CHISEL", "level": 3 }, { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 } ], + "tools": [ [ [ "forge", 20 ], [ "oxy_torch", 20 ], [ "fake_arc_furnace", 10 ] ], [ [ "metalworking_tongs", -1 ] ] ], + "components": [ [ [ "scrap", 2 ], [ "steel_lump", 1 ] ] ] + } +] diff --git a/data/mods/innawood/scenario_whitelist.json b/data/mods/innawood/scenario_whitelist.json new file mode 100644 index 0000000000000..d78ed525645b0 --- /dev/null +++ b/data/mods/innawood/scenario_whitelist.json @@ -0,0 +1,24 @@ +[ + { + "type": "SCENARIO_BLACKLIST", + "subtype": "whitelist", + "scenarios": [ + "evacuee", + "medieval", + "migo_prisoner", + "mutant", + "wilderness", + "strong_portal_storm", + "portal_dependent", + "heli_crash", + "infected", + "hunted_start", + "fungal_start", + "bad_day", + "bordered", + "ambushed", + "summer_advanced_start", + "car_crash" + ] + } +] diff --git a/data/mods/innawood/scenarios.json b/data/mods/innawood/scenarios.json new file mode 100644 index 0000000000000..360c23d265eaa --- /dev/null +++ b/data/mods/innawood/scenarios.json @@ -0,0 +1,130 @@ +[ + { + "type": "scenario", + "id": "evacuee", + "//": "Overriding evacuee to put it at the top of the list of available scenarios.", + "name": "In a cave", + "points": 0, + "description": "Somehow, you found yourself in a cave.", + "allowed_locs": [ "sloc_cave_underground_innawood", "sloc_cave_innawood" ], + "start_name": "Cave", + "flags": [ ] + }, + { + "type": "scenario", + "name": "Infected", + "description": "In the chaos and panic of evacuation, you got bitten by something! You didn't get proper medical care, and now the wound has started turning green.", + "flags": [ "CHALLENGE", "LONE_START" ], + "id": "infected", + "points": -4, + "start_name": "Wilderness", + "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island", "sloc_river" ], + "eoc": [ "scenario_infected" ] + }, + { + "type": "scenario", + "id": "hunted_start", + "name": "Challenge - Hunted", + "points": -2, + "forced_traits": [ "HAS_NEMESIS" ], + "description": "Since the start of the Cataclysm, something has been hunting you relentlessly. You can outrun it, but it always seems to find you eventually. The only escape is for one of you to die.", + "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island", "sloc_river" ], + "start_name": "Wilderness", + "flags": [ "CHALLENGE", "LONE_START" ], + "missions": [ "MISSION_KILL_NEMESIS" ] + }, + { + "type": "scenario", + "id": "fungal_start", + "name": "Challenge - Fungal Infection", + "points": -8, + "description": "You feel spores crawling beneath your skin. It's only a matter of time.", + "start_name": "Wilderness", + "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island", "sloc_river" ], + "eoc": [ "scenario_fungal_infection" ], + "flags": [ "CHALLENGE", "LONE_START" ] + }, + { + "type": "scenario", + "id": "bad_day", + "name": "Challenge - Really Bad Day", + "points": -8, + "description": "You start drunk to the point of incapacitation, depressed, infected, surrounded by fire, and sick with the flu. This day went downhill really fast.", + "start_name": "Wilderness", + "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island", "sloc_river" ], + "professions": [ "svictim", "tweaker" ], + "eoc": [ "scenario_infected", "scenario_bad_day" ], + "flags": [ "FIRE_START", "CHALLENGE", "LONE_START" ] + }, + { + "type": "scenario", + "id": "bordered", + "name": "Challenge - Bordered", + "points": -2, + "description": "You have survived the initial wave of panic, and have achieved (relative) safety in a wilderness. The only thing that really bothers you is a mysterious sky-high wall seen in the distance.", + "start_name": "Wilderness", + "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island", "sloc_river" ], + "flags": [ "CHALLENGE", "BORDERED" ] + }, + { + "type": "scenario", + "id": "ambushed", + "name": "Ambush", + "points": -3, + "description": "It is the winter after zero hour. As you were scavenging for food and a warm place to stay at, you heard the sound of lots of movement nearby.", + "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island", "sloc_river" ], + "start_name": "Outside Town", + "surround_groups": [ [ "GROUP_BLACK_ROAD", 70.0 ] ], + "flags": [ "LONE_START" ], + "custom_initial_date": { "season": "winter" }, + "add_professions": true, + "professions": [ "sheltered_survivor", "sheltered_militia", "winter_scavenger", "winter_army" ] + }, + { + "type": "scenario", + "id": "summer_advanced_start", + "name": "The Next Summer", + "points": 0, + "description": "A little over a year has passed since the apocalypse started, and you're about to face your second summer in Hell.", + "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island", "sloc_river" ], + "start_name": "Outside Town", + "flags": [ "LONE_START" ], + "custom_initial_date": { "season": "summer", "year": 2 }, + "add_professions": true, + "professions": [ "sheltered_survivor", "sheltered_militia", "winter_scavenger", "winter_army" ] + }, + { + "type": "scenario", + "id": "last_flight", + "name": "Last Flight", + "//": "Doesn't seem to spawn the helicopter without a road nearby. Dissabeled until this can be fixed.", + "points": 2, + "description": "Once it became clear that the world was ending you took to the skies, hoping that your flying skills could lead you to safety. During your flight you got lost and had to land on an empty field.", + "start_name": "Emergency Landing Site", + "allowed_locs": [ "sloc_field" ], + "vehicle": "2seater2_scenario", + "professions": [ "heli_pilot" ], + "flags": [ "LONE_START" ] + }, + { + "type": "scenario", + "id": "wilderness", + "name": "Wilderness", + "points": 0, + "description": "You find yourself amongst trees. The screaming and the moaning is fainter this far from civilization, but you'd better know what you're doing out here.", + "start_name": "Wilderness", + "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island", "sloc_river" ], + "flags": [ "LONE_START" ] + }, + { + "type": "scenario", + "id": "car_crash", + "name": "Car Crash", + "points": -2, + "description": "You decided the open road would be a better prospect than the zombie-filled cities. While en route to your destination, you were involved in a wreck. When you look around, you can no longer spot the road you were driving on. Just how hard did you hit your head?", + "allowed_locs": [ "sloc_field" ], + "start_name": "Crash Site", + "map_extra": "mx_mayhem", + "flags": [ "CHALLENGE", "HELI_CRASH", "LONE_START" ] + } +] diff --git a/data/mods/innawood/start_locations.json b/data/mods/innawood/start_locations.json new file mode 100644 index 0000000000000..257006e48ac74 --- /dev/null +++ b/data/mods/innawood/start_locations.json @@ -0,0 +1,14 @@ +[ + { + "type": "start_location", + "id": "sloc_cave_innawood", + "name": "Cave - on the surface", + "terrain": [ "cave_innawood" ] + }, + { + "type": "start_location", + "id": "sloc_cave_underground_innawood", + "name": "Cave - underground", + "terrain": [ "cave_underground_innawood" ] + } +] diff --git a/data/mods/innawood/terrain-floors-outdoors.json b/data/mods/innawood/terrain-floors-outdoors.json new file mode 100644 index 0000000000000..c3c403117caed --- /dev/null +++ b/data/mods/innawood/terrain-floors-outdoors.json @@ -0,0 +1,50 @@ +[ + { + "type": "terrain", + "id": "t_pavement", + "name": "pavement", + "connects_to": "PAVEMENT", + "description": "A segment of asphalt, slowly degrading from cracks, frost heaves and lack of maintenance.", + "symbol": ".", + "color": "dark_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAT", "ROAD", "MINEABLE" ], + "bash": { + "ter_set": "t_null", + "str_min": 50, + "str_max": 400, + "str_min_supported": 100, + "items": [ { "item": "rock", "count": [ 2, 10 ] } ] + } + }, + { + "type": "terrain", + "id": "t_pavement_y", + "name": "yellow pavement", + "connects_to": "PAVEMENT", + "description": "Streaks of carefully aligned yellow paint mark the road to inform drivers not to cross. No one is enforcing these rules anymore.", + "symbol": ".", + "color": "yellow", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAT", "ROAD", "MINEABLE" ], + "bash": { + "ter_set": "t_null", + "str_min": 50, + "str_max": 400, + "str_min_supported": 100, + "items": [ { "item": "rock", "count": [ 2, 10 ] } ] + } + }, + { + "type": "terrain", + "id": "t_bog_iron", + "name": "bog iron", + "description": "A wet pit full of raw bog iron, suitable for bloomery refining if it was extracted properly.", + "symbol": "*", + "looks_like": "f_wreckage", + "color": "brown", + "move_cost": 6, + "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT" ], + "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100, "bash_below": true } + } +] diff --git a/data/mods/innawood/terrain-flora.json b/data/mods/innawood/terrain-flora.json new file mode 100644 index 0000000000000..345db698f1009 --- /dev/null +++ b/data/mods/innawood/terrain-flora.json @@ -0,0 +1,22 @@ +[ + { + "type": "terrain", + "id": "t_tree_young", + "name": "young tree", + "looks_like": "t_tree", + "description": "A relatively young sapling of an indeterminate species. It could take decades before reaching maturity, so there's no use waiting around.", + "symbol": "1", + "color": [ "green", "green", "green", "brown" ], + "//": "barren in winter", + "move_cost": 4, + "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "NOITEM", "YOUNG", "REDUCE_SCENT" ], + "bash": { + "str_min": 4, + "str_max": 50, + "sound": "crunch!", + "sound_fail": "whack!", + "ter_set": "t_dirt", + "items": [ { "item": "stick_long", "count": [ 1, 5 ] }, { "item": "withered", "count": [ 2, 6 ] } ] + } + } +] diff --git a/data/mods/innawood/terrain-walls.json b/data/mods/innawood/terrain-walls.json new file mode 100644 index 0000000000000..10db4fb43d511 --- /dev/null +++ b/data/mods/innawood/terrain-walls.json @@ -0,0 +1,31 @@ +[ + { + "type": "terrain", + "id": "t_rock", + "name": "solid rock", + "description": "It's solid rock, could be full of all kinds of interesting things. Best grab your pickaxe or equivalent digging implement, and strike the earth!", + "symbol": "#", + "color": "white", + "move_cost": 0, + "coverage": 100, + "flags": [ "NOITEM", "SUPPORTS_ROOF", "WALL", "NO_SCENT", "MINEABLE", "BLOCK_WIND" ], + "roof": "t_rock_floor_no_roof", + "bash": { + "str_min": 100, + "str_max": 400, + "sound": "crash!", + "sound_fail": "whump!", + "ter_set": "t_rock_floor", + "ter_set_bashed_from_above": "t_rock_floor_no_roof", + "items": [ + { "item": "rock", "count": [ 3, 7 ] }, + { "item": "coal_lump", "charges": [ 250, 500 ], "prob": 10 }, + { "item": "material_limestone", "charges": [ 10, 25 ], "prob": 80 }, + { "item": "material_rocksalt", "count": [ 0, 1 ], "prob": 20 }, + { "item": "material_rhodonite", "count": [ 0, 1 ], "prob": 3 }, + { "item": "material_zincite", "count": [ 0, 5 ], "prob": 5 }, + { "item": "chunk_sulfur", "count": [ 0, 5 ], "prob": 5 } + ] + } + } +] From 97f83353e0145672cdecc7d2485bb54147fcee37 Mon Sep 17 00:00:00 2001 From: John Bytheway <52664+jbytheway@users.noreply.github.com> Date: Wed, 5 Jan 2022 18:31:00 -0500 Subject: [PATCH 139/154] Fix out of bounds nests in mods Mostly these are just copying the existing dda fixes over to No Hope. There were a few more in the aftershock road mapgen. --- .../Mapgen/city_npc_nested_spawns.json | 28 +++--- data/mods/No_Hope/Mapgen/irradiator_1.json | 10 +- data/mods/No_Hope/Mapgen/islands.json | 20 ++-- data/mods/No_Hope/Mapgen/megastore.json | 43 +++----- .../aftershock_exoplanet/Map/mapgen/road.json | 99 ++++++++++--------- 5 files changed, 94 insertions(+), 106 deletions(-) diff --git a/data/mods/No_Hope/Mapgen/city_npc_nested_spawns.json b/data/mods/No_Hope/Mapgen/city_npc_nested_spawns.json index 5d6c117a02183..7229d8c69c358 100644 --- a/data/mods/No_Hope/Mapgen/city_npc_nested_spawns.json +++ b/data/mods/No_Hope/Mapgen/city_npc_nested_spawns.json @@ -6,21 +6,21 @@ "object": { "mapgensize": [ 13, 13 ], "rows": [ - "mt_________#t", - "____________r", - "__________ffr", - "___________W_", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________", - "_____________" + "mt #t", + " r", + " ffr", + " W ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " ], - "terrain": { "_": "t_null", "-": "t_wall", "W": "t_window_boarded" }, + "terrain": { "-": "t_wall", "W": "t_window_boarded" }, "furniture": { "r": "f_rack", "f": "f_fridge", "t": "f_table", "#": "f_counter", "m": "f_makeshift_bed" }, "place_npcs": [ { "class": "survivor_chef", "x": 5, "y": 1 } ], "place_loot": [ diff --git a/data/mods/No_Hope/Mapgen/irradiator_1.json b/data/mods/No_Hope/Mapgen/irradiator_1.json index 2c1fd2813fadd..0538dab3ff4bb 100644 --- a/data/mods/No_Hope/Mapgen/irradiator_1.json +++ b/data/mods/No_Hope/Mapgen/irradiator_1.json @@ -463,16 +463,16 @@ "place_nested": [ { "chunks": [ - [ "null", 5 ], + [ "null", 30 ], [ "roof_4x4_survivor", 15 ], - [ "roof_16x16_help", 25 ], [ "roof_4x4_holdout", 5 ], [ "roof_6x6_utility", 45 ], [ "roof_5x5_coop", 5 ] ], - "x": [ 11, 23 ], - "y": [ 5, 23 ] - } + "x": [ 11, 18 ], + "y": [ 5, 18 ] + }, + { "chunks": [ [ "null", 75 ], [ "roof_16x16_help", 25 ] ], "x": [ 24, 32 ], "y": [ 5, 8 ] } ] } } diff --git a/data/mods/No_Hope/Mapgen/islands.json b/data/mods/No_Hope/Mapgen/islands.json index a927425a45374..48affa21343c0 100644 --- a/data/mods/No_Hope/Mapgen/islands.json +++ b/data/mods/No_Hope/Mapgen/islands.json @@ -48,8 +48,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } @@ -70,8 +70,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } @@ -92,8 +92,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } @@ -114,8 +114,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } @@ -136,8 +136,8 @@ [ "small_camp_8x8", 5 ], [ "gone_fishing_3x3", 5 ] ], - "x": [ 3, 20 ], - "y": [ 3, 20 ] + "x": [ 3, 16 ], + "y": [ 3, 16 ] } ] } diff --git a/data/mods/No_Hope/Mapgen/megastore.json b/data/mods/No_Hope/Mapgen/megastore.json index d99054b4a1e0b..a3896cf786e5c 100644 --- a/data/mods/No_Hope/Mapgen/megastore.json +++ b/data/mods/No_Hope/Mapgen/megastore.json @@ -2260,15 +2260,14 @@ "place_nested": [ { "chunks": [ - [ "null", 5 ], - [ "roof_16x16_help", 5 ], + [ "null", 10 ], [ "roof_2x2_infrastructure", 80 ], [ "roof_2x2_infrastructure_2", 40 ], [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 7, 22 ], - "y": [ 6, 22 ] + "x": [ 7, 18 ], + "y": [ 6, 18 ] } ] } @@ -2310,20 +2309,7 @@ "rotation": 0, "palettes": [ "megastore" ], "terrain": { " ": "t_flat_roof" }, - "place_nested": [ - { - "chunks": [ - [ "null", 5 ], - [ "roof_16x16_help", 5 ], - [ "roof_2x2_infrastructure", 80 ], - [ "roof_2x2_infrastructure_2", 40 ], - [ "roof_2x2_utilities", 40 ], - [ "roof_6x6_survivor", 5 ] - ], - "x": [ 1, 22 ], - "y": [ 6, 22 ] - } - ] + "place_nested": [ { "chunks": [ [ "null", 160 ], [ "roof_16x16_help", 5 ] ], "x": [ 1, 8 ], "y": [ 6, 8 ] } ] } }, { @@ -2367,14 +2353,13 @@ { "chunks": [ [ "null", 5 ], - [ "roof_16x16_help", 5 ], [ "roof_2x2_infrastructure", 80 ], [ "roof_2x2_infrastructure_2", 40 ], [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 6, 22 ], - "y": [ 7, 22 ] + "x": [ 6, 18 ], + "y": [ 7, 18 ] } ] } @@ -2429,8 +2414,8 @@ [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 1, 22 ], - "y": [ 18, 22 ] + "x": [ 1, 18 ], + "y": [ 18, 18 ] } ] } @@ -2475,8 +2460,8 @@ "place_nested": [ { "chunks": [ [ "null", 5 ], [ "roof_2x2_infrastructure", 20 ], [ "roof_2x2_infrastructure_2", 20 ], [ "roof_2x2_utilities", 20 ] ], - "x": [ 1, 22 ], - "y": [ 1, 6 ] + "x": [ 1, 18 ], + "y": [ 0, 2 ] } ] } @@ -2527,8 +2512,8 @@ [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 1, 22 ], - "y": [ 18, 22 ] + "x": [ 1, 18 ], + "y": [ 16, 18 ] } ] } @@ -2625,8 +2610,8 @@ [ "roof_2x2_utilities", 40 ], [ "roof_6x6_survivor", 5 ] ], - "x": [ 1, 22 ], - "y": [ 7, 22 ] + "x": [ 1, 18 ], + "y": [ 7, 18 ] } ] } diff --git a/data/mods/aftershock_exoplanet/Map/mapgen/road.json b/data/mods/aftershock_exoplanet/Map/mapgen/road.json index 75e1991870d55..9bdc5a3a52d65 100644 --- a/data/mods/aftershock_exoplanet/Map/mapgen/road.json +++ b/data/mods/aftershock_exoplanet/Map/mapgen/road.json @@ -7,29 +7,29 @@ "object": { "predecessor_mapgen": "field", "rows": [ - " .................... ", + " .................1.. ", " 1.................. ", - " 1.................1 ", - " ......1............1 ", + " 1...............1.. ", + " ......1............. ", + " .................1.. ", + " ...............1.... ", + " ................1... ", + " ........1........... ", + " 1................1.. ", " .................... ", - " ...............1...1 ", + " ....1....1.......1.. ", " .................... ", - " ...................1 ", + " .......1.......1.... ", + " ........... .....1.. ", " 1................... ", + " .......1.......1.... ", " .................... ", - " .........1.......1.. ", - " .................... ", - " .......1...........1 ", - " ........... ........ ", - " 1..................1 ", - " ...............1.... ", + " 1...............1... ", + " ....1............... ", + " ...........1.....1.. ", + " ................ .. ", " .................... ", - " 1..................1 ", " .................... ", - " ...........1.......1 ", - " 1............... .. ", - " 1.....1............1 ", - " ...................1 ", " .................... " ], "terrain": { ".": "t_pavement" }, @@ -46,7 +46,7 @@ "rows": [ " ", " ................ ", - " .....1...........1 ", + " .....1..........1. ", " .................... ", " .................... ", " .1.............1.... ", @@ -59,13 +59,13 @@ " .......1............ ", " .................... ", " ...1................ ", - " ...............1.... ", - " .................... ", + " ........1......1.... ", " .................... ", + " .................1.. ", " .................... ", " .1......1......... ", " ................. ", - " 1.............1.. ", + " ................. ", " .................. ", " .................. " ], @@ -83,26 +83,26 @@ "rows": [ " ", " ", - " 1..", + " ...", " ....", " 1....", " ......", " .......", - " 1.......", + " 1..1....", " .........", " 1.........", " ......1....", " ............", - " 1............", - " ..........1...", + " 1.....1......", + " ..............", " ...............", " 1........1......", " .................", - " ..................", + " .......1..........", " .1.................", - " .......1............", + " .......1......1.....", " .....................", - " 1...............1.....", + " ......................", " ..................... ", " .................... " ], @@ -120,31 +120,34 @@ "rows": [ " ", " ", - "..1.....1..........1....", + "..2.....2..........1....", "..............1.........", "........................", - "...1.............1......", - ".........1..............", - "....................1...", - "..1.....................", + "...2.............1......", + ".........2..............", "........................", - ".......1...........1....", + "..2...............1.....", + ".............1..........", + ".......2...........1....", "........................", - ".........1..............", + ".........1.........1....", "........................", - ".....1..................", + ".....1.....1............", ".................1......", - "........................", + "......1.................", "...........1............", - "....................1...", + "...................1....", "....1......1............", "........................", - "..................1..1..", - " .1....1............. ", + "........................", + " .................... ", " .................... " ], "terrain": { ".": "t_pavement" }, - "nested": { "1": { "chunks": [ [ "road_crater", 40 ], [ "road_rift", 10 ], [ "null", 50 ] ] } } + "nested": { + "1": { "chunks": [ [ "road_crater", 50 ], [ "null", 50 ] ] }, + "2": { "chunks": [ [ "road_crater", 30 ], [ "road_rift", 20 ], [ "null", 50 ] ] } + } } }, { @@ -160,24 +163,24 @@ "..1.....1..........1....", "..............1.........", "........................", - "...1.............1......", + "1..1.............1......", ".........1.....1........", - "....................1...", + "........................", "..1.....................", - "............1...........", + "......1.....1...........", "...................1....", "........................", - ".........1..............", + "..1......1....1.........", "........................", ".....1..................", - ".................1......", + ".........1.......1......", "....1...................", "........................", - "....................1...", + "........................", "....1......1............", "........................", - "..................1..1..", - " .1.................. ", + "........................", + " .................... ", " .................... " ], "terrain": { ".": "t_pavement" }, From b07087b3778659adaa1ee9876f2bda86e27f4aea Mon Sep 17 00:00:00 2001 From: FoolsGold45 <46657256+FoolsGold45@users.noreply.github.com> Date: Wed, 5 Jan 2022 19:29:01 -0500 Subject: [PATCH 140/154] Monster Description Audit (#53701) --- data/json/monsters/bird.json | 2 +- data/json/monsters/cyborgs.json | 8 +- data/json/monsters/defense_bot.json | 4 +- data/json/monsters/feral_humans.json | 38 ++++---- data/json/monsters/fish.json | 62 ++++++------- data/json/monsters/fungus.json | 4 +- data/json/monsters/fungus_zombie.json | 4 +- data/json/monsters/insect_spider.json | 108 +++++++++++----------- data/json/monsters/mammal.json | 44 ++++----- data/json/monsters/mechsuits.json | 6 +- data/json/monsters/mi-go.json | 10 +- data/json/monsters/misc.json | 4 +- data/json/monsters/mutant.json | 14 +-- data/json/monsters/mutant_mammal.json | 2 +- data/json/monsters/nether.json | 30 +++--- data/json/monsters/power_leech.json | 4 +- data/json/monsters/reptile_amphibian.json | 8 +- data/json/monsters/robofac_robots.json | 2 +- data/json/monsters/slugs.json | 6 +- data/json/monsters/starers.json | 6 +- data/json/monsters/triffid.json | 8 +- data/json/monsters/turrets.json | 16 ++-- data/json/monsters/utility_bot.json | 8 +- data/json/monsters/zanimal_upgrade.json | 20 ++-- data/json/monsters/zed-animal.json | 24 ++--- data/json/monsters/zed-classic.json | 14 +-- data/json/monsters/zed-medical.json | 8 +- data/json/monsters/zed-pupating.json | 8 +- data/json/monsters/zed-winged.json | 12 +-- data/json/monsters/zed_acid.json | 6 +- data/json/monsters/zed_burned.json | 4 +- data/json/monsters/zed_children.json | 10 +- data/json/monsters/zed_electric.json | 4 +- data/json/monsters/zed_explosive.json | 4 +- data/json/monsters/zed_ferrous.json | 4 +- data/json/monsters/zed_fusion.json | 14 +-- data/json/monsters/zed_lab.json | 6 +- data/json/monsters/zed_misc.json | 34 +++---- data/json/monsters/zed_prisoner.json | 2 +- data/json/monsters/zed_skeletal.json | 2 +- data/json/monsters/zed_soldiers.json | 14 +-- 41 files changed, 294 insertions(+), 294 deletions(-) diff --git a/data/json/monsters/bird.json b/data/json/monsters/bird.json index fbbe12aa2cb41..751f12b4e1bfe 100644 --- a/data/json/monsters/bird.json +++ b/data/json/monsters/bird.json @@ -553,7 +553,7 @@ "id": "mon_pigeon", "type": "MONSTER", "name": { "str": "pigeon" }, - "description": "Pigeons are gentle, plump, small-billed birds with a skin saddle (cere) between the bill and forehead. All pigeons strut about with a characteristic bobbing of the head. Because of their long wings and powerful flight muscles, they are strong, swift fliers.", + "description": "A gentle, plump, small-billed bird with a skin saddle, or cere, between its bill and forehead. On the ground, it struts about with a characteristic bobbing of the head. It is a strong, swift flier thanks to its long wings and powerful flight muscles.", "bodytype": "bird", "default_faction": "small_animal", "categories": [ "WILDLIFE" ], diff --git a/data/json/monsters/cyborgs.json b/data/json/monsters/cyborgs.json index 5b083b4d4ddcc..84f0b62e8a983 100644 --- a/data/json/monsters/cyborgs.json +++ b/data/json/monsters/cyborgs.json @@ -3,7 +3,7 @@ "id": "mon_broken_cyborg", "type": "MONSTER", "name": { "str": "broken cyborg" }, - "description": "A robot body with the head of a human. All kinds of electronic wires and devices are implanted in its head. Patches of skin look diseased or rotting. This cyborg moves erratically and has a confused and deranged look in its eyes.", + "description": "A robot body with the head of a human. All kinds of electronic wires and devices are implanted in its head. The remaining patches of skin look diseased or rotting. This cyborg moves erratically and has a confused and deranged look in its eyes. Any personality or humanity it once had is clearly gone for good.", "default_faction": "science", "bodytype": "human", "species": [ "ROBOT" ], @@ -46,7 +46,7 @@ "id": "mon_prototype_cyborg", "type": "MONSTER", "name": { "str": "prototype cyborg" }, - "description": "A human fused with a mess of metal parts and wires. While its eyes are empty, flashes of pain pass across its face reminiscent of the person trapped in this grotesque body. With enough surgical skills one might be able to give them back some humanity. If only they caredā€¦", + "description": "A human fused with a mess of metal parts and wires. While their eyes are empty, the flashes of pain that occasionally cross their face remind you that, deep down, there is a person just like you trapped in this grotesque body. Someone with enough surgical skills might be able to restore some of their humanity. If only anyone caredā€¦", "default_faction": "science", "bodytype": "human", "species": [ "ROBOT" ], @@ -89,7 +89,7 @@ "id": "mon_exodii_worker", "type": "MONSTER", "name": { "str": "Exodii worker" }, - "description": "This is a mostly humanoid robot equipped with various construction tools.", + "description": "A mostly humanoid robot equipped with various construction tools.", "default_faction": "exodii", "volume": "119 L", "weight": "221 kg", @@ -124,7 +124,7 @@ "id": "mon_exodii_quad", "type": "MONSTER", "name": { "str": "Exodii quadruped" }, - "description": "This enormous quadrupedal robot seems to be cobbled together from parts, most of them unfamiliar to you. It moves with a heavy, oddly graceful gait, its footsteps leaving shallow craters behind. It bristles with an arsenal of weaponry. While it doesn't seem to be in a rush to target you, it would be prudent to keep your distance.", + "description": "This enormous quadrupedal robot seems to be cobbled together from parts, most of them unfamiliar to you. It moves with a heavy, oddly graceful gait, its footsteps leaving shallow craters behind. It bristles with an arsenal of weaponry, and while it doesn't seem to be in a rush to target you, you feel that you should keep your distance anyway.", "default_faction": "exodii", "volume": "413 L", "weight": "517 kg", diff --git a/data/json/monsters/defense_bot.json b/data/json/monsters/defense_bot.json index 0fb335e814b69..8f185b60a1c1e 100644 --- a/data/json/monsters/defense_bot.json +++ b/data/json/monsters/defense_bot.json @@ -46,7 +46,7 @@ "id": "mon_riotbot", "type": "MONSTER", "name": { "str": "riot control bot" }, - "description": "Nonviolent riot-control bot. Designed to suppress riots and make mass arrests of those participating. Though its relaxation gas is by far its best-known weapon, it carries a blinding flash and a low-powered stungun for self-defense--in addition to its supply of electronic handcuffs.", + "description": "A nonviolent riot-control bot, designed to suppress riots and make mass arrests of those participating. Though its relaxation gas is by far its best-known weapon, it carries a blinding spotlight and a low-powered stungun for self-defense--in addition to a supply of electronic handcuffs.", "default_faction": "cop_bot", "species": [ "ROBOT" ], "diff": 10, @@ -278,7 +278,7 @@ "id": "mon_robofac_prototype", "type": "MONSTER", "name": { "str": "prototype robot" }, - "description": "The single glowing eye of this robot surveys the landscape periodically, as it performs the endless slaughter dictated by a misinterpreted and cruel routine. Between half-built plates, you can see the machinery and cables that animate it, and yet it moves deftly as it switches between one target and the next.", + "description": "This robot's single, glowing eye surveys the landscape periodically as it performs the endless slaughter dictated by a misinterpreted and cruel routine. Between half-built plates, you can see the machinery and cables that animate it, and yet it moves deftly as it switches between one target and the next.", "default_faction": "berserk_bot", "bodytype": "human", "species": [ "ROBOT" ], diff --git a/data/json/monsters/feral_humans.json b/data/json/monsters/feral_humans.json index e073d5cccd22e..7cd12734d856f 100644 --- a/data/json/monsters/feral_humans.json +++ b/data/json/monsters/feral_humans.json @@ -3,7 +3,7 @@ "id": "mon_feral_human_pipe", "type": "MONSTER", "name": { "str": "feral human" }, - "description": "Their pupils are dilated and what remains to be seen of the iris and sclera are bloodshot. This pipe-wielding maniac still breathes, but the zombies treat them like one of their own.", + "description": "Their pupils are dilated and what can be seen of the iris and sclera are bloodshot. This pipe-wielding maniac still breathes, but the zombies treat them like one of their own.", "default_faction": "zombie", "looks_like": "chud", "bodytype": "human", @@ -64,7 +64,7 @@ "id": "mon_feral_sapien_spear", "type": "MONSTER", "name": { "str": "cunning feral" }, - "description": "In this feral human's eyes is more intelligence than in those of most of their kind. They're carrying a crude spear, and have assembled some basic armor from scavenged clothing and bits of riot armor, leaving several gaps. Although a bit more together, this creature is still only a few steps away from being a living zombie themself.", + "description": "This feral human's eyes look more focused, and its movements steadier, than others of their kind. They're carrying a crude spear, and have assembled some basic armor from scavenged clothing and bits of riot armor, though you can see several gaps. Despite these signs of greater intelligence, this creature is still only a few steps away from being a zombie themself.", "default_faction": "zombie", "bodytype": "human", "species": [ "HUMAN" ], @@ -125,7 +125,7 @@ "id": "mon_chud", "type": "MONSTER", "name": { "str": "feral troglobite" }, - "description": "One of the still-living crazed humans, changed by something they are exposed to down here. Their face is dominated by unnaturally large, faintly glowing eyes and needle-sharp teeth poking through their lips. They remind you of something out of a campy monster movie - and of the good times when underground cannibals were less of a real concern.", + "description": "This person is still alive but completely crazed, changed by something they are exposed to down here. Their face is dominated by unnaturally large, faintly glowing eyes and needle-sharp teeth poking through their lips. They remind you of something out of a campy monster movie - and of the good times when underground cannibals were less of a real concern.", "copy-from": "mon_feral_human_pipe", "looks_like": "mon_zombie_runner", "symbol": "@", @@ -145,7 +145,7 @@ { "id": "mon_feral_human_crowbar", "type": "MONSTER", - "description": "Their pupils are dilated and what remains to be seen of the iris and sclera are bloodshot. This crowbar-wielding maniac still breathes, but the zombies treat them like one of their own.", + "description": "Their pupils are dilated and what can be seen of the iris and sclera are bloodshot. This crowbar-wielding maniac still breathes, but the zombies treat them like one of their own.", "copy-from": "mon_feral_human_pipe", "melee_dice": 2, "melee_dice_sides": 6, @@ -155,7 +155,7 @@ { "id": "mon_feral_human_axe", "type": "MONSTER", - "description": "Their pupils are dilated and what remains to be seen of the iris and sclera are bloodshot. This axe-wielding maniac still breathes, but the zombies treat them like one of their own.", + "description": "Their pupils are dilated and what can be seen of the iris and sclera are bloodshot. This axe-wielding maniac still breathes, but the zombies treat them like one of their own.", "copy-from": "mon_feral_human_pipe", "melee_dice": 2, "melee_dice_sides": 7, @@ -190,7 +190,7 @@ { "id": "mon_feral_human_pipe_fungal_corpse", "type": "MONSTER", - "description": "Delicate fungal stalks sprout in rows from sores covering the body, and what remains of the facial expression is pure agony.", + "description": "Delicate fungal stalks sprout in rows from sores covering this person's body, and their facial expression is pure agony.", "copy-from": "mon_feral_human_pipe", "default_faction": "fungus", "upgrades": { "half_life": 14, "into": "mon_fungaloid" }, @@ -201,7 +201,7 @@ { "id": "mon_feral_human_crowbar_fungal_corpse", "type": "MONSTER", - "description": "Delicate fungal stalks sprout in rows from sores in the arms, and what remains of the facial expression is pure agony. Moans softly.", + "description": "Delicate fungal stalks sprout in rows from sores on this person's arms, and their facial expression is pure agony. Their mouth opens and closes softly in a silent moan.", "copy-from": "mon_feral_human_crowbar", "default_faction": "fungus", "upgrades": { "half_life": 14, "into": "mon_fungaloid" }, @@ -212,7 +212,7 @@ { "id": "mon_feral_human_axe_fungal_corpse", "type": "MONSTER", - "description": "Delicate fungal stalks sprout in rows from sores in the arms, and what remains of the facial expression is pure agony.", + "description": "Delicate fungal stalks sprout in rows from sores on this person's arms, and their facial expression is pure agony.", "copy-from": "mon_feral_human_axe", "default_faction": "fungus", "upgrades": { "half_life": 14, "into": "mon_fungaloid" }, @@ -345,7 +345,7 @@ "id": "mon_feral_maid_broom", "type": "MONSTER", "name": { "str": "feral servant" }, - "description": "Once a fancy servant of some rich family, this maniac walks around with a broom in hand, searching for a victim to clean from its life.", + "description": "Once a fancy servant of some rich family, this maniac walks around with a broom in hand, searching for a victim to sweep off this mortal coil.", "default_faction": "zombie", "looks_like": "chud", "bodytype": "human", @@ -379,7 +379,7 @@ "type": "MONSTER", "copy-from": "mon_feral_maid_broom", "name": { "str": "feral servant" }, - "description": "Once a fancy servant of some rich family, this maniac walks around with a candlestick in hand, wanting to turn off the lights of your life.", + "description": "Once a fancy servant of some rich family, this maniac walks around with a candlestick in hand, ready to snuff out your life.", "death_drops": "feral_maids_death_drops_candlestick" }, { @@ -387,7 +387,7 @@ "type": "MONSTER", "copy-from": "mon_feral_maid_broom", "name": { "str": "feral servant" }, - "description": "Once a fancy servant of some rich family, this maniac walks around with a knife in hand, searching some victims to butcher for the next meal.", + "description": "Once a fancy servant of some rich family, this maniac walks around with a knife in hand, searching for some victims to butcher.", "melee_skill": 3, "melee_cut": 4, "death_drops": "feral_maids_death_drops_knife" @@ -397,7 +397,7 @@ "type": "MONSTER", "copy-from": "mon_feral_maid_broom", "name": { "str": "well dressed feral" }, - "description": "Wearing fancy clothes and with a rapier in hand, this maniac was once a socialite. It smiles with madness and seems like it wants to invite you to dinner.", + "description": "Wearing fancy clothes and with a rapier in hand, this maniac was once a socialite. They smile with madness and seem like they want to invite you to dinner.", "melee_skill": 4, "melee_dice": 2, "melee_dice_sides": 6, @@ -409,7 +409,7 @@ "type": "MONSTER", "copy-from": "mon_feral_maid_broom", "name": { "str": "well dressed feral" }, - "description": "Wearing fancy clothes and with a rapier in hand, this maniac was once a socialite. It smiles with madness and seems like it wants to invite you to dinner.", + "description": "Wearing fancy clothes and with a rapier in hand, this maniac was once a socialite. They smile with madness and seem like they want to invite you to dinner.", "melee_skill": 3, "melee_cut": 1, "death_drops": "feral_fancy_death_drops_rapier_fake" @@ -419,7 +419,7 @@ "type": "MONSTER", "copy-from": "mon_feral_maid_broom", "name": { "str": "well dressed feral" }, - "description": "Wearing fancy clothes and with a crossbow in hand, this maniac was once a socialite. Its hands seem to caress the crossbow as if touching a loved one.", + "description": "Wearing fancy clothes and with a crossbow in hand, this maniac was once a socialite. Their hands caress the crossbow as if touching a loved one.", "starting_ammo": { "bolt_cf": 6 }, "special_attacks": [ { @@ -443,7 +443,7 @@ "type": "MONSTER", "copy-from": "mon_feral_maid_broom", "name": { "str": "armored feral" }, - "description": "Clad in ancient armor and with a mace in hand, this maniac walks around in search of its next prey. You can see stains of dried blood all around its mace.", + "description": "Clad in ancient armor and with a mace in hand, this maniac walks around in search of their next prey. You can see stains of dried blood all over their mace.", "melee_skill": 3, "melee_dice": 3, "melee_dice_sides": 7, @@ -460,7 +460,7 @@ "type": "MONSTER", "copy-from": "mon_feral_armored_mace", "name": { "str": "armored feral" }, - "description": "Clad in ancient armor and with a battle axe in hand, this maniac walks around in search of its next prey. You can see stains of dried blood all around its axe.", + "description": "Clad in ancient armor and with a battle axe in hand, this maniac walks around in search of their next prey. You can see stains of dried blood all over their axe.", "melee_cut": 15, "death_drops": "feral_armored_death_drops_battleaxe" }, @@ -468,7 +468,7 @@ "id": "mon_feral_prepper", "type": "MONSTER", "name": { "str": "feral prepper" }, - "description": "A quick glance of this person would show that they have prepared well enough for times like these. Unfortunately, their bloodshot eyes, and the excluding treatment by the undead shows that they have turned feral. One of their hands clasp the handle of a makeshift weapon, while the other grips on a firearm, treating both as clubs.", + "description": "A quick glance at this person would suggest that they have prepared well enough for the apocalypse. Unfortunately, their bloodshot eyes, and the excluding treatment by the undead, shows that they have turned feral. One of their hands clasps the handle of a makeshift weapon, while the other grips a handgun.", "default_faction": "zombie", "bodytype": "human", "species": [ "HUMAN" ], @@ -532,7 +532,7 @@ "id": "mon_feral_survivalist", "type": "MONSTER", "name": { "str": "crazed survivalist" }, - "description": "Grasping a blade-sharp weapon, this feral prepper is seen having an athletic body, a sign of sturdy training before they turned feral. In addition of utilizing a flashlight, they seem to have an awareness of self preservation when in critical harm, a byproduct of leftover survival instincts kicking in.", + "description": "Grasping a sharp bladed weapon, this feral prepper has an athletic physique, a sign that they trained extensively before turning feral. In addition to remembering how to use a flashlight, their survival instincts seem to kick in when critically harmed, causing them to act in self-preservation unlike most of their fellows.", "default_faction": "zombie", "bodytype": "human", "species": [ "HUMAN" ], @@ -583,7 +583,7 @@ "id": "mon_feral_militia", "type": "MONSTER", "name": { "str": "mad militia" }, - "description": "Wearing a geared camo uniform with a kevlar vest, this person was a militia member, turned feral. Their hands grip unto an automatic rifle as their bloodshot eyes scan around; a headlamp above them illuminates their presence and surroundings.", + "description": "Wearing a tactical camo uniform with a kevlar vest, this person seems to have been a militia member, now turned feral. Their hands grip an automatic rifle as their bloodshot eyes scan for threats; a flashlight strapped to their forehead illuminates their presence and surroundings.", "default_faction": "zombie", "bodytype": "human", "species": [ "HUMAN" ], diff --git a/data/json/monsters/fish.json b/data/json/monsters/fish.json index 3a48a1db678f2..fbcefb8533afd 100644 --- a/data/json/monsters/fish.json +++ b/data/json/monsters/fish.json @@ -3,7 +3,7 @@ "id": "mon_alpha_razorclaw", "type": "MONSTER", "name": { "str": "alpha razorclaw" }, - "description": "A blood-red, gigantic razorclaw. Its sword-like pincers serve as the keepers of the nest.", + "description": "A blood-red, gigantic razorclaw. With its sword-like pincers, it serves as a protector of the nest.", "default_faction": "razorclaw", "bodytype": "crab", "species": [ "MUTANT" ], @@ -268,28 +268,28 @@ "type": "MONSTER", "copy-from": "mon_fish_medium", "name": { "str_sp": "whitefish" }, - "description": "A whitefish, closely related to salmon. One can assume they are just as nice when cooked with smoke." + "description": "A whitefish, closely related to salmon. One can assume they taste just as nice when smoked." }, { "id": "mon_fish_lbass", "type": "MONSTER", "copy-from": "mon_fish_medium", "name": { "str_sp": "largemouth bass" }, - "description": "A largemouth bass. Very popular with sports fishermen." + "description": "A largemouth bass. Very popular with sport fishermen." }, { "id": "mon_fish_sbass", "type": "MONSTER", "copy-from": "mon_fish_small", "name": { "str_sp": "smallmouth bass" }, - "description": "A smallmouth bass. Being intolerant to pollution in the water, smallmouth bass are a good indicator of how clean it is." + "description": "A smallmouth bass. Infamously intolerant to pollution, the presence of smallmouth bass is a good indicator of how clean a body of water is." }, { "id": "mon_fish_pbass", "type": "MONSTER", "copy-from": "mon_fish_medium", "name": { "str_sp": "striped bass" }, - "description": "A striped bass. Mostly a salt water fish, they migrate to fresher water to spawn." + "description": "A striped bass. Mostly a saltwater fish, they migrate to fresher water to spawn." }, { "id": "mon_fish_white_bass", @@ -297,7 +297,7 @@ "copy-from": "mon_fish_tiny", "name": { "str_sp": "white bass" }, "looks_like": "mon_fish_pbass", - "description": "A white bass. Common to the region, a slab-sided and spiny-rayed little fish." + "description": "A white bass. Common to this region, it is a slab-sided and spiny-rayed little fish." }, { "id": "mon_fish_perch", @@ -305,7 +305,7 @@ "copy-from": "mon_fish_small", "name": { "str": "perch", "str_pl": "perches" }, "looks_like": "mon_fish_pickerel", - "description": "A small sprightly perch. A very bony fish, still got some tasty meat on it though." + "description": "A small, sprightly perch. It is a very bony fish, still has some tasty meat on it though." }, { "id": "mon_fish_walleye", @@ -313,14 +313,14 @@ "copy-from": "mon_fish_medium", "name": { "str": "walleye" }, "looks_like": "mon_fish_pbass", - "description": "A walleye, a green-brown medium-sized fish with a white belly." + "description": "A walleye. A green-brown medium-sized fish with a white belly." }, { "id": "mon_fish_sunfish", "type": "MONSTER", "copy-from": "mon_fish_tiny", "name": { "str_sp": "sunfish" }, - "description": "A sunfish. A small fish related to bass or bluegill." + "description": "A sunfish. A small fish related to bass and bluegill." }, { "id": "mon_fish_pumpkinseed", @@ -328,7 +328,7 @@ "copy-from": "mon_fish_tiny", "name": { "str_sp": "pumpkinseed sunfish" }, "looks_like": "mon_fish_sunfish", - "description": "A pumpkinseed sunfish. A small fish related to bass or bluegill." + "description": "A pumpkinseed sunfish. A small fish related to bass and bluegill." }, { "id": "mon_fish_bluegill", @@ -343,7 +343,7 @@ "copy-from": "mon_fish_tiny", "name": { "str_sp": "redbreast sunfish" }, "looks_like": "mon_fish_sunfish", - "description": "A redbreast sunfish. A small fish related to bass or bluegill." + "description": "A redbreast sunfish. A small fish related to bass and bluegill." }, { "id": "mon_fish_green_sunfish", @@ -351,7 +351,7 @@ "copy-from": "mon_fish_tiny", "name": { "str_sp": "green sunfish" }, "looks_like": "mon_fish_sunfish", - "description": "A green sunfish. A small fish related to bass or bluegill." + "description": "A green sunfish. A small fish related to bass and bluegill." }, { "id": "mon_fish_longear_sunfish", @@ -359,7 +359,7 @@ "copy-from": "mon_fish_tiny", "name": { "str_sp": "longear sunfish" }, "looks_like": "mon_fish_sunfish", - "description": "A longear sunfish. A small fish related to bass or bluegill." + "description": "A longear sunfish. A small fish related to bass and bluegill." }, { "id": "mon_fish_redear_sunfish", @@ -367,7 +367,7 @@ "copy-from": "mon_fish_tiny", "name": { "str_sp": "redear sunfish" }, "looks_like": "mon_fish_sunfish", - "description": "A redear sunfish. A small fish related to bass or bluegill." + "description": "A redear sunfish. A small fish related to bass and bluegill." }, { "id": "mon_fish_rock_bass", @@ -375,7 +375,7 @@ "copy-from": "mon_fish_tiny", "name": { "str_sp": "rock bass" }, "looks_like": "mon_fish_sunfish", - "description": "A rock bass. Related to sunfish, this tiny fish has a camouflage-like patterning and a red eye." + "description": "A rock bass. Related to sunfish, this tiny fish has a camouflage-like patterning and red eyes." }, { "id": "mon_fish_calico_bass", @@ -383,7 +383,7 @@ "copy-from": "mon_fish_medium", "name": { "str_sp": "calico bass" }, "looks_like": "mon_fish_pbass", - "description": "A calico bass. A medium-sized fish also known as a 'Crappie'." + "description": "A calico bass. A medium-sized fish also known as a 'crappie'." }, { "id": "mon_fish_warmouth", @@ -391,14 +391,14 @@ "copy-from": "mon_fish_small", "name": { "str": "warmouth" }, "looks_like": "mon_fish_sunfish", - "description": "A warmouth, similar to a rock bass, this small fish is related to the sunfish." + "description": "A warmouth, similar to a rock bass. This small fish is related to the sunfish." }, { "id": "mon_fish_bullhead", "type": "MONSTER", "copy-from": "mon_fish_small", "name": { "str": "bullhead" }, - "description": "A bullhead, a type of catfish. Delicious battered and fried." + "description": "A bullhead, a type of catfish. Delicious when battered and fried." }, { "id": "mon_fish_channel_catfish", @@ -406,7 +406,7 @@ "copy-from": "mon_fish_large", "name": { "str_sp": "channel catfish" }, "looks_like": "mon_fish_bullhead", - "description": "A channel catfish, they have a forked tail and long whiskers." + "description": "A channel catfish. It has a forked tail and long whiskers." }, { "id": "mon_fish_white_catfish", @@ -414,14 +414,14 @@ "copy-from": "mon_fish_tiny", "name": { "str_sp": "white catfish" }, "looks_like": "mon_fish_bullhead", - "description": "A white catfish, a small whiskered fish with a broad head." + "description": "A white catfish. A small whiskered fish with a broad head." }, { "id": "mon_fish_pike", "type": "MONSTER", "copy-from": "mon_fish_large", "name": { "ctxt": "fish", "str": "pike" }, - "description": "A northern pike. Pike can be a pretty aggressive fish, careful around those teeth." + "description": "A northern pike. Pike can be pretty aggressive fish, careful around those teeth." }, { "id": "mon_fish_pickerel", @@ -466,7 +466,7 @@ "type": "MONSTER", "copy-from": "mon_fish_large", "name": { "str": "bowfin" }, - "description": "A bowfin. These fish are related to gar but without the huge teeth, skin rending scales, and aggression." + "description": "A bowfin. These fish are related to gar but without the huge teeth, skin-rending scales, and aggression." }, { "id": "mon_fish_fallfish", @@ -474,13 +474,13 @@ "copy-from": "mon_fish_small", "name": { "str_sp": "fallfish" }, "looks_like": "mon_fish_pbass", - "description": "A fallfish. These fish are related to gar but without the huge teeth, skin rending scales, and aggression." + "description": "A fallfish. These fish are related to gar but without the huge teeth, skin-rending scales, and aggression." }, { "id": "mon_fish_lobster", "type": "MONSTER", "name": { "str": "lobster" }, - "description": "These things were once considered pests not worth eating, then some marketing genius started selling them to people as a delicacy and they took off in popularityā€¦ and price.", + "description": "A dark greenish crustacean in its natural habitat. These were once considered pests barely worth eating, then some marketing genius started selling them to people as a delicacy and they took off in popularityā€¦ and price.", "default_faction": "fish", "bodytype": "crab", "categories": [ "WILDLIFE" ], @@ -508,7 +508,7 @@ "id": "mon_fish_crayfish", "type": "MONSTER", "name": { "str_sp": "crayfish" }, - "description": "If you could get a hold of a bunch more of these, a hefty pot of boiling water, and some spicy seasoningsā€¦", + "description": "This crustacean looks like a tiny lobster, but is actually a completely different species. If you could get ahold of a bunch more of these, a hefty pot of boiling water, and some spicy seasoningsā€¦", "default_faction": "fish", "bodytype": "crab", "categories": [ "WILDLIFE" ], @@ -563,7 +563,7 @@ "id": "mon_fish_eel", "type": "MONSTER", "name": { "str": "freshwater eel" }, - "description": "An American eel. Used to be quite common in these parts until the dams were built. Guess they'll get a second chance now that they aren't running.", + "description": "An American eel. They used to be quite common in these parts until the dams were built. They'll get a second chance now that those aren't running.", "default_faction": "fish", "bodytype": "snake", "categories": [ "WILDLIFE" ], @@ -589,7 +589,7 @@ "id": "mon_crayfish_small", "type": "MONSTER", "name": { "str_sp": "crayfish" }, - "description": "A mutant crayfish the size of a dog with a brown carapace, claws, and long antennae.", + "description": "A mutant crayfish the size of a dog, with a brown carapace, claws, and long antennae.", "copy-from": "mon_giant_crayfish", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "30 L", @@ -648,7 +648,7 @@ "id": "mon_razorclaw", "type": "MONSTER", "name": { "str": "razorclaw" }, - "description": "A man-sized crustacean clad in an iron-like chitin, capable of emitting the most horrible of shrieks. Often spotted near shipwrecks or other dark damp places, which it uses as nesting grounds.", + "description": "A man-sized crustacean clad in iron-like chitin, capable of emitting horrible shrieking noises. Often spotted near shipwrecks or other dark, damp places, which it uses as nesting grounds.", "default_faction": "razorclaw", "bodytype": "crab", "species": [ "MUTANT" ], @@ -683,7 +683,7 @@ "id": "mon_mutant_carp", "type": "MONSTER", "name": { "str": "giant carp" }, - "description": "This thing seems like a carp, only swollen and very very angry. Death is the gift of the carp god.", + "description": "This thing looks like a carp, but huge and very, very angry. Death is the gift of the carp god.", "default_faction": "mutant", "bodytype": "fish", "species": [ "FISH" ], @@ -711,7 +711,7 @@ "id": "mon_mutant_salmon", "type": "MONSTER", "name": { "str": "giant salmon" }, - "description": "A mutated salmon, the same size as a large dog and quite dangerous to the inexperienced angler.", + "description": "A mutated salmon, the size of a large dog and quite dangerous to the inexperienced angler.", "default_faction": "mutant", "bodytype": "fish", "species": [ "FISH" ], @@ -739,7 +739,7 @@ "id": "mon_sewer_fish", "type": "MONSTER", "name": { "str": "seweranha" }, - "description": "A large mutant variety of carp. It has shimmering green scales and a mouth lined with three jagged rows of razor-sharp teeth.", + "description": "A large, mutant variety of carp. It has shimmering green scales and a mouth lined with three jagged rows of razor-sharp teeth.", "default_faction": "seweranha", "bodytype": "fish", "species": [ "FISH" ], diff --git a/data/json/monsters/fungus.json b/data/json/monsters/fungus.json index c3402e6853b50..ae9a46672fa2f 100644 --- a/data/json/monsters/fungus.json +++ b/data/json/monsters/fungus.json @@ -277,7 +277,7 @@ "id": "mon_fungaloid_young", "type": "MONSTER", "name": { "str": "fungal sporeling" }, - "description": "A fungal stalk several feet in height. Two vicious looking tendrils extend from its thorned and leathery exterior, and it moves about faster than the larger fungaloids.", + "description": "A fungal stalk several feet in height. Two vicious-looking tendrils extend from its thorned and leathery exterior, and it moves about faster than the larger fungaloids.", "default_faction": "fungus", "species": [ "FUNGUS" ], "diff": 2, @@ -369,7 +369,7 @@ "id": "mon_spider_fungus", "type": "MONSTER", "name": { "str": "fungal spider" }, - "description": "The abdomen of this sickly looking giant spider is now home to many lumps of blooming fungi. It is leaving behind a trail of tainted secretions when the spider struggles to drag it along the ground.", + "description": "The abdomen of this sickly-looking giant spider is now home to many lumps of blooming fungi. It leaves behind a trail of tainted secretions as it struggles to drag itself along the ground.", "default_faction": "fungus", "bodytype": "spider", "species": [ "FUNGUS" ], diff --git a/data/json/monsters/fungus_zombie.json b/data/json/monsters/fungus_zombie.json index 8b4b28a127d4b..b130022e4b397 100644 --- a/data/json/monsters/fungus_zombie.json +++ b/data/json/monsters/fungus_zombie.json @@ -3,7 +3,7 @@ "id": "mon_zombie_fungus", "type": "MONSTER", "name": { "str": "fungal zombie" }, - "description": "Once human, fungal tendrils now sprout from its mouth, eyes, and other orifices, holding together a shambling mass of mold-covered flesh.", + "description": "Once alive, then undead, now something else entirely. Fungal tendrils sprout from its mouth, eyes, and other orifices, holding together a shambling mass of mold-covered flesh.", "default_faction": "fungus", "bodytype": "human", "species": [ "FUNGUS" ], @@ -37,7 +37,7 @@ "type": "MONSTER", "name": { "str": "bloated fungal zombie" }, "looks_like": "mon_zombie_gasbag", - "description": "With its swollen gray skin overgrown by thick layer of mold, this balloon-like fungal zombie looks like it could violently burst with a cloud of noxious spores.", + "description": "With its swollen gray skin overgrown by thick layer of mold, this balloon-like fungal zombie looks like it could violently burst into a cloud of noxious spores at any moment.", "default_faction": "fungus", "bodytype": "human", "species": [ "FUNGUS" ], diff --git a/data/json/monsters/insect_spider.json b/data/json/monsters/insect_spider.json index 3c45385876bb5..805c620a13e7f 100644 --- a/data/json/monsters/insect_spider.json +++ b/data/json/monsters/insect_spider.json @@ -3,7 +3,7 @@ "id": "mon_dark_wyrm", "type": "MONSTER", "name": { "str": "dark wyrm" }, - "description": "A huge mutated worm found deep underground. It has a gaping round mouth lined with dagger-like teeth, and its flesh is slick with bubbling blue slime.", + "description": "A huge mutated worm living deep underground. It has a round, gaping mouth lined with dagger-like teeth, and its flesh is slick with bubbling blue slime.", "default_faction": "dark_wyrm", "bodytype": "snake", "species": [ "MUTANT" ], @@ -132,7 +132,7 @@ "id": "mon_large_cockroach", "type": "MONSTER", "name": { "str": "cockroach", "str_pl": "cockroaches" }, - "description": "A mutant cockroach the size of a small dog.", + "description": "An aggressive mutant cockroach the size of a small dog.", "copy-from": "mon_giant_cockroach", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "15 L", @@ -143,7 +143,7 @@ "id": "mon_skittering_plague", "type": "MONSTER", "name": { "str": "skittering plague" }, - "description": "A giant infected roach, it has been feeding on the undead.", + "description": "A giant, sickly-looking cockroach that appears to be using the undead as its primary food source. The diet of infected flesh doesn't seem to harm it, but something about the roach's biology is clearly changing. It doesn't seem interested in you.", "default_faction": "roach", "bodytype": "insect", "species": [ "INSECT" ], @@ -180,7 +180,7 @@ "id": "mon_plague_nymph", "type": "MONSTER", "name": { "str": "plague nymph" }, - "description": "An infected mutant cockroach about the size of a rat.", + "description": "A sickly-looking mutant cockroach about the size of a rat, raised from birth on a healthy diet of zombie flesh. It still has enough natural instinct left to avoid approaching you.", "default_faction": "roach", "bodytype": "insect", "species": [ "INSECT", "ZOMBIE" ], @@ -210,7 +210,7 @@ "id": "mon_plague_vector", "type": "MONSTER", "name": { "str": "plague vector" }, - "description": "This infected roach has been feeding on the undead and started to mutate chaotically. Extra limbs and growths sprout from its thorax.", + "description": "This giant cockroach has been feeding on the undead for some time and started to mutate chaotically. Extra limbs and growths sprout from its thorax, and it is notably aggressive even to creatures much larger than itself.", "default_faction": "roach", "bodytype": "insect", "species": [ "INSECT" ], @@ -246,7 +246,7 @@ "id": "mon_giant_cockroach", "type": "MONSTER", "name": { "str": "giant cockroach", "str_pl": "giant cockroaches" }, - "description": "A mutant cockroach the size of a dog.", + "description": "A mutant cockroach the size of a dog. This size advantage is apparently all it needs to start regarding humans as food!", "default_faction": "roach", "bodytype": "insect", "species": [ "INSECT" ], @@ -310,7 +310,7 @@ "id": "mon_pregnant_giant_cockroach", "type": "MONSTER", "name": { "str": "pregnant giant cockroach", "str_pl": "pregnant giant cockroaches" }, - "description": "A mutant cockroach the size of a small dog. Its abdomen is heavily swollen.", + "description": "A mutant cockroach the size of a small dog. Its abdomen is heavily swollen with eggs.", "default_faction": "roach", "bodytype": "insect", "species": [ "INSECT" ], @@ -546,7 +546,7 @@ "id": "mon_centipede_small", "type": "MONSTER", "name": { "str": "centipede" }, - "description": "A brightly colored mutant centipede the size of a small dog, skittering quickly in the underbrush. Probably won't think you're suitable prey, but beware its venom.", + "description": "A brightly-colored mutant centipede the size of a small dog, skittering quickly in the underbrush. Probably won't think you're suitable prey, but beware its venom.", "symbol": "a", "color": "light_green", "copy-from": "mon_centipede_giant", @@ -585,7 +585,7 @@ "id": "mon_centipede_giant", "type": "MONSTER", "name": { "str": "giant centipede" }, - "description": "A two meter long centipede with a menacing set of venom-dripping mandibles and a worrying number of grabbing appendages, moving swiftly on dozens of spindly legs. It has a pair of small compound eyes, but seems to mostly orient itself with its antennae.", + "description": "A two-meter-long centipede with a menacing set of venom-dripping mandibles and a worrying number of grabbing appendages, moving swiftly on dozens of spindly legs. It has a pair of small compound eyes, but seems to mostly orient itself with its antennae.", "symbol": "a", "color": "light_green", "copy-from": "base_centipede", @@ -792,7 +792,7 @@ "id": "mon_dragonfly_naiad", "type": "MONSTER", "name": { "str": "giant dragonfly naiad" }, - "description": "The predatory, aquatic larva of a dragonfly, normally barely a centimeter long and feeding on small fishes, grown to the size of a catfish. Underneath its sharp mandibles you can see that its folded lower jaw changed into something resembling a barbed spear.", + "description": "A predatory, aquatic dragonfly larva, normally barely a centimeter long and feeding on small fishes, grown to the size of a catfish. Underneath its sharp mandibles you can see that its folded lower jaw has changed into something resembling a barbed spear.", "species": [ "INSECT" ], "bodytype": "insect", "material": [ "iflesh" ], @@ -981,7 +981,7 @@ "id": "mon_fly_mega", "type": "MONSTER", "name": { "str": "frigate fly", "str_pl": "frigate flies" }, - "description": "An enormous mutant housefly creating a loud buzzing sound.", + "description": "An mutant housefly the size of a cow, creating a loud buzzing sound as it inexplicably stays airborne.", "copy-from": "mon_fly", "diff": 5, "proportional": { "hp": 20, "speed": 0.25, "vision_day": 2 }, @@ -1007,7 +1007,7 @@ "id": "mon_mosquito_giant", "type": "MONSTER", "name": { "str": "giant mosquito" }, - "description": "A giant mutant mosquito, fluttering erratically. Its face is dominated by a long, spear-tipped proboscis.", + "description": "A giant mutant mosquito the size of a dog, fluttering erratically. Its face is dominated by a long, spear-tipped proboscis.", "default_faction": "mosquito", "bodytype": "flying insect", "species": [ "INSECT_FLYING" ], @@ -1037,7 +1037,7 @@ "id": "mon_mosquito_mega", "type": "MONSTER", "name": { "str": "bloodbank mosquito" }, - "description": "An enormous mutant mosquito with huge thin wings and legs. Its face is dominated by a long, spear-tipped proboscis.", + "description": "A mutant mosquito the size of a cow, with huge, thin wings and legs. Its face is dominated by a long, spear-tipped proboscis.", "copy-from": "mon_mosquito_giant", "proportional": { "hp": 20, "speed": 0.25, "vision_day": 2 }, "volume": "625 L", @@ -1051,7 +1051,7 @@ "id": "mon_spider_cellar_small", "type": "MONSTER", "name": { "str": "cellar spider" }, - "description": "A mutant brown spider the size of a small dog with long thin legs, big eyes, and oversized fangs.", + "description": "A mutant brown spider the size of a small dog, with long thin legs, big eyes, and oversized fangs.", "copy-from": "mon_spider_cellar_giant", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "15 L", @@ -1062,7 +1062,7 @@ "id": "mon_spider_cellar_giant", "type": "MONSTER", "name": { "str": "giant cellar spider" }, - "description": "A twitchy mutant brown spider, with a relatively small body and spindly long legs. Its smaller brethren are known for being agile, and for preying upon other spiders.", + "description": "A twitchy mutant brown spider, with a relatively small body and long, spindly legs. Its pre-Cataclysm brethren are known for being agile, and for preying upon other spiders.", "default_faction": "spider_cellar", "bodytype": "spider", "species": [ "SPIDER" ], @@ -1098,7 +1098,7 @@ "id": "mon_spider_cellar_mega", "type": "MONSTER", "name": { "str": "warehouse spider" }, - "description": "An enormous mutated brown spider with spindly long legs. Looks like a classic house spider, but so much more.", + "description": "A mutated brown spider the size of a cow, somehow supporting itself despite its rather spindly long legs. Looks like a classic house spider, but so much more.", "copy-from": "mon_spider_cellar_giant", "proportional": { "hp": 20, "speed": 0.25, "vision_day": 2 }, "volume": "625 L", @@ -1112,7 +1112,7 @@ "id": "mon_spider_cellar_giant_s", "type": "MONSTER", "name": { "str": "immature giant cellar spider" }, - "description": "A newly-hatched giant cellar spider. Too small to possess much venom, but still quick and agile like an adult.", + "description": "A newly-hatched mutant cellar spider, about the size of a beer bottle. Too small to possess much venom, but still quick and agile like an adult.", "default_faction": "spider_cellar", "bodytype": "spider", "species": [ "SPIDER" ], @@ -1146,7 +1146,7 @@ "id": "mon_spider_jumping_small", "type": "MONSTER", "name": { "str": "jumping spider" }, - "description": "A mutant spider the size of a small dog with big forelegs, big eyes, and oversized fangs.", + "description": "A mutant spider the size of a small dog with long forelegs, big eyes, and oversized fangs.", "copy-from": "mon_spider_jumping_giant", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "15 L", @@ -1157,7 +1157,7 @@ "id": "mon_spider_jumping_giant", "type": "MONSTER", "name": { "str": "giant jumping spider" }, - "description": "A giant spider with big forelegs and two pairs of inquisitive-looking eyes. It can leap quite quickly, even into the treetops.", + "description": "A dog-sized mutant spider with big forelegs and two pairs of inquisitive-looking eyes. It can leap quite quickly, even into the treetops.", "default_faction": "spider_jumping", "bodytype": "spider", "species": [ "SPIDER" ], @@ -1193,7 +1193,7 @@ "id": "mon_spider_jumping_mega", "type": "MONSTER", "name": { "str": "missile spider" }, - "description": "An enormous hairy mutated spider with strong forelegs and a raised, bloated thorax. Smells like rotten eggs", + "description": "An enormous hairy mutated spider the size of a cow, with strong forelegs and a raised, bloated thorax. Its vast increase in size has caused it to lose much of its mobility, and when near it you can smell rotten eggs for some reasonā€¦", "copy-from": "mon_spider_jumping_giant", "proportional": { "hp": 20, "speed": 0.25, "dodge": 0.25, "vision_day": 2 }, "volume": "625 L", @@ -1255,7 +1255,7 @@ "id": "mon_spider_trapdoor_mega", "type": "MONSTER", "name": { "str": "deathtrap spider" }, - "description": "An enormous mutated spider with strong thick legs, and a bulbous thorax, dark brown in color.", + "description": "A cow-sized mutant spider with strong, thick legs and a bulbous thorax, dark brown in color. Anything it pulls into its underground lair is unlikely to see the light of day again.", "copy-from": "mon_spider_trapdoor_giant", "proportional": { "hp": 10, "speed": 0.25, "dodge": 0.5, "vision_day": 2 }, "volume": "625 L", @@ -1279,7 +1279,7 @@ "id": "mon_spider_web", "type": "MONSTER", "name": { "str": "giant web spider" }, - "description": "A light gray giant mutated grass spider, it waits for prey to become ensnared in the vast webs that it weaves between the trees.", + "description": "A giant, light gray mutant grass spider, it waits for prey to become ensnared in the vast webs that it weaves between the trees.", "default_faction": "spider_web", "bodytype": "spider", "species": [ "SPIDER" ], @@ -1314,7 +1314,7 @@ "id": "mon_spider_web_mega", "type": "MONSTER", "name": { "str": "wyrd spider" }, - "description": "An enormous mutated grass spider with long spindly legs, light gray in color.", + "description": "A cow-sized mutated grass spider with long spindly legs, light gray in color. It moves ponderously, depending on its webs to prevent prey from fleeing.", "copy-from": "mon_spider_web", "proportional": { "hp": 10, "speed": 0.25, "dodge": 0.5, "vision_day": 2 }, "volume": "625 L", @@ -1328,7 +1328,7 @@ "id": "mon_spider_web_s", "type": "MONSTER", "name": { "str": "immature giant web spider" }, - "description": "A still immature giant grass spider. Too young to be venomous, or to walk proficiently for that matter", + "description": "A juvenile giant grass spider, about the size of a beer bottle. Too young to be venomous, or to walk proficiently for that matter", "default_faction": "spider_web", "bodytype": "spider", "species": [ "SPIDER" ], @@ -1359,7 +1359,7 @@ "id": "mon_spider_widow_small", "type": "MONSTER", "name": { "str": "black widow spider" }, - "description": "A black mutant spider the size of a cat with a long legs, big eyes, and oversized fangs. There is a red hourglass shape on its thorax.", + "description": "A black mutant spider the size of a small dog with a long legs, big eyes, and oversized fangs. There is a red hourglass shape on its thorax.", "copy-from": "mon_spider_widow_giant", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "15 L", @@ -1370,7 +1370,7 @@ "id": "mon_spider_widow_giant", "type": "MONSTER", "name": { "str": "giant black widow" }, - "description": "A giant mutated black widow spider. There is a red hourglass shape on its thorax. A highly venomous nightmare come to life.", + "description": "A dog-sized mutated black widow spider. There is a red hourglass shape on its thorax. A highly venomous nightmare come to life.", "default_faction": "spider_widow", "bodytype": "spider", "species": [ "SPIDER" ], @@ -1404,7 +1404,7 @@ "id": "mon_spider_widow_mega", "type": "MONSTER", "name": { "str": "black death widow" }, - "description": "An enormous mutated black widow spider. There is a red hourglass shape on its thorax.", + "description": "A cow-sized mutated black widow spider with a distinctive red hourglass shape on its thorax. Still possesses its infamous venom, but it probably doesn't even need that to crush you like a bug.", "copy-from": "mon_spider_widow_giant", "proportional": { "hp": 10, "speed": 0.25, "dodge": 0.5, "vision_day": 2 }, "volume": "625 L", @@ -1497,7 +1497,7 @@ "id": "mon_spider_wolf_mega", "type": "MONSTER", "name": { "str": "necrowolf spider" }, - "description": "An enormous hairy mutant wolf spider.", + "description": "A cow-sized, hairy mutant wolf spider. Its mouthparts have noticeably changed, and it moves much more slowly now with the additional weight it needs to carry.", "copy-from": "mon_spider_wolf_giant", "proportional": { "hp": 10, "speed": 0.25, "dodge": 0.25, "vision_day": 2 }, "volume": "625 L", @@ -1619,7 +1619,7 @@ "id": "mon_wasp_small", "type": "MONSTER", "name": { "str": "wasp" }, - "description": "A huge wasp the size of a large cat with bright yellow markings on her jet-black carapace and a threatening stinger. It flies around erratically, searching for smaller prey.", + "description": "A huge wasp the size of a large cat with bright yellow markings on her jet-black carapace and a threatening stinger. She flies around erratically, searching for smaller prey.", "default_faction": "wasp", "copy-from": "base_wasp", "bodytype": "flying insect", @@ -1671,7 +1671,7 @@ "id": "mon_wasp_small_guard", "type": "MONSTER", "name": { "str": "wasp guard" }, - "description": "A mutated wasp worker, buzzing around their nest. While their foraging sisters are relatively content to leave you be, this one won't hesitate to attack anything it considers a threat to the nest. Don't linger.", + "description": "A mutated wasp worker, buzzing around the nest. While her foraging sisters are relatively content to leave you be, this one won't hesitate to attack anything she considers a threat to the nest. Don't linger.", "copy-from": "mon_wasp_small", "aggression": 0, "melee_skill": 6, @@ -1683,7 +1683,7 @@ "id": "mon_wasp_queen", "type": "MONSTER", "name": { "str": "wasp queen" }, - "description": "A mutated wasp queen grown to the size of a person, laying a single white egg in each empty cell it comes across while scurrying around on the paper walls of their home. It struggles to fit into some of them, but the newer cells seem to be getting largerā€¦", + "description": "A mutated wasp queen grown to the size of a person, laying a single white egg in each empty cell she comes across while scurrying around on the paper walls of her home. She struggles to fit into some of them, but the newer cells seem to be getting largerā€¦", "copy-from": "mon_wasp_guard", "armor_elec": 3, "harvest": "arachnid_wasp_queen", @@ -1694,7 +1694,7 @@ "id": "mon_wasp", "type": "MONSTER", "name": { "str": "giant wasp" }, - "description": "A gigantic wasp worker, scouring the landscape for an easy meal to feed the next generation. Its abdomen glowers with ominous yellow stripes and ends in a half-hidden stinger the size of a kitchen knife.", + "description": "A gigantic wasp worker, scouring the landscape for an easy meal to feed the next generation. Her abdomen glowers with ominous yellow stripes and ends in a half-hidden stinger the size of a kitchen knife.", "default_faction": "wasp", "bodytype": "flying insect", "copy-from": "base_wasp", @@ -1749,7 +1749,7 @@ "id": "mon_wasp_guard", "type": "MONSTER", "name": { "str": "giant wasp guard" }, - "description": "A wasp worker grown to the size of a person, buzzing around their home. While their foraging sisters are relatively content to live and let live, this one won't hesitate to attack anything it considers a threat to the nest. Don't linger.", + "description": "A wasp worker grown to the size of a person, buzzing around her home. While her foraging sisters are relatively content to live and let live, this one won't hesitate to attack anything she considers a threat to the nest. Don't linger.", "copy-from": "mon_wasp", "aggression": 4, "melee_skill": 9, @@ -1761,7 +1761,7 @@ "id": "mon_wasp_mega", "type": "MONSTER", "name": { "str": "giant wasp queen" }, - "description": "A yellowjacket queen grown to the size of a horse, towering over their daughters. Even with their abdomen swollen with eggs and wings long unused it still poses a threat to interlopers, should their children have failed at subduing them.", + "description": "A yellowjacket queen grown to the size of a horse, towering over her daughters. Even with her abdomen swollen with eggs and wings long unused she still poses a threat to interlopers, should her children have failed at subduing them.", "copy-from": "mon_wasp_guard", "looks_like": "mon_wasp_mega", "diff": 4, @@ -1836,7 +1836,7 @@ "id": "mon_dermatik", "type": "MONSTER", "name": { "str": "dermatik" }, - "description": "A colorful parasitoid wasp grown to the size of a dog, with a huge ovipositor extruding from her abdomen. It darts around in search of a suitable home for her many, many children.", + "description": "A colorful parasitoid wasp grown to the size of a dog, with a huge ovipositor extruding from her abdomen. She darts around in search of a suitable home for her many, many children.", "default_faction": "dermatik", "bodytype": "flying insect", "species": [ "INSECT_FLYING" ], @@ -1868,7 +1868,7 @@ "id": "mon_dermatik_midwife", "type": "MONSTER", "name": { "str": "dermatik midwife", "str_pl": "dermatik midwives" }, - "description": "A dermatik grown even larger, its wings and ovipositor chewed off by her sisters. It now stands watch in the nest, tending to the unfortunate hosts dragged home and ensuring they don't perish before their purpose is fulfilled.", + "description": "A dermatik grown even larger, her wings and ovipositor chewed off by her sisters. She now stands watch in the nest, tending to the unfortunate hosts dragged home and ensuring they don't perish before their purpose is fulfilled.", "species": [ "INSECT" ], "copy-from": "mon_dermatik", "volume": "17 L", @@ -2006,7 +2006,7 @@ "id": "mon_ant_small", "type": "MONSTER", "name": { "str": "ant" }, - "description": "A mutant red ant the size of a dog covered in chitinous plates. It possesses a pair of wriggling antennae and vicious-looking mandibles.", + "description": "A mutant red ant the size of a dog, covered in chitinous plates. She possesses a pair of wriggling antennae and vicious-looking mandibles.", "copy-from": "mon_ant", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "30 L", @@ -2017,7 +2017,7 @@ "id": "mon_ant", "type": "MONSTER", "name": { "str": "giant ant" }, - "description": "An enormous red ant covered in chitinous plates. It possesses a pair of wriggling antennae and vicious-looking mandibles.", + "description": "An enormous red ant covered in chitinous plates. She possesses a pair of wriggling antennae and vicious-looking mandibles.", "default_faction": "ant", "copy-from": "base_ant", "bodytype": "insect", @@ -2052,7 +2052,7 @@ "id": "mon_ant_acid_small", "type": "MONSTER", "name": { "str": "acidic ant" }, - "description": "A brown mutated ant with a swollen abdomen, that ends with a small orifice at the tip. Glistening liquid drips out periodically.", + "description": "A dog-sized mutant brown ant with a swollen abdomen that ends with a small orifice at the tip. Glistening liquid drips out periodically.", "copy-from": "mon_ant_acid", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "30 L", @@ -2063,7 +2063,7 @@ "id": "mon_ant_acid", "type": "MONSTER", "name": { "str": "giant acidic ant" }, - "description": "A monstrous brown ant with a swollen abdomen, that ends with a small orifice at the tip. Glistening liquid seems to drip out periodically.", + "description": "A monstrous brown ant with a swollen abdomen that ends with a small orifice at the tip. Glistening liquid seems to drip out periodically.", "default_faction": "acid_ant", "copy-from": "base_ant", "bodytype": "insect", @@ -2125,7 +2125,7 @@ "id": "mon_ant_acid_queen", "type": "MONSTER", "name": { "str": "acidic queen ant" }, - "description": "An enormous brown ant with an elongated, pulsating abdomen. Its orifice seems developed only for egg-laying rather than spraying acid like the rest of the colony, but it doesn't seem affected by the acrid liquid either.", + "description": "An enormous brown ant with an elongated, pulsating abdomen. Her orifice seems developed only for egg-laying rather than spraying acid like the rest of the colony, but she doesn't seem affected by the acrid liquid either.", "default_faction": "acid_ant", "bodytype": "insect", "copy-from": "base_ant", @@ -2157,7 +2157,7 @@ "id": "mon_ant_acid_soldier", "type": "MONSTER", "name": { "str": "acidic soldier ant" }, - "description": "A massive woolly brown ant that towers over the worker ants with a giant head crest. Along with its huge mandibles, a corrosive liquid seeps from the end of its bloated abdomen.", + "description": "A massive woolly brown ant that towers over the worker ants with a giant head crest. Along with her huge mandibles, a corrosive liquid seeps from the end of her bloated abdomen.", "default_faction": "acid_ant", "copy-from": "base_ant", "bodytype": "insect", @@ -2218,7 +2218,7 @@ "id": "mon_ant_queen", "type": "MONSTER", "name": { "str": "queen ant" }, - "description": "A colossal red ant with a bulging, bloated thorax. It moves slowly and deliberately, tending to nearby eggs and continually laying more.", + "description": "A colossal red ant with a bulging, bloated thorax. She moves slowly and deliberately, tending to nearby eggs and continually laying more.", "default_faction": "ant", "copy-from": "base_ant", "bodytype": "insect", @@ -2249,7 +2249,7 @@ "id": "mon_ant_soldier", "type": "MONSTER", "name": { "str": "soldier ant" }, - "description": "A huge and hairy red ant almost twice the size of other giant ants. Bulging pincers extend from its jaws.", + "description": "A huge and hairy red ant almost twice the size of other giant ants. Bulging pincers extend from her jaws.", "default_faction": "ant", "copy-from": "base_ant", "bodytype": "insect", @@ -2284,7 +2284,7 @@ "id": "mon_ant_soldier_mega", "type": "MONSTER", "name": { "str": "super soldier ant" }, - "description": "An enormous hairy red ant. Bulging pincers extend from its jaws.", + "description": "A cow-sized, hairy red ant. Bulging pincers extend from her jaws. Given the relative strength of ants to their body size, you don't doubt that this one could shove cars around or rip through solid walls.", "copy-from": "mon_ant_soldier", "proportional": { "hp": 10, "speed": 0.25, "dodge": 0.5, "vision_day": 2 }, "volume": "625 L", @@ -2304,7 +2304,7 @@ "id": "mon_locust_small", "type": "MONSTER", "name": { "str": "locust" }, - "description": "A yellow and brown mutated locust the size of a cat with big eyes and long powerful legs.", + "description": "A yellow and brown mutated locust the size of a small dog, with big eyes and long, powerful legs.", "copy-from": "mon_locust", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "15 L", @@ -2315,7 +2315,7 @@ "id": "mon_locust", "type": "MONSTER", "name": { "str": "giant locust" }, - "description": "A yellow and brown mutated locust the size of a dog with big eyes and long powerful legs. You don't think it'll eat you but it could cause massive damage to nearby plants.", + "description": "A yellow and brown mutated locust the size of a dog with big eyes and long, powerful legs. You don't think it'll eat you, but it could cause massive damage to nearby plants.", "default_faction": "locust", "bodytype": "flying insect", "species": [ "INSECT_FLYING" ], @@ -2352,7 +2352,7 @@ "id": "mon_locust_mega", "type": "MONSTER", "name": { "str": "famine" }, - "description": "An enormous yellow and brown mutated locust with huge staring eyes and long powerful legs.", + "description": "A cow-sized yellow and brown mutated locust with huge, staring eyes and long, powerful legs. The bane of the post-apocalyptic farmer.", "copy-from": "mon_locust", "proportional": { "hp": 20, "speed": 0.25, "morale": 4, "dodge": 0.5, "vision_day": 2 }, "volume": "625 L", @@ -2470,7 +2470,7 @@ "id": "mon_mantis_giant", "type": "MONSTER", "name": { "str": "giant praying mantis", "str_pl": "giant praying mantises" }, - "description": "An enormous green creature grown about the size of a bear. It dances weirdly and looks ready to chop your head off at any moment.", + "description": "An enormous green insect grown to about the size of a bear. It moves in a weird, dance-like pattern and looks ready to chop your head off at any moment.", "default_faction": "mantis", "bodytype": "insect", "species": [ "INSECT" ], @@ -2511,7 +2511,7 @@ "id": "mon_mantis_mega", "type": "MONSTER", "name": { "str": "great mantis", "str_pl": "great mantises" }, - "description": "This ferocious creature is lurking through the land. It's probably capable of killing a moose with its powerful arms.", + "description": "This ferocious cow-sized mantis stalks the fields of New England. It's probably capable of killing a moose with its powerful arms.", "copy-from": "mon_mantis_giant", "proportional": { "hp": 20, "speed": 0.25, "vision_day": 2 }, "volume": "625 L", @@ -2547,7 +2547,7 @@ "id": "mon_mole_cricket", "type": "MONSTER", "name": { "str": "giant mole cricket" }, - "description": "An enormous underground bug. Beware the ear-splitting screech and strong shovel-like front legs.", + "description": "An enormous underground bug. Beware its ear-splitting screech and strong shovel-like front legs.", "default_faction": "insect", "bodytype": "insect", "species": [ "INSECT" ], @@ -2582,7 +2582,7 @@ "id": "mon_lady_bug_giant", "type": "MONSTER", "name": { "str": "giant lady bug" }, - "description": "This monster was cute with its black spotted red forewings and was adored by children as well as associated with good luck when it was the normal size, but this is clearly a ferocious predator capable of killing swarms of ants and aphids.", + "description": "The normal-sized version of this red and black beetle is generally considered cute, and is adored by children and associated with good luck. This monster, on the other hand is clearly a ferocious predator capable of killing swarms of ants, aphids, and unprepared humans.", "default_faction": "ladybug", "bodytype": "insect", "species": [ "INSECT" ], @@ -2916,7 +2916,7 @@ "id": "mon_antlion_giant", "type": "MONSTER", "name": { "str": "giant adult antlion" }, - "description": "A ferocious mutant flying antlion as big as a cat, darting through the air with a cluster of fangs for a mouth. Despite dangerous looks it doesn't seem interested in you.", + "description": "A ferocious mutant flying antlion as big as a cat, darting through the air with a cluster of fangs for a mouth. Despite its dangerous looks, it doesn't seem interested in you.", "default_faction": "antlion_adult", "bodytype": "flying insect", "species": [ "INSECT_FLYING" ], @@ -2948,7 +2948,7 @@ "id": "mon_strider_small", "type": "MONSTER", "name": { "str": "water strider" }, - "description": "This water bug is several times larger than a regular one. It's moves are fast and fluid.", + "description": "This water bug is several times larger than a regular one. It's movements are fast and fluid.", "copy-from": "mon_strider_giant", "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.5 }, "volume": "3 L", diff --git a/data/json/monsters/mammal.json b/data/json/monsters/mammal.json index f1f6cab04f65e..1198f24879f28 100644 --- a/data/json/monsters/mammal.json +++ b/data/json/monsters/mammal.json @@ -195,7 +195,7 @@ "id": "mon_boar_wild_piglet", "type": "MONSTER", "name": { "str": "wild boar piglet" }, - "description": "Originally not native in the US, this wild omnivore is a crossbreed between the Eurasian wild boar escaped from hunting reserves and the domesticated pig went feral in the wilderness. Its population has skyrocketed in the US during the last few decades.", + "description": "Originally not native in the U.S., this wild omnivore is a crossbreed between the Eurasian wild boar escaped from hunting reserves and the domesticated pig gone feral in the wilderness. This one is just a baby, and is surprisingly cute.", "default_faction": "pig", "bodytype": "pig", "categories": [ "WILDLIFE" ], @@ -228,7 +228,7 @@ "id": "mon_boar_wild", "type": "MONSTER", "name": { "str": "wild boar" }, - "description": "Originally not native in the US, this wild omnivore is a crossbreed between the Eurasian wild boar escaped from hunting reserves and the domesticated pig went feral in the wilderness. Its population has skyrocketed in the US during the last few decades.", + "description": "Originally not native in the U.S., this wild omnivore is a crossbreed between the Eurasian wild boar escaped from hunting reserves and the domesticated pig gone feral in the wilderness. Its population has skyrocketed during the last few decades.", "looks_like": "mon_pig", "default_faction": "pig", "bodytype": "pig", @@ -384,7 +384,7 @@ "type": "MONSTER", "copy-from": "mon_cat", "name": { "str": "longhair cat" }, - "description": "This cat's long fur appears difficult to groom, but the cat seems to manage it despite the environmental conditions.", + "description": "This cat's long fur appears difficult to groom, but it seems to manage despite the circumstances.", "volume": "6000 ml", "weight": "6 kg", "reproduction": { "baby_monster": "mon_cat_longhair_kitten", "baby_count": 4, "baby_timer": 60 } @@ -519,7 +519,7 @@ "type": "MONSTER", "copy-from": "mon_cat", "name": { "str": "calico cat" }, - "description": "Partly white with patches of orange and black, the calico coloring tells you this cat is probably female. The Calico was the Maryland State cat (back when there were still states).", + "description": "Partly white with patches of orange and black, the calico coloring tells you this cat is probably female. The calico was the Maryland state cat, back when there were still states.", "reproduction": { "baby_monster": "mon_cat_calico_kitten", "baby_count": 4, "baby_timer": 60 } }, { @@ -535,7 +535,7 @@ "type": "MONSTER", "copy-from": "mon_cat", "name": { "str": "golden chonker" }, - "description": "Lawd, he comin! This impressive feline would once have been celebrated on internet cat forums for its chonkiness and majestic golden mane. Appears surprisingly well-groomed for a feral cat.", + "description": "Oh lawd, he comin'! This impressive feline would once have been celebrated on internet cat forums for its chonkiness and majestic golden mane. Appears surprisingly well-groomed for a feral cat.", "volume": "8000 ml", "weight": "10 kg", "hp": 20, @@ -630,7 +630,7 @@ "id": "mon_cow_calf", "type": "MONSTER", "name": { "str": "calf", "str_pl": "calves" }, - "description": "The domestic cow, a baleful, ruminating farm animal. It is quite muscular, and the males can have a violent streak to accompany their nasty-looking horns.", + "description": "The domestic cow, a baleful, ruminating farm animal. This one is still a juvenile; it'll take a while before you can get any milk or a meaningful amount of meat from her.", "default_faction": "herbivore", "bodytype": "dog", "categories": [ "WILDLIFE" ], @@ -667,7 +667,7 @@ "id": "mon_cow", "type": "MONSTER", "name": { "str": "cow" }, - "description": "The domestic cow, a baleful, ruminating farm animal. It is quite muscular, and the males can have a violent streak to accompany their nasty-looking horns.", + "description": "The domestic cow, a baleful, ruminating farm animal. She is quite muscular, and would be a great source of milk if domesticated or of meat and leather if slaughtered.", "default_faction": "herbivore", "bodytype": "dog", "categories": [ "WILDLIFE" ], @@ -835,7 +835,7 @@ "id": "mon_dog", "type": "MONSTER", "name": { "str": "Labrador mutt" }, - "description": "This once-average Labrador mixed breed dog has clearly gone feral. Though it likely still instinctively trusts humans, it's probably far from domestic by now.", + "description": "This once-average Labrador mixed-breed dog has clearly gone feral. Though it likely still instinctively trusts humans, it's probably far from domestic by now.", "default_faction": "dog", "bodytype": "dog", "categories": [ "WILDLIFE" ], @@ -913,7 +913,7 @@ "copy-from": "mon_dog", "type": "MONSTER", "name": { "str": "bulldog" }, - "description": "The American bulldog is a hardy, well built dog, that seems suited for surviving the apocalypse.", + "description": "The American bulldog is a hardy, well-built dog that seems suited for surviving the apocalypse.", "volume": "25000 ml", "weight": "25 kg", "hp": 47, @@ -984,7 +984,7 @@ "copy-from": "mon_dog", "type": "MONSTER", "name": { "str": "pit bull mix", "str_pl": "pit bull mixes" }, - "description": "The oft-misunderstood pit bull is not actually a single breed but a label for several kinds of terriers. It has average abilities, and is well-known for its 'lock jaw' - which isn't real, but their incredible determination is.", + "description": "The oft-misunderstood pit bull is not actually a single breed but a label for several kinds of terriers. It has average abilities, and is well-known for its 'lock jaw' - which isn't real, but its incredible determination is.", "hp": 27, "weight": "25 kg", "speed": 135, @@ -1058,7 +1058,7 @@ "copy-from": "mon_dog", "type": "MONSTER", "name": { "str": "beagle" }, - "description": "An adorable beagle that has managed to survive the apocalypse. Being agile and small, they are difficult to shoot at. Generally attacks in packs.", + "description": "An adorable beagle that has managed to survive the apocalypse. Small and agile, but not especially tough. Generally attacks in packs.", "weight": "10 kg", "harvest": "mammal_small_leather", "hp": 13, @@ -1365,7 +1365,7 @@ "copy-from": "mon_dog", "type": "MONSTER", "name": { "str": "dachshund" }, - "description": "A wiener dog! This awkward looking dog can be a useful watchdog, plus it looks adorable as it bumbles around. Its tiny size also makes it hard to shoot (you monster).", + "description": "A wiener dog! This awkward looking dog can be a useful watchdog, plus it looks adorable as it bumbles around. Needless to say, it doesn't make a good attack dog.", "hp": 10, "weight": "10 kg", "speed": 135, @@ -1453,7 +1453,7 @@ "copy-from": "mon_dog", "type": "MONSTER", "name": { "str": "German Shepherd" }, - "description": "The original K-9 breed. An easy to train and great attack dog that will also defend its owner to the death, however they don't work well in packs.", + "description": "The original K-9 breed. An easily trained and powerful attack dog that will defend its owner to the death, however they don't work well in packs.", "volume": "35000 ml", "weight": "35 kg", "hp": 36, @@ -1776,7 +1776,7 @@ "id": "mon_fox_gray", "type": "MONSTER", "name": { "str": "fox", "str_pl": "foxes" }, - "description": "A small omnivorous canine with an almost cat-like manner. It is a solitary hunter, and one of the only canids able to climb trees.", + "description": "A small, omnivorous canine with almost cat-like mannerisms. It is a solitary hunter, and one of the only canids able to climb trees.", "default_faction": "fox", "bodytype": "dog", "categories": [ "WILDLIFE" ], @@ -1886,7 +1886,7 @@ "id": "mon_horse", "type": "MONSTER", "name": { "str": "horse" }, - "description": "A hooved grazing mammal with a mane of hair, a sweeping tail, and powerful-looking muscles.", + "description": "A hooved grazing mammal with a mane of hair, a sweeping tail, and powerful-looking muscles. A stalwart companion to humans for longer than recorded history, with some effort you should be able to get this one to trust you enough to ride it.", "default_faction": "herbivore", "bodytype": "horse", "categories": [ "WILDLIFE" ], @@ -1973,7 +1973,7 @@ "id": "mon_moose", "type": "MONSTER", "name": { "str_sp": "moose" }, - "description": "The Eastern moose, the largest living species of deer. While they aren't aggressive unless angered, the mating season can make the bulls quite ill-tempered.", + "description": "The Eastern moose, the largest living species of deer. While they aren't typically aggressive unless provoked, the autumn mating season can make the bulls quite ill-tempered.", "default_faction": "herbivore", "bodytype": "horse", "categories": [ "WILDLIFE" ], @@ -2105,7 +2105,7 @@ "id": "mon_otter", "type": "MONSTER", "name": { "str": "otter" }, - "description": "The North American river otter is a shy water dwelling relative of the weasel, living in large families along the banks of streams. It is an excellent fisher and a resourceful survivor, using the abandoned dens of beavers and other animals to raise its own young.", + "description": "The North American river otter, a shy water-dwelling relative of the weasel that lives in large families along the banks of streams. It is an excellent fisher and a resourceful survivor, using the abandoned dens of beavers and other animals to raise its own young.", "default_faction": "small_animal", "bodytype": "pig", "categories": [ "WILDLIFE" ], @@ -2131,7 +2131,7 @@ "id": "mon_pig_piglet", "type": "MONSTER", "name": { "str": "piglet" }, - "description": "A domesticated omnivore descended from the wild boar, intelligent and inquisitive. Left to its own devices, it has gone feral. Unlike the fully grown version it can be tamed.", + "description": "A domesticated omnivore descended from the wild boar, intelligent and inquisitive. Left to its own devices, it has gone feral. Unlike the fully grown version, this juvenile can be tamed.", "default_faction": "pig", "bodytype": "pig", "categories": [ "WILDLIFE" ], @@ -2201,7 +2201,7 @@ "id": "mon_rabbit", "type": "MONSTER", "name": { "str": "rabbit" }, - "description": "A small mammal with a cute wiggling nose, cotton tail, and made of delicious flesh.", + "description": "A small mammal with a cute wiggling nose, a cotton ball tail, and a body made of delicious flesh.", "default_faction": "small_animal", "bodytype": "pig", "categories": [ "WILDLIFE" ], @@ -2227,7 +2227,7 @@ "id": "mon_raccoon", "type": "MONSTER", "name": { "str": "raccoon" }, - "description": "A small mammal native to North America, distinctive for its dexterous paws and facial markings. It is resourceful and agile enough to open sealed containers with its paws.", + "description": "A small mammal native to North America, distinctive for its dexterous paws and facial markings. It is resourceful and agile enough to open sealed containers in search of food.", "default_faction": "small_animal", "bodytype": "pig", "categories": [ "WILDLIFE" ], @@ -2485,7 +2485,7 @@ "id": "mon_reindeer", "type": "MONSTER", "name": { "str": "Reindeer" }, - "description": "Also known as the Caribou, this deer is native to North America and parts of Eurasia, although usually friendly, they can be aggressive during mating season as well as when hungry.", + "description": "Also known as the caribou, this deer is native to North America and parts of Eurasia. Although usually friendly, they can be aggressive during the autumn and winter mating season as well as when hungry.", "default_faction": "herbivore", "bodytype": "horse", "categories": [ "WILDLIFE" ], @@ -2522,7 +2522,7 @@ "type": "MONSTER", "copy-from": "mon_reindeer", "name": { "str": "Reindeer fawn" }, - "description": "A juvenile Caribou, it seems to be smaller than its adult counterparts, as well as having shorter antlers.", + "description": "A juvenile caribou, it is smaller than its adult counterparts, as well as having shorter antlers.", "volume": "30000 ml", "weight": "120 g", "hp": 35, diff --git a/data/json/monsters/mechsuits.json b/data/json/monsters/mechsuits.json index baef2c7de3459..b44947716d2fb 100644 --- a/data/json/monsters/mechsuits.json +++ b/data/json/monsters/mechsuits.json @@ -3,7 +3,7 @@ "id": "mon_mech_recon", "type": "MONSTER", "name": { "str": "X-03: 'Spectre' Recon Mech" }, - "description": "The Boeing-Daewoo RMES (Recon Mechanical Exoskeleton Suit), a recent acquisition by the US military, it was designed to be used in a scout-recon-sniper role, due to its mobility and integrated laser sniper rifle and suite of optics for target designation and battlefield awareness. It was not deployed before the Cataclysm hit, though there were a few prototypes in the field. You may be able to hack it to accept you as its pilot. Like all mech-suits it can act as a UPS from its large battery.", + "description": "The Boeing-Daewoo RMES (Recon Mechanical Exoskeleton Suit), a recent acquisition by the U.S. military, it was designed to be used in a scout-recon-sniper role, due to its mobility, integrated laser sniper rifle, and suite of optics for target designation and battlefield awareness. It was not deployed before the Cataclysm hit, though there were a few prototypes in the field. You may be able to hack it to accept you as its pilot. Like all mech-suits, it can act as a UPS from its large battery.", "default_faction": "mech_bot", "species": [ "ROBOT" ], "diff": 5, @@ -51,7 +51,7 @@ "id": "mon_mech_combat", "type": "MONSTER", "name": { "str": "X-02: 'Grunt' Combat Mech" }, - "description": "The Boeing-Daewoo CMES (Combat Mechanical Exoskeleton Suit), a recent acquisition by the US military, it was designed to be used in a fire support role, due to its fearsome integrated gatling laser. It was not deployed before the Cataclysm hit, though there were a few prototypes in the field. You may be able to hack it to accept you as its pilot. Like all mech-suits it can act as a UPS from its large battery.", + "description": "The Boeing-Daewoo CMES (Combat Mechanical Exoskeleton Suit), a recent acquisition by the U.S. military, it was designed to be used in a fire support role, due to its fearsome integrated gatling laser. It was not deployed before the Cataclysm hit, though there were a few prototypes in the field. You may be able to hack it to accept you as its pilot. Like all mech-suits, it can act as a UPS from its large battery.", "default_faction": "mech_bot", "species": [ "ROBOT" ], "diff": 5, @@ -99,7 +99,7 @@ "id": "mon_mech_lifter", "type": "MONSTER", "name": { "str": "X-01: 'Jack' Lifting Mech" }, - "description": "The Boeing-Daewoo LMES (Lifting Mechanical Exoskeleton Suit), a recent acquisition by the US military, it was designed to be piloted by an operator to load and unload heavy material, and for limited combat support roles, it was not deployed before the Cataclysm hit, though there were a few prototypes in the field. You may be able to hack it to accept you as its pilot. Like all mech-suits it can act as a UPS from its large battery.", + "description": "The Boeing-Daewoo LMES (Lifting Mechanical Exoskeleton Suit), a recent acquisition by the U.S. military, it was designed to be piloted by an operator to load and unload heavy material, and for limited combat support roles. It was not deployed before the Cataclysm hit, though there were a few prototypes in the field. You may be able to hack it to accept you as its pilot. Like all mech-suits, it can act as a UPS from its large battery.", "default_faction": "mech_bot", "species": [ "ROBOT" ], "diff": 5, diff --git a/data/json/monsters/mi-go.json b/data/json/monsters/mi-go.json index 52746fd1f7352..a3666247d308c 100644 --- a/data/json/monsters/mi-go.json +++ b/data/json/monsters/mi-go.json @@ -3,7 +3,7 @@ "id": "mon_mi_go", "type": "MONSTER", "name": { "str": "mi-go" }, - "description": "This is an alien creature of uncertain origin. Its shapeless pink body bears numerous sets of paired appendages of unknown function, and a pair of ribbed, membranous wings which seem to be quite useless. Its odd, vaguely pyramid-shaped head bristles with numerous wavering antennae, and simply gazing upon the unnatural beast fills you with primordial dread.", + "description": "An alien creature of uncertain origin. Its shapeless pink body bears numerous sets of paired appendages of unknown function, and a pair of ribbed, membranous wings which seem to be quite useless. Its odd, vaguely pyramid-shaped head bristles with numerous wavering antennae, and simply gazing upon the unnatural beast fills you with primordial dread.", "default_faction": "mi-go", "bodytype": "migo", "species": [ "MIGO" ], @@ -53,7 +53,7 @@ "id": "mon_mi_go_slaver", "type": "MONSTER", "name": { "str": "mi-go slaver" }, - "description": "This is an alien creature of uncertain origin. Its shapeless pink body bears numerous sets of paired appendages of unknown function, and a pair of ribbed, membranous wings which seem to be quite useless. Its odd, vaguely pyramid-shaped head bristles with numerous wavering antennae, and simply gazing upon the unnatural beast fills you with primordial dread. It is carrying an oblong object that hums with an odd keening sound.", + "description": "An alien creature of uncertain origin. Its shapeless pink body bears numerous sets of paired appendages of unknown function, and a pair of ribbed, membranous wings which seem to be quite useless. Its odd, vaguely pyramid-shaped head bristles with numerous wavering antennae, and simply gazing upon the unnatural beast fills you with primordial dread. It is carrying an oblong object that hums with an odd keening sound.", "default_faction": "mi-go", "bodytype": "migo", "species": [ "MIGO" ], @@ -161,7 +161,7 @@ "id": "mon_mi_go_guard", "type": "MONSTER", "name": { "str": "mi-go guard" }, - "description": "This, like the more common mi-go, is an alien creature; this one is more heavily armored. Its trunk is a shapeless mass of strange flesh encased in an iridescent carapace, from which sprout several appendages terminating in what appear to be devices of some sort. Its pyramidal head is encrusted in barnacle-like armor, aside from the bristling antennae that serve as its - you must assume sensory devices and mouth.", + "description": "A more heavily armored version of the common mi-go. Its trunk is a shapeless mass of strange flesh encased in an iridescent carapace, from which sprout several appendages terminating in what appear to be devices of some sort. Its pyramidal head is encrusted in barnacle-like armor, aside from the bristling antennae that serve as its - you assume - sensory devices and mouth.", "default_faction": "mi-go", "bodytype": "migo", "species": [ "MIGO" ], @@ -221,7 +221,7 @@ "id": "mon_mi_go_myrmidon", "type": "MONSTER", "name": { "str": "mi-go myrmidon" }, - "description": "This creature resembles the smaller mi-go like a grizzly bear resembles a human. Its enormous, thick body is covered in an iridescent segmented carapace, like a scarab crossed with an isopod. It boasts several pairs of deadly looking claws and other appendages, and it moves with a strange, slow grace, like an otherworldly dancer. It actually appears to be carrying weaponry.", + "description": "This creature resembles the smaller mi-go like a grizzly bear resembles a human. Its enormous, thick body is covered in an iridescent segmented carapace, like a scarab crossed with an isopod. It boasts several pairs of deadly looking claws and other appendages, and it moves with a strange, slow grace, like an otherworldly dancer. It appears to be carrying weaponry.", "default_faction": "mi-go", "bodytype": "migo", "species": [ "MIGO" ], @@ -281,7 +281,7 @@ "id": "mon_mi_go_scout", "type": "MONSTER", "name": { "str": "mi-go scout" }, - "description": "This slender mi-go is a little smaller than most others of its kind. It has a weird oblong thing attached to the center of its body with some sort of a diaphragm or a membrane on the end. The thing seems like an integral part of the mi-go, and all its appendages are supporting it to prevent swaying.", + "description": "This slender mi-go is a little smaller than most others of its kind. It has a weird, oblong thing attached to the center of its body with some sort of a diaphragm or a membrane on the end. The thing seems like an integral part of the mi-go's body, and all its appendages are supporting it to prevent swaying.", "default_faction": "mi-go", "bodytype": "migo", "species": [ "MIGO" ], diff --git a/data/json/monsters/misc.json b/data/json/monsters/misc.json index 1f5923b6133d8..7157885b3a39c 100644 --- a/data/json/monsters/misc.json +++ b/data/json/monsters/misc.json @@ -250,7 +250,7 @@ "id": "mon_halloween_ghost", "type": "MONSTER", "name": { "str": "inflatable ghost" }, - "description": "A human sized inflatable for Halloween decorations.", + "description": "A human-sized inflatable ghost for Halloween decorations.", "looks_like": "mon_darkman", "default_faction": "factionless", "species": [ "UNKNOWN" ], @@ -274,7 +274,7 @@ "id": "mon_mannequin_decoy", "type": "MONSTER", "name": { "str": "mannequin decoy" }, - "description": "A human sized mannequin, making noise.", + "description": "A human-sized mannequin, speaking pre-recorded phrases.", "looks_like": "mon_shia", "default_faction": "factionless", "species": [ "UNKNOWN" ], diff --git a/data/json/monsters/mutant.json b/data/json/monsters/mutant.json index eb92c01ebb2cf..94d0f3a12d073 100644 --- a/data/json/monsters/mutant.json +++ b/data/json/monsters/mutant.json @@ -3,7 +3,7 @@ "id": "mon_mutant_experimental", "type": "MONSTER", "name": { "str": "experimental mutant" }, - "description": "A deformed mutant in an torn jumpsuit, looking at you with insane hatred. Their skin is a chaotic mix of scales, fur and chitin, and their fingers end in long talons.", + "description": "A deformed mutant in a torn jumpsuit, looking at you with insane hatred. Their skin is a chaotic mix of scales, fur and chitin, and their fingers end in long talons.", "default_faction": "lab_mutant", "bodytype": "human", "species": [ "MUTANT" ], @@ -97,7 +97,7 @@ "id": "mon_mutant_antler", "type": "MONSTER", "name": { "str": "ungulate mutant" }, - "description": "A gigantic mutated test subject, still wearing the tattered remains of an orange jumpsuit. It walks on four warped legs ending in hooves, and its head is dominated by a glistening, tangled crown of antlers that scratch the ceiling.", + "description": "A gigantic mutated test subject, still wearing the tattered remains of an orange jumpsuit. They walk on four warped legs ending in hooves, and their head is dominated by a glistening, tangled crown of antlers that scratch the ceiling.", "symbol": "M", "color": "brown", "bodytype": "horse", @@ -134,7 +134,7 @@ "id": "mon_mutant_arthropod", "type": "MONSTER", "name": { "str": "arthropod mutant" }, - "description": "A horribly mutated experimental subject. Its original body - still wearing their orange jumpsuit - flops around lifelessly, carried by twelve segmented legs covered in hairy chitin erupting from its back. At the base of the front pair of legs an almost human scalp gives way to a dozen irregularly-sized eyes and a set of mandibles, and from its hind end a stinger not unlike a scorpion's emerges.", + "description": "A horribly mutated experimental subject. Their original body - still wearing an orange jumpsuit - flops around lifelessly, carried by twelve segmented legs covered in hairy chitin erupting from their back. At the base of the front pair of legs, an almost-human scalp gives way to a dozen irregularly-sized eyes and a set of mandibles, and from their hind end a stinger not unlike a scorpion's emerges.", "copy-from": "mon_mutant_antler", "bodytype": "spider", "color": "i_black", @@ -176,7 +176,7 @@ "id": "mon_mutant_camouflaged", "type": "MONSTER", "name": { "str": "camouflaged mutant" }, - "description": "A mutated test subject, running on all fours at alarming speed. Its short fur changes color to match the background in an instant, making you struggle to keep the thing in focus. Its thin limbs end in long talons, and its mouth is kept perpetually open by a set of knife-sized fangs.", + "description": "A mutated test subject, running on all fours at alarming speed. Their short fur changes color to match the background in an instant, making you struggle to keep the thing in focus. Their thin limbs end in long talons, and their mouth is held perpetually open by a set of knife-sized fangs.", "copy-from": "mon_mutant_antler", "color": "blue", "bodytype": "dog", @@ -210,7 +210,7 @@ "id": "mon_mutant_alpha", "type": "MONSTER", "name": { "str": "transcendent mutant" }, - "description": "An experimental subject wearing a surprisingly clean orange jumpsuit. They look unchanged at a distance, but as you approach their head spins towards you with an unnatural speed. Their face is disconcertingly beautiful, but the eyes shine with an intelligence far beyond human - and a deep disgust directed at you.", + "description": "An experimental subject wearing a surprisingly clean orange jumpsuit. They look unchanged at a distance, but as you approach their head spins towards you with unnatural speed. Their face is disconcertingly beautiful, but their eyes shine with an intelligence far beyond human - and a deep disgust directed at you.", "copy-from": "mon_mutant_antler", "looks_like": "mon_feral_scientist_scalpel", "color": "white", @@ -244,7 +244,7 @@ "id": "mon_mutant_alpha_boss", "type": "MONSTER", "name": { "str": "mutant child" }, - "description": "A thin child with a shaved head, wearing a too-large white lab coat over a baggy orange jumpsuit. They turn their head towards you with uncanny speed, and you're takan aback by the inhuman curiosity burning in their eyes. The angelic smile does very little to reassure you of their intentions.", + "description": "A thin child with a shaved head, wearing a too-large white lab coat over a baggy orange jumpsuit. They turn their head towards you with uncanny speed, and you're takan aback by the inhuman curiosity burning in their eyes. Their angelic smile does very little to reassure you of their intentions.", "copy-from": "mon_mutant_alpha", "looks_like": "mon_zombie_child", "proportional": { "hp": 0.5, "volume": 0.33, "weight": 0.33, "dodge": 1.2 }, @@ -262,7 +262,7 @@ "id": "mon_mutant_mollusk", "type": "MONSTER", "name": { "str": "shelled mutant" }, - "description": "An enormous mutant hidden beneath a gray segmented shell, crawling on a carpet of innumerable tentacles covered with suckers. It holds three thicker, branching limbs high on its front end, each dotted with dozens of unblinking eyeballs.", + "description": "An enormous mutant hidden beneath a gray segmented shell, crawling on a carpet of innumerable tentacles covered with suckers. They hold three thicker, branching limbs high on their front end, each dotted with dozens of unblinking eyeballs.", "copy-from": "mon_mutant_antler", "color": "dark_gray", "bodytype": "snake", diff --git a/data/json/monsters/mutant_mammal.json b/data/json/monsters/mutant_mammal.json index 9f09f215a78c6..bfa4ab46513c4 100644 --- a/data/json/monsters/mutant_mammal.json +++ b/data/json/monsters/mutant_mammal.json @@ -46,7 +46,7 @@ "id": "mon_beaver_mutant_huge", "type": "MONSTER", "name": { "str": "dambreaker" }, - "description": "This mutated beaver's size is almost double what it should be, and its back is covered with tough-looking bristles.", + "description": "This mutated beaver is almost double its normal size, and its back is covered with tough-looking bristles.", "default_faction": "small_animal", "bodytype": "bear", "categories": [ "WILDLIFE" ], diff --git a/data/json/monsters/nether.json b/data/json/monsters/nether.json index 1cc1e7e7aaa96..02150cc25771f 100644 --- a/data/json/monsters/nether.json +++ b/data/json/monsters/nether.json @@ -3,7 +3,7 @@ "id": "mon_albino_penguin", "type": "MONSTER", "name": { "str": "albino penguin" }, - "description": "Eight-feet-tall ghastly white penguins. Placid unless otherwise provoked.", + "description": "An eight-foot-tall, ghastly white penguin. Its muscular body suggests immense strength, but it seems placid unless otherwise provoked.", "default_faction": "nether", "bodytype": "bear", "categories": [ "WILDLIFE" ], @@ -139,7 +139,7 @@ "id": "mon_breather_hub", "type": "MONSTER", "name": { "str": "breather" }, - "description": "A weird mass of immobile pink goo. It seems to breathe.", + "description": "A weird mass of immobile, breathing pink goo. The other breathers seem to originate from this one.", "default_faction": "nether", "bodytype": "blob", "species": [ "NETHER" ], @@ -159,7 +159,7 @@ "id": "mon_shrapnel_swarm", "type": "MONSTER", "name": { "str": "shrapnel swarm" }, - "description": "Uncountable jagged spikes cleaving reality as they fly through its invisible seams.", + "description": "Uncountable jagged spikes, cleaving reality as they fly through its invisible seams.", "default_faction": "nether", "bodytype": "blob", "species": [ "NETHER" ], @@ -320,7 +320,7 @@ "id": "mon_flaming_eye", "type": "MONSTER", "name": { "str": "flaming eye" }, - "description": "An enormous disembodied eyeball the size of a person, flying through the air through some unknown agency. Wreathed in unnatural flickering blue flame, it possesses a blazing yellow iris with a slitted pupil like that of a cat and trails a set of flailing black tendrils as it slowly drifts about; its unearthly presence filling you with dread at the prospect of falling under its baleful gaze.", + "description": "An enormous disembodied eyeball the size of a person, flying through the air through some unknown agency. Wreathed in unnatural flickering blue flame, it possesses a blazing yellow iris with a slitted pupil like that of a cat, and trails a set of flailing black tendrils as it slowly drifts about. Its unearthly presence fills you with dread at the prospect of falling under its baleful gaze.", "default_faction": "nether", "species": [ "NETHER" ], "diff": 20, @@ -348,7 +348,7 @@ "id": "mon_flying_polyp", "type": "MONSTER", "name": { "str": "flying polyp" }, - "description": "A half polypous, utterly alien creature. It's only partly material and has the ability to fly, despite the absence of wings. It produces strange whistling noises which send cold shivers of primal terror down your spine.", + "description": "A half-polypous, utterly alien creature. It's only partly material and has the ability to fly, despite the absence of wings. It produces strange whistling noises which send cold shivers of primal terror down your spine.", "default_faction": "nether", "bodytype": "blob", "species": [ "NETHER" ], @@ -474,7 +474,7 @@ "id": "mon_gracke", "type": "MONSTER", "name": { "str": "gracken" }, - "description": "This is some form of eldritch monstrosity; an uncouth black being with smooth, oily, skin and unpleasant horns that curve inward toward each other. Tall and thin, the shadows cling unnaturally to its vaguely defined humanoid form as it shuffles along, its hands twitching and spasming so rapidly as to appear a little more than a black blur of claws. Gazing upon its disturbing form fills you with an unspeakable terror.", + "description": "This is some form of eldritch monstrosity; an uncouth black being with smooth, oily skin and unpleasant horns that curve inward toward each other. Tall and thin, the shadows cling unnaturally to its vaguely defined humanoid form as it shuffles along, its hands twitching and spasming so rapidly as to appear a little more than a black blur of claws. While it doesn't seem aggressive, gazing upon its disturbing form fills you with an unspeakable terror regardless.", "default_faction": "nether", "bodytype": "human", "species": [ "NETHER" ], @@ -531,7 +531,7 @@ "id": "mon_hound_tindalos", "type": "MONSTER", "name": { "str": "hound of tindalos", "str_pl": "hounds of tindalos" }, - "description": "A grotesque hound-like beast, its frame is angular and emaciated and its head is like that of an abyssal fish. When it moves, twisted limbs duplicate, merge, disappear, and reform in dissonance, as if a hundred copies of itself were somehow forced to inhabit the same space. Extraneous to our reality, it moves between the corners of the world, hunting those that would dare stepping beyond time and space.", + "description": "A grotesque dog-like beast, its frame is angular and emaciated and its head is like that of an abyssal fish. When it moves, its twisted limbs duplicate, merge, disappear, and reform in dissonance, as if a hundred copies of itself were somehow forced to inhabit the same space. Extraneous to our reality, it moves between the corners of the world, hunting those that would dare step beyond time and space.", "default_faction": "nether", "bodytype": "dog", "species": [ "NETHER" ], @@ -577,7 +577,7 @@ "id": "mon_hound_tindalos_afterimage", "type": "MONSTER", "name": { "str": "hound of tindalos", "str_pl": "hounds of tindalos" }, - "description": "A grotesque hound-like beast, its frame is angular and emaciated and its head is like that of an abyssal fish. When it moves, twisted limbs duplicate, merge, disappear, and reform in dissonance, as if a hundred copies of itself were somehow forced to inhabit the same space. Extraneous to our reality, it moves between the corners of the world, hunting those that would dare stepping beyond time and space.", + "description": "A grotesque dog-like beast, its frame is angular and emaciated and its head is like that of an abyssal fish. When it moves, its twisted limbs duplicate, merge, disappear, and reform in dissonance, as if a hundred copies of itself were somehow forced to inhabit the same space. Extraneous to our reality, it moves between the corners of the world, hunting those that would dare step beyond time and space.", "default_faction": "nether", "bodytype": "dog", "species": [ "NETHER" ], @@ -651,7 +651,7 @@ "id": "mon_hunting_horror", "type": "MONSTER", "name": { "str": "hunting horror" }, - "description": "This is some sort of great viperine creature, possessed of a curiously distorted head and massive clawed appendages. It partially supports itself with the aid of black rubbery wings of monstrous dimensions. Its form writhes and changes before your eyes, filling you with unnameable horror.", + "description": "This is some sort of great viperine creature, possessed of a curiously distorted head and massive clawed appendages. It partially supports itself with the aid of black, rubbery wings of monstrous dimensions. Its form writhes and changes before your eyes, filling you with unnameable horror.", "default_faction": "nether", "species": [ "NETHER" ], "volume": "62500 ml", @@ -689,7 +689,7 @@ "id": "mon_kreck", "type": "MONSTER", "name": { "str": "kreck" }, - "description": "This is some form of otherworldly hound. Lean and hungry looking, its twisted red flesh is stretched tightly across its misshapen, angular frame. Loping grotesquely along, its unusually long neck stretches forward, its skull-like head near the ground as it sniffs out its prey. Its foulness partially veiled by some arcane force, it seems to almost flicker in and out of your perceptions in a fashion that awakens ancient nameless terrors in the back of your mind.", + "description": "This is some form of otherworldly hound. Lean and hungry-looking, its twisted red flesh is stretched tightly across its misshapen, angular frame. Loping grotesquely along, its unusually long neck stretches forward, its skull-like head near the ground as it sniffs out its prey. Its foulness partially veiled by some arcane force, it seems to almost flicker in and out of your perceptions in a fashion that awakens ancient nameless terrors in the back of your mind.", "default_faction": "nether", "bodytype": "dog", "species": [ "NETHER" ], @@ -721,7 +721,7 @@ "id": "mon_rabbit_dreadful", "type": "MONSTER", "name": { "str": "rabbit" }, - "description": "A small mammal with a cute wiggling nose, cotton tail, and made of delicious flesh.", + "description": "A small mammal with a cute wiggling nose, a cotton ball tail, and a body made of delicious flesh.", "default_faction": "mutant", "bodytype": "pig", "looks_like": "mon_rabbit", @@ -970,7 +970,7 @@ "id": "mon_shifting_mass", "type": "MONSTER", "name": { "str": "shifting mass", "str_pl": "shifting masses" }, - "description": "A small, shifting mass floating in midair. It is not even real enough to have a stable shape. You can see through it, not as if it were transparent but as if it isn't quite fully here.", + "description": "A small, shifting mass floating in midair. It is not even real enough to have a stable shape. You can see through it, not as if it were transparent, but as if it isn't quite fully there.", "default_faction": "nether", "species": [ "NETHER" ], "volume": "1000 ml", @@ -997,7 +997,7 @@ "id": "mon_impossible_shape", "type": "MONSTER", "name": { "str": "Impossible shape" }, - "description": "A twisted shape floating in midair; its angles don't seem to quite add up - it hurts to look at. You can see through it, not as if it were transparent but as if it isn't quite fully here.", + "description": "A twisted shape floating in midair; its angles don't quite seem to add up - it hurts to look at. You can see through it, not as if it were transparent but as if it isn't quite fully there.", "default_faction": "nether", "species": [ "NETHER" ], "volume": "62500 ml", @@ -1024,7 +1024,7 @@ "id": "mon_absence", "type": "MONSTER", "name": { "str": "Absence" }, - "description": "Every sense you have claims this space to be empty, but your mind is not fooled. There is an emptiness here, that is far from natural or safe.", + "description": "Every sense you have claims this space to be empty, but your mind is not fooled. There is an emptiness here that is far from natural or safe.", "default_faction": "nether", "species": [ "NETHER" ], "volume": "62500 ml", @@ -1051,7 +1051,7 @@ "id": "mon_giant_appendage", "type": "MONSTER", "name": { "str": "Giant appendage" }, - "description": "A gigantic appendage, its end looks like a portal, as if this is merely a probing piece of something much larger.", + "description": "A gigantic appendage reaching through what looks like a portal, as if this is merely a probing piece of something much larger.", "default_faction": "nether", "species": [ "NETHER" ], "volume": "62500 ml", diff --git a/data/json/monsters/power_leech.json b/data/json/monsters/power_leech.json index 5068f3b82128c..63715f5040ecc 100644 --- a/data/json/monsters/power_leech.json +++ b/data/json/monsters/power_leech.json @@ -144,7 +144,7 @@ "id": "mon_leech_root_runner", "type": "MONSTER", "name": { "str": "root runner" }, - "description": "This clump of woody vegetation hastily clambers around in a lizard-like fashion. Three translucent scale-leaves stand tall on the backside of the creature, and the thin ridges within them periodically glow through some unknown mean. It's seemingly a symbiote of the nearby alien ferns, and looks ready to defend them with its life.", + "description": "This clump of woody vegetation hastily clambers around in a lizard-like fashion. Three translucent scale-leaves stand tall on the backside of the creature, and the thin ridges within them periodically glow through some unknown means. It's seemingly a symbiote of the nearby alien ferns, and looks ready to defend them with its life.", "default_faction": "leech_plant", "species": [ "LEECH_PLANT" ], "volume": "4000 ml", @@ -187,7 +187,7 @@ "id": "mon_leech_root_drone", "type": "MONSTER", "name": { "str": "root drone" }, - "description": "A small bulb with a beak-like protuberance, skittishly roaming about under three tendril rhizomes. Dripping and glistening, it resembles a creature newly born rather than a sapling grown from seeds.", + "description": "A small bulb with a beak-like protuberance, skittishly roaming about under three tendril rhizomes. Dripping and glistening, it resembles a newborn animal rather than a sapling grown from seeds.", "default_faction": "leech_plant", "species": [ "LEECH_PLANT" ], "volume": "3000 ml", diff --git a/data/json/monsters/reptile_amphibian.json b/data/json/monsters/reptile_amphibian.json index 175c2d558f5c0..258577e04fc35 100644 --- a/data/json/monsters/reptile_amphibian.json +++ b/data/json/monsters/reptile_amphibian.json @@ -27,7 +27,7 @@ "id": "mon_tadpole", "type": "MONSTER", "name": { "str_sp": "tadpole" }, - "description": "An amphibian in its larval stage. It will eventually grow legs and start breathing air.", + "description": "An American bullfrog in its larval stage. It will eventually grow legs and start breathing air.", "default_faction": "frog", "bodytype": "fish", "categories": [ "WILDLIFE" ], @@ -93,7 +93,7 @@ "id": "mon_gator", "type": "MONSTER", "name": { "str": "sewer gator" }, - "description": "In the late 20th century, there was an urban legend about pet alligators getting flushed down the toilet and growing to adulthood in sewers. This large specimen doesn't look like it sees humans as anything other than a meal.", + "description": "In the late 20th century, there was an urban legend about pet alligators getting flushed down the toilet and growing to adulthood in the sewers. If this large specimen was ever someone's pet, it doesn't look like it sees humans as anything other than a meal now.", "default_faction": "gator", "bodytype": "gator", "categories": [ "WILDLIFE" ], @@ -141,7 +141,7 @@ "id": "mon_rattlesnake", "type": "MONSTER", "name": { "str": "rattlesnake" }, - "description": "The timber rattlesnake is the most venomous viper native to New England. Climatic changes have extended its range far into the north.", + "description": "The timber rattlesnake, the most venomous viper native to New England. Climatic changes have extended its range far into the north.", "default_faction": "small_animal", "bodytype": "snake", "categories": [ "WILDLIFE" ], @@ -220,7 +220,7 @@ "id": "mon_sewer_snake", "type": "MONSTER", "name": { "str": "sewer snake" }, - "description": "An aggressive mutant variety of the worm snake, turned pale yellow from its underground life. It swarms beneath the ground and is named for its habit of infesting sewer lines.", + "description": "An aggressive mutant variety of the worm snake, turned pale yellow from lack of sunlight. It swarms beneath the ground, and is named for its habit of infesting sewer lines.", "default_faction": "sewer_snake", "bodytype": "snake", "species": [ "REPTILE" ], diff --git a/data/json/monsters/robofac_robots.json b/data/json/monsters/robofac_robots.json index b6862fd1470ba..530e8448cdea9 100644 --- a/data/json/monsters/robofac_robots.json +++ b/data/json/monsters/robofac_robots.json @@ -3,7 +3,7 @@ "id": "mon_robofac_laserturret_mk1", "type": "MONSTER", "name": { "str": "prototype laser turret" }, - "description": "This appears to be a very experimental automated tower. Plating-less and seemingly half-built, it's little more than an oversized laser emitter and a camera, both welded to a swiveling platform.", + "description": "This appears to be a very experimental automated tower. Lacking armor plating and seemingly half-built, it's little more than an oversized laser emitter and a camera, both welded to a swiveling platform.", "default_faction": "robofac", "species": [ "ROBOT" ], "volume": "30000 ml", diff --git a/data/json/monsters/slugs.json b/data/json/monsters/slugs.json index 73b80a167aae7..4f263fa2ae81e 100644 --- a/data/json/monsters/slugs.json +++ b/data/json/monsters/slugs.json @@ -3,7 +3,7 @@ "id": "mon_sludge_crawler", "type": "MONSTER", "name": { "str": "sludge crawler" }, - "description": "A sluglike creature, eight feet long and the width of a refrigerator. Its black body glistens as it oozes its way along the ground. Eye stalks occasionally push their way out of the oily mass and look around.", + "description": "A sluglike creature, eight feet long and the width of a refrigerator. Its black body glistens as it oozes its way along the ground. Eyestalks occasionally push their way out of the oily mass and look around.", "default_faction": "mutant", "species": [ "MUTANT" ], "diff": 2, @@ -36,7 +36,7 @@ "id": "mon_slug_small", "type": "MONSTER", "name": { "str": "slug" }, - "description": "A disturbingly large mutated slug as large as a human. Venom drips from something like a mouth and it is covered with sticky mucus.", + "description": "A disturbingly large mutated slug as large as a human. Venom drips from what must be its mouth, and it is covered with sticky mucus.", "copy-from": "mon_slug_giant", "volume": "62500 ml", "weight": "81500 g", @@ -47,7 +47,7 @@ "id": "mon_slug_giant", "type": "MONSTER", "name": { "str": "giant slug" }, - "description": "A mutated leopard slug, as wide as a golf cart. Venom dripping from its fanged maw, it slithers ahead slowly, leaving a trail of glistening slime.", + "description": "A mutated leopard slug, as wide as a golf cart. Venom dripping from its fanged maw, it slithers around slowly, leaving a trail of glistening slime.", "default_faction": "slug", "species": [ "MOLLUSK" ], "diff": 5, diff --git a/data/json/monsters/starers.json b/data/json/monsters/starers.json index a659055c830af..813c5352b90b8 100644 --- a/data/json/monsters/starers.json +++ b/data/json/monsters/starers.json @@ -3,7 +3,7 @@ "id": "mon_starer_pipe", "type": "MONSTER", "name": { "str": "starer" }, - "description": "Burned creature that still reeks of charred flesh. The flesh has mended into a leathery shell with wide open eyes. The pupils are dilated and the iris and sclera are bloodshot. Somehow it breathes, in deep ragged gulps.", + "description": "A horribly burned human, reeking of charred meat. Their flesh has mended into a leathery shell, and the pupils of their wide-open eyes are dilated and the iris and sclera are bloodshot. Somehow they still breathe, in deep, ragged gulps.", "copy-from": "mon_feral_human_pipe", "looks_like": "mon_zombie_scorched", "default_faction": "fungus", @@ -43,7 +43,7 @@ { "id": "mon_starer_crowbar", "type": "MONSTER", - "description": "Burned creature that still reeks of charred flesh. The flesh has mended into a leathery shell with wide open eyes. The pupils are dilated and the iris and sclera are bloodshot. Somehow it breathes again, in deep ragged gulps.", + "description": "A horribly burned human, reeking of charred meat. Their flesh has mended into a leathery shell, and the pupils of their wide-open eyes are dilated and the iris and sclera are bloodshot. Somehow they still breathe, in deep, ragged gulps.", "copy-from": "mon_starer_pipe", "melee_dice": 2, "melee_dice_sides": 6, @@ -52,7 +52,7 @@ { "id": "mon_starer_axe", "type": "MONSTER", - "description": "Burned creature that still reeks of charred flesh. The flesh has mended into a leathery shell with wide open eyes. The pupils are dilated and the iris and sclera are bloodshot. Somehow it breathes again, in deep ragged gulps.", + "description": "A horribly burned human, reeking of charred meat. Their flesh has mended into a leathery shell, and the pupils of their wide-open eyes are dilated and the iris and sclera are bloodshot. Somehow they still breathe, in deep, ragged gulps.", "copy-from": "mon_starer_pipe", "melee_dice": 2, "melee_dice_sides": 7, diff --git a/data/json/monsters/triffid.json b/data/json/monsters/triffid.json index 134c53163d398..eacef1636a708 100644 --- a/data/json/monsters/triffid.json +++ b/data/json/monsters/triffid.json @@ -4,7 +4,7 @@ "type": "MONSTER", "copy-from": "mon_biollante", "name": { "str": "biollante sprig" }, - "description": "A short fat stalk with broad leaves and tiny flower buds.", + "description": "A short, fat stalk with broad leaves and tiny flower buds.", "volume": "30000 ml", "weight": "40750 g", "hp": 20, @@ -18,7 +18,7 @@ "type": "MONSTER", "copy-from": "mon_biollante", "name": { "str": "biollante sprout" }, - "description": "A thick stalk that rises five feet from the ground and has heavy broad leaves at its base. Purple flower buds adorn the top.", + "description": "A thick stalk that rises five feet from the ground, with heavy, broad leaves at its base. Purple flower buds adorn the top.", "volume": "62500 ml", "weight": "81500 g", "hp": 60, @@ -157,7 +157,7 @@ "id": "mon_triffid", "type": "MONSTER", "name": { "str": "triffid" }, - "description": "A creeping animate plant, growing as tall as a moose. It has a single bark-covered stalk supporting a flowery head with a paralyzing sting concealed within.", + "description": "A creeping mobile plant, as tall as a moose. It has a single bark-covered stalk supporting a flowery head with a paralyzing sting concealed within.", "default_faction": "triffid", "species": [ "PLANT" ], "volume": "62500 ml", @@ -243,7 +243,7 @@ "id": "mon_fungal_fighter", "type": "MONSTER", "name": { "str": "fungal fighter" }, - "description": "A stout woody plant that can dig through the ground and flick spines from its branches. The thorns carry a fungicidal compound with paralytic effects.", + "description": "A stout, woody plant that can dig through the ground and flick spines from its branches. The thorns carry a fungicidal compound with paralytic effects.", "default_faction": "triffid", "species": [ "PLANT" ], "volume": "30000 ml", diff --git a/data/json/monsters/turrets.json b/data/json/monsters/turrets.json index 9a9d7df7bdc36..a03e37f17e6d3 100644 --- a/data/json/monsters/turrets.json +++ b/data/json/monsters/turrets.json @@ -3,7 +3,7 @@ "id": "mon_turret", "type": "MONSTER", "name": { "str": "improvised MP5 turret" }, - "description": "An MP5 attached to a motorized chassis with basic autonomous software control. There is no mechanism to reload the weapon when its magazine is empty and the fire control system is only designed for semi automatic fire.", + "description": "A 9mm MP5 attached to a motorized chassis with basic autonomous software control. There is no mechanism to reload the weapon when its magazine is empty, and the fire control system is only designed for semi-automatic fire.", "default_faction": "defense_bot", "species": [ "ROBOT" ], "diff": 20, @@ -51,7 +51,7 @@ "id": "mon_turret_searchlight", "type": "MONSTER", "name": { "str": "milspec searchlight" }, - "description": "Three high-powered searchlights with automated search AI and mounting, continually seeking targets.", + "description": "A pylon boasting three high-powered searchlights with automated search AI, continually seeking targets.", "default_faction": "military", "species": [ "ROBOT" ], "diff": 2, @@ -83,7 +83,7 @@ "id": "mon_turret_bmg", "type": "MONSTER", "name": { "str": "M2HB autonomous CROWS II" }, - "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the US military before the Cataclysm and they were valued for their use in engaging anything up to light vehicles at long range without exposing the operator. This one is fitted with a M2HB.", + "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the U.S. military before the Cataclysm, and they were valued for their use in engaging anything up to light vehicles at long range without exposing the operator. This one is fitted with a .50 caliber M2HB machine gun.", "default_faction": "military", "species": [ "ROBOT" ], "diff": 40, @@ -143,7 +143,7 @@ "id": "mon_turret_rifle", "type": "MONSTER", "name": { "str": "M249 autonomous CROWS II" }, - "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the US military before the Cataclysm and they were valued for their use in engaging infantry without exposing the operator. This one is fitted with a M249.", + "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the U.S. military before the Cataclysm, and they were valued for their use in engaging infantry without exposing the operator. This one is fitted with a 5.56 caliber M249 machine gun.", "default_faction": "military", "species": [ "ROBOT" ], "diff": 30, @@ -203,7 +203,7 @@ "id": "mon_crows_m240", "type": "MONSTER", "name": { "str": "M240 autonomous CROWS II" }, - "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the US military before the Cataclysm and they were valued for their use in engaging infantry without exposing the operator. This one is fitted with a M240.", + "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the U.S. military before the Cataclysm, and they were valued for their use in engaging infantry without exposing the operator. This one is fitted with a 7.62 caliber M240 machine gun.", "default_faction": "military", "species": [ "ROBOT" ], "diff": 35, @@ -263,7 +263,7 @@ "id": "mon_turret_riot", "type": "MONSTER", "name": { "str": "riot control platform" }, - "description": "These TALON-derived riot control platforms were widely publicized a few years before the Cataclysm as a new semi-autonomous device that could fire less-lethal rounds with far more accuracy than a human, ensuring safer hits against a target's limbs. They were quickly adopted by prisons and inner city police forces, where they demonstrated that 'less lethal' is not the same as 'non-lethal'. In the days before the Cataclysm, massive stockrooms of the things were put into circulation. On the bright side, although it shoots autonomously, it requires a human operator to relocate, so it's not so mobile anymore.", + "description": "These TALON-derived riot control platforms were widely publicized a few years before the Cataclysm as a new semi-autonomous device that could fire less-lethal rounds with far more accuracy than a human, ensuring safer hits against a target's limbs. They were quickly adopted by prisons and inner-city police forces, where they demonstrated that 'less lethal' does not mean 'non-lethal'. In the days before the Cataclysm, massive stockrooms of these things were put into circulation. On the bright side, although it shoots autonomously, it requires a human operator to relocate, so it's not mobile anymore.", "default_faction": "cop_bot", "looks_like": "mon_turret", "species": [ "ROBOT" ], @@ -324,7 +324,7 @@ "id": "mon_turret_speaker", "type": "MONSTER", "name": { "str": "loudspeaker" }, - "description": "High-powered loudspeaker, repeating loud messages over and over again.", + "description": "A high-powered loudspeaker set to loudly repeat messages on a loop.", "default_faction": "military", "species": [ "ROBOT" ], "diff": 2, @@ -353,7 +353,7 @@ "id": "mon_exodii_turret", "type": "MONSTER", "name": { "str": "upcycled turret" }, - "description": "This hefty turret appears to be bolted together out of various scraps of technology, many of them extremely foreign looking. It is equipped with a hefty looking machine gun.", + "description": "This hefty turret appears to be bolted together out of various scraps of technology, many of them extremely foreign-looking. It is equipped with a hefty-looking machine gun.", "default_faction": "exodii", "weight": "206 kg", "volume": "105 L", diff --git a/data/json/monsters/utility_bot.json b/data/json/monsters/utility_bot.json index 41c77e469c06d..97d077a98f7f8 100644 --- a/data/json/monsters/utility_bot.json +++ b/data/json/monsters/utility_bot.json @@ -30,7 +30,7 @@ "id": "mon_grocerybot", "type": "MONSTER", "name": { "str": "grocery bot" }, - "description": "A popular product from Uncanny, this friendly android can carry your bag or push your Grocery Cart for you. You know it's friendly because its human face is constantly smiling at you. According to the ads it uses a state-machine of a complexity never seen before, Uncanny even hired professional actors to record its lines. Examine to befriend.", + "description": "A popular product from Uncanny, this friendly android can carry your bag or push your grocery cart for you. You know it's friendly because its human-esque face is constantly smiling at you. According to the ads, it uses state-of-the-art artificial intelligence of a complexity never seen before. Uncanny even hired professional actors to record its lines. Examine to befriend.", "default_faction": "mech_bot", "species": [ "ROBOT" ], "volume": "62500 ml", @@ -70,7 +70,7 @@ "id": "mon_grocerybot_busted", "type": "MONSTER", "name": { "str": "busted grocery bot" }, - "description": "A busted grocery bot, it can still carry your bag but its arms are too damaged to push a Grocery Cart. Despite its current state it's still smiling at you. Examine to befriend.", + "description": "A busted grocery bot, it can still carry your bag but its arms are too damaged to push a grocery cart. Despite its current state, it's still smiling at you. Examine to befriend.", "default_faction": "mech_bot", "species": [ "ROBOT" ], "volume": "62500 ml", @@ -175,7 +175,7 @@ "id": "mon_nursebot", "type": "MONSTER", "name": { "str": "nurse bot" }, - "description": "The first product from Uncanny, a towering four-armed humanoid with a gentle face. The details of its visage are striking, but the stiffness of it makes you really uncomfortable. The end of the world did not stop it from looking for patient to assist.", + "description": "The first product from Uncanny, a towering four-armed humanoid with a gentle face. The details of its visage are striking, but the stiffness of it makes you really uncomfortable. The end of the world did not stop it from looking for patients to assist.", "default_faction": "nurse_bot", "species": [ "ROBOT" ], "volume": "62500 ml", @@ -206,7 +206,7 @@ "type": "MONSTER", "name": { "str": "nurse bot" }, "looks_like": "mon_nursebot", - "description": "The first product from Uncanny, a towering four-armed humanoid with a gentle face. The details of its visage are striking, but the stiffness of it makes you really uncomfortable. The end of the world did not stop it from looking for patient to assist.", + "description": "The first product from Uncanny, a towering four-armed humanoid with a gentle face. The details of its visage are striking, but the stiffness of it makes you really uncomfortable. The end of the world did not stop it from looking for patients to assist.", "default_faction": "nurse_bot", "species": [ "ROBOT" ], "volume": "62500 ml", diff --git a/data/json/monsters/zanimal_upgrade.json b/data/json/monsters/zanimal_upgrade.json index e1e3e40e16a75..ea76aa92306e3 100644 --- a/data/json/monsters/zanimal_upgrade.json +++ b/data/json/monsters/zanimal_upgrade.json @@ -3,7 +3,7 @@ "id": "mon_dog_skeleton", "type": "MONSTER", "name": { "str": "skeletal dog" }, - "description": "This once-canine has shed all of its skin, revealing a carapace of fused bones and ribs. This walking suit of bone seems to be controlled by a net of veins and sinews which pulse with glistening black goo.", + "description": "This undead canine has shed all of its skin, revealing a carapace of fused bones and ribs. This walking suit of bone seems to be controlled by a net of veins and sinews which pulse with glistening black goo.", "default_faction": "zombie", "bodytype": "dog", "species": [ "ZOMBIE" ], @@ -38,7 +38,7 @@ "type": "MONSTER", "name": { "str": "barghest" }, "copy-from": "mon_dog_zombie_rot", - "description": "Huge swollen zombie dog, smeared black with slime. Its teeth are longer and its broad back is rippling with muscles and oozing wounds.", + "description": "A huge swollen zombie dog, smeared black with slime. Its teeth have grown longer, and its broad back ripples with muscles and oozing wounds.", "diff": 2, "color": "red", "proportional": { "hp": 1.5, "speed": 1.5, "attack_cost": 1.5 }, @@ -89,7 +89,7 @@ "type": "MONSTER", "copy-from": "mon_dog_skeleton", "name": { "str": "boneplate wolf", "str_pl": "boneplate wolves" }, - "description": "This is a four legged creature covered in fused bony plates, shaped somewhat like a dog or wolf. Joints and cracks around its body ooze with black goo.", + "description": "A four-legged creature covered in fused bony plates, shaped somewhat like a dog or wolf. Joints and cracks across its body ooze with black goo.", "volume": "46 L", "weight": "60 kg", "hp": 70, @@ -114,7 +114,7 @@ "type": "MONSTER", "name": { "str": "skull pig" }, "copy-from": "mon_zombie_pig", - "description": "This former wild boar appears to have been a truly massive specimen in life. Stretching eight to nine feet in length, the most arresting feature of this animal is that the enamel of its tusks has spread across its face leaving a skull-like appearance with deep-set eyeholes.", + "description": "This undead boar appears to have been a truly massive specimen in life. Stretching eight to nine feet in length, the most arresting feature of this animal is that the enamel of its tusks has spread across its face, leaving a skull-like appearance with deep-set eye holes.", "diff": 2, "color": "red", "weight": "281 kg", @@ -137,7 +137,7 @@ "type": "MONSTER", "name": { "str": "trench pig" }, "copy-from": "mon_zombie_pig", - "description": "Billowing clouds of yellow-streaked gas precede boar-shaped shadows. Glimpses of a zombie boar are quickly obscured by the gases leaving its body through open wounds.", + "description": "Billowing clouds of yellowish gas precede a boar-shaped shadow. Glimpses of a zombified boar are quickly obscured by the gases spewing forth from the open wounds on its body.", "diff": 5, "color": "red", "bleed_rate": 50, @@ -152,7 +152,7 @@ "id": "mon_wolf_skeleton", "type": "MONSTER", "name": { "str": "skeletal wolf", "str_pl": "skeletal wolves" }, - "description": "This once-canine has shed all of its skin, revealing a carapace of fused bones and ribs. Devoid entirely of flesh, this walking suit of bone seems to be controlled by a net of veins and sinews which pulse with glistening black goo.", + "description": "This undead canine has shed all of its skin, revealing a carapace of fused bones and ribs. Devoid entirely of flesh, this walking suit of bone seems to be controlled by a net of veins and sinews which pulse with glistening black goo.", "looks_like": "mon_dog_skeleton", "default_faction": "zombie", "bodytype": "dog", @@ -188,7 +188,7 @@ "type": "MONSTER", "name": { "str": "spearcat hunter" }, "copy-from": "mon_zougar", - "description": "This cougar's eyes ooze with dark, oily fluid, and its fur is torn, revealing deep festering wounds. Its claws and teeth are unnaturally long and sharpened into dangerous looking spikes", + "description": "This undead cougar's eyes ooze with dark, oily fluid, and its fur is torn, revealing deep, festering wounds. Its claws and teeth are unnaturally long, and sharpened into dangerous looking spikes", "hp": 200, "speed": 190, "attack_cost": 190, @@ -266,7 +266,7 @@ "type": "MONSTER", "name": { "str": "acidic zombear" }, "copy-from": "mon_zombear", - "description": "A sickly-looking dead dead black bear with patchy fur. Its skin looks especially thin, with a sticky, yellow fluid flowing through the clearly visible veins.", + "description": "A sickly-looking zombear with patchy fur. Its skin looks especially thin, with a sticky, yellow fluid flowing through the clearly visible veins.", "diff": 5, "hp": 145, "speed": 135, @@ -299,7 +299,7 @@ "type": "MONSTER", "name": { "str": "antlered hammer" }, "copy-from": "mon_zoose", - "description": "This once great moose's eyes ooze with dark, oily fluid, and its flesh is torn and scarred. Its entire body bulges with distended muscles and swollen, festering wounds.", + "description": "This once-great moose's eyes ooze with dark, oily fluid, and its flesh is torn and scarred. Its entire body bulges with distended muscles and swollen, festering wounds.", "diff": 2, "hp": 315, "speed": 210, @@ -336,7 +336,7 @@ "type": "MONSTER", "name": { "str": "thorny moose shambler" }, "copy-from": "mon_zoose", - "description": "What once was a great moose is now covered with long, matted hair twisted with thorny vines that wrap together and then twist back into the body. Long interlocking thorns wrap the antlers, dripping with a mysterious silvery liquid.", + "description": "This once-great moose is covered with long, matted hair twisted with thorny vines that wrap together and then twist back into its body. Long, interlocking thorns wrap its antlers, dripping with a silvery liquid.", "species": [ "ZOMBIE", "PLANT" ], "speed": 100, "material": [ "veggy" ], diff --git a/data/json/monsters/zed-animal.json b/data/json/monsters/zed-animal.json index 44697c3385510..bf862be8ad433 100644 --- a/data/json/monsters/zed-animal.json +++ b/data/json/monsters/zed-animal.json @@ -3,7 +3,7 @@ "id": "mon_zhark", "type": "MONSTER", "name": { "str": "jawed terror" }, - "description": "Once a normally-aggressive, normally-hungry bull shark, this jawed terror is now even more of the same, possibly thanks to its lack of a functioning brain.", + "description": "Once a normally-aggressive, normally-hungry bull shark, this undead terror is now even more aggressive and more hungry, possibly thanks to its lack of a functioning brain.", "default_faction": "zombie_aquatic", "bodytype": "fish", "species": [ "ZOMBIE" ], @@ -110,7 +110,7 @@ "id": "mon_dog_zombie_rot", "type": "MONSTER", "name": { "str": "rot-weiler" }, - "description": "An acrid smell accompanies this canine corpse. Its whole body is covered in chains of pulsing cysts and slime-dribbling ulcers.", + "description": "An acrid smell accompanies this animated canine corpse. Its whole body is covered in chains of pulsing cysts and slime-dribbling ulcers.", "default_faction": "zombie", "bodytype": "dog", "categories": [ "CLASSIC" ], @@ -243,7 +243,7 @@ "id": "mon_zombeaver", "type": "MONSTER", "name": { "str": "zombeaver" }, - "description": "This wall-eyed beast has a large wound on its side, and inside, its gore-stained ribs are clearly visible. Its most prominent features are the fearsome incisors and thick, black goo in its mouth that it seems proud to display. It doesn't look interested in chewing on trees anymore.", + "description": "This wall-eyed beast has a large wound on its side, its gore-stained ribs clearly visible. Its most prominent features are the fearsome incisors dribbling thick, black goo from inside its mouth. It doesn't look interested in chewing on trees anymore.", "default_faction": "zombie_aquatic", "bodytype": "dog", "categories": [ "CLASSIC" ], @@ -274,7 +274,7 @@ "id": "mon_zoose", "type": "MONSTER", "name": { "str": "antlered horror" }, - "description": "This formerly-majestic moose has succumbed to the infection which is killing the world. Shiny green blowflies swarm the vast, suppurated patches of purulent flesh where its skin has sloughed away, and its remaining fur is black and matted with necrotic discharge.", + "description": "This formerly-majestic moose has succumbed to the infection that is killing the world. Shiny green blowflies swarm the vast, suppurated patches of purulent flesh where its skin has sloughed away, and its remaining fur is black and matted with necrotic discharge.", "default_faction": "zombie", "bodytype": "horse", "categories": [ "CLASSIC" ], @@ -308,7 +308,7 @@ "id": "mon_zougar", "type": "MONSTER", "name": { "str": "decayed pouncer" }, - "description": "An otherwise normal-looking cougar, except that its hind legs are swollen, and its eyes bulge with black goo.", + "description": "A normal-looking cougar, except that its hind legs are swollen, and its eyes bulge with black goo.", "default_faction": "zombie", "bodytype": "dog", "categories": [ "CLASSIC" ], @@ -355,7 +355,7 @@ "id": "mon_zombie_horse", "type": "MONSTER", "name": { "str": "zombie horse" }, - "description": "From the looks of this zombie horse's ghastly features--its protruding ribs, off-white skull, and decayed, tattered muscles--it doesn't seem like it should put up much of a fight, but its mutant strength gives it power. Black, reeking ichor drips from its wounds.", + "description": "From the deteriorated state of this undead horse's ghastly features--protruding ribs, off-white skull, and decayed, tattered muscles--it doesn't seem like it should put up much of a fight, but something deep inside gives it power. Black, reeking ichor drips from its wounds.", "default_faction": "zombie", "bodytype": "horse", "categories": [ "CLASSIC" ], @@ -387,7 +387,7 @@ "id": "mon_ziger", "type": "MONSTER", "name": { "str": "tiger wight" }, - "description": "This otherwise normal-looking tiger stumbles and sways, its jaws slack, its eyes wide open and shining black.", + "description": "This tiger stumbles and sways, its jaws slack, its eyes wide open and shining black.", "copy-from": "mon_zougar", "volume": "150 L", "weight": "190 kg", @@ -402,7 +402,7 @@ "id": "mon_zow", "type": "MONSTER", "name": { "str": "zombie cow" }, - "description": "Once a placid cow, this leathery horror stumbles and shudders, its pulsing black eyes scanning for prey beneath wicked horns. It is big and heavy and murderous.", + "description": "Once a placid cow, this leathery horror stumbles and shudders, its pulsing black eyes scanning for prey. Dairy cows have no natural weapons, but a zombie as big, heavy, and murderous as this is still extremely dangerous.", "looks_like": "mon_cow", "default_faction": "zombie", "bodytype": "horse", @@ -435,7 +435,7 @@ "id": "mon_zombull", "type": "MONSTER", "name": { "str": "zombull" }, - "description": "This enormous, massive creature with oily black eyes and dread horns was once a domestic bull. Its nasty character makes it attack everyone it meets with tremendous speed and an unbridled rage.", + "description": "This enormous, terrifyingly fast creature with oily black eyes and dreadful horns was once a domestic bull. While live bulls can be temperamental, unbridled rage is now this one's only emotion.", "default_faction": "zombie", "bodytype": "horse", "categories": [ "CLASSIC" ], @@ -483,7 +483,7 @@ "type": "MONSTER", "name": { "str": "woodland wight" }, "looks_like": "mon_deer", - "description": "A pale, stumbling, white-tailed deer, rivulets of slime running down its neck. Its limbs twist and bend in unnatural, haphazard directions, and yet it moves with uncanny strength and speed. Thanks to the Cataclysm, it has now turned the tables; what was once prey, now itself preys on coyotes, wolves, and giant mutated spiders.", + "description": "A pale, stumbling, white-tailed deer, rivulets of slime running down its neck. Its limbs twist and bend in unnatural, haphazard directions, and yet it moves with uncanny strength and speed. Thanks to the Cataclysm, it has now turned the tables; what was once prey, now itself preys on coyotes, wolves, and giant spider mutants.", "default_faction": "zombie", "bodytype": "horse", "categories": [ "CLASSIC" ], @@ -513,7 +513,7 @@ "id": "mon_zpider_mass", "type": "MONSTER", "name": { "str": "mass of zombie spiders", "str_pl": "masses of zombie spiders" }, - "description": "Thousands, maybe millions of spiders piling up high, each slowly oozing sticky green pus, struggling to keep the fetid mass together and moving.", + "description": "Thousands, maybe millions of spiders piled up high, each slowly oozing sticky green pus, struggling to keep the fetid mass together and moving.", "default_faction": "zombie", "bodytype": "blob", "categories": [ "CLASSIC" ], @@ -561,7 +561,7 @@ "type": "MONSTER", "name": { "str": "zeindeer" }, "looks_like": "mon_zeer", - "description": "A once-majestic caribou, this undead creature barely resembles the reindeer of tradition and seems to only be interested in human flesh.", + "description": "Once a majestic caribou, this undead creature barely resembles Santa's helpful reindeer and seems to only be interested in human flesh.", "default_faction": "zombie", "bodytype": "horse", "categories": [ "CLASSIC" ], diff --git a/data/json/monsters/zed-classic.json b/data/json/monsters/zed-classic.json index 7f76a71c18f9f..75e7b329e43bc 100644 --- a/data/json/monsters/zed-classic.json +++ b/data/json/monsters/zed-classic.json @@ -278,7 +278,7 @@ "id": "mon_zombie_fireman", "type": "MONSTER", "name": { "str": "firefighter zombie" }, - "description": "A decaying human body clad in tattered firefighting gear. It staggers aimlessly, reeking of smoke and decay.", + "description": "A decaying human body clad in tattered firefighting gear. It staggers aimlessly, reeking of smoke and decay. Its protective mask prevents it from attempting to bite you.", "default_faction": "zombie", "bodytype": "human", "categories": [ "CLASSIC" ], @@ -328,7 +328,7 @@ "id": "mon_zombie_hazmat", "type": "MONSTER", "name": { "str": "hazmat zombie" }, - "description": "This zombie's face and body is completely covered by a protective suit. It wanders around, unsteadily.", + "description": "This zombie is completely encased in a protective suit that apparently failed to protect it from whatever this infection is. At least it can't bite you from inside that suit.", "default_faction": "zombie", "bodytype": "human", "categories": [ "CLASSIC" ], @@ -385,7 +385,7 @@ "id": "mon_zombie_rot", "type": "MONSTER", "name": { "str": "decayed zombie" }, - "description": "A once-dead human corpse. Its discolored swollen flesh is riddled with festering wounds and open sores.", + "description": "A once-dead human corpse. Its discolored, swollen flesh is riddled with festering wounds and open sores.", "default_faction": "zombie", "bodytype": "human", "categories": [ "CLASSIC" ], @@ -431,7 +431,7 @@ "id": "mon_zombie_swat", "type": "MONSTER", "name": { "str": "SWAT zombie" }, - "description": "This zombie was part of a specialized unit of law enforcement. It still wears a battered armor with the SWAT logo emblazoned on the front.", + "description": "This zombie was part of a specialized unit of law enforcement. It still wears a battered armor with the SWAT logo emblazoned on the front. The protective mask makes its head a difficult target, but also prevents it from biting you.", "looks_like": "mon_zombie_cop", "bodytype": "human", "default_faction": "zombie", @@ -482,7 +482,7 @@ "id": "mon_zombie_tough", "type": "MONSTER", "name": { "str": "tough zombie" }, - "description": "Once an athletic human, now a brutal monster. Its facial features are twisted into an expression of pure rage.", + "description": "This was once an athletic human, now a brutal monster. Its facial features are twisted into an expression of pure rage.", "default_faction": "zombie", "bodytype": "human", "categories": [ "CLASSIC" ], @@ -532,7 +532,7 @@ "id": "mon_zombie_resort_dancer", "type": "MONSTER", "name": { "str": "sleek zombie" }, - "description": "This zombie is rather sleek and barely clothed.", + "description": "This zombie is rather sleek and scantily clothed.", "copy-from": "mon_zombie", "looks_like": "mon_zombie", "dodge": 1, @@ -543,7 +543,7 @@ "id": "mon_zombie_resort_bouncer", "type": "MONSTER", "name": { "str": "bouncer zombie" }, - "description": "This zombie looks beefed and is dressed in the tattered remnants of a security uniform.", + "description": "This muscular zombie is dressed in the tattered remnants of a security uniform.", "copy-from": "mon_zombie_tough", "looks_like": "mon_zombie_tough", "upgrades": { "half_life": 14, "into_group": "GROUP_ZOMBIE_UPGRADE" }, diff --git a/data/json/monsters/zed-medical.json b/data/json/monsters/zed-medical.json index cf44149e19ca4..ece13f0bd54e7 100644 --- a/data/json/monsters/zed-medical.json +++ b/data/json/monsters/zed-medical.json @@ -3,7 +3,7 @@ "id": "mon_zombie_medical", "type": "MONSTER", "name": { "str": "zombie medic" }, - "description": "This shambling corpse is dressed like a medical professional. Either it was a doctor or only played one on TV.", + "description": "This shambling corpse is dressed like a medical professional. It was either a doctor, or only played one on TV.", "copy-from": "mon_zombie", "death_drops": "mon_zombie_medical_death_drops", "color": "blue", @@ -13,7 +13,7 @@ "id": "mon_zombie_medical_brute", "type": "MONSTER", "name": { "str": "medical horror" }, - "description": "This bulging corpse is dressed like a medical professional. Its entire body bulges with distended muscles and swollen, festering wounds.", + "description": "This enormous shambling corpse is dressed like a medical professional. Its entire body bulges with distended muscles and swollen, festering wounds.", "copy-from": "mon_zombie_brute", "death_drops": "mon_zombie_medical_death_drops", "color": "blue" @@ -22,7 +22,7 @@ "id": "mon_zombie_medical_regenerating", "type": "MONSTER", "name": { "str": "regenerating zombie medic" }, - "description": "This hairless corpse is dressed like a medical professional. Its pale pinkish flesh appears to be squirming and moving across its body, quickly covering and fixing any wounds received.", + "description": "This hairless corpse is dressed like a medical professional. Its pale, pinkish flesh appears to be squirming and moving across its body, quickly covering and fixing any wounds received.", "copy-from": "mon_zombie_regenerating", "death_drops": "mon_zombie_medical_death_drops", "upgrades": { "half_life": 14, "into_group": "GROUP_MEDICAL_CRAWLER_UPGRADE" } @@ -40,7 +40,7 @@ "id": "mon_zombie_medical_acidic", "type": "MONSTER", "name": { "str_sp": "doctor burns" }, - "description": "The pale shuffling corpse of a medical professional. Its skin looks especially thin, with a sticky, yellow fluid flowing through the clearly visible veins.", + "description": "This is the pale, shuffling corpse of a medical professional. Its skin looks especially thin, with a sticky, yellow fluid flowing through the clearly visible veins.", "copy-from": "mon_zombie_acidic", "death_drops": "mon_zombie_medical_death_drops" }, diff --git a/data/json/monsters/zed-pupating.json b/data/json/monsters/zed-pupating.json index 2d3ab6b3ee159..db2d197b4c923 100644 --- a/data/json/monsters/zed-pupating.json +++ b/data/json/monsters/zed-pupating.json @@ -3,7 +3,7 @@ "id": "mon_zombie_crawler_pupa_decoy", "type": "MONSTER", "name": { "str": "pupating zombie crawler" }, - "description": "This half of a human corpse is wrapped in sticky black fibers that cover everything neck down. Beneath the wrapping there is strange rhythmic movement grotesque to behold.", + "description": "This half of a human corpse is wrapped in sticky black fibers that cover everything from the neck down. Beneath the wrapping there is a strange rhythmic movement, grotesque to behold.", "copy-from": "mon_zombie_crawler", "delete": { "categories": [ "CLASSIC" ] }, "armor_bash": 7, @@ -18,7 +18,7 @@ "id": "mon_zombie_crawler_pupa", "type": "MONSTER", "name": { "str": "pupating zombie crawler" }, - "description": "This half of a human corpse is wrapped in sticky black fibers that cover everything neck down. Beneath the wrapping there is strange rhythmic movement grotesque to behold.", + "description": "This half of a human corpse is wrapped in sticky black fibers that cover everything from the neck down. Beneath the wrapping there is a strange rhythmic movement, grotesque to behold.", "copy-from": "mon_zombie_crawler_pupa_decoy", "extend": { "special_attacks": [ @@ -35,7 +35,7 @@ "id": "mon_zombie_pupa_decoy", "type": "MONSTER", "name": { "str": "pupating zombie" }, - "description": "This human corpse is wrapped in sticky black fibers that cover everything neck down. Beneath the wrapping there is strange rhythmic movement grotesque to behold.", + "description": "This human corpse is wrapped in sticky black fibers that cover everything from the neck down. Beneath the wrapping there is a strange rhythmic movement, grotesque to behold.", "copy-from": "mon_zombie_fat", "delete": { "categories": [ "CLASSIC" ] }, "armor_bash": 8, @@ -50,7 +50,7 @@ "id": "mon_zombie_pupa", "type": "MONSTER", "name": { "str": "pupating zombie" }, - "description": "This human corpse is wrapped in sticky black fibers that cover everything neck down. Beneath the wrapping there is strange rhythmic movement grotesque to behold.", + "description": "This human corpse is wrapped in sticky black fibers that cover everything from the neck down. Beneath the wrapping there is a strange rhythmic movement, grotesque to behold.", "copy-from": "mon_zombie_pupa_decoy", "extend": { "special_attacks": [ diff --git a/data/json/monsters/zed-winged.json b/data/json/monsters/zed-winged.json index bc6b7e1727ab3..2ab6b2f9c8d30 100644 --- a/data/json/monsters/zed-winged.json +++ b/data/json/monsters/zed-winged.json @@ -3,7 +3,7 @@ "id": "mon_zombie_winged", "type": "MONSTER", "name": { "str": "batwing zombie" }, - "description": "This zombie's arms have stretched far beyond human limits, the skin lengthened into a gruesome fleshy membrane. The mutation does not suit it well: It moves clumsily, even compared to other zombies, but can leap a significant distance.", + "description": "This zombie's arms have stretched far beyond human limits, the skin lengthened into a gruesome, fleshy membrane. The mutation does not suit it well: it moves clumsily, even compared to other zombies, but can occasionally leap a significant distance.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -65,7 +65,7 @@ "id": "mon_zombie_brute_winged", "type": "MONSTER", "name": { "str": "garghoul" }, - "description": "This zombie's arms have stretched far beyond human limits, the skin lengthened into a gruesome fleshy membrane. The rest has become emaciated, thin rope-like muscles ripping through taut flesh. While it doesn't appear to be able to truly fly, it uses its mutated arms to make shockingly fast leaps through the air.", + "description": "This zombie's arms have stretched far beyond human limits, the skin lengthened into a gruesome, fleshy membrane. The rest has become emaciated, with thin, rope-like muscles ripping through taut flesh. While it doesn't appear to be able to fly, it uses its mutated arms to make shockingly fast leaps through the air.", "species": [ "ZOMBIE", "HUMAN" ], "default_faction": "zombie", "diff": 2, @@ -131,7 +131,7 @@ "id": "mon_spawn_raptor", "type": "MONSTER", "name": { "str": "flesh-raptor" }, - "description": "This small winged predator darts through the air on three thinly haired wings that look like stretched human hands. Where the wings meet juts a sheer jagged spike. It looks like nothing you've seen on Earth, and yet strangely like it was made of human parts.", + "description": "This small, winged predator darts through the air on three thinly-haired wings that look like stretched human hands. A sheer, jagged spike juts out from the point where the wings meet. It looks like nothing you've seen on Earth, and yet strangely like it is made of human parts.", "species": [ "ZOMBIE", "HUMAN" ], "default_faction": "zombie", "diff": 1, @@ -175,7 +175,7 @@ "name": { "str": "shadow raptor" }, "copy-from": "mon_spawn_raptor", "color": "light_gray", - "description": "An uncanny shadow envelops this creature. You can make out the outline of three flapping wings connected to a jagged pointed object.", + "description": "An uncanny shadow envelops this creature. You can make out the outline of three flapping wings connected to a jagged, pointed object.", "upgrades": { }, "extend": { "flags": [ "NIGHT_INVISIBILITY" ] }, "vision_day": 10, @@ -188,7 +188,7 @@ "copy-from": "mon_spawn_raptor", "speed": 100, "color": "red", - "description": "This small winged predator darts through the air on three thinly haired wings that look like stretched human hands. Where the wings meet juts a jagged spike and a bloated fleshy belly.", + "description": "This small, winged predator darts through the air on three thinly-haired wings that look like stretched human hands. A jagged spike juts out from the point where the wings meet, and a bloated, fleshy belly hangs beneath. A sharp smell of rotten eggs hangs around it.", "special_attacks": [ [ "SUICIDE", 20 ], { "id": "impale", "damage_max_instance": [ { "damage_type": "stab", "amount": 15, "armor_multiplier": 0.6 } ] } @@ -207,7 +207,7 @@ "copy-from": "mon_spawn_raptor", "color": "light_cyan", "diff": 10, - "description": "This small winged predator darts through the air on three thinly haired wings that look like stretched human hands. Where the wings meet juts a jagged spike with a pulsing electrical glow.", + "description": "This small, winged predator darts through the air on three thinly-haired wings that look like stretched human hands. A jagged spike with a pulsing electrical glow juts out from the point where the wings meet.", "melee_damage": [ { "damage_type": "electric", "amount": 8 } ], "luminance": 8, "special_attacks": [ diff --git a/data/json/monsters/zed_acid.json b/data/json/monsters/zed_acid.json index 66b958ad82e8b..5b47080a3d827 100644 --- a/data/json/monsters/zed_acid.json +++ b/data/json/monsters/zed_acid.json @@ -3,7 +3,7 @@ "id": "mon_zombie_acidic", "type": "MONSTER", "name": { "str": "acidic zombie" }, - "description": "A sickly-looking dead one. Its skin looks especially thin, with a sticky, yellow fluid flowing through the clearly visible veins.", + "description": "A sickly-looking zombie. Its skin looks especially thin, with a sticky, yellow fluid flowing through the clearly visible veins.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -53,7 +53,7 @@ "id": "mon_zombie_corrosive", "type": "MONSTER", "name": { "str": "corrosive zombie" }, - "description": "This body has swollen to immense proportions, but still manages to hold itself together with semi-congealed acid all over its bloated body. It clumsily moves around, but attacks with a large reserve of acid.", + "description": "This zombie has swollen to immense proportions, but still manages to hold itself together with semi-congealed acid all over its bloated body. It moves clumsily, but spits from a large reserve of acid with uncanny accuracy.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -171,7 +171,7 @@ "id": "mon_zombie_wretched", "type": "MONSTER", "name": { "str": "wretched puker" }, - "description": "A degenerate corpse, shambling as it walks. Several junks and waste materials have unified into its skin and wounds around it reeks in black goo.", + "description": "A degenerate corpse, shambling as it walks. Various pieces of trash and waste materials have melded into the black goo leaking from its skin.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], diff --git a/data/json/monsters/zed_burned.json b/data/json/monsters/zed_burned.json index 815caa5ac44bb..c742c028c8997 100644 --- a/data/json/monsters/zed_burned.json +++ b/data/json/monsters/zed_burned.json @@ -53,7 +53,7 @@ "id": "mon_zombie_fiend", "type": "MONSTER", "name": { "str": "fiend" }, - "description": "Charred zombie with bony plates, spikes and protrusions. Moves stiffly, but swiftly.", + "description": "A charred zombie covered with bony plates, spikes and protrusions. Moves stiffly, but swiftly.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -90,7 +90,7 @@ "id": "mon_zombie_scorched", "type": "MONSTER", "name": { "str": "scorched zombie" }, - "description": "Heavily burned zombie that still reeks of charred flesh. Its flesh has mended into a leathery shell.", + "description": "A heavily burned zombie that still reeks of charred meat. Its flesh has mended into a leathery shell.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], diff --git a/data/json/monsters/zed_children.json b/data/json/monsters/zed_children.json index 822e1869abfab..ef5de11fd6559 100644 --- a/data/json/monsters/zed_children.json +++ b/data/json/monsters/zed_children.json @@ -38,7 +38,7 @@ "id": "mon_zombie_child", "type": "MONSTER", "name": { "str": "zombie child", "str_pl": "zombie children" }, - "description": "It was only a child, and little is different about it now aside from the hungry look in its eyes. You'd be hard pressed to not feel like you were killing an actual child by putting it down.", + "description": "It was only a child, and little is different about it now aside from the hungry look in its eyes. You'd be hard-pressed to not feel like you were killing an actual child by putting it down.", "default_faction": "zombie", "bodytype": "human", "categories": [ "CLASSIC" ], @@ -77,7 +77,7 @@ "id": "mon_zombie_creepy", "type": "MONSTER", "name": { "str": "creepy crawler" }, - "description": "What was once a child is now a mutant beast with blackened skin and massive eyes. This abomination's vile form makes mockery of its human origin.", + "description": "What was once a child is now a mutant beast with blackened skin and massive eyes. This abomination's vile form makes a mockery of its human origin.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE" ], @@ -112,7 +112,7 @@ "id": "mon_zombie_shriekling", "type": "MONSTER", "name": { "str": "shriekling" }, - "description": "This heavily mutated child zombie twitches and flails its limbs in painful looking spasms as it runs about.", + "description": "This heavily mutated child zombie twitches and flails its limbs in painful-looking spasms as it runs about.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE" ], @@ -148,7 +148,7 @@ "id": "mon_zombie_snotgobbler", "type": "MONSTER", "name": { "str": "snotgobbler" }, - "description": "This swollen, gooey looking mutant child looks bad, even for a zombie. Maybe that's why it seems to want a hug so badly.", + "description": "This swollen, gooey-looking mutant child looks bad, even for a zombie. Maybe that's why it seems to want a hug so badly.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE" ], @@ -185,7 +185,7 @@ "id": "mon_zombie_sproglodyte", "type": "MONSTER", "name": { "str": "sproglodyte" }, - "description": "This crouching child-mutant's face is dominated by a pair of huge black eyes and its fingertips end in sharp claws.", + "description": "This crouching child-mutant's face is dominated by a pair of huge black eyes, and its fingertips end in sharp claws.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE" ], diff --git a/data/json/monsters/zed_electric.json b/data/json/monsters/zed_electric.json index e2174b8247cdb..680e01bb64482 100644 --- a/data/json/monsters/zed_electric.json +++ b/data/json/monsters/zed_electric.json @@ -102,7 +102,7 @@ "id": "mon_zombie_nullfield", "type": "MONSTER", "name": { "str": "incandescent husk" }, - "description": "This once-human is visible only as a glowing white silhouette that you have to squint to see, cloaked in a crackling field of lightning that pulses like a beating heart. It walks slowly and deliberately, the thunderstorm surrounding it eagerly jumping to anything conductive within its grasp.", + "description": "This zombie is visible only as a glowing white silhouette that you have to squint to see, cloaked in a crackling field of lightning that pulses like a beating heart. It walks slowly and deliberately, the thunderstorm surrounding it eagerly jumping to anything conductive within its grasp.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -136,7 +136,7 @@ "id": "mon_zombie_static", "type": "MONSTER", "name": { "str": "zapper zombie" }, - "description": "A very pale dead body with the worst case of static hair you have ever seen. Sometimes, you can see sparks of electricity around it.", + "description": "A very pale dead body with the worst case of static hair you have ever seen. Sparks of electricity frequently jump off it, lighting it up in the dark. You might not want to touch it with your bare hands, or anything conductive.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], diff --git a/data/json/monsters/zed_explosive.json b/data/json/monsters/zed_explosive.json index 8e195af0f54f6..9bbcba082d442 100644 --- a/data/json/monsters/zed_explosive.json +++ b/data/json/monsters/zed_explosive.json @@ -104,7 +104,7 @@ "id": "mon_gas_zombie", "type": "MONSTER", "name": { "str": "gasoline zombie" }, - "description": "A huge bloated zombie that appears to have fed upon gasoline; fumes and flames escape from its mouth and fuel leaks from its waddling form.", + "description": "A huge, bloated zombie that appears to have consumed gasoline; fumes and flames escape from its mouth and liquid fuel leaks from its waddling form.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -148,7 +148,7 @@ "id": "mon_zombie_gasbag", "type": "MONSTER", "name": { "str": "bloated zombie" }, - "description": "With its gray skin swollen to near rupture with putrid gas, this cyst covered zombie looks like it could violently burst under the slightest of disturbances.", + "description": "With its gray skin swollen to near-rupture with putrid gas, this cyst-covered zombie looks like it could violently burst under the slightest of disturbances.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], diff --git a/data/json/monsters/zed_ferrous.json b/data/json/monsters/zed_ferrous.json index 95b2c75769405..9bafb15c0a147 100644 --- a/data/json/monsters/zed_ferrous.json +++ b/data/json/monsters/zed_ferrous.json @@ -3,7 +3,7 @@ "id": "mon_zombie_rust", "type": "MONSTER", "name": { "str": "rust zombie" }, - "description": "A zombie impaled with a multitude of metal fragments that are covered with a thick layer of rust that seems to propagate to other parts of the body.", + "description": "A zombie impaled with a multitude of metal fragments, each covered with a thick layer of rust that seems to propagate to other parts of its body. You can't remember the last time you got a tetanus shot, so it would be best not to let this thing touch you.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -147,7 +147,7 @@ "id": "mon_zombie_urchin", "type": "MONSTER", "name": { "str": "rust urchin" }, - "description": "A spiked horror of a zombie covered in long rusty spikes.", + "description": "A spiked horror of a zombie covered in long, rusty spikes. A walking tetanus infection waiting to happen.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], diff --git a/data/json/monsters/zed_fusion.json b/data/json/monsters/zed_fusion.json index 630f44ecd6ea3..a598a86e8f964 100644 --- a/data/json/monsters/zed_fusion.json +++ b/data/json/monsters/zed_fusion.json @@ -30,7 +30,7 @@ "id": "mon_devourer", "type": "MONSTER", "name": { "str": "dissoluted devourer" }, - "description": "Human bodies fused together into a colossus with heads and limbs sticking out of its bloated body. You may have trouble estimating its healthiness and its capabilities might change.", + "description": "Human bodies fused together into a colossus, with heads and limbs sticking out of its bloated body. The nature of the thing makes it difficult to estimate how close it is to dying, and its capabilities might change if it manages to assimilate more zombies into itself.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -81,7 +81,7 @@ "id": "mon_devourer_lab_sec", "type": "MONSTER", "name": { "str": "melded task force" }, - "description": "A tangle of security personnel fused with their gear and each other, warped limbs and flesh-covered equipment moving in strange unison. Every so often you glimpse a pitch-black figure at its center, limbs mirroring the movements of the larger mass.", + "description": "A tangle of security personnel fused with their gear and with each other, warped limbs and flesh-covered equipment moving in strange unison. Every so often you glimpse a pitch-black figure at its center, limbs mirroring the movements of the larger mass.", "copy-from": "mon_devourer", "default_faction": "science", "bodytype": "blob", @@ -149,7 +149,7 @@ "id": "mon_zombie_crushed_giant", "type": "MONSTER", "name": { "str": "trapped tendril" }, - "description": "A great tendril of mutated flesh and sharpened bone. Emergent from a crevice in the ruined floor, hundreds of human limbs seek freedom and writhe incessantly from underneath its grotesque carapace. As enormous as it may already be, you feel certain that this is just part of a creature much bigger, for when it moves, you can feel this whole ruin tremble, as if an unseen giant struggled against the weight of its concrete tomb.", + "description": "A great tendril of mutated flesh and sharpened bone. Emerging from a crevice in the ruined floor, hundreds of human limbs seek freedom and writhe incessantly from underneath its grotesque carapace. As enormous as it may be, you feel certain that this is just part of a much bigger creature, for when it moves, you can feel this whole ruin tremble, as though an unseen giant is struggling against the weight of its concrete tomb.", "default_faction": "zombie", "volume": "875000 ml", "weight": "200 kg", @@ -182,7 +182,7 @@ "id": "mon_zombie_gasbag_immobile", "type": "MONSTER", "name": { "str_sp": "gangrenous flesh" }, - "description": "Immobile from grievous wounds, its gray skin has bloated to near rupture with putrid gas. Between lumps of unrecognizable gore, a human head lamely follows your walking with empty, black eyes.", + "description": "Covered in grievous wounds, this wretch's gray skin has bloated to near-rupture with putrid gas. Between lumps of unrecognizable gore, a human head lamely follows your movements with empty, black eyes.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -213,7 +213,7 @@ "id": "mon_zombie_gasbag_crawler", "type": "MONSTER", "name": { "str": "gangrenous crawler" }, - "description": "A nightmarish spidery abomination, born from human gore. It deftly crawls between walls and ceiling with limbs grown from its own disjointed ribs.", + "description": "A nightmarish, spidery abomination born from human gore. It deftly crawls between the walls and ceiling with limbs grown from its own disjointed ribs.", "default_faction": "zombie", "bodytype": "spider", "species": [ "ZOMBIE", "HUMAN" ], @@ -290,7 +290,7 @@ "id": "mon_zombie_scissorlimbs", "type": "MONSTER", "name": { "str_sp": "scissorlimbs" }, - "description": "A nightmarish spider of gore stands tall among the ruins, and keeps silent watch of the blighted landscape. Its spindly limbs of bone slip between the rubble with otherworldly speed.", + "description": "A nightmarish spider of gore standing tall among the ruins, keeping silent watch of the blighted landscape. Its spindly limbs of bone slip between the rubble with otherworldly speed.", "default_faction": "zombie", "bodytype": "spider", "species": [ "ZOMBIE", "HUMAN" ], @@ -381,7 +381,7 @@ "id": "mon_zombie_living_wall", "type": "MONSTER", "name": { "str": "flesh wall" }, - "description": "A great lump of mutated flesh. It resembles the innards of some gigantic creature and is covered in a grid of diminutive veins.", + "description": "A great lump of mutated flesh. It resembles the innards of some gigantic creature, and is covered in a grid of diminutive veins.", "default_faction": "zombie", "volume": "875000 ml", "weight": "200 kg", diff --git a/data/json/monsters/zed_lab.json b/data/json/monsters/zed_lab.json index efdefa2994b21..c07ffa9d2febe 100644 --- a/data/json/monsters/zed_lab.json +++ b/data/json/monsters/zed_lab.json @@ -3,7 +3,7 @@ "id": "mon_zombie_scientist", "type": "MONSTER", "name": { "str": "zombie scientist" }, - "description": "Apart from the jet-black eyes, this zombie looks less decomposed and inhuman than most. Clad in a tattered lab coat, it seems to have a glimmer of awareness - not a human awareness, but something more sinister. As you watch it, its movements look almost marionette-like.", + "description": "Apart from the jet-black eyes, this zombie looks less decomposed and inhuman than most. Clad in a tattered lab coat, it seems to have a glimmer of awareness - not human awareness, but something else. As you watch, its movements look almost marionette-like.", "default_faction": "science", "bodytype": "human", "//": "zombie scientists are recognised as friendly by the lab's defense system", @@ -53,7 +53,7 @@ "id": "mon_zombie_labsecurity", "type": "MONSTER", "name": { "str": "zombie security guard" }, - "description": "A shambling human corpse wearing a gray uniform and bulletproof vest with \"SECURITY\" emblazoned across the front. It looks like the guard was quite physically fit before its death; it moves quickly and powerfully, albeit clumsily.", + "description": "A shambling human corpse wearing a gray uniform and a bulletproof vest with \"SECURITY\" emblazoned across the front. It looks like this guard was quite physically fit before its death; it moves quickly and powerfully, albeit clumsily.", "default_faction": "science", "//": "guards are recognised as friendly by the lab's defense system", "categories": [ "CLASSIC" ], @@ -108,7 +108,7 @@ "id": "mon_zombie_phase_skulker", "type": "MONSTER", "name": { "str": "phase skulker" }, - "description": "What remains of a researcher lost to the portal storms, twisted and enervated by the presences that lurk beneath natural perception. It walks and stumbles in stuttered way, and is granted tenuous corporality only by grace of the experimental gear inherited from its past life.", + "description": "What remains of a researcher lost to the portal storms, twisted and enervated by the presences that lurk beneath natural perception. It walks and stumbles in a stuttered manner, and is granted tenuous corporality only by grace of the experimental gear it wore when it died.", "default_faction": "zombie", "bodytype": "human", "species": [ "ABERRATION" ], diff --git a/data/json/monsters/zed_misc.json b/data/json/monsters/zed_misc.json index 203aec022d177..e2119605aa65c 100644 --- a/data/json/monsters/zed_misc.json +++ b/data/json/monsters/zed_misc.json @@ -3,7 +3,7 @@ "id": "mon_frog_mother", "type": "MONSTER", "name": { "str": "frog mother" }, - "description": "A large, bulbous creature with an extremely large mouth and small, stubby legs with no feet. Drenched in an oily greenish-black substance, its flesh seems to rapidly decompose and reconstitute itself, and it is covered by large, white pustules that seem ready to pop.", + "description": "A large, bulbous creature with an extremely large mouth and small, stubby legs with no feet. Drenched in an oily greenish-black substance, its flesh seems to rapidly decompose and reconstitute itself, and it is covered in large, white pustules that seem ready to pop.", "default_faction": "zombie", "species": [ "ZOMBIE", "AMPHIBIAN" ], "volume": "240 L", @@ -62,7 +62,7 @@ "id": "mon_tadpole_grabber", "type": "MONSTER", "name": { "str": "tadpole constrictor" }, - "description": "The only resemblance this creature bears to a tadpole is its slick black-green skin and its slender body. Its three appendages, resembling long tentacles or pseudopods, propel it across the ground at a maddening speed. It has no outward sensory organs or a mouth, and steam rises from its skin as if it is burning away its own lifeforce to catch you.", + "description": "The only resemblance this creature bears to a tadpole is its slick black-green skin and slender body. Its three appendages, resembling long tentacles or pseudopods, propel it across the ground at maddening speed. It has no outward sensory organs or a mouth, and steam rises from its skin as if it is burning away its own lifeforce to catch you.", "default_faction": "zombie", "species": [ "ZOMBIE", "AMPHIBIAN" ], "volume": "10 L", @@ -248,7 +248,7 @@ "id": "mon_zombie_brute", "type": "MONSTER", "name": { "str": "zombie brute" }, - "description": "Its entire body bulges with distended muscles and swollen, festering wounds.", + "description": "This zombie's entire body bulges with distended muscles and swollen, festering wounds.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -362,7 +362,7 @@ "id": "mon_zombie_brute_ninja", "type": "MONSTER", "name": { "str": "zombie nightstalker" }, - "description": "Somehow this brute hides in the dark like some kind of boogeyman. Very agile for such a large zombie.", + "description": "Somehow, this brute hides in the dark like some kind of boogeyman. Very agile for such a large zombie.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -423,7 +423,7 @@ "type": "MONSTER", "name": { "str": "listener zombie" }, "//": "Upgraded version of brainless. Regenerating Skull with huge ears.", - "description": "The head of this zombie was once obviously destroyed, the gaps in its scraps of face now filling with a peculiar gray goo. Human ears hang from the sides, enormous and unsettling. Thin slits at the front suggest it may be able to see.", + "description": "This zombie's head was once obviously destroyed, the gaps in its scraps of face now filling with a peculiar gray goo. Human ears hang from the sides, enormous and unsettling. Thin slits at the front suggest it may have a (very limited) sense of sight.", "default_faction": "zombie", "species": [ "ZOMBIE", "HUMAN" ], "volume": "62275 ml", @@ -526,7 +526,7 @@ "id": "mon_zombie_grabber", "type": "MONSTER", "name": { "str": "grabber zombie" }, - "description": "A deformed human body, once living. Its arms dangle from its sides like the limbs of some skinless ape, mindlessly groping at their surroundings.", + "description": "A badly deformed zombie. Its arms dangle from its sides like the limbs of some skinless ape, mindlessly groping at their surroundings.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -574,7 +574,7 @@ "id": "mon_zombie_grappler", "type": "MONSTER", "name": { "str": "grappler zombie" }, - "description": "An undead humanoid, its elongated arms drag along the ground as it moves. It looks to almost have a hunch from the swollen back and shoulder muscles tearing though its skin.", + "description": "This zombie's elongated arms drag along the ground as it moves. It looks to almost have a hunchback from the swollen shoulder muscles tearing though its skin.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -621,7 +621,7 @@ "id": "mon_zombie_hollow", "type": "MONSTER", "name": { "str": "zombie hollow" }, - "description": "Black hollow eyes survey the surroundings as the zombie stretches and bends in ways that whoever the original body belonged to never could. The only thing that seems solid on this flexible, black-veined body is the rows of sharp, black teeth. You get the feeling that the only human thing remaining is the skin, worn as one might wear clothes.", + "description": "This zombie's hollow black eyes survey its surroundings as it stretches and bends in ways that whoever the original body belonged to never could. The only things that seem solid on this flexible, black-veined body are the rows of sharp, black teeth. You get the feeling that the only human thing remaining is the skin, worn as one might wear clothes.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -664,7 +664,7 @@ "id": "mon_zombie_hulk", "type": "MONSTER", "name": { "str": "zombie hulk" }, - "description": "A human body now swollen to the size of six men, with arms as wide as a trash can.", + "description": "A human corpse swollen to the size of six men, with arms as wide as trash cans.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -717,7 +717,7 @@ "id": "mon_zombie_hunter", "type": "MONSTER", "name": { "str": "zombie hunter" }, - "description": "This once-human body is barely recognizable; it scrambles about on all fours, its nails and teeth both sharpened into dangerous-looking spikes.", + "description": "You're barely able to believe this thing was ever human; it scrambles about on all fours, its nails and teeth sharpened into dangerous-looking spikes.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -863,7 +863,7 @@ "id": "mon_zombie_master", "type": "MONSTER", "name": { "str": "zombie master" }, - "description": "Once human, its features have tightened, its lips pulled back into an unnatural grin, revealing rows of blackened teeth beneath its large, piercing eyes. It stands tall and its movements are fluid and tightly controlled. A feeling of danger permeates the surrounding air, and the light that falls on it seems somehow harsher and more glaring.", + "description": "This zombie's features have tightened, its lips pulled back into an unnatural grin, revealing rows of blackened teeth beneath large, piercing eyes. It stands tall and its movements are fluid and tightly controlled. A feeling of danger permeates the surrounding air, and the light that falls on it seems somehow harsher and more glaring.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -1021,7 +1021,7 @@ "id": "mon_zombie_regenerating", "type": "MONSTER", "name": { "str": "regenerating zombie" }, - "description": "A hairless zombie; its pale pinkish flesh appears to be squirming and moving across its body, quickly covering and fixing any wounds that it receives. Its clothing is riddled with holes, suggesting someone else tried to take it down before you.", + "description": "A hairless zombie. Its pale, pinkish flesh appears to be squirming and moving across its body, quickly covering and fixing any wounds that it receives. Its clothing is riddled with holes, suggesting someone else tried, and failed, to take it down.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -1274,7 +1274,7 @@ "type": "MONSTER", "name": { "str": "skull zombie" }, "//": "Highest upgrade of brainless/ear zombie. Still immune to headshots, as there's nothing critical there.", - "description": "This creature's head is a hideous gray skull, formed of human bone fragments and some sort of goo. Jagged teeth are visible as the thing works its jaw and disturbingly human, lidless eyes stare at you from their sockets. The thing's fleshy ears are four sizes too large and droop under their own weight.", + "description": "This zombie's head is a hideous gray skull, formed of human bone fragments and some sort of goo. Jagged teeth are visible as the thing works its jaw, and lidless, disturbingly human eyes stare at you from their sockets. The thing's fleshy ears are four sizes too large and droop under their own weight.", "default_faction": "zombie", "species": [ "ZOMBIE", "HUMAN" ], "volume": "62500 ml", @@ -1370,7 +1370,7 @@ "id": "mon_smoker_brute", "type": "MONSTER", "name": { "str": "ashen brawler" }, - "description": "A gigantic, twisted human frame with a menacing stance and rapid movements. Thick clouds of smoke pour from violent-looking eviscerations spread across its muscular-looking body, and its arms appear to have elongated massively.", + "description": "A gigantic, twisted human frame with a menacing stance and rapid movements. Thick clouds of smoke pour from violent-looking eviscerations spread across its muscular body, and its arms appear to have elongated massively.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -1432,7 +1432,7 @@ "id": "mon_zombie_swimmer_base", "type": "MONSTER", "name": { "str": "swimmer zombie" }, - "description": "A human body, clad in swimwear. Probably not a very graceful swimmer now, owing to its zombified state.", + "description": "A zombie clad in swimwear. Probably not a very graceful swimmer anymore.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -1478,7 +1478,7 @@ "id": "mon_zombie_swimmer", "type": "MONSTER", "name": { "str": "webbed zombie" }, - "description": "A slick and glistening human body. Its hands and feet are heavily webbed, and it is clad in swimwear.", + "description": "A slick and glistening human body clad in swimwear. Its hands and feet are heavily webbed, suggesting some kind of rapid evolutionary adaptation to water.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -1525,7 +1525,7 @@ "id": "mon_zombie_technician", "type": "MONSTER", "name": { "str": "zombie technician" }, - "description": "Still wearing its work clothes and hardhat, this zombie likely used to work on power lines or other electrical equipment.", + "description": "Still wearing its work clothes and hardhat, this zombie likely used to work on power lines or other electrical equipment. As it approaches, everything metal you're carrying shifts very slightly in the zombie's direction, as if attracted by a strong magnetic force.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], diff --git a/data/json/monsters/zed_prisoner.json b/data/json/monsters/zed_prisoner.json index 24478acb0d205..295145cc9f34c 100644 --- a/data/json/monsters/zed_prisoner.json +++ b/data/json/monsters/zed_prisoner.json @@ -3,7 +3,7 @@ "id": "mon_zombie_prisoner", "type": "MONSTER", "name": { "str": "prisoner zombie" }, - "description": "Apparently this zombie was doing time when the Cataclysm struck. It wears black and white striped prisoner clothes, and tattoos can be seen on his decaying skin.", + "description": "Apparently this zombie was doing time when the Cataclysm struck. It wears black and white striped prisoner clothes, and tattoos can be seen on its decaying skin.", "copy-from": "mon_zombie", "looks_like": "mon_zombie", "hp": 90, diff --git a/data/json/monsters/zed_skeletal.json b/data/json/monsters/zed_skeletal.json index d2f9d19c5c5d9..1d74311bf3ed3 100644 --- a/data/json/monsters/zed_skeletal.json +++ b/data/json/monsters/zed_skeletal.json @@ -83,7 +83,7 @@ "id": "mon_skeleton_electric", "type": "MONSTER", "name": { "str": "skeletal shocker" }, - "description": "Heavy, jagged bone plates have grown out of the surface of this zombie. Underneath, its flesh glows and crackles with the occasional jolt of electricity.", + "description": "Heavy, jagged bone plates have grown out of the surface of this zombie's skin. Underneath, its flesh glows and crackles with the occasional jolt of electricity.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], diff --git a/data/json/monsters/zed_soldiers.json b/data/json/monsters/zed_soldiers.json index a06e94160f960..d15205a070acd 100644 --- a/data/json/monsters/zed_soldiers.json +++ b/data/json/monsters/zed_soldiers.json @@ -120,7 +120,7 @@ "id": "mon_zombie_soldier_acid_1", "type": "MONSTER", "name": { "str": "bilious soldier zombie" }, - "description": "This staggering soldier wears a burnt gasmask, now fused to its face. Through the melted, bile-encrusted ruination of the mask comes some sort of hardened fleshy proboscis, with steaming corrosive fluid leaking from the end.", + "description": "This staggering soldier wears a burnt gasmask, now fused to its face. Through the melted, bile-encrusted ruination of the mask protrudes some sort of hardened, fleshy proboscis, with steaming corrosive fluid leaking from the end.", "copy-from": "mon_zombie_soldier", "looks_like": "mon_zombie_soldier", "diff": 20, @@ -155,7 +155,7 @@ "id": "mon_zombie_soldier_acid_2", "type": "MONSTER", "name": { "str": "caustic soldier zombie" }, - "description": "This zombie wears what appears to have once been a soldier's uniform and armor, now a series of cracked and melted plates that have fused to its skin and thickened hide. Its face and arms blister with strange mutated tubes that pulse and drip with acid.", + "description": "This zombie wears what appears to have once been a soldier's uniform and armor, now a series of cracked and melted plates that have fused to its skin and thickened hide. Its face and arms blister with strange, mutated tubes that pulse and drip with acid.", "copy-from": "mon_zombie_soldier", "looks_like": "mon_zombie_soldier", "diff": 20, @@ -191,7 +191,7 @@ "id": "mon_zombie_kevlar_1", "type": "MONSTER", "name": { "str": "Kevlar zombie" }, - "description": "This zombie was once wearing some kind of uniform with heavy, bulletproof materials sewn in. At this point it's impossible to tell what kind of uniform it was: the monster's skin has grown over the fabric, splitting and tearing it to shreds, turning the remaining Kevlar and other bits of armor material into part of its hide. Its hands, similarly, have fused into large leathery cudgels.", + "description": "This zombie was once wearing some kind of uniform with heavy, bulletproof materials sewn in. At this point it's impossible to tell what kind of uniform it was: the monster's skin has grown over the fabric, splitting and tearing it to shreds, turning the remaining Kevlar and other bits of armor material into part of its hide. Its hands have similarly fused into large, leathery cudgels.", "looks_like": "mon_zombie_brute", "default_faction": "zombie", "bodytype": "human", @@ -274,7 +274,7 @@ "id": "mon_zombie_military_pilot", "type": "MONSTER", "name": { "str": "zombie military pilot" }, - "description": "Once a pilot, it is dressed in basic military fatigues, aviator sunglasses, and a sturdy looking helmet.", + "description": "Once a pilot, it is dressed in basic military fatigues, aviator sunglasses, and a sturdy-looking helmet.", "default_faction": "zombie", "bodytype": "human", "categories": [ "CLASSIC" ], @@ -386,7 +386,7 @@ "id": "mon_zombie_armored", "type": "MONSTER", "name": { "str": "armored zombie" }, - "description": "Despite being encased in a what was once a nigh-impenetrable suit of power armor, something still managed to kill this soldier.", + "description": "Despite being encased in a what was once a nigh-impenetrable combat exoskeleton, something still managed to kill this soldier.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -432,7 +432,7 @@ "id": "mon_zombie_bio_op", "type": "MONSTER", "name": { "str": "zombie bio-operator" }, - "description": "This armored soldier appears to have been some sort of special forces agent. Its malfunctioning equipment sends out occasional series of sparks.", + "description": "This armored soldier zombie appears to have been some sort of special forces agent. Its malfunctioning equipment sends out occasional showers of sparks.", "default_faction": "zombie", "bodytype": "human", "species": [ "ZOMBIE", "HUMAN" ], @@ -484,7 +484,7 @@ "id": "mon_zombie_bio_op2", "type": "MONSTER", "name": { "str": "elite zombie bio-operator" }, - "description": "Once a highly trained soldier, this zombie is still in heavy military gear and dangerous physical condition. Its malfunctioning equipment sends out occasional series of sparks.", + "description": "Once a highly-trained soldier, this zombie is still equipped with heavy military gear and dangerous physical abilities. Its malfunctioning equipment sends out occasional showers of sparks.", "copy-from": "mon_zombie_bio_op", "looks_like": "mon_zombie_bio_op", "diff": 10, From 7e0928f3cc656dce8eee0771304536e73013c30a Mon Sep 17 00:00:00 2001 From: Dillon Matchett Date: Wed, 5 Jan 2022 20:31:37 -0400 Subject: [PATCH 141/154] Flexible Per Pocket Encumbrance (#53968) * testing the scavenger armor changes as well --- data/json/items/armor/ballistic_armor.json | 28 +++++++++++++------ .../armor/bespoke_armor/custom_bodysuits.json | 13 +++++++-- data/json/items/armor/robofac_armor.json | 2 ++ src/item_contents.cpp | 6 ++-- src/item_factory.cpp | 7 +++-- src/item_pocket.cpp | 1 + src/item_pocket.h | 2 ++ src/itype.h | 6 ++++ 8 files changed, 49 insertions(+), 16 deletions(-) diff --git a/data/json/items/armor/ballistic_armor.json b/data/json/items/armor/ballistic_armor.json index 82eb536f81d6b..d9bd2beb9e110 100644 --- a/data/json/items/armor/ballistic_armor.json +++ b/data/json/items/armor/ballistic_armor.json @@ -19,6 +19,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "1600 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -28,6 +29,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "1600 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -37,6 +39,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "800 ml", "max_contains_weight": "2 kg", "moves": 200, @@ -46,6 +49,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "800 ml", "max_contains_weight": "2 kg", "moves": 200, @@ -59,7 +63,7 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 95, "thickness": 3.0 } ], - "encumbrance": [ 6, 6 ], + "encumbrance": 6, "coverage": 100, "cover_vitals": 90, "covers": [ "torso" ] @@ -143,6 +147,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "1600 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -152,6 +157,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "1600 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -161,6 +167,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "800 ml", "max_contains_weight": "2 kg", "moves": 200, @@ -170,6 +177,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "800 ml", "max_contains_weight": "2 kg", "moves": 200, @@ -183,7 +191,7 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 95, "thickness": 3.0 } ], - "encumbrance": [ 6, 6 ], + "encumbrance": 6, "coverage": 100, "cover_vitals": 100, "covers": [ "torso" ] @@ -193,7 +201,7 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 100, "thickness": 3.0 } ], - "encumbrance": [ 5, 5 ], + "encumbrance": 5, "//": "an enemy could get under the protection in melee but ranged shots should almost always be blocked", "coverage": 80, "cover_melee": 80, @@ -207,7 +215,7 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 100, "thickness": 3.0 } ], - "encumbrance": [ 2, 2 ], + "encumbrance": 2, "coverage": 75, "cover_vitals": 100, "covers": [ "leg_l", "leg_r" ], @@ -230,7 +238,7 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 95, "thickness": 3.0 } ], - "encumbrance": [ 6, 6 ], + "encumbrance": 6, "coverage": 100, "cover_vitals": 100, "covers": [ "torso" ] @@ -240,7 +248,7 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 100, "thickness": 3.0 } ], - "encumbrance": [ 5, 5 ], + "encumbrance": 5, "//": "an enemy could get under the protection in melee but ranged shots should almost always be blocked", "coverage": 80, "cover_melee": 80, @@ -266,7 +274,7 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 95, "thickness": 3.0 } ], - "encumbrance": [ 6, 6 ], + "encumbrance": 6, "coverage": 100, "cover_vitals": 100, "covers": [ "torso" ] @@ -276,7 +284,7 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 100, "thickness": 3.0 } ], - "encumbrance": [ 2, 2 ], + "encumbrance": 2, "coverage": 75, "cover_vitals": 100, "covers": [ "leg_l", "leg_r" ], @@ -299,6 +307,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "1600 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -308,6 +317,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "1600 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -318,7 +328,7 @@ "armor": [ { "material": [ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 } ], - "encumbrance": [ 1, 1 ], + "encumbrance": 1, "coverage": 90, "covers": [ "torso" ], "specifically_covers": [ "torso_upper" ] diff --git a/data/json/items/armor/bespoke_armor/custom_bodysuits.json b/data/json/items/armor/bespoke_armor/custom_bodysuits.json index ffd2527fe091f..104ef757647d1 100644 --- a/data/json/items/armor/bespoke_armor/custom_bodysuits.json +++ b/data/json/items/armor/bespoke_armor/custom_bodysuits.json @@ -75,7 +75,8 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 3.0 }, { "type": "kevlar_layered", "covered_by_mat": 95, "thickness": 3.0 } ], - "encumbrance": [ 15, 26 ], + "volume_encumber_modifier": 0.2, + "encumbrance": 15, "coverage": 100, "cover_vitals": 90, "covers": [ "torso" ] @@ -85,7 +86,8 @@ { "type": "nylon", "covered_by_mat": 100, "thickness": 2.0 }, { "type": "kevlar_layered", "covered_by_mat": 90, "thickness": 3.0 } ], - "encumbrance": [ 15, 15 ], + "encumbrance": 15, + "volume_encumber_modifier": 0, "coverage": 100, "cover_vitals": 90, "covers": [ "arm_l", "arm_r" ] @@ -95,7 +97,8 @@ { "type": "cotton", "covered_by_mat": 100, "thickness": 1.0 }, { "type": "kevlar_layered", "covered_by_mat": 90, "thickness": 3.0 } ], - "encumbrance": [ 10, 14 ], + "volume_encumber_modifier": 0.1, + "encumbrance": 10, "coverage": 100, "cover_vitals": 90, "covers": [ "leg_l", "leg_r" ] @@ -167,6 +170,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "1600 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -176,6 +180,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "1600 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -185,6 +190,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "800 ml", "max_contains_weight": "2 kg", "moves": 200, @@ -194,6 +200,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "800 ml", "max_contains_weight": "2 kg", "moves": 200, diff --git a/data/json/items/armor/robofac_armor.json b/data/json/items/armor/robofac_armor.json index f03ea2bd43daf..5da35923ed67c 100644 --- a/data/json/items/armor/robofac_armor.json +++ b/data/json/items/armor/robofac_armor.json @@ -56,6 +56,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "5000 ml", "max_contains_weight": "5 kg", "moves": 200, @@ -65,6 +66,7 @@ { "pocket_type": "CONTAINER", "ablative": true, + "volume_encumber_modifier": 0, "max_contains_volume": "4000 ml", "max_contains_weight": "5 kg", "moves": 200, diff --git a/src/item_contents.cpp b/src/item_contents.cpp index 86fab3610c12e..15c5ee8587c97 100644 --- a/src/item_contents.cpp +++ b/src/item_contents.cpp @@ -1804,8 +1804,10 @@ float item_contents::relative_encumbrance() const if( pocket.rigid() ) { continue; } - nonrigid_volume += pocket.contains_volume(); - nonrigid_max_volume += pocket.max_contains_volume(); + // need to modify by pockets volume encumbrance modifier since some pockets may have less effect than others + float modifier = pocket.get_pocket_data()->volume_encumber_modifier; + nonrigid_volume += pocket.contains_volume() * modifier; + nonrigid_max_volume += pocket.max_contains_volume() * modifier; } if( nonrigid_volume > nonrigid_max_volume ) { debugmsg( "volume exceeds capacity (%sml > %sml)", diff --git a/src/item_factory.cpp b/src/item_factory.cpp index 4997d57c283e7..8d6aa980fa414 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -645,10 +645,12 @@ void Item_factory::finalize_post( itype &obj ) units::volume total_nonrigid_volume = 0_ml; for( const pocket_data &pocket : obj.pockets ) { if( !pocket.rigid ) { - total_nonrigid_volume += pocket.max_contains_volume(); + // include the modifier for each individual pocket + total_nonrigid_volume += pocket.max_contains_volume() * pocket.volume_encumber_modifier; } } - data.max_encumber = data.encumber + total_nonrigid_volume / 250_ml; + data.max_encumber = data.encumber + total_nonrigid_volume * data.volume_encumber_modifier / + data.volume_per_encumbrance; } // Precalc average thickness per portion int data_count = 0; @@ -2359,6 +2361,7 @@ void armor_portion_data::deserialize( const JsonObject &jo ) optional( jo, false, "material_thickness", avg_thickness, 0.0f ); optional( jo, false, "environmental_protection", env_resist, 0 ); optional( jo, false, "environmental_protection_with_filter", env_resist_w_filter, 0 ); + optional( jo, false, "volume_encumber_modifier", volume_encumber_modifier, 1 ); // TODO: Make mandatory - once we remove the old loading below if( jo.has_member( "material" ) ) { diff --git a/src/item_pocket.cpp b/src/item_pocket.cpp index 65cce03e5e0d2..17b1bec7e2efb 100644 --- a/src/item_pocket.cpp +++ b/src/item_pocket.cpp @@ -155,6 +155,7 @@ void pocket_data::load( const JsonObject &jo ) units::default_length_from_volume( volume_capacity ) * M_SQRT2 ); optional( jo, was_loaded, "min_item_length", min_item_length ); optional( jo, was_loaded, "extra_encumbrance", extra_encumbrance, 0 ); + optional( jo, was_loaded, "volume_encumber_modifier", volume_encumber_modifier, 1 ); optional( jo, was_loaded, "ripoff", ripoff, 0 ); optional( jo, was_loaded, "activity_noise", activity_noise ); } diff --git a/src/item_pocket.h b/src/item_pocket.h index d671e909454a3..0cbbf4ac7a8cd 100644 --- a/src/item_pocket.h +++ b/src/item_pocket.h @@ -440,6 +440,8 @@ class pocket_data bool ablative = false; // additional encumbrance when this pocket is in use int extra_encumbrance = 0; + // how much this pocket contributes to enumbrance compared to an average item + float volume_encumber_modifier = 1; // chance this pockets contents get ripped off when escaping a grab int ripoff = 0; // volume this pocket makes when moving diff --git a/src/itype.h b/src/itype.h index 82d091393dcc9..3b3aae1498c58 100644 --- a/src/itype.h +++ b/src/itype.h @@ -235,12 +235,18 @@ struct part_material { struct armor_portion_data { + // The base volume for an item + const units::volume volume_per_encumbrance = 250_ml; // NOLINT(cata-serialize) + // How much this piece encumbers the player. int encumber = 0; // When storage is full, how much it encumbers the player. int max_encumber = -1; + // how much an item can hold comfortably compared to an average item + float volume_encumber_modifier = 1; + // Percentage of the body part that this item covers. // This determines how likely it is to hit the item instead of the player. int coverage = 0; From 420a483edf7b2984145f8c495f17f6cfd41fa68d Mon Sep 17 00:00:00 2001 From: Drew4484 <57647637+Drew4484@users.noreply.github.com> Date: Wed, 5 Jan 2022 16:32:10 -0800 Subject: [PATCH 142/154] Kevlar Chainmail Fix (#54063) --- data/json/items/armor/suits_protection.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index 25bf6f2f77320..19628d4af4322 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -517,6 +517,7 @@ "name": { "str": "kevlar chainmail armor" }, "description": "A fully customized chainmail suit. The shirt, arms, and leggings have been modified with straps and combined with a kevlar gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", "copy-from": "chainmail_suit", + "material_thickness": 6, "material": [ { "type": "steel", "portion": 5 }, { "type": "kevlar_layered", "portion": 3 }, { "type": "kevlar", "portion": 2 } ], "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ], "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER", "NONCONDUCTIVE" ] @@ -533,7 +534,9 @@ "id": "xl_kevlar_chainmail_suit", "type": "ARMOR", "name": { "str": "XL kevlar chainmail armor" }, - "copy-from": "xl_chainmail_suit" + "copy-from": "kevlar_chainmail_suit", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } }, { "id": "chainmail_suit_faraday", From e885763abb5caaff08927945cd30cc4fda7ab440 Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Thu, 6 Jan 2022 08:35:35 +0800 Subject: [PATCH 143/154] Simplify StringMaker template specialization in tests (#54075) --- tests/stringmaker.cpp | 7 ------- tests/stringmaker.h | 48 ++++++++++++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/tests/stringmaker.cpp b/tests/stringmaker.cpp index 56238e7adc02a..b5f07b9314667 100644 --- a/tests/stringmaker.cpp +++ b/tests/stringmaker.cpp @@ -9,45 +9,38 @@ namespace Catch { -template<> template<> std::string StringMaker::convert( const item &i ) { return string_format( "item( itype_id( \"%s\" ) )", i.typeId().str() ); } -template<> template<> std::string StringMaker::convert( const point &p ) { return string_format( "point( %d, %d )", p.x, p.y ); } -template<> template<> std::string StringMaker::convert( const rl_vec2d &p ) { return string_format( "rl_vec2d( %f, %f )", p.x, p.y ); } -template<> template<> std::string StringMaker::convert( const cata_variant &v ) { return string_format( "cata_variant<%s>(\"%s\")", io::enum_to_string( v.type() ), v.get_string() ); } -template<> template<> std::string StringMaker::convert( const time_duration &d ) { return string_format( "time_duration( %d ) [%s]", to_turns( d ), to_string( d ) ); } -template<> template<> std::string StringMaker::convert( const time_point &d ) { return string_format( "time_point( %d ) [%s]", to_turns( d - calendar::turn_zero ), to_string( d ) ); } -template<> template<> std::string StringMaker::convert( const talk_response &r ) { return string_format( "talk_response( text=\"%s\" )", r.text ); diff --git a/tests/stringmaker.h b/tests/stringmaker.h index a3b868e4b3607..07ebb49a319f9 100644 --- a/tests/stringmaker.h +++ b/tests/stringmaker.h @@ -18,20 +18,40 @@ struct talk_response; namespace Catch { -template<> template<> std::string StringMaker::convert( const item &i ); -extern template struct StringMaker; -template<> template<> std::string StringMaker::convert( const point &p ); -extern template struct StringMaker; -template<> template<> std::string StringMaker::convert( const rl_vec2d &p ); -extern template struct StringMaker; -template<> template<> std::string StringMaker::convert( const cata_variant &v ); -extern template struct StringMaker; -template<> template<> std::string StringMaker::convert( const time_duration &d ); -extern template struct StringMaker; -template<> template<> std::string StringMaker::convert( const time_point &d ); -extern template struct StringMaker; -template<> template<> std::string StringMaker::convert( const talk_response &r ); -extern template struct StringMaker; +template<> +struct StringMaker { + static std::string convert( const item &i ); +}; + +template<> +struct StringMaker { + static std::string convert( const point &p ); +}; + +template<> +struct StringMaker { + static std::string convert( const rl_vec2d &p ); +}; + +template<> +struct StringMaker { + static std::string convert( const cata_variant &v ); +}; + +template<> +struct StringMaker { + static std::string convert( const time_duration &d ); +}; + +template <> +struct StringMaker { + static std::string convert( const time_point &d ); +}; + +template <> +struct StringMaker { + static std::string convert( const talk_response &r ); +}; template struct StringMaker> { From 5e77f08c9c418104227bd6bbe0d7f2c6fc5c4228 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Tue, 4 Jan 2022 11:55:39 -0500 Subject: [PATCH 144/154] Custom widget height: Ability to define custom height --- src/widget.cpp | 100 +++++++++++++++++++++++++++++++++++++------------ src/widget.h | 7 ++-- 2 files changed, 80 insertions(+), 27 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index 6264e2c72258c..2d364294883b8 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -160,6 +160,7 @@ void widget::load( const JsonObject &jo, const std::string & ) { optional( jo, was_loaded, "strings", _strings ); optional( jo, was_loaded, "width", _width, 1 ); + optional( jo, was_loaded, "height", _height, 1 ); optional( jo, was_loaded, "symbols", _symbols, "-" ); optional( jo, was_loaded, "fill", _fill, "bucket" ); optional( jo, was_loaded, "label", _label, translation() ); @@ -324,14 +325,14 @@ int widget::get_var_value( const avatar &ava ) return value; } -std::string widget::show( const avatar &ava ) +std::string widget::show( const avatar &ava, const unsigned int max_width ) { if( uses_text_function() ) { // Text functions are a carry-over from before widgets, with existing functions generating // descriptive colorized text for avatar attributes. The "value" for these is immaterial; // only the final color string is shown. Bypass value calculation and call the // text-rendering function directly. - return color_text_function_string( ava ); + return color_text_function_string( ava, max_width ); } else { // For normal widgets, get current numeric value and potential maximum, // and return a color string rendering of that value in the appropriate style. @@ -341,6 +342,24 @@ std::string widget::show( const avatar &ava ) } } +// Returns the new row index after drawing +static int custom_draw_multiline( const std::string &widget_string, const catacurses::window &w, + const int margin, const int width, int row_num ) +{ + std::string wgt_str = widget_string; + size_t strpos = 0; + // Split the widget string into lines (for height > 1) + while( ( strpos = wgt_str.find( '\n' ) ) != std::string::npos ) { + trim_and_print( w, point( margin, row_num ), width, c_light_gray, wgt_str.substr( 0, strpos ) ); + wgt_str.erase( 0, strpos + 1 ); + row_num++; + } + // Last line (or first line for single-line widgets) + trim_and_print( w, point( margin, row_num ), width, c_light_gray, wgt_str ); + row_num++; + return row_num; +} + // Drawing function, provided as a callback to the window_panel constructor. // Handles rendering a widget's content into a window panel. static void custom_draw_func( const draw_args &args ) @@ -370,19 +389,18 @@ static void custom_draw_func( const draw_args &args ) int row_num = 0; for( const widget_id &row_wid : wgt->_widgets ) { widget row_widget = row_wid.obj(); - trim_and_print( w, point( margin, row_num ), widt, c_light_gray, row_widget.layout( u, - widt ) ); - row_num++; + const std::string txt = row_widget.layout( u, widt ); + row_num = custom_draw_multiline( txt, w, margin, widt, row_num ); } } else { // Layout widgets in columns // For now, this is the default when calling layout() // So, just layout self on a single line - trim_and_print( w, point( margin, 0 ), widt, c_light_gray, _( wgt->layout( u, widt ) ) ); + custom_draw_multiline( wgt->layout( u, widt ), w, margin, widt, 0 ); } } else { - // No layout, just a widget - simply layout self on a single line - trim_and_print( w, point( margin, 0 ), widt, c_light_gray, _( wgt->layout( u, widt ) ) ); + // No layout, just a widget + custom_draw_multiline( wgt->layout( u, widt ), w, margin, widt, 0 ); } wnoutrefresh( w ); } @@ -392,10 +410,15 @@ window_panel widget::get_window_panel( const int width, const int req_height ) // Width is fixed, but height may vary depending on child widgets int height = req_height; - // For layout with rows, height will be number of rows - // (assuming each row is only 1 line) + // For layout with rows, height will be the combined + // height of all child widgets. if( _style == "layout" && _arrange == "rows" ) { - height = _widgets.size(); + height = 0; + for( const widget_id &wid : _widgets ) { + height += wid->_height > 0 ? wid->_height : 1; + } + } else if( _style == "widget" ) { + height = _height > 1 ? _height : req_height; } // Minimap and log do not have a predetermined height // (or they should allow caller to customize height) @@ -438,7 +461,8 @@ bool widget::uses_text_function() } } -std::string widget::color_text_function_string( const avatar &ava ) +// NOTE: Use max_width to split multi-line widgets across lines +std::string widget::color_text_function_string( const avatar &ava, unsigned int /*max_width*/ ) { std::string ret; std::pair desc; @@ -651,6 +675,32 @@ std::string widget::graph( int value, int value_max ) return ret; } +// For widget::layout, process each row to append to the layout string +static std::string append_line( const std::string &line, bool first_row, unsigned int max_width, + const translation &label, bool skip_padding ) +{ + std::string ret; + // Width used by label, ": " and value, using utf8_width to ignore color tags + unsigned int used_width = utf8_width( line, true ); + if( first_row ) { + const std::string tlabel = label.translated(); + // If label is empty or omitted, don't reserve space for it + if( !tlabel.empty() ) { + used_width += utf8_width( tlabel, true ) + 2; + // Label and ": " first + ret += tlabel + ": "; + } + } + + // then enough padding to fit max_width + if( !skip_padding && used_width < max_width ) { + ret += std::string( max_width - used_width, ' ' ); + } + // then colorized value + ret += line; + return ret; +} + std::string widget::layout( const avatar &ava, const unsigned int max_width ) { std::string ret; @@ -688,19 +738,21 @@ std::string widget::layout( const avatar &ava, const unsigned int max_width ) } } else { // Get displayed value (colorized) - std::string shown = show( ava ); - const std::string tlabel = _label.translated(); - // Width used by label, ": " and value, using utf8_width to ignore color tags - unsigned int used_width = utf8_width( tlabel, true ) + 2 + utf8_width( shown, true ); - - // Label and ": " first - ret += tlabel + ": "; - // then enough padding to fit max_width - if( used_width < max_width ) { - ret += std::string( max_width - used_width, ' ' ); + std::string shown = show( ava, max_width ); + size_t strpos = 0; + int row_num = 0; + // For multi-line widgets, each line is separated by a '\n' character + while( ( strpos = shown.find( '\n' ) ) != std::string::npos && row_num < _height ) { + // Process line, including '\n' + ret += append_line( shown.substr( 0, strpos + 1 ), row_num == 0, max_width, _label, _height > 1 ); + // Delete used token + shown.erase( 0, strpos + 1 ); + row_num++; + } + if( row_num < _height ) { + // Process last line, or first for single-line widgets + ret += append_line( shown, row_num == 0, max_width, _label, _height > 1 ); } - // then colorized value - ret += shown; } return ret; } diff --git a/src/widget.h b/src/widget.h index ba8232f7d569b..9b6f98cd6a82a 100644 --- a/src/widget.h +++ b/src/widget.h @@ -90,7 +90,6 @@ class widget { private: friend class generic_factory; - friend void custom_draw_fn( avatar &u, const catacurses::window &w, const widget &wgt ); widget_id id; bool was_loaded = false; @@ -115,6 +114,8 @@ class widget bodypart_id _bp_id; // Width in characters of widget, not including label int _width = 0; + // Height in characters of widget, only matters for style == widget + int _height = 0; // String of symbols for graph widgets, mapped in increasing order like "0123..." std::string _symbols; // Graph fill style ("bucket" or "pool") @@ -143,11 +144,11 @@ class widget // label area, so the returned string is equal to max_width. std::string layout( const avatar &ava, unsigned int max_width = 0 ); // Display labeled widget, with value (number, graph, or string) from an avatar - std::string show( const avatar &ava ); + std::string show( const avatar &ava, unsigned int max_width ); // Return a window_panel for rendering this widget at given width (and possibly height) window_panel get_window_panel( const int width, const int req_height = 1 ); // Return a colorized string for a _var associated with a description function - std::string color_text_function_string( const avatar &ava ); + std::string color_text_function_string( const avatar &ava, unsigned int max_width ); // Return true if the current _var is one which uses a description function bool uses_text_function(); From 11a010302a25085d1763ed90f57c41bc0e3c290a Mon Sep 17 00:00:00 2001 From: David Seguin Date: Tue, 4 Jan 2022 23:26:11 -0500 Subject: [PATCH 145/154] Custom widget height: Unit tests --- data/mods/TEST_DATA/widgets.json | 8 +++ src/widget.cpp | 10 +-- src/widget.h | 7 +- tests/widget_test.cpp | 111 +++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 6 deletions(-) diff --git a/data/mods/TEST_DATA/widgets.json b/data/mods/TEST_DATA/widgets.json index 94ff8d288b473..79ec1648f3cbb 100644 --- a/data/mods/TEST_DATA/widgets.json +++ b/data/mods/TEST_DATA/widgets.json @@ -159,6 +159,14 @@ "var": "weather_text", "style": "text" }, + { + "id": "test_weather_text_height5", + "type": "widget", + "label": "Weather", + "var": "weather_text", + "style": "text", + "height": 5 + }, { "id": "test_weariness_num", "type": "widget", diff --git a/src/widget.cpp b/src/widget.cpp index 2d364294883b8..b2610a13ea7bc 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -343,8 +343,8 @@ std::string widget::show( const avatar &ava, const unsigned int max_width ) } // Returns the new row index after drawing -static int custom_draw_multiline( const std::string &widget_string, const catacurses::window &w, - const int margin, const int width, int row_num ) +int widget::custom_draw_multiline( const std::string &widget_string, const catacurses::window &w, + const int margin, const int width, int row_num ) { std::string wgt_str = widget_string; size_t strpos = 0; @@ -390,17 +390,17 @@ static void custom_draw_func( const draw_args &args ) for( const widget_id &row_wid : wgt->_widgets ) { widget row_widget = row_wid.obj(); const std::string txt = row_widget.layout( u, widt ); - row_num = custom_draw_multiline( txt, w, margin, widt, row_num ); + row_num = widget::custom_draw_multiline( txt, w, margin, widt, row_num ); } } else { // Layout widgets in columns // For now, this is the default when calling layout() // So, just layout self on a single line - custom_draw_multiline( wgt->layout( u, widt ), w, margin, widt, 0 ); + widget::custom_draw_multiline( wgt->layout( u, widt ), w, margin, widt, 0 ); } } else { // No layout, just a widget - custom_draw_multiline( wgt->layout( u, widt ), w, margin, widt, 0 ); + widget::custom_draw_multiline( wgt->layout( u, widt ), w, margin, widt, 0 ); } wnoutrefresh( w ); } diff --git a/src/widget.h b/src/widget.h index 9b6f98cd6a82a..82a2d59bc32ab 100644 --- a/src/widget.h +++ b/src/widget.h @@ -170,7 +170,12 @@ class widget std::string text( int value, int value_max = 0 ); // Return the graph part of this widget, rendered with "bucket" or "pool" fill std::string graph( int value, int value_max = 0 ); - + // Takes a string generated by widget::layout and draws the text to the window w. + // If the string contains newline characters, the text is broken up into lines. + // Returns the new row index after drawing. + // Note: Not intended to be called directly, only public for unit testing. + static int custom_draw_multiline( const std::string &widget_string, const catacurses::window &w, + const int margin, const int width, int row_num ); }; #endif // CATA_SRC_WIDGET_H diff --git a/tests/widget_test.cpp b/tests/widget_test.cpp index 482f427e7858f..26faee770724c 100644 --- a/tests/widget_test.cpp +++ b/tests/widget_test.cpp @@ -7,6 +7,21 @@ #include "weather_type.h" #include "widget.h" +// Needed for screen scraping +#if !(defined(TILES) || defined(_WIN32)) +namespace cata_curses_test +{ +#define NCURSES_NOMACROS +#if defined(__CYGWIN__) +#include +#else +#include +#endif +} +#else +#include "cursesport.h" +#endif + static const itype_id itype_rad_badge( "rad_badge" ); static const weather_type_id weather_acid_rain( "acid_rain" ); @@ -45,6 +60,39 @@ static const widget_id widget_test_str_num( "test_str_num" ); static const widget_id widget_test_text_widget( "test_text_widget" ); static const widget_id widget_test_weariness_num( "test_weariness_num" ); static const widget_id widget_test_weather_text( "test_weather_text" ); +static const widget_id widget_test_weather_text_height5( "test_weather_text_height5" ); + +// dseguin 2022 - Ugly hack to scrape content from the window object. +// Scrapes the window w at origin, reading the number of cols and rows. +static std::vector scrape_win_at( + catacurses::window &w, const point &origin, int cols, int rows ) +{ + std::vector lines; + +#if defined(TILES) || defined(_WIN32) + cata_cursesport::WINDOW *win = static_cast( w.get() ); + + for( int i = origin.y; i < rows && static_cast( i ) < win->line.size(); i++ ) { + lines.emplace_back( std::string() ); + for( int j = origin.x; j < cols && static_cast( j ) < win->line[i].chars.size(); j++ ) { + lines[i] += win->line[i].chars[j].ch; + } + } +#else + cata_curses_test::WINDOW *win = static_cast( w.get() ); + + int max_y = catacurses::getmaxy( w ); + for( int i = origin.y; i < rows && i < max_y; i++ ) { + wchar_t *buf = static_cast( ::malloc( sizeof( *buf ) * ( cols + 1 ) ) ); + cata_curses_test::mvwinnwstr( win, i, origin.x, buf, cols ); + std::wstring line( buf, static_cast( cols ), std::allocator() ); + lines.emplace_back( std::string( line.begin(), line.end() ) ); + ::free( buf ); + } +#endif + + return lines; +} TEST_CASE( "widget value strings", "[widget][value][string]" ) { @@ -569,3 +617,66 @@ TEST_CASE( "widgets showing weather conditions", "[widget][weather]" ) } } } + +TEST_CASE( "Custom widget height and multiline formatting", "[widget]" ) +{ + const int cols = 32; + const int rows = 5; + widget height1 = widget_test_weather_text.obj(); + widget height5 = widget_test_weather_text_height5.obj(); + + avatar &ava = get_avatar(); + clear_avatar(); + scoped_weather_override forcast( weather_sunny ); + + SECTION( "Height field does not impact text content" ) { + std::string layout1 = height1.layout( ava ); + std::string layout5 = height5.layout( ava ); + CHECK( height1._height == 1 ); + CHECK( height5._height == 5 ); + CHECK( layout1 == "Weather: Sunny" ); + CHECK( layout5 == "Weather: Sunny" ); + } + + SECTION( "Multiline drawing splits newlines correctly" ) { +#if !(defined(TILES) || defined(_WIN32)) + // Running the tests in a developer environment works fine, but + // the CI env has no interactive shell, so we skip the screen scraping. + const char *term_env = ::getenv( "TERM" ); + // The tests don't initialize the curses window, so initialize it here... + if( term_env != nullptr && std::string( term_env ) != "unknown" && + cata_curses_test::initscr() != nullptr ) { +#endif + catacurses::window w = catacurses::newwin( rows, cols, point_zero ); + + werase( w ); + SECTION( "Single-line layout" ) { + std::string layout1 = "abcd efgh ijkl mnop qrst"; + CHECK( widget::custom_draw_multiline( layout1, w, 1, 30, 0 ) == 1 ); + std::vector lines = scrape_win_at( w, point_zero, cols, rows ); + CHECK( lines[0] == " abcd efgh ijkl mnop qrst " ); + CHECK( lines[1] == " " ); + CHECK( lines[2] == " " ); + CHECK( lines[3] == " " ); + CHECK( lines[4] == " " ); + } + + werase( w ); + SECTION( "Single-line layout" ) { + std::string layout5 = "abcd\nefgh\nijkl\nmnop\nqrst"; + CHECK( widget::custom_draw_multiline( layout5, w, 1, 30, 0 ) == 5 ); + std::vector lines = scrape_win_at( w, point_zero, cols, rows ); + CHECK( lines[0] == " abcd " ); + CHECK( lines[1] == " efgh " ); + CHECK( lines[2] == " ijkl " ); + CHECK( lines[3] == " mnop " ); + CHECK( lines[4] == " qrst " ); + } + +#if !(defined(TILES) || defined(_WIN32)) + // ... and free it here + cata_curses_test::endwin(); + } +#endif + } +} From a573b7c1d0f92be74ca3d2840a471c1053406a54 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Wed, 5 Jan 2022 16:51:06 -0500 Subject: [PATCH 146/154] Custom widget height: Documentation --- doc/SIDEBAR_MOD.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/doc/SIDEBAR_MOD.md b/doc/SIDEBAR_MOD.md index 68849333ccaf8..3a9b13151253d 100644 --- a/doc/SIDEBAR_MOD.md +++ b/doc/SIDEBAR_MOD.md @@ -224,9 +224,25 @@ And a widget to show the HP of the right arm would define "var" and "bodypart" l Plain numeric values can be displayed as-is, up to any maximum. For "graph" widgets, it is useful to define a "var_max" as a cutoff point; see the "Graph widget" section for more. - You may also define "var_min" if it's relevant. By default this is 0. +#### `height` + +Some widgets can make use of multiple lines by specifying the `"height"` field, which reserves +vertical space in the sidebar. Display functions can make use of this extra space to render +multi-line widgets. + +Warning: implementation details ahead. + +The max width and height available for a widget is passed to its `display::` function through +`widget::color_text_function_string()`. The display function can use this data to format the +widget text as a series of lines delimited by a newline (`\n`). + +The formatted string is passed to `widget::show()` and `widget::layout()`, which format each +line individually for drawing in `widget::custom_draw_multiline()`. + +Adding new multi-line-capable widgets involves ensuring the new display function formats the +widget's text according to the available width and height. ### Number widget From be5c26b60e7fa0388b5d1d2d6bfc1af8ed5f216c Mon Sep 17 00:00:00 2001 From: Kevin Granade Date: Wed, 5 Jan 2022 18:23:50 -0800 Subject: [PATCH 147/154] Make clang-tidy happy with a little optimization (#54080) --- src/construction.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/construction.cpp b/src/construction.cpp index 7cd9d55531b6f..ecad16916a8ef 100644 --- a/src/construction.cpp +++ b/src/construction.cpp @@ -1336,7 +1336,7 @@ void construct::done_appliance( const tripoint &p ) // or the appliance will be invisible for the first couple of turns. here.add_vehicle_to_cache( veh ); - for( const tripoint trip : here.points_in_radius( p, 1 ) ) { + for( const tripoint &trip : here.points_in_radius( p, 1 ) ) { const optional_vpart_position vp = here.veh_at( trip ); if( !vp ) { continue; From 4d221295bf79cd4b80c47af9f9efb206c8c6116b Mon Sep 17 00:00:00 2001 From: I-am-Erk <45136638+I-am-Erk@users.noreply.github.com> Date: Wed, 5 Jan 2022 18:29:17 -0800 Subject: [PATCH 148/154] Add an oven to the power grid (#53648) * ovens can be disconnected and aren't fireplaces anymore Parting out the specific components of an oven Making a separate folder for appliance construction because I think these are going to add up to a lot. Start adding some craft/uncraft recipes. Will need to add rock_wool_bat item. will need an appliance repair proficiency Co-authored-by: Fris0uman <41293484+Fris0uman@users.noreply.github.com> Co-authored-by: Kevin Granade Co-authored-by: Wishbringer --- data/json/construction.json | 11 ++ data/json/construction_group.json | 5 + .../furniture-appliances.json | 19 +-- data/json/items/appliances.json | 15 ++ .../json/items/resources/appliance_parts.json | 77 +++++++++ data/json/items/resources/metal.json | 30 ++++ data/json/items/resources/stone.json | 13 ++ data/json/proficiencies/misc.json | 10 ++ data/json/recipes/appliances/oven.json | 150 ++++++++++++++++++ data/json/vehicleparts/appliances.json | 30 +++- 10 files changed, 344 insertions(+), 16 deletions(-) create mode 100644 data/json/items/resources/appliance_parts.json create mode 100644 data/json/recipes/appliances/oven.json diff --git a/data/json/construction.json b/data/json/construction.json index bd25d2c0a8d99..6098c38cbef11 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -3001,6 +3001,17 @@ "pre_special": "check_empty", "post_special": "done_appliance" }, + { + "type": "construction", + "id": "app_oven", + "group": "place_oven", + "category": "APPLIANCE", + "required_skills": [ [ "fabrication", 0 ] ], + "time": "5 m", + "components": [ [ [ "oven", 1 ] ] ], + "pre_special": "check_empty", + "post_special": "done_appliance" + }, { "type": "construction", "id": "app_standing_lamp", diff --git a/data/json/construction_group.json b/data/json/construction_group.json index 9602c3d746dae..6409dcf6c672e 100644 --- a/data/json/construction_group.json +++ b/data/json/construction_group.json @@ -1094,6 +1094,11 @@ "id": "place_fridge", "name": "Place Fridge" }, + { + "type": "construction_group", + "id": "place_oven", + "name": "Place Oven" + }, { "type": "construction_group", "id": "place_standing_lamp", diff --git a/data/json/furniture_and_terrain/furniture-appliances.json b/data/json/furniture_and_terrain/furniture-appliances.json index a77a6d3c45f74..da176750bacdd 100644 --- a/data/json/furniture_and_terrain/furniture-appliances.json +++ b/data/json/furniture_and_terrain/furniture-appliances.json @@ -342,26 +342,15 @@ "id": "f_oven", "name": "oven", "symbol": "#", - "description": "A standard convection-based oven, commonly used for heating and cooking food. You could safely light a fire inside or power it with UPS.", + "description": "A standard convection-based oven, commonly used for heating and cooking food. It can safely contain a fire, although it's not adequately ventilated. You could disconnect it and plug it in to a working power grid, or power it with UPS.", "color": "dark_gray", "move_cost_mod": 2, "coverage": 60, "required_str": 10, - "flags": [ "PLACE_ITEM", "TRANSPARENT", "FIRE_CONTAINER", "CONTAINER", "BLOCKSDOOR", "MOUNTABLE" ], + "flags": [ "PLACE_ITEM", "TRANSPARENT", "EASY_DECONSTRUCT", "FIRE_CONTAINER", "CONTAINER", "BLOCKSDOOR", "MOUNTABLE" ], + "deconstruct": { "items": [ { "item": "oven", "count": 1 } ] }, "examine_action": "fireplace", - "deconstruct": { - "items": [ - { "item": "sheet_metal", "count": [ 2, 6 ] }, - { "item": "sheet_metal_small", "count": [ 0, 4 ] }, - { "item": "steel_chunk", "count": [ 2, 3 ] }, - { "item": "scrap", "count": [ 2, 6 ] }, - { "item": "element", "count": [ 1, 4 ] }, - { "item": "cable", "charges": [ 1, 3 ] }, - { "item": "pipe_fittings", "count": [ 1, 3 ] }, - { "item": "pilot_light", "count": 1 } - ] - }, - "max_volume": "40 L", + "max_volume": "120 L", "bash": { "str_min": 8, "str_max": 30, diff --git a/data/json/items/appliances.json b/data/json/items/appliances.json index 69641984c3f92..e317bea7528ca 100644 --- a/data/json/items/appliances.json +++ b/data/json/items/appliances.json @@ -21,6 +21,21 @@ } ] }, + { + "type": "GENERIC", + "id": "oven", + "looks_like": "f_oven", + "symbol": "#", + "description": "A disconnected electric convection-based oven, commonly used for heating and cooking food.", + "color": "dark_gray_white", + "name": { "str": "disconnected oven" }, + "material": [ "budget_steel" ], + "longest_side": "69 cm", + "insulation": 3, + "volume": "290 L", + "weight": "77 kg", + "pocket_data": [ { "pocket_type": "CONTAINER", "rigid": true, "max_contains_volume": "120 L", "max_contains_weight": "200 kg" } ] + }, { "type": "TOOL", "id": "power_cord", diff --git a/data/json/items/resources/appliance_parts.json b/data/json/items/resources/appliance_parts.json new file mode 100644 index 0000000000000..23c0ec72aa673 --- /dev/null +++ b/data/json/items/resources/appliance_parts.json @@ -0,0 +1,77 @@ +[ + { + "type": "GENERIC", + "id": "oven_stovetop", + "symbol": "_", + "color": "dark_gray", + "name": { "str": "dismantled stovetop" }, + "category": "spare_parts", + "description": "The dismantled stovetop of an electric oven. Some electric components are still attached but the heating elements have been pulled off.", + "price": 100, + "price_postapoc": 5, + "material": [ "budget_steel" ], + "weight": "5 kg", + "volume": "20 L", + "longest_side": "60 cm" + }, + { + "type": "GENERIC", + "id": "oven_cabinet", + "symbol": "x", + "color": "dark_gray_white", + "name": { "str": "stripped oven cabinet" }, + "category": "spare_parts", + "description": "A large hefty steel box that was once the main body of an electric oven. Most of the parts have been stripped. It could be further disassembled into base materials.", + "price": 200, + "price_postapoc": 10, + "material": [ "budget_steel" ], + "weight": "25 kg", + "volume": "250 L", + "longest_side": "69 cm" + }, + { + "type": "GENERIC", + "id": "oven_controls", + "symbol": "#", + "color": "light_cyan", + "name": { "str": "oven control panel" }, + "category": "spare_parts", + "description": "The control panel and LCD from a dismantled electric oven.", + "price": 100, + "price_postapoc": 5, + "material": [ "budget_steel", "glass" ], + "weight": "1 kg", + "volume": "2 L", + "longest_side": "65 cm" + }, + { + "type": "GENERIC", + "id": "oven_door", + "symbol": "#", + "color": "light_cyan", + "name": { "str": "oven door" }, + "category": "spare_parts", + "description": "The removed glass and steel door of an electric oven.", + "price": 100, + "price_postapoc": 5, + "material": [ "budget_steel", "glass" ], + "weight": "10 kg", + "volume": "20 L", + "longest_side": "69 cm" + }, + { + "type": "GENERIC", + "id": "oven_broiler_pan", + "symbol": "_", + "color": "dark_gray_white", + "name": { "str": "broiler pan" }, + "category": "spare_parts", + "description": "A simple sheet metal drawer that goes in the bottom of an electric oven.", + "price": 50, + "price_postapoc": 1, + "material": [ "budget_steel" ], + "weight": "5 kg", + "volume": "20 L", + "longest_side": "69 cm" + } +] diff --git a/data/json/items/resources/metal.json b/data/json/items/resources/metal.json index 05a365edf6f55..215091796dc8c 100644 --- a/data/json/items/resources/metal.json +++ b/data/json/items/resources/metal.json @@ -364,5 +364,35 @@ "longest_side": "1572 mm", "ammo_type": "components", "count": 1 + }, + { + "id": "fanblade_metal", + "type": "GENERIC", + "category": "spare_parts", + "name": { "str": "metal fan blade assembly", "str_pl": "metal fan blade assemblies" }, + "description": "A multi-bladed metal fan, like you'd find on a larger desk fan or inside a convection oven.", + "weight": "150 g", + "volume": "2 L", + "longest_side": "30 cm", + "price": 50, + "price_postapoc": 10, + "material": [ "budget_steel" ], + "symbol": "*", + "color": "light_gray" + }, + { + "id": "heavy_wire_rack", + "type": "GENERIC", + "category": "spare_parts", + "name": { "str": "heavy wire rack" }, + "description": "A durable steel rack, the sort you might find in an oven or on a barbecue.", + "weight": "600 g", + "volume": "5 L", + "longest_side": "60 cm", + "price": 50, + "price_postapoc": 10, + "material": [ "steel" ], + "symbol": "#", + "color": "light_gray" } ] diff --git a/data/json/items/resources/stone.json b/data/json/items/resources/stone.json index 721898091bf60..91b3becd129a1 100644 --- a/data/json/items/resources/stone.json +++ b/data/json/items/resources/stone.json @@ -36,5 +36,18 @@ "bashing": 28, "to_hit": -2, "qualities": [ [ "ANVIL", 1 ] ] + }, + { + "type": "GENERIC", + "id": "rock_wool_bat", + "symbol": "#", + "color": "brown", + "name": { "str": "fiber insulation bat" }, + "//": "I am assuming this is made of rock wool, but it could also be fiberglass. There is almost no practical difference for our purposes.", + "description": "A foil-wrapped bat of fibrous insulation: fire and moisture resistant, used for hot appliances like dishwashers and ovens.", + "category": "spare_parts", + "material": "epoxy", + "weight": "150 g", + "volume": "3 L" } ] diff --git a/data/json/proficiencies/misc.json b/data/json/proficiencies/misc.json index 14095410b1f6c..6835a35bce09f 100644 --- a/data/json/proficiencies/misc.json +++ b/data/json/proficiencies/misc.json @@ -153,5 +153,15 @@ "description": "You're skilled at clearing obstacles; terrain like railings or counters are as easy for you to move on as solid ground.", "can_learn": true, "time_to_learn": "8 h" + }, + { + "type": "proficiency", + "id": "prof_appliance_repair", + "name": { "str": "General Appliance Repair" }, + "description": "A base knowledge of how to put together and take apart common appliances, diagnose problems, and replace parts.", + "can_learn": true, + "default_time_multiplier": 2, + "default_fail_multiplier": 1.1, + "time_to_learn": "8 h" } ] diff --git a/data/json/recipes/appliances/oven.json b/data/json/recipes/appliances/oven.json new file mode 100644 index 0000000000000..0072a2e84d28a --- /dev/null +++ b/data/json/recipes/appliances/oven.json @@ -0,0 +1,150 @@ +[ + { + "result": "oven", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_OTHER", + "activity_level": "MODERATE_EXERCISE", + "time": "1 h", + "skill_used": "fabrication", + "difficulty": 1, + "autolearn": true, + "skills_required": [ "electronics", 1 ], + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } ], + "proficiencies": [ { "proficiency": "prof_appliance_repair" } ], + "components": [ + [ [ "oven_stovetop", 1 ] ], + [ [ "oven_cabinet", 1 ] ], + [ [ "oven_controls", 1 ] ], + [ [ "oven_door", 1 ] ], + [ [ "oven_broiler_pan", 1 ] ], + [ [ "heavy_wire_rack", 2 ] ], + [ [ "element", 4 ] ], + [ [ "cable", 1 ] ] + ] + }, + { + "result": "oven", + "type": "uncraft", + "activity_level": "MODERATE_EXERCISE", + "time": "45 m", + "skill_used": "fabrication", + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } ], + "proficiencies": [ { "proficiency": "prof_appliance_repair", "fail_multiplier": 1 } ], + "components": [ + [ [ "oven_stovetop", 1 ] ], + [ [ "oven_cabinet", 1 ] ], + [ [ "oven_controls", 1 ] ], + [ [ "oven_door", 1 ] ], + [ [ "oven_broiler_pan", 1 ] ], + [ [ "heavy_wire_rack", 2 ] ], + [ [ "element", 4 ] ], + [ [ "cable", 4 ] ] + ] + }, + { + "result": "oven_stovetop", + "type": "uncraft", + "activity_level": "MODERATE_EXERCISE", + "time": "30 m", + "skill_used": "fabrication", + "proficiencies": [ { "proficiency": "prof_appliance_repair", "fail_multiplier": 1 } ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "WRENCH", "level": 1 }, + { "id": "HAMMER", "level": 1 }, + { "id": "SAW_M", "level": 1 } + ], + "components": [ [ [ "sheet_metal_small", 2 ] ], [ [ "spring", 1 ] ], [ [ "hinge", 1 ] ], [ [ "wire", 1 ] ], [ [ "e_scrap", 4 ] ] ] + }, + { + "result": "oven_cabinet", + "type": "uncraft", + "activity_level": "MODERATE_EXERCISE", + "time": "1 h", + "skill_used": "fabrication", + "proficiencies": [ { "proficiency": "prof_appliance_repair", "fail_multiplier": 1 } ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "WRENCH", "level": 1 }, + { "id": "HAMMER", "level": 1 }, + { "id": "SAW_M", "level": 1 } + ], + "//": "Pilot lights shouldn't be part of an electric oven but we don't have gas ones yet. Can be removed when that changes.", + "components": [ + [ [ "sheet_metal", 2 ] ], + [ [ "sheet_metal_small", 2 ] ], + [ [ "rock_wool_bat", 3 ] ], + [ [ "element", 2 ] ], + [ [ "scrap", 4 ] ], + [ [ "e_scrap", 2 ] ], + [ [ "cable", 2 ] ], + [ [ "pilot_light", 1 ] ], + [ [ "motor_micro", 1 ] ], + [ [ "fanblade_metal", 1 ] ], + [ [ "thermometer", 1 ] ], + [ [ "pipe_fittings", 4 ] ] + ] + }, + { + "result": "oven_door", + "type": "uncraft", + "activity_level": "MODERATE_EXERCISE", + "time": "1 h", + "skill_used": "fabrication", + "proficiencies": [ { "proficiency": "prof_appliance_repair", "fail_multiplier": 1 } ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "WRENCH", "level": 1 }, + { "id": "HAMMER_FINE", "level": 1 }, + { "id": "SAW_M", "level": 1 } + ], + "components": [ + [ [ "reinforced_glass_sheet", 1 ] ], + [ [ "sheet_metal_small", 2 ] ], + [ [ "rock_wool_bat", 1 ] ], + [ [ "element", 2 ] ], + [ [ "scrap", 4 ] ], + [ [ "e_scrap", 2 ] ], + [ [ "cable", 2 ] ], + [ [ "hinge", 2 ] ] + ] + }, + { + "result": "oven_broiler_pan", + "type": "uncraft", + "activity_level": "MODERATE_EXERCISE", + "time": "30 m", + "skill_used": "fabrication", + "proficiencies": [ { "proficiency": "prof_appliance_repair", "fail_multiplier": 1 } ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "WRENCH", "level": 1 }, + { "id": "HAMMER", "level": 1 }, + { "id": "SAW_M", "level": 1 } + ], + "components": [ [ [ "sheet_metal", 1 ] ], [ [ "sheet_metal_small", 2 ] ], [ [ "scrap", 2 ] ], [ [ "bearing", 12 ] ] ] + }, + { + "result": "oven_controls", + "type": "uncraft", + "activity_level": "MODERATE_EXERCISE", + "time": "1 h", + "skill_used": "fabrication", + "proficiencies": [ + { "proficiency": "prof_elec_soldering", "fail_multiplier": 1 }, + { "proficiency": "prof_elec_circuits", "fail_multiplier": 1 } + ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "tools": [ [ [ "soldering_iron", -1 ], [ "toolset", -1 ] ] ], + "components": [ + [ [ "plastic_chunk", 4 ] ], + [ [ "sheet_metal_small", 1 ] ], + [ [ "scrap", 2 ] ], + [ [ "e_scrap", 6 ] ], + [ [ "cable", 2 ] ], + [ [ "solder_wire", 8 ] ], + [ [ "small_lcd_screen", 1 ] ] + ] + } +] diff --git a/data/json/vehicleparts/appliances.json b/data/json/vehicleparts/appliances.json index 97b1832326be7..b775535a77a60 100644 --- a/data/json/vehicleparts/appliances.json +++ b/data/json/vehicleparts/appliances.json @@ -16,7 +16,6 @@ "epower": -30, "size": 2000, "item": "fridge", - "location": "center", "requirements": { "install": { "skills": [ [ "mechanics", 3 ] ], "time": "60 m", "using": [ [ "vehicle_wrench_2", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_wrench_2", 1 ] ] }, @@ -36,6 +35,35 @@ ], "damage_reduction": { "all": 32 } }, + { + "id": "ap_oven", + "name": { "str": "oven" }, + "categories": [ "utility" ], + "description": "A standard electric convection-based oven, commonly used for heating and cooking food.", + "symbol": "#", + "color": "dark_gray", + "broken_color": "dark_gray_white", + "broken_symbol": "x", + "damage_modifier": 10, + "damage_reduction": { "all": 30 }, + "durability": 80, + "flags": [ "CARGO", "OBSTACLE", "COVERED", "FLAT_SURF", "APPLIANCE" ], + "pseudo_tools": [ { "id": "hotplate", "hotkey": "h" } ], + "//": "Doesn't draw power at baseline, only when cooking.", + "epower": 0, + "item": "oven", + "looks_like": "f_oven", + "breaks_into": [ + { "item": "sheet_metal", "count": [ 1, 4 ] }, + { "item": "sheet_metal_small", "count": [ 8, 12 ] }, + { "item": "steel_chunk", "count": [ 0, 3 ] }, + { "item": "scrap", "count": [ 0, 6 ] }, + { "item": "element", "count": [ 1, 3 ] }, + { "item": "cable", "charges": [ 1, 3 ] } + ], + "size": 200, + "type": "vehicle_part" + }, { "type": "vehicle_part", "id": "power_cord", From f8f4405f34d328c88c7a3ba16ee659d3fe8afe4c Mon Sep 17 00:00:00 2001 From: Ramza13 <52087122+Ramza13@users.noreply.github.com> Date: Wed, 5 Jan 2022 22:58:37 -0500 Subject: [PATCH 149/154] First --- .../portal_storm_effect_on_condition.json | 27 +++++++++++-------- src/debug_menu.cpp | 16 +++++++++++ src/debug_menu.h | 1 + 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/data/json/portal_storm_effect_on_condition.json b/data/json/portal_storm_effect_on_condition.json index 7b7f10083f2a2..5b9c469296ba0 100644 --- a/data/json/portal_storm_effect_on_condition.json +++ b/data/json/portal_storm_effect_on_condition.json @@ -56,8 +56,8 @@ { "id": "EOC_PORTAL_STORM_WARN_DAY_NIGHT_1", "condition": "is_day", - "effect": [ { "u_message": "PORTAL_STORM_DAY_MESSAGES_1", "snippet": true } ], - "false_effect": { "u_message": "PORTAL_STORM_NIGHT_MESSAGES_1", "snippet": true } + "effect": [ { "u_message": "PORTAL_STORM_DAY_MESSAGES_1", "snippet": true, "popup": true } ], + "false_effect": { "u_message": "PORTAL_STORM_NIGHT_MESSAGES_1", "snippet": true, "popup": true } } ] } @@ -72,7 +72,7 @@ { "compare_int": [ { "global_val": "var", "var_name": "ps_base_str" }, { "const": 3 } ], "op": "<" } ] }, - "effect": [ { "u_message": "PORTAL_STORM_INDOOR_MESSAGES_1", "snippet": true } ] + "effect": [ { "u_message": "PORTAL_STORM_INDOOR_MESSAGES_1", "snippet": true, "popup": true } ] }, { "id": "EOC_PORTAL_STORM_WARN_CAN_SEE_OUTDOORS_2", @@ -90,8 +90,8 @@ { "id": "EOC_PORTAL_STORM_WARN_DAY_NIGHT_2", "condition": "is_day", - "effect": [ { "u_message": "PORTAL_STORM_DAY_MESSAGES_2", "snippet": true } ], - "false_effect": { "u_message": "PORTAL_STORM_NIGHT_MESSAGES_2", "snippet": true } + "effect": [ { "u_message": "PORTAL_STORM_DAY_MESSAGES_2", "snippet": true, "popup": true } ], + "false_effect": { "u_message": "PORTAL_STORM_NIGHT_MESSAGES_2", "snippet": true, "popup": true } } ] } @@ -107,7 +107,7 @@ { "compare_int": [ { "global_val": "var", "var_name": "ps_base_str" }, { "const": 3 } ], "op": ">=" } ] }, - "effect": [ { "u_message": "PORTAL_STORM_INDOOR_MESSAGES_2", "snippet": true } ] + "effect": [ { "u_message": "PORTAL_STORM_INDOOR_MESSAGES_2", "snippet": true, "popup": true } ] }, { "id": "EOC_PORTAL_STORM_WARN_CAN_SEE_OUTDOORS_3", @@ -124,8 +124,8 @@ { "id": "EOC_PORTAL_STORM_WARN_DAY_NIGHT_3", "condition": "is_day", - "effect": [ { "u_message": "PORTAL_STORM_DAY_MESSAGES_3", "snippet": true } ], - "false_effect": { "u_message": "PORTAL_STORM_NIGHT_MESSAGES_3", "snippet": true } + "effect": [ { "u_message": "PORTAL_STORM_DAY_MESSAGES_3", "snippet": true, "popup": true } ], + "false_effect": { "u_message": "PORTAL_STORM_NIGHT_MESSAGES_3", "snippet": true, "popup": true } } ] } @@ -140,7 +140,7 @@ { "compare_int": [ { "global_val": "var", "var_name": "ps_base_str" }, { "const": 6 } ], "op": ">=" } ] }, - "effect": [ { "u_message": "PORTAL_STORM_INDOOR_MESSAGES_3", "snippet": true } ] + "effect": [ { "u_message": "PORTAL_STORM_INDOOR_MESSAGES_3", "snippet": true, "popup": true } ] } ] }, @@ -189,7 +189,8 @@ }, { "u_message": "Reality is breaking. It is subtle but something deep inside you feels the wrongness.", - "type": "bad" + "type": "bad", + "popup": true } ] }, @@ -207,7 +208,11 @@ "effect": [ { "arithmetic": [ { "global_val": "var", "var_name": "cause_portal_storm" }, "=", { "const": 0 } ] }, "next_weather", - { "u_message": "The damage to reality fades. Hopefully the scarring is minimal.", "type": "good" }, + { + "u_message": "The damage to reality fades. Hopefully the scarring is minimal.", + "type": "good", + "popup": true + }, { "set_queue_effect_on_condition": [ "EOC_WORSEN_PORTAL_STORM" ] } ] }, diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index fc350d81fbf3a..b861aee18f04f 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -215,6 +215,7 @@ std::string enum_to_string( debug_menu::debug_menu case debug_menu::debug_menu_index::EDIT_CAMP_LARDER: return "EDIT_CAMP_LARDER"; case debug_menu::debug_menu_index::VEHICLE_BATTERY_CHARGE: return "VEHICLE_BATTERY_CHARGE"; case debug_menu::debug_menu_index::GENERATE_EFFECT_LIST: return "GENERATE_EFFECT_LIST"; + case debug_menu::debug_menu_index::ACTIVATE_EOC: return "ACTIVATE_EOC"; // *INDENT-ON* case debug_menu::debug_menu_index::last: break; @@ -334,6 +335,7 @@ static int game_uilist() { uilist_entry( debug_menu_index::SHOW_MSG, true, 'd', _( "Show debug message" ) ) }, { uilist_entry( debug_menu_index::CRASH_GAME, true, 'C', _( "Crash game (test crash handling)" ) ) }, { uilist_entry( debug_menu_index::QUIT_NOSAVE, true, 'Q', _( "Quit to main menu" ) ) }, + { uilist_entry( debug_menu_index::ACTIVATE_EOC, true, 'E', _( "Activate EOC" ) ) }, }; return uilist( _( "Gameā€¦" ), uilist_initializer ); @@ -2780,6 +2782,20 @@ void debug() case debug_menu_index::CRASH_GAME: raise( SIGSEGV ); break; + case debug_menu_index::ACTIVATE_EOC: { + const std::vector &eocs = effect_on_conditions::get_all(); + uilist eoc_menu; + for( const effect_on_condition &eoc : eocs ) { + eoc_menu.addentry( -1, true, -1, eoc.id.str() ); + } + eoc_menu.query(); + + if( eoc_menu.ret >= 0 && eoc_menu.ret < static_cast( eocs.size() ) ) { + dialogue newDialog( get_talker_for( get_avatar() ), nullptr ); + eocs[eoc_menu.ret].activate( newDialog ); + } + } + break; case debug_menu_index::MAP_EXTRA: { const std::vector &mx_str = MapExtras::get_all_function_names(); uilist mx_menu; diff --git a/src/debug_menu.h b/src/debug_menu.h index 842b55487aeb8..773aaff8ca20e 100644 --- a/src/debug_menu.h +++ b/src/debug_menu.h @@ -92,6 +92,7 @@ enum class debug_menu_index : int { EDIT_CAMP_LARDER, WRITE_GLOBAL_EOCS, WRITE_GLOBAL_VARS, + ACTIVATE_EOC, last }; From e80f69f27afd8732df05d32bebf84feb66d43fb4 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Thu, 6 Jan 2022 00:18:33 -0500 Subject: [PATCH 150/154] Clang-tidy: use emplace_back instead of push_back --- src/activity_item_handling.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index b5952ea21832c..0d011285e02bc 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -2047,7 +2047,7 @@ void activity_on_turn_move_loot( player_activity &act, Character &you ) // TODO: fix point types std::vector src_set; for( const tripoint &p : act.coord_set ) { - src_set.push_back( tripoint_abs_ms( p ) ); + src_set.emplace_back( tripoint_abs_ms( p ) ); } // sort source tiles by distance const auto &src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); From 6dd5b07dfd5966baa5d755985987e0dbfcf0e297 Mon Sep 17 00:00:00 2001 From: Kevin Granade Date: Wed, 5 Jan 2022 22:21:49 -0800 Subject: [PATCH 151/154] Fix ccache archive handling for better hit rates. (#54078) * Combine linux and mac ccache steps * Split ccache fetch into a pull and a push version This prevents PRs from pushing new cache entries and evicting more valuable ones. The goal is to have just one set of cache entries built on master. Co-authored-by: akrieger --- .github/workflows/matrix.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/matrix.yml b/.github/workflows/matrix.yml index cbbca56b280a2..271a76a940148 100644 --- a/.github/workflows/matrix.yml +++ b/.github/workflows/matrix.yml @@ -199,28 +199,28 @@ jobs: - name: prepare if: ${{ env.SKIP == 'false' }} run: bash ./build-scripts/requirements.sh - - name: Get Date - id: get-date + - name: Get ccache vars + id: get-vars if: ${{ env.SKIP == 'false' }} run: | - echo "::set-output name=date::$(/bin/date -u "+%Y%m%d%H%M")" + echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" + echo "::set-output name=ccache-path::$([ "$RUNNER_OS" = "macOS" ] && echo '/Users/runner/Library/Caches/ccache' || echo '~/.ccache')" shell: bash - - name: ccache cache files (ubuntu) - if: ${{ env.SKIP == 'false' && runner.os == 'Linux' }} + - name: ccache cache files (master) + if: ${{ github.event_name == 'push' && env.SKIP == 'false' && ( runner.os == 'Linux' || runner.os == 'macOS' ) }} uses: actions/cache@v2 with: - path: ~/.ccache - key: ccache-linux-${{ matrix.compiler }}-${{ steps.get-date.outputs.date }} + path: ${{ steps.get-vars.outputs.ccache-path }} + # double-dash after compiler is not a typo, it is to disambiguate between g++- and g++-11- for restore key prefix matching + key: ccache-${{ runner.os }}-${{ matrix.compiler }}--${{ steps.get-vars.outputs.date }} restore-keys: | - ccache-linux-${{ matrix.compiler }}- - - name: ccache cache files (mac) - if: ${{ env.SKIP == 'false' && runner.os == 'macOS' }} + ccache-${{ runner.os }}-${{ matrix.compiler }}-- + - name: ccache cache files (PR) + if: ${{ github.event_name == 'pull_request' && env.SKIP == 'false' && ( runner.os == 'Linux' || runner.os == 'macOS' ) }} uses: actions/cache@v2 with: - path: /Users/runner/Library/Caches/ccache - key: ccache-mac-${{ matrix.compiler }}-${{ steps.get-date.outputs.date }} - restore-keys: | - ccache-mac-${{ matrix.compiler }}- + path: ${{ steps.get-vars.outputs.ccache-path }} + key: ccache-${{ runner.os }}-${{ matrix.compiler }}--${{ steps.get-vars.outputs.date }} - uses: ammaraskar/gcc-problem-matcher@master - name: build and test if: ${{ env.SKIP == 'false' }} From 13a65f351781694ab1da75d5414abe464c9601d2 Mon Sep 17 00:00:00 2001 From: Dillon Matchett Date: Thu, 6 Jan 2022 03:08:59 -0400 Subject: [PATCH 152/154] Fix body part not being used to generate resistance objects (#54079) * pass body part all the way down the line * updated the failing test --- src/character_armor.cpp | 2 +- src/damage.cpp | 4 ++-- src/damage.h | 3 ++- src/item.cpp | 4 ++-- src/item.h | 2 +- tests/coverage_test.cpp | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/character_armor.cpp b/src/character_armor.cpp index af92aa2619ffc..17e9ff6a23141 100644 --- a/src/character_armor.cpp +++ b/src/character_armor.cpp @@ -499,7 +499,7 @@ bool Character::armor_absorb( damage_unit &du, item &armor, const bodypart_id &b // TODO: add some check for power armor // reduce the damage - armor.mitigate_damage( du ); + armor.mitigate_damage( du, bp ); // check if the armor was damaged item::armor_status damaged = armor.damage_armor_durability( du, bp ); diff --git a/src/damage.cpp b/src/damage.cpp index 22328b4e671e8..45402f1fe8864 100644 --- a/src/damage.cpp +++ b/src/damage.cpp @@ -224,13 +224,13 @@ resistances::resistances() resist_vals.fill( 0 ); } -resistances::resistances( const item &armor, bool to_self ) +resistances::resistances( const item &armor, bool to_self, const bodypart_id &bp ) { // Armors protect, but all items can resist if( to_self || armor.is_armor() ) { for( int i = 0; i < static_cast( damage_type::NUM ); i++ ) { damage_type dt = static_cast( i ); - set_resist( dt, armor.damage_resist( dt, to_self ) ); + set_resist( dt, armor.damage_resist( dt, to_self, bp ) ); } } } diff --git a/src/damage.h b/src/damage.h index a1b3a132b21da..73db051dd3593 100644 --- a/src/damage.h +++ b/src/damage.h @@ -125,7 +125,8 @@ struct resistances { resistances(); // If to_self is true, we want armor's own resistance, not one it provides to wearer - explicit resistances( const item &armor, bool to_self = false ); + explicit resistances( const item &armor, bool to_self = false, + const bodypart_id &bp = bodypart_id() ); explicit resistances( monster &monster ); void set_resist( damage_type dt, float amount ); float type_resist( damage_type dt ) const; diff --git a/src/item.cpp b/src/item.cpp index 4ec0380b097c0..3f5fbe6b74ba9 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -7920,9 +7920,9 @@ const std::set &item::repaired_with() const return has_flag( flag_NO_REPAIR ) ? no_repair : type->repair; } -void item::mitigate_damage( damage_unit &du ) const +void item::mitigate_damage( damage_unit &du, const bodypart_id &bp ) const { - const resistances res = resistances( *this ); + const resistances res = resistances( *this, false, bp ); const float mitigation = res.get_effective_resist( du ); du.amount -= mitigation; du.amount = std::max( 0.0f, du.amount ); diff --git a/src/item.h b/src/item.h index 3bd701ac24355..7b02a5f5be84f 100644 --- a/src/item.h +++ b/src/item.h @@ -1174,7 +1174,7 @@ class item : public visitable * Assuming that specified du hit the armor, reduce du based on the item's resistance to the * damage type. This will never reduce du.amount below 0. */ - void mitigate_damage( damage_unit &du ) const; + void mitigate_damage( damage_unit &du, const bodypart_id &bp = bodypart_id() ) const; /** * Resistance provided by this item against damage type given by an enum. */ diff --git a/tests/coverage_test.cpp b/tests/coverage_test.cpp index e1ccd003d6558..ab63e4c05ad72 100644 --- a/tests/coverage_test.cpp +++ b/tests/coverage_test.cpp @@ -149,7 +149,7 @@ TEST_CASE( "Proportional armor material resistances", "[material]" ) { SECTION( "Mostly steel armor vs. melee" ) { const float dmg = get_avg_melee_dmg( "test_swat_mostly_steel" ); - check_near( "Average damage", dmg, 10.2f, 0.2f ); + check_near( "Average damage", dmg, 3.3f, 0.2f ); } SECTION( "Mostly cotton armor vs. melee" ) { From fd030beb7a446dafa3a0e065efa1e424cbaec9dc Mon Sep 17 00:00:00 2001 From: catdach <93795131+catdach@users.noreply.github.com> Date: Thu, 6 Jan 2022 02:11:15 -0500 Subject: [PATCH 153/154] [Magiclysm] Added Technomancer mana-toolbar to the 'Fior Di Battaglia' martial art. (#54016) --- data/mods/Magiclysm/items/enchanted_melee.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/items/enchanted_melee.json b/data/mods/Magiclysm/items/enchanted_melee.json index b6dba66f88e9a..1a85ba006388a 100644 --- a/data/mods/Magiclysm/items/enchanted_melee.json +++ b/data/mods/Magiclysm/items/enchanted_melee.json @@ -737,7 +737,8 @@ "color": "light_gray", "techniques": [ "WBLOCK_1", "BRUTAL", "SWEEP" ], "qualities": [ [ "PRY", 3 ], [ "HAMMER", 3 ], [ "HAMMER_FINE", 1 ], [ "WRENCH", 2 ], [ "WRENCH_FINE", 2 ], [ "PRYING_NAIL", 1 ] ], - "flags": [ "DURABLE_MELEE", "BELT_CLIP", "TRADER_AVOID", "MAGIC_FOCUS" ] + "flags": [ "DURABLE_MELEE", "BELT_CLIP", "TRADER_AVOID", "MAGIC_FOCUS" ], + "weapon_category": [ "HOOKING_WEAPONRY" ] }, { "id": "rune_technomancer_weapon_adept", @@ -758,6 +759,7 @@ "techniques": [ "WBLOCK_1", "BRUTAL", "SWEEP" ], "qualities": [ [ "PRY", 3 ], [ "HAMMER", 3 ], [ "HAMMER_FINE", 1 ], [ "WRENCH", 2 ], [ "WRENCH_FINE", 2 ], [ "PRYING_NAIL", 1 ] ], "flags": [ "DURABLE_MELEE", "BELT_CLIP", "TRADER_AVOID", "MAGIC_FOCUS", "WATCH", "ALARMCLOCK", "NO_RELOAD", "NO_UNLOAD" ], + "weapon_category": [ "HOOKING_WEAPONRY" ], "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "crystallized_mana": 3 } } ], "relic_data": { "charge_info": { "recharge_type": "periodic", "time": "24 h", "regenerate_ammo": true } }, "charges_per_use": 1, From b7484436960186793fabd93a79312a990146145c Mon Sep 17 00:00:00 2001 From: Sofistico <59299346+Sofistico@users.noreply.github.com> Date: Thu, 6 Jan 2022 04:45:47 -0300 Subject: [PATCH 154/154] [Magiclysm] Master class weapons 2 - The Return of the Lazy (#53380) Co-authored-by: casswedson <58050969+casswedson@users.noreply.github.com> --- .../mods/Magiclysm/items/enchanted_melee.json | 50 +++++++++++++++++++ data/mods/Magiclysm/recipes/weapons.json | 48 ++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/data/mods/Magiclysm/items/enchanted_melee.json b/data/mods/Magiclysm/items/enchanted_melee.json index 1a85ba006388a..49d6ee4dc81ba 100644 --- a/data/mods/Magiclysm/items/enchanted_melee.json +++ b/data/mods/Magiclysm/items/enchanted_melee.json @@ -880,6 +880,34 @@ "use_action": [ "WEATHER_TOOL" ], "flags": [ "DURABLE_MELEE", "SHEATH_AXE", "TRADER_AVOID", "MAGIC_FOCUS", "HYGROMETER", "BAROMETER" ] }, + { + "id": "rune_stormshaper_weapon_adept", + "type": "TOOL", + "name": { "str": "Stormshaper hammer-axe" }, + "//": "There isn't an equivalent, so the damage has been multiplied by 1.2 to cutting and bashing", + "description": "A forged copper hammer-axe with silver trimmings and a wooden handle. There is a Stormshaper rune embedded in the eye and a Nordic rune reminiscent of Thor, the thunder god, in the hammer side.", + "weight": "3755 g", + "volume": "3500 ml", + "longest_side": "90 cm", + "price": 55800, + "price_postapoc": 21000, + "to_hit": 0, + "bashing": 40, + "cutting": 27, + "material": [ "wood", "copper", "silver" ], + "symbol": "/", + "color": "brown", + "techniques": [ "WBLOCK_1", "BRUTAL", "SWEEP" ], + "qualities": [ [ "AXE", 1 ], [ "BUTCHER", -20 ], [ "HAMMER", 1 ] ], + "use_action": [ + { "type": "cast_spell", "spell_id": "lightning_bolt", "no_fail": true, "level": 7, "need_wielding": true }, + "WEATHER_TOOL" + ], + "flags": [ "DURABLE_MELEE", "NO_UNLOAD", "NO_RELOAD", "SHEATH_AXE", "TRADER_AVOID", "MAGIC_FOCUS", "HYGROMETER", "BAROMETER" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "crystallized_mana": 3 } } ], + "relic_data": { "charge_info": { "recharge_type": "periodic", "time": "24 h", "regenerate_ammo": true } }, + "charges_per_use": 1 + }, { "id": "rune_animist_weapon", "type": "GENERIC", @@ -899,6 +927,28 @@ "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 11 ] ], "flags": [ "STAB", "SHEATH_KNIFE", "MAGIC_FOCUS", "TRADER_AVOID" ] }, + { + "id": "rune_animist_weapon_adept", + "type": "GENERIC", + "name": { "str": "Animist life-athame" }, + "//": "Tool qualities equivalent to combat knife with some saw capability, to represent sharpness, combat equiv. to combat knife + 2 w/ RAPID and BLOCK1 with no to hit, size/weight off combat knife +1", + "description": "A steel ritual knife used by Animists to draw blood for summoning. The knife has seen so much bloodshed that the rune at the crossguard seemingly is constantly drenched in blood and gives you preternatural resistance to pain.", + "weight": "504 g", + "volume": "500 ml", + "longest_side": "25 cm", + "price": 15000, + "bashing": 7, + "cutting": 30, + "material": [ "wood", "steel" ], + "symbol": ";", + "color": "light_gray", + "techniques": [ "WBLOCK_1", "RAPID" ], + "qualities": [ [ "CUT", 1 ], [ "SAW_W", 1 ], [ "SAW_M", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 19 ] ], + "relic_data": { + "passive_effects": [ { "has": "WIELD", "condition": "ALWAYS", "values": [ { "value": "PAIN", "multiply": -0.3 } ] } ] + }, + "flags": [ "STAB", "SHEATH_KNIFE", "MAGIC_FOCUS", "TRADER_AVOID" ] + }, { "type": "GENERIC", "id": "springstaff-retracted", diff --git a/data/mods/Magiclysm/recipes/weapons.json b/data/mods/Magiclysm/recipes/weapons.json index b74990793cfff..b3d91c6c26aa0 100644 --- a/data/mods/Magiclysm/recipes/weapons.json +++ b/data/mods/Magiclysm/recipes/weapons.json @@ -141,6 +141,32 @@ "tools": [ [ [ "tongs", -1 ] ], [ [ "swage", -1 ] ] ], "components": [ [ [ "2x4", 1 ], [ "stick", 1 ] ], [ [ "rune_animist", 1 ] ] ] }, + { + "type": "recipe", + "activity_level": "fake", + "result": "rune_animist_weapon_adept", + "category": "CC_ENCHANTED", + "subcategory": "CSC_ENCHANTED_WEAPONS", + "skill_used": "fabrication", + "skills_required": [ [ "spellcraft", 6 ], [ "stabbing", 2 ] ], + "difficulty": 6, + "time": "360 m", + "autolearn": true, + "using": [ [ "forging_standard", 2 ], [ "steel_tiny", 1 ] ], + "qualities": [ + { "id": "ANVIL", "level": 3 }, + { "id": "HAMMER", "level": 3 }, + { "id": "CHISEL", "level": 3 }, + { "id": "MANA_INFUSE", "level": 2 } + ], + "proficiencies": [ + { "proficiency": "prof_metalworking" }, + { "proficiency": "prof_blacksmithing" }, + { "proficiency": "prof_alchemy", "required": false, "time_multiplier": 3 } + ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "swage", -1 ] ] ], + "components": [ [ [ "rune_animist_weapon", 1 ] ], [ [ "twisted_restore_potion", 1 ] ], [ [ "blood", 5 ] ] ] + }, { "type": "recipe", "activity_level": "fake", @@ -230,6 +256,28 @@ [ [ "rune_stormshaper", 1 ] ] ] }, + { + "type": "recipe", + "activity_level": "fake", + "result": "rune_stormshaper_weapon_adept", + "category": "CC_ENCHANTED", + "subcategory": "CSC_ENCHANTED_WEAPONS", + "skill_used": "fabrication", + "difficulty": 6, + "skills_required": [ [ "spellcraft", 6 ], [ "bashing", 4 ] ], + "time": "360 m", + "autolearn": true, + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "MANA_INFUSE", "level": 1 } ], + "using": [ [ "forging_standard", 5 ] ], + "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_redsmithing" } ], + "components": [ + [ [ "rune_stormshaper_weapon", 1 ] ], + [ [ "scrap_copper", 10 ], [ "copper", 1000 ] ], + [ [ "gold", 100 ] ], + [ [ "cordage_short", 2, "LIST" ], [ "filament", 40, "LIST" ], [ "duct_tape", 40 ] ], + [ [ "rune_stormshaper", 1 ] ] + ] + }, { "type": "recipe", "activity_level": "fake",