From 8e41c69d0b037b2915fed37a60fc20bbe5ed01e3 Mon Sep 17 00:00:00 2001
From: fairyarmadillo <94415528+fairyarmadillo@users.noreply.github.com>
Date: Sat, 16 Dec 2023 11:19:37 -0800
Subject: [PATCH] Seasonal Mutation EOCs (#69591)
* seasonal EOCs
* Update data/json/effects.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update raw_fruit.json
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* leaf updates
* Update professions.json
* fix conflict
* Revert "Update professions.json"
This reverts commit cd486a884ec67b9b1fb5cc8601248e35858ddea9.
* Fur, plant stuff
* Communion
* Tinkering with communion
* Photosynthesis is back
* Photosynthesizing.
* SAD
* phelloderrrrm
* tree talkin
* bugfixin
* photosynthesis etc
* balance
* dialing in photosynthesis
* transparent ugliness
* Update npc.cpp
* Update npc.cpp
* bugfixes and mods
* Update mutations.json
* Adjusting rates
* Final touches
* linting
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* minor fixes
* Update data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update mutations.json
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/mutation.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/mutation.h
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/mutation.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/map.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/item.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/character_attire.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/item.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/item.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/character_attire.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/character.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/character.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/character.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/character.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/character.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update src/activity_handlers.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* fix merge conflict error
* Update effects.json
* Update effects.json
* Update data/json/effects.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* fixes
* astyle
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* astyle
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update suffer.cpp
* Update snippets.json
* make test happy
* Update data/json/mutations/mutations.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* check compliance
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* bugfix
* Update data/mods/Magiclysm/items/ethereal_items.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update suffer.cpp
* Update src/suffer.cpp
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update suffer.cpp
* Update src/suffer.cpp
Co-authored-by: Maleclypse <54345792+Maleclypse@users.noreply.github.com>
* Update suffer.cpp
* Update mutation_effect_eocs.json
* Update mutation_effect_eocs.json
* Update med.json
* Update altered_object_auras.json
* Update altered_object_auras.json
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Maleclypse <54345792+Maleclypse@users.noreply.github.com>
---
data/json/effects.json | 25 +-
.../mutation_eocs/mutation_effect_eocs.json | 405 +++++++++++++++++-
data/json/flags.json | 5 +
.../furniture-domestic_plants.json | 86 ++++
.../terrain-floors-outdoors.json | 2 +-
data/json/items/armor/coats.json | 7 +-
data/json/items/armor/eyewear.json | 20 +-
data/json/items/armor/head_attachments.json | 8 +-
data/json/items/armor/integrated.json | 123 +++++-
data/json/items/comestibles/med.json | 4 +-
data/json/items/comestibles/raw_fruit.json | 35 ++
data/json/items/comestibles/seed.json | 25 ++
data/json/mutations/mutations.json | 273 +++++++++++-
.../beggars/BEGGAR_1_Reena_Sandhu.json | 1 +
data/json/npcs/starting_traits.json | 4 +-
data/json/player_activities.json | 10 +
data/json/snippets/snippets.json | 15 +
data/json/uncraft/comestibles/fruit.json | 8 +
data/mods/Aftershock/items/ethereal.json | 2 +
data/mods/Magiclysm/items/ethereal_items.json | 53 ++-
.../items/psions_summon_items.json | 121 ++++--
.../Xedra_Evolved/items/ethereal_items.json | 6 +-
doc/MUTATIONS.md | 1 +
src/activity_handlers.cpp | 72 +++-
src/activity_handlers.h | 2 +
src/character.cpp | 34 +-
src/character_attire.cpp | 5 +-
src/flag.cpp | 1 +
src/flag.h | 1 +
src/item.cpp | 24 ++
src/item.h | 13 +-
src/item_factory.cpp | 7 +
src/itype.h | 12 +
src/map.cpp | 16 +-
src/mapdata.cpp | 2 +
src/mapdata.h | 3 +
src/mutation.cpp | 30 +-
src/mutation.h | 2 +
src/mutation_data.cpp | 1 +
src/npc.cpp | 2 +-
src/player_hardcoded_effects.cpp | 43 --
src/suffer.cpp | 168 +++++++-
tools/spell_checker/dictionary.txt | 2 +
43 files changed, 1468 insertions(+), 211 deletions(-)
diff --git a/data/json/effects.json b/data/json/effects.json
index b46ba3f444f98..8da3f3bc2596b 100644
--- a/data/json/effects.json
+++ b/data/json/effects.json
@@ -344,6 +344,15 @@
"rating": "bad",
"show_in_info": true
},
+ {
+ "type": "effect_type",
+ "id": "sneezing",
+ "name": [ "Sneezing" ],
+ "desc": [ "Effect to briefly distract you while you sneeze. You should not be able to see this." ],
+ "max_duration": "1 s",
+ "base_mods": { "speed_mod": [ -20 ], "dex_mod": [ -2 ], "per_mod": [ -4 ] },
+ "show_in_info": false
+ },
{
"type": "effect_type",
"id": "acid_charged",
@@ -2926,12 +2935,12 @@
"rat_bite_fever",
"infected",
"asthma",
- "common_cold",
- "flu",
"pre_conjunctivitis_viral",
"pre_conjunctivitis_bacterial",
"conjunctivitis_viral",
- "conjunctivitis_bacterial"
+ "conjunctivitis_bacterial",
+ "common_cold",
+ "flu"
],
"base_mods": { "pkill_min": [ 5 ] }
},
@@ -4494,6 +4503,16 @@
"resist_traits": [ "GASTROPOD_BALANCE" ],
"show_in_info": true
},
+ {
+ "type": "effect_type",
+ "id": "hay_fever",
+ "name": [ "Hay Fever" ],
+ "desc": [ "Your eyes are itchy and you've got a runny nose." ],
+ "rating": "bad",
+ "resist_effects": [ "took_flumed", "took_antihistamine" ],
+ "show_in_info": true,
+ "base_mods": { "per_mod": [ -2 ], "int_mod": [ -2 ], "stamina_min": [ -50 ], "stamina_max": [ -150 ], "stamina_chance": [ 300 ] }
+ },
{
"id": "star_vampire_blood_drank",
"type": "effect_type",
diff --git a/data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json b/data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
index a846eaa080f44..1cf52a4f458f6 100644
--- a/data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
+++ b/data/json/effects_on_condition/mutation_eocs/mutation_effect_eocs.json
@@ -225,17 +225,420 @@
},
{
"type": "effect_on_condition",
- "id": "EOC_RASHY_SKIN",
+ "id": "rashy_skin",
"recurrence": [ "2 hours", "24 hours" ],
"condition": {
"and": [
{ "u_has_trait": "SKIN_RASHY" },
+ { "not": { "u_has_effect": "took_flumed" } },
{ "not": { "u_has_effect": "took_antihistamine" } },
{ "not": { "u_has_effect": "formication" } }
]
},
"effect": [ { "u_add_effect": "formication", "duration": "10 minutes", "target_part": "random" } ]
},
+ {
+ "type": "effect_on_condition",
+ "id": "hay_fever_spring_fall",
+ "recurrence": [ "6 hours", "4 days" ],
+ "condition": {
+ "and": [
+ { "u_has_trait": "SEASONAL_ALLERGIES" },
+ { "or": [ { "is_season": "spring" }, { "is_season": "autumn" } ] },
+ { "not": { "u_has_effect": "took_flumed" } },
+ { "not": { "u_has_effect": "took_antihistamine" } },
+ { "not": { "u_has_effect": "hay_fever" } }
+ ]
+ },
+ "effect": [
+ { "u_message": "Your eyes water and your nose itches.", "type": "bad" },
+ { "u_add_effect": "hay_fever", "duration": { "math": [ "rand(28800) + 600" ] } }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "hay_fever_summer",
+ "recurrence": [ "8 hours", "8 days" ],
+ "condition": {
+ "and": [
+ { "u_has_trait": "SEASONAL_ALLERGIES" },
+ { "is_season": "SUMMER" },
+ { "not": { "u_has_effect": "took_flumed" } },
+ { "not": { "u_has_effect": "took_antihistamine" } },
+ { "not": { "u_has_effect": "hay_fever" } }
+ ]
+ },
+ "effect": [
+ { "u_message": "Your eyes water and your nose itches.", "type": "bad" },
+ { "u_add_effect": "hay_fever", "duration": { "math": [ "rand(28800) + 600" ] } }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "sneeze",
+ "recurrence": [ "45 seconds", "30 minutes" ],
+ "condition": {
+ "and": [
+ { "u_has_effect": "hay_fever" },
+ { "not": { "u_has_effect": "took_antihistamine" } },
+ { "not": { "u_has_effect": "narcosis" } }
+ ]
+ },
+ "effect": [
+ { "u_message": "You sneeze!", "type": "bad" },
+ { "u_add_effect": "sneezing", "duration": "1 second" },
+ { "u_make_sound": "a sneeze!", "volume": 10, "type": "speech" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "leaves_winter_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": { "and": [ { "is_season": "winter" }, { "u_has_trait": "LEAVES" } ] },
+ "effect": [
+ { "u_message": "The grassy leaves on your head have succumbed to winter dormancy.", "type": "bad" },
+ { "u_lose_trait": "LEAVES" },
+ { "u_add_trait": "LEAVES_WINTER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "leaves_spring_summer_fall_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ { "or": [ { "is_season": "spring" }, { "is_season": "summer" }, { "is_season": "autumn" } ] },
+ { "u_has_trait": "LEAVES_WINTER" }
+ ]
+ },
+ "effect": [
+ { "u_message": "Your leaves are looking green and healthy again.", "type": "good" },
+ { "u_lose_trait": "LEAVES_WINTER" },
+ { "u_add_trait": "LEAVES" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "flowers_winter_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": { "and": [ { "is_season": "winter" }, { "u_has_trait": "FLOWERS" } ] },
+ "effect": [
+ {
+ "u_message": "A somber feeling comes over you as the last petals of your wilting flowers fall from your head.",
+ "type": "bad"
+ },
+ { "u_lose_trait": "FLOWERS" },
+ { "u_add_trait": "FLOWERS_WINTER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "flowers_spring_summer_fall_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ { "or": [ { "is_season": "spring" }, { "is_season": "summer" }, { "is_season": "autumn" } ] },
+ { "u_has_trait": "FLOWERS_WINTER" }
+ ]
+ },
+ "effect": [
+ { "u_message": "You feel a giddy thrill as new flowers bloom from your scalp.", "type": "good" },
+ { "u_lose_trait": "FLOWERS_WINTER" },
+ { "u_add_trait": "FLOWERS" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "leaves2_spring_summer_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ { "or": [ { "u_has_trait": "LEAVES2_FALL" }, { "u_has_trait": "LEAVES2_WINTER" } ] },
+ { "or": [ { "is_season": "spring" }, { "is_season": "summer" } ] }
+ ]
+ },
+ "effect": [
+ { "u_message": "New green leaves are growing in on your head and arms.", "type": "good" },
+ { "u_lose_trait": "LEAVES2_WINTER" },
+ { "u_lose_trait": "LEAVES2_FALL" },
+ { "u_add_trait": "LEAVES2" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "leaves2_fall_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [ { "or": [ { "u_has_trait": "LEAVES2" }, { "u_has_trait": "LEAVES2_WINTER" } ] }, { "is_season": "autumn" } ]
+ },
+ "effect": [
+ { "u_message": "Your leaves are turning and starting to drop as the season changes.", "type": "good" },
+ { "u_lose_trait": "LEAVES2" },
+ { "u_lose_trait": "LEAVES2_WINTER" },
+ { "u_spawn_item": "leaves", "count": 1 },
+ { "u_add_trait": "LEAVES2_FALL" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "leaves2_winter_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": { "and": [ { "or": [ { "u_has_trait": "LEAVES2" }, { "u_has_trait": "LEAVES2_FALL" } ] }, { "is_season": "winter" } ] },
+ "effect": [
+ { "u_message": "The last of your leaves fall, leaving your head and arms bare.", "type": "bad" },
+ { "u_lose_trait": "LEAVES2" },
+ { "u_lose_trait": "LEAVES2_FALL" },
+ { "u_spawn_item": "leaves", "count": 1 },
+ { "u_add_trait": "LEAVES2_WINTER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "leaves3_spring_summer_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ { "or": [ { "u_has_trait": "LEAVES3_FALL" }, { "u_has_trait": "LEAVES3_WINTER" } ] },
+ { "or": [ { "is_season": "spring" }, { "is_season": "summer" } ] }
+ ]
+ },
+ "effect": [
+ { "u_message": "New green leaves are growing in on your head and upper limbs.", "type": "good" },
+ { "u_lose_trait": "LEAVES3_WINTER" },
+ { "u_lose_trait": "LEAVES3_FALL" },
+ { "u_add_trait": "LEAVES3" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "leaves3_fall_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [ { "or": [ { "u_has_trait": "LEAVES3" }, { "u_has_trait": "LEAVES3_WINTER" } ] }, { "is_season": "autumn" } ]
+ },
+ "effect": [
+ {
+ "u_message": "Your leaves have begun taking on the red-gold hues of fall. A few have fallen already.",
+ "type": "good"
+ },
+ { "u_lose_trait": "LEAVES3" },
+ { "u_lose_trait": "LEAVES3_WINTER" },
+ { "u_spawn_item": "leaves", "count": 1 },
+ { "u_add_trait": "LEAVES3_FALL" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "leaves3_winter_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": { "and": [ { "or": [ { "u_has_trait": "LEAVES3" }, { "u_has_trait": "LEAVES3_FALL" } ] }, { "is_season": "winter" } ] },
+ "effect": [
+ { "u_message": "The last of your leaves fall, leaving your head and upper limbs bare.", "type": "bad" },
+ { "u_lose_trait": "LEAVES3" },
+ { "u_lose_trait": "LEAVES3_FALL" },
+ { "u_spawn_item": "leaves", "count": 1 },
+ { "u_add_trait": "LEAVES3_WINTER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "rosebuds_spring_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ {
+ "or": [ { "u_has_trait": "ROSEBUDS_SUMMER" }, { "u_has_trait": "ROSEBUDS_FALL" }, { "u_has_trait": "ROSEBUDS_WINTER" } ]
+ },
+ { "is_season": "spring" }
+ ]
+ },
+ "effect": [
+ {
+ "u_message": "Spring must be here, the new buds growing from your scalp are giving off a lovely scent.",
+ "type": "good"
+ },
+ { "u_lose_trait": "ROSEBUDS_WINTER" },
+ { "u_lose_trait": "ROSEBUDS_SUMMER" },
+ { "u_lose_trait": "ROSEBUDS_FALL" },
+ { "u_add_trait": "ROSEBUDS" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "rosebuds_summer_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ { "or": [ { "u_has_trait": "ROSEBUDS" }, { "u_has_trait": "ROSEBUDS_FALL" }, { "u_has_trait": "ROSEBUDS_WINTER" } ] },
+ { "is_season": "summer" }
+ ]
+ },
+ "effect": [
+ {
+ "u_message": "Your blossoms come into full bloom, sending a brief flush of warmth through your body.",
+ "type": "good"
+ },
+ { "u_lose_trait": "ROSEBUDS_WINTER" },
+ { "u_lose_trait": "ROSEBUDS" },
+ { "u_lose_trait": "ROSEBUDS_FALL" },
+ { "u_add_trait": "ROSEBUDS_SUMMER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "rosebuds_fall_timer_plant",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ { "or": [ { "u_has_trait": "ROSEBUDS" }, { "u_has_trait": "ROSEBUDS_SUMMER" }, { "u_has_trait": "ROSEBUDS_WINTER" } ] },
+ { "u_has_trait": "THRESH_PLANT" },
+ { "is_season": "autumn" }
+ ]
+ },
+ "effect": [
+ {
+ "u_message": "Your flowers have withered away and died. In their place, a few small fruits hang from your head.",
+ "type": "good"
+ },
+ { "u_lose_trait": "ROSEBUDS_WINTER" },
+ { "u_lose_trait": "ROSEBUDS" },
+ { "u_lose_trait": "ROSEBUDS_SUMMER" },
+ { "u_add_trait": "ROSEBUDS_FALL" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "picked_rosebuds_fall",
+ "recurrence": [ "1 seconds", "1 seconds" ],
+ "condition": { "and": [ { "u_has_trait": "ROSEBUDS_FALL_active" } ] },
+ "effect": [
+ { "u_lose_trait": "ROSEBUDS_FALL_active" },
+ { "u_spawn_item": "mutfruit", "count": 1 },
+ { "u_add_trait": "ROSEBUDS_FALL_PICKED" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "rosebuds_fall_timer_elfa",
+ "//": "Only true plants bear fruit. Elves just look pretty for longer.",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ { "or": [ { "u_has_trait": "ROSEBUDS" }, { "u_has_trait": "ROSEBUDS" }, { "u_has_trait": "ROSEBUDS_WINTER" } ] },
+ { "not": { "u_has_trait": "THRESH_PLANT" } },
+ { "is_season": "autumn" }
+ ]
+ },
+ "effect": [
+ {
+ "u_message": "Your blossoms come into full bloom, sending a brief flush of warmth through your body.",
+ "type": "good"
+ },
+ { "u_lose_trait": "ROSEBUDS_WINTER" },
+ { "u_lose_trait": "ROSEBUDS" },
+ { "u_lose_trait": "ROSEBUDS_FALL" },
+ { "u_add_trait": "ROSEBUDS_SUMMER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "rosebuds_winter_timer",
+ "recurrence": [ "15 hours", "60 hours" ],
+ "condition": {
+ "and": [
+ { "or": [ { "u_has_trait": "ROSEBUDS" }, { "u_has_trait": "ROSEBUDS_FALL" }, { "u_has_trait": "ROSEBUDS_SUMMER" } ] },
+ { "is_season": "winter" }
+ ]
+ },
+ "effect": [
+ {
+ "u_message": "Winter claims the last few vestiges of your flowers, leaving your crown bare of adornment.",
+ "type": "bad"
+ },
+ { "u_lose_trait": "ROSEBUDS_SUMMER" },
+ { "u_lose_trait": "ROSEBUDS" },
+ { "u_lose_trait": "ROSEBUDS_FALL" },
+ { "u_add_trait": "ROSEBUDS_WINTER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "shed_summer_timer_lupine",
+ "recurrence": [ "1 days", "7 days" ],
+ "condition": { "and": [ { "is_season": "summer" }, { "u_has_trait": "LUPINE_FUR" } ] },
+ "effect": [
+ { "u_message": "You've been shedding for a while, and your coat feels noticably lighter.", "type": "good" },
+ { "u_lose_trait": "LUPINE_FUR" },
+ { "u_add_trait": "LUPINE_FUR_SUMMER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "regrow_timer_lupine",
+ "recurrence": [ "5 days", "15 days" ],
+ "condition": { "and": [ { "u_has_trait": "LUPINE_FUR_SUMMER" }, { "not": { "is_season": "summer" } } ] },
+ "effect": [
+ { "u_message": "It looks like your coat has grown back in for the colder seasons.", "type": "good" },
+ { "u_lose_trait": "LUPINE_FUR_SUMMER" },
+ { "u_add_trait": "LUPINE_FUR" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "shed_summer_timer_ursine",
+ "recurrence": [ "1 days", "7 days" ],
+ "condition": { "and": [ { "is_season": "summer" }, { "u_has_trait": "URSINE_FUR" } ] },
+ "effect": [
+ { "u_message": "You've been shedding for a while, and your coat feels noticably lighter.", "type": "good" },
+ { "u_lose_trait": "URSINE_FUR" },
+ { "u_add_trait": "URSINE_FUR_SUMMER" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "regrow_timer_ursine",
+ "recurrence": [ "5 days", "15 days" ],
+ "condition": { "and": [ { "u_has_trait": "URSINE_FUR_SUMMER" }, { "not": { "is_season": "summer" } } ] },
+ "effect": [
+ { "u_message": "It looks like your coat has grown back in for the colder seasons.", "type": "good" },
+ { "u_lose_trait": "URSINE_FUR_SUMMER" },
+ { "u_add_trait": "URSINE_FUR" }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "seasonal_affective_fall",
+ "recurrence": [ "5 days", "20 days" ],
+ "condition": {
+ "and": [ { "u_has_trait": "SEASONAL_AFFECTIVE" }, { "is_season": "autumn" }, { "not": { "u_has_effect": "took_prozac" } } ]
+ },
+ "effect": [
+ { "u_message": "It's only fall, but you already miss the summer sun.", "type": "bad" },
+ {
+ "u_add_morale": "morale_feeling_bad",
+ "bonus": -15,
+ "max_bonus": -15,
+ "duration": { "math": [ "rand(216000) + 86400" ] }
+ }
+ ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "seasonal_affective_winter",
+ "recurrence": [ "3 days", "12 days" ],
+ "condition": {
+ "and": [ { "u_has_trait": "SEASONAL_AFFECTIVE" }, { "is_season": "winter" }, { "not": { "u_has_effect": "took_prozac" } } ]
+ },
+ "effect": [
+ { "u_message": "The long, cold nights really get you feeling down.", "type": "bad" },
+ {
+ "u_add_morale": "morale_feeling_bad",
+ "bonus": -15,
+ "max_bonus": -15,
+ "duration": { "math": [ "rand(432000) + 86400" ] }
+ }
+ ]
+ },
{
"type": "effect_on_condition",
"id": "EOC_ink_grand_spray",
diff --git a/data/json/flags.json b/data/json/flags.json
index 069f42bd536e5..8293735e87f0b 100644
--- a/data/json/flags.json
+++ b/data/json/flags.json
@@ -2366,5 +2366,10 @@
"id": "UNDERFED",
"type": "json_flag",
"//": "This corpse is from a monster with the CRITTER_UNDERFED flag."
+ },
+ {
+ "id": "TRANSPARENT",
+ "type": "json_flag",
+ "info": "This is transparent and won't block light from hitting the wearer."
}
]
diff --git a/data/json/furniture_and_terrain/furniture-domestic_plants.json b/data/json/furniture_and_terrain/furniture-domestic_plants.json
index a6d7995978031..f5c75abfa2c06 100644
--- a/data/json/furniture_and_terrain/furniture-domestic_plants.json
+++ b/data/json/furniture_and_terrain/furniture-domestic_plants.json
@@ -137,6 +137,92 @@
"bash": { "str_min": 2, "str_max": 6, "sound": "crunch.", "sound_fail": "whish." },
"plant_data": { "transform": "f_plant_mature", "base": "f_null" }
},
+ {
+ "type": "furniture",
+ "id": "f_mutant_tree_adult",
+ "name": "mutant tree",
+ "description": "This bizarre tree spreads its twisted branches at odd angles toward the sky. If you squint, it almost looks like a human figure with its arms raised to catch the sun.",
+ "symbol": "7",
+ "color": "light_green",
+ "required_str": -1,
+ "move_cost_mod": 0,
+ "flags": [
+ "PLANT",
+ "SEALED",
+ "TRANSPARENT",
+ "CONTAINER",
+ "NOITEM",
+ "TINY",
+ "DONT_REMOVE_ROTTEN",
+ "GROWTH_HARVEST",
+ "MUTANT_TREE",
+ "TREE",
+ "OBSTACLE"
+ ],
+ "bash": {
+ "str_min": 18,
+ "str_max": 50,
+ "sound": "crunch.",
+ "sound_fail": "whish.",
+ "items": [
+ { "item": "stick_long", "count": [ 1, 2 ] },
+ { "item": "bone", "count": [ 1, 2 ] },
+ { "item": "splinter", "count": [ 1, 5 ] },
+ { "item": "twig", "count": [ 2, 5 ] },
+ { "item": "leaves", "count": [ 5, 25 ] }
+ ]
+ },
+ "plant_data": { "transform": "f_null", "base": "f_null" }
+ },
+ {
+ "type": "furniture",
+ "id": "f_mutant_tree_sapling",
+ "name": "mutant sapling",
+ "description": "A twisted and gnarled little tree. Its shape is at once alien and familiar.",
+ "symbol": "1",
+ "color": "green",
+ "move_cost_mod": 1,
+ "required_str": -1,
+ "flags": [
+ "PLANT",
+ "SEALED",
+ "TRANSPARENT",
+ "CONTAINER",
+ "NOITEM",
+ "TINY",
+ "DONT_REMOVE_ROTTEN",
+ "GROWTH_MATURE",
+ "SMALL_HIDE",
+ "YOUNG"
+ ],
+ "bash": {
+ "str_min": 8,
+ "str_max": 50,
+ "sound": "crunch.",
+ "sound_fail": "whish.",
+ "items": [
+ { "item": "stick_long", "count": [ 0, 2 ] },
+ { "item": "bone", "count": [ 1, 2 ] },
+ { "item": "splinter", "count": [ 0, 2 ] },
+ { "item": "twig", "count": [ 1, 3 ] },
+ { "item": "leaves", "count": [ 5, 20 ] }
+ ]
+ },
+ "plant_data": { "transform": "f_mutant_tree_adult", "base": "f_null" }
+ },
+ {
+ "type": "furniture",
+ "id": "f_mutant_tree_sprout",
+ "name": "sprout",
+ "description": "A tiny little sprout that has just begun to grow.",
+ "symbol": "^",
+ "color": "green",
+ "move_cost_mod": 0,
+ "required_str": -1,
+ "flags": [ "PLANT", "SEALED", "TRANSPARENT", "CONTAINER", "NOITEM", "TINY", "DONT_REMOVE_ROTTEN", "GROWTH_SEEDLING" ],
+ "bash": { "str_min": 6, "str_max": 10, "sound": "crunch.", "sound_fail": "whish." },
+ "plant_data": { "transform": "f_mutant_tree_sapling", "base": "f_null" }
+ },
{
"type": "furniture",
"id": "f_planter",
diff --git a/data/json/furniture_and_terrain/terrain-floors-outdoors.json b/data/json/furniture_and_terrain/terrain-floors-outdoors.json
index dedc9befb6308..6fa65b689ff0a 100644
--- a/data/json/furniture_and_terrain/terrain-floors-outdoors.json
+++ b/data/json/furniture_and_terrain/terrain-floors-outdoors.json
@@ -130,7 +130,7 @@
"connect_groups": "DIRTMOUND",
"connects_to": "DIRTMOUND",
"move_cost": 3,
- "flags": [ "TRANSPARENT", "DIGGABLE", "MOUNTABLE", "NOCOLLIDE", "PLANTABLE" ],
+ "flags": [ "TRANSPARENT", "DIGGABLE", "MOUNTABLE", "NOCOLLIDE", "PLANTABLE", "TREE_PLANTABLE" ],
"bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100 },
"examine_action": "dirtmound"
},
diff --git a/data/json/items/armor/coats.json b/data/json/items/armor/coats.json
index cde54184b9954..b5046a113621a 100644
--- a/data/json/items/armor/coats.json
+++ b/data/json/items/armor/coats.json
@@ -348,17 +348,18 @@
"type": "ARMOR",
"category": "clothing",
"symbol": "[",
- "color": "yellow",
+ "color": "white",
"name": { "str": "rain poncho" },
- "description": "A lightweight plastic rain poncho with a hood. It folds into a very compact form when not in use.",
+ "description": "A lightweight transparent plastic rain poncho with a hood. It folds into a very compact form when not in use.",
"price": 5000,
"price_postapoc": 50,
"material": [ "plastic" ],
"weight": "280 g",
"volume": "250 ml",
- "flags": [ "WATERPROOF", "RAINPROOF", "HOOD", "OVERSIZE", "OUTER", "SOFT" ],
+ "flags": [ "WATERPROOF", "RAINPROOF", "HOOD", "OVERSIZE", "OUTER", "SOFT", "TRANSPARENT" ],
"environmental_protection": 1,
"material_thickness": 0.1,
+ "variant_type": "generic",
"armor": [
{ "covers": [ "torso" ], "specifically_covers": [ "torso_upper", "torso_lower" ], "coverage": 100 },
{
diff --git a/data/json/items/armor/eyewear.json b/data/json/items/armor/eyewear.json
index 0f193126ed84d..6a83ad132932e 100644
--- a/data/json/items/armor/eyewear.json
+++ b/data/json/items/armor/eyewear.json
@@ -113,7 +113,7 @@
"material_thickness": 1,
"environmental_protection": 1,
"use_action": { "type": "firestarter", "moves": 1000, "moves_slow": 25000, "need_sunlight": true },
- "flags": [ "WATER_FRIENDLY", "FIRESTARTER", "FIX_NEARSIGHT", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT" ],
+ "flags": [ "WATER_FRIENDLY", "FIRESTARTER", "FIX_NEARSIGHT", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT", "TRANSPARENT" ],
"armor": [ { "coverage": 75, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -132,7 +132,7 @@
"color": "cyan",
"material_thickness": 1,
"environmental_protection": 1,
- "flags": [ "WATER_FRIENDLY", "FIX_NEARSIGHT", "FRAGILE", "SKINTIGHT" ],
+ "flags": [ "WATER_FRIENDLY", "FIX_NEARSIGHT", "FRAGILE", "SKINTIGHT", "TRANSPARENT" ],
"armor": [ { "coverage": 75, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -152,7 +152,7 @@
"color": "cyan",
"material_thickness": 1,
"environmental_protection": 1,
- "flags": [ "FANCY", "FIX_NEARSIGHT", "FRAGILE", "SKINTIGHT" ],
+ "flags": [ "FANCY", "FIX_NEARSIGHT", "FRAGILE", "SKINTIGHT", "TRANSPARENT" ],
"armor": [ { "coverage": 20, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -173,7 +173,7 @@
"material_thickness": 1,
"environmental_protection": 1,
"use_action": { "type": "firestarter", "moves": 1000, "moves_slow": 25000, "need_sunlight": true },
- "flags": [ "WATER_FRIENDLY", "FIRESTARTER", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT" ],
+ "flags": [ "WATER_FRIENDLY", "FIRESTARTER", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT", "TRANSPARENT" ],
"armor": [ { "coverage": 75, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -193,7 +193,7 @@
"warmth": 5,
"material_thickness": 2,
"environmental_protection": 1,
- "flags": [ "WATER_FRIENDLY" ],
+ "flags": [ "WATER_FRIENDLY", "TRANSPARENT" ],
"armor": [ { "encumbrance": 5, "coverage": 95, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -211,7 +211,7 @@
"color": "light_cyan",
"material_thickness": 1,
"environmental_protection": 1,
- "flags": [ "WATER_FRIENDLY", "FRAGILE" ],
+ "flags": [ "WATER_FRIENDLY", "FRAGILE", "TRANSPARENT" ],
"armor": [ { "encumbrance": 5, "coverage": 95, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -368,7 +368,7 @@
"material_thickness": 1,
"environmental_protection": 1,
"use_action": { "type": "firestarter", "moves": 1000, "moves_slow": 25000, "need_sunlight": true },
- "flags": [ "FANCY", "WATER_FRIENDLY", "FIRESTARTER", "FIX_NEARSIGHT", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT" ],
+ "flags": [ "FANCY", "WATER_FRIENDLY", "FIRESTARTER", "FIX_NEARSIGHT", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT", "TRANSPARENT" ],
"armor": [ { "coverage": 75, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -387,7 +387,7 @@
"color": "yellow",
"material_thickness": 1,
"environmental_protection": 1,
- "flags": [ "FANCY", "WATER_FRIENDLY", "FIX_NEARSIGHT", "FRAGILE", "SKINTIGHT" ],
+ "flags": [ "FANCY", "WATER_FRIENDLY", "FIX_NEARSIGHT", "FRAGILE", "SKINTIGHT", "TRANSPARENT" ],
"armor": [ { "coverage": 75, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -408,7 +408,7 @@
"material_thickness": 1,
"environmental_protection": 1,
"use_action": { "type": "firestarter", "moves": 1000, "moves_slow": 25000, "need_sunlight": true },
- "flags": [ "FANCY", "WATER_FRIENDLY", "FIRESTARTER", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT" ],
+ "flags": [ "FANCY", "WATER_FRIENDLY", "FIRESTARTER", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT", "TRANSPARENT" ],
"armor": [ { "coverage": 75, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
@@ -427,7 +427,7 @@
"color": "dark_gray",
"material_thickness": 1,
"environmental_protection": 1,
- "flags": [ "FANCY", "WATER_FRIENDLY", "SUN_GLASSES", "FIX_NEARSIGHT", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT" ],
+ "flags": [ "FANCY", "WATER_FRIENDLY", "SUN_GLASSES", "FIX_NEARSIGHT", "FIX_FARSIGHT", "FRAGILE", "SKINTIGHT", "TRANSPARENT" ],
"armor": [ { "coverage": 75, "covers": [ "eyes" ], "rigid_layer_only": true } ]
},
{
diff --git a/data/json/items/armor/head_attachments.json b/data/json/items/armor/head_attachments.json
index 359148bd13e8f..ed63d7b5111cd 100644
--- a/data/json/items/armor/head_attachments.json
+++ b/data/json/items/armor/head_attachments.json
@@ -152,7 +152,7 @@
"symbol": "[",
"color": "light_blue",
"material_thickness": 1,
- "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR" ],
+ "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "TRANSPARENT" ],
"armor": [ { "encumbrance": 2, "coverage": 90, "covers": [ "eyes" ] } ]
},
{
@@ -169,7 +169,7 @@
"symbol": "[",
"color": "light_blue",
"material_thickness": 1.5,
- "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "OUTER" ],
+ "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "OUTER", "TRANSPARENT" ],
"armor": [ { "encumbrance": 4, "coverage": 100, "covers": [ "eyes", "mouth" ] } ]
},
{
@@ -186,7 +186,7 @@
"symbol": "[",
"color": "light_gray",
"material_thickness": 4.5,
- "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "OUTER" ],
+ "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "OUTER", "TRANSPARENT" ],
"armor": [ { "encumbrance": 14, "coverage": 100, "covers": [ "eyes", "mouth" ] } ]
},
{
@@ -203,7 +203,7 @@
"symbol": "[",
"color": "light_blue",
"material_thickness": 1,
- "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "OUTER" ],
+ "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "OUTER", "TRANSPARENT" ],
"armor": [ { "encumbrance": 4, "coverage": 100, "covers": [ "eyes", "mouth" ] } ]
},
{
diff --git a/data/json/items/armor/integrated.json b/data/json/items/armor/integrated.json
index d2e11f07fb13a..ecd3a2dc80c3c 100644
--- a/data/json/items/armor/integrated.json
+++ b/data/json/items/armor/integrated.json
@@ -14,7 +14,8 @@
"color": "light_green",
"warmth": 1,
"environmental_protection": 2,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "WATER_FRIENDLY", "SOFT" ],
+ "//": "bark can photosynthesize, so all of Plant's integrated armors are flagged transparent",
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "WATER_FRIENDLY", "SOFT", "TRANSPARENT" ],
"armor": [
{
"material": [
@@ -41,9 +42,9 @@
"material": [ "mut_wood" ],
"symbol": "x",
"color": "brown",
- "warmth": 1,
+ "warmth": 8,
"environmental_protection": 3,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "WATERPROOF", "PADDED" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "WATERPROOF", "PADDED", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "wood", "covered_by_mat": 100, "thickness": 4 }, { "type": "wood", "covered_by_mat": 75, "thickness": 6 } ],
@@ -66,9 +67,9 @@
"material": [ "mut_wood" ],
"symbol": "x",
"color": "brown",
- "warmth": 2,
+ "warmth": 8,
"environmental_protection": 4,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "WATERPROOF", "PADDED" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "WATERPROOF", "PADDED", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "wood", "covered_by_mat": 100, "thickness": 6 }, { "type": "wood", "covered_by_mat": 75, "thickness": 7 } ],
@@ -91,9 +92,9 @@
"material": [ "mut_wood" ],
"symbol": "x",
"color": "brown",
- "warmth": 2,
+ "warmth": 12,
"environmental_protection": 4,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "WATERPROOF", "PADDED" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "WATERPROOF", "PADDED", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "wood", "covered_by_mat": 100, "thickness": 15 } ],
@@ -131,9 +132,9 @@
"material": [ "mut_wood" ],
"symbol": "x",
"color": "brown",
- "warmth": 2,
+ "warmth": 10,
"environmental_protection": 2,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "OUTER", "PADDED" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "OUTER", "PADDED", "TRANSPARENT" ],
"armor": [
{
"material": [
@@ -170,7 +171,7 @@
"color": "white",
"warmth": 10,
"environmental_protection": 1,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "WATER_FRIENDLY" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "WATER_FRIENDLY", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "mut_fur", "covered_by_mat": 100, "thickness": 2 } ],
@@ -260,6 +261,43 @@
}
]
},
+ {
+ "id": "integrated_ursine_fur_summer",
+ "type": "ARMOR",
+ "category": "armor",
+ "name": { "str": "scruffy fur" },
+ "description": "While still formidable, this furry hide has lost a lot of its bulk to better endure the summer months.",
+ "weight": "2 kg",
+ "volume": "2 L",
+ "price": 0,
+ "price_postapoc": 0,
+ "material": [ "mut_fur" ],
+ "symbol": "x",
+ "color": "black",
+ "warmth": 32,
+ "environmental_protection": 1,
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "NORMAL", "WATER_FRIENDLY", "SOFT" ],
+ "armor": [
+ {
+ "material": [ { "type": "mut_fur", "covered_by_mat": 100, "thickness": 10 } ],
+ "covers": [ "leg_l", "leg_r", "arm_l", "arm_r", "torso" ],
+ "coverage": 100,
+ "encumbrance": 3
+ },
+ {
+ "material": [ { "type": "mut_fur", "covered_by_mat": 100, "thickness": 6 } ],
+ "covers": [ "hand_l", "hand_r", "foot_l", "foot_r", "head" ],
+ "coverage": 100,
+ "encumbrance": 4
+ },
+ {
+ "material": [ { "type": "mut_fur", "covered_by_mat": 100, "thickness": 3 } ],
+ "covers": [ "mouth" ],
+ "coverage": 85,
+ "encumbrance": 0
+ }
+ ]
+ },
{
"id": "integrated_lupine_fur",
"type": "ARMOR",
@@ -297,6 +335,43 @@
}
]
},
+ {
+ "id": "integrated_lupine_fur_summer",
+ "type": "ARMOR",
+ "category": "armor",
+ "name": { "str": "summer coat" },
+ "description": "A covering of fur that has thinned out for the summer.",
+ "weight": "1 kg",
+ "volume": "1 L",
+ "price": 0,
+ "price_postapoc": 0,
+ "material": [ "mut_fur" ],
+ "symbol": "x",
+ "color": "dark_gray",
+ "warmth": 18,
+ "environmental_protection": 1,
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "SKINTIGHT", "RAINPROOF" ],
+ "armor": [
+ {
+ "material": [ { "type": "mut_fur", "covered_by_mat": 100, "thickness": 6 } ],
+ "covers": [ "leg_l", "leg_r", "arm_l", "arm_r", "torso" ],
+ "coverage": 100,
+ "encumbrance": 2
+ },
+ {
+ "material": [ { "type": "mut_fur", "covered_by_mat": 100, "thickness": 4 } ],
+ "covers": [ "hand_l", "hand_r", "foot_l", "foot_r", "head" ],
+ "coverage": 100,
+ "encumbrance": 1
+ },
+ {
+ "material": [ { "type": "mut_fur", "covered_by_mat": 100, "thickness": 2 } ],
+ "covers": [ "mouth" ],
+ "coverage": 85,
+ "encumbrance": 0
+ }
+ ]
+ },
{
"id": "integrated_feline_fur",
"type": "ARMOR",
@@ -370,7 +445,16 @@
"color": "light_red",
"warmth": 7,
"environmental_protection": 1,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "SKINTIGHT", "WATER_FRIENDLY", "SOFT", "NO_SALVAGE" ],
+ "flags": [
+ "INTEGRATED",
+ "ALLOWS_NATURAL_ATTACKS",
+ "UNBREAKABLE",
+ "SKINTIGHT",
+ "WATER_FRIENDLY",
+ "SOFT",
+ "NO_SALVAGE",
+ "TRANSPARENT"
+ ],
"armor": [
{
"material": [
@@ -526,7 +610,7 @@
"color": "green",
"warmth": 2,
"environmental_protection": 2,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "WATER_FRIENDLY" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "WATER_FRIENDLY", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "leather_arthropod", "covered_by_mat": 100, "thickness": 2.5 } ],
@@ -628,7 +712,8 @@
"color": "dark_gray",
"warmth": 8,
"environmental_protection": 1,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "BLOCK_WHILE_WORN", "UNBREAKABLE", "NORMAL", "WATER_FRIENDLY" ],
+ "//": "Freshly molted bugs have semi-transparent chitin.",
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "BLOCK_WHILE_WORN", "UNBREAKABLE", "NORMAL", "WATER_FRIENDLY", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "leather_arthropod", "covered_by_mat": 100, "thickness": 1.4 } ],
@@ -764,7 +849,7 @@
"color": "brown",
"warmth": 5,
"environmental_protection": 1,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "BLOCK_WHILE_WORN", "UNBREAKABLE", "OUTER" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "BLOCK_WHILE_WORN", "UNBREAKABLE", "OUTER", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "leather_arthropod", "covered_by_mat": 100, "thickness": 2 } ],
@@ -1114,7 +1199,7 @@
"color": "light_red",
"warmth": 1,
"environmental_protection": 1,
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "WATER_FRIENDLY" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "WATER_FRIENDLY", "TRANSPARENT" ],
"armor": [
{
"material": [
@@ -1396,7 +1481,7 @@
"material": [ "chitin" ],
"symbol": ";",
"color": "dark_gray",
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "chitin", "covered_by_mat": 100, "thickness": 3 } ],
@@ -1425,7 +1510,7 @@
"material": [ "chitin" ],
"symbol": ";",
"color": "dark_gray",
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "chitin", "covered_by_mat": 100, "thickness": 3 } ],
@@ -1454,7 +1539,7 @@
"material": [ "chitin" ],
"symbol": ";",
"color": "dark_gray",
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "chitin", "covered_by_mat": 100, "thickness": 3 } ],
@@ -1483,7 +1568,7 @@
"material": [ "chitin" ],
"symbol": ";",
"color": "dark_gray",
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE", "TRANSPARENT" ],
"armor": [
{
"material": [ { "type": "chitin", "covered_by_mat": 100, "thickness": 3 } ],
diff --git a/data/json/items/comestibles/med.json b/data/json/items/comestibles/med.json
index 150fda438dc3e..6417f2a319d7d 100644
--- a/data/json/items/comestibles/med.json
+++ b/data/json/items/comestibles/med.json
@@ -927,7 +927,7 @@
"comestible_type": "MED",
"name": { "str_sp": "antihistamine pill" },
"description": "Over-the-counter allergy medication. These are meant to be taken once a day and can cause drowsiness.",
- "//": "Flu meds contain antihistamines among other things, so it's intended that there's some overlap between this and cough syrup.",
+ "//": "Diphenhydramine HCl. Many flu meds including nyquil contain this drug, so the overlap with cough syrup is intentional.",
"material": [ "drug_filler" ],
"weight": "1 g",
"volume": "1 ml",
@@ -937,7 +937,7 @@
"color": "light_red",
"container": "bottle_plastic_pill_supplement",
"stim": -6,
- "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
+ "flags": [ "IRREPLACEABLE_CONSUMABLE", "EDIBLE_FROZEN" ],
"addiction_potential": 4,
"addiction_type": "sleeping pill",
"use_action": {
diff --git a/data/json/items/comestibles/raw_fruit.json b/data/json/items/comestibles/raw_fruit.json
index 85869a1d29c97..70ae05d7115f4 100644
--- a/data/json/items/comestibles/raw_fruit.json
+++ b/data/json/items/comestibles/raw_fruit.json
@@ -858,5 +858,40 @@
"fun": -1,
"flags": [ "RAW" ],
"vitamins": [ [ "vitC", 9 ], [ "calcium", 16 ], [ "iron", 3 ] ]
+ },
+ {
+ "type": "COMESTIBLE",
+ "id": "mutfruit",
+ "name": { "str": "mutant fruit" },
+ "weight": "40 g",
+ "color": "magenta",
+ "spoils_in": "12 days",
+ "comestible_type": "FOOD",
+ "symbol": "%",
+ "quench": 2,
+ "calories": 18,
+ "description": "A leathery skin covers this purplish-brown little fruit. It will need to be deconstructed before anything can be done with it.",
+ "material": [ "fruit", "hflesh" ],
+ "vitamins": [ [ "vitC", 2 ], [ "calcium", 1 ], [ "iron", 4 ], [ "mutant_toxin", 6 ] ],
+ "volume": "60 ml",
+ "flags": [ "INEDIBLE", "TRADER_AVOID" ]
+ },
+ {
+ "type": "COMESTIBLE",
+ "id": "mutfruit_peeled",
+ "name": { "str": "peeled mutant fruit" },
+ "weight": "28 g",
+ "color": "red",
+ "spoils_in": "3 days",
+ "comestible_type": "FOOD",
+ "symbol": "%",
+ "quench": 2,
+ "calories": 13,
+ "description": "Divested of its skin, this mutated fruit is revealed to be a nonsensical jumble of plant and animal matter. Human hair and teeth grow from pithy blood-slick flesh, redolent with the scent of rotting mangoes.",
+ "material": [ "fruit", "hflesh" ],
+ "volume": "34 ml",
+ "fun": -10,
+ "flags": [ "BAD_TASTE", "TRADER_AVOID" ],
+ "vitamins": [ [ "vitC", 2 ], [ "calcium", 1 ], [ "iron", 4 ], [ "mutant_toxin", 6 ] ]
}
]
diff --git a/data/json/items/comestibles/seed.json b/data/json/items/comestibles/seed.json
index 258834aca7404..de27f6671154f 100644
--- a/data/json/items/comestibles/seed.json
+++ b/data/json/items/comestibles/seed.json
@@ -1063,5 +1063,30 @@
"name": { "str_sp": "eggplant seeds" },
"description": "Some eggplant seeds.",
"seed_data": { "plant_name": "eggplant", "fruit": "eggplant", "seeds": false, "byproducts": [ "withered" ], "grow": "60 days" }
+ },
+ {
+ "type": "COMESTIBLE",
+ "id": "seed_mutant",
+ "comestible_type": "FOOD",
+ "name": { "str_sp": "mutant seed" },
+ "description": "A single rock-hard seed shaped like a kidney bean. Two dark spots on one end look a bit like a pair of eyes.",
+ "category": "seeds",
+ "volume": "2 ml",
+ "weight": "1 g",
+ "price": "1 cent",
+ "price_postapoc": "1 cent",
+ "material": [ "veggy", "bone" ],
+ "symbol": ".",
+ "flags": [ "TRADER_AVOID", "CANNIBALISM" ],
+ "color": "brown",
+ "seed_data": {
+ "plant_name": "mutant",
+ "fruit": "null",
+ "grow": "90 days",
+ "seedling_form": "f_mutant_tree_sprout",
+ "mature_form": "f_mutant_tree_sapling",
+ "harvestable_form": "f_mutant_tree_adult",
+ "required_terrain_flag": "TREE_PLANTABLE"
+ }
}
]
diff --git a/data/json/mutations/mutations.json b/data/json/mutations/mutations.json
index a0a73113f24f6..c400648404284 100644
--- a/data/json/mutations/mutations.json
+++ b/data/json/mutations/mutations.json
@@ -18,7 +18,7 @@
"player_display": false,
"dummy": true,
"category": [ "HUMAN" ],
- "types": [ "BIOLUM", "HAIR", "HORNS", "TAIL", "WHISKERS", "WINGS", "TUSKS", "BODY_ARMOR_MOD" ],
+ "types": [ "BIOLUM", "HORNS", "HAIR", "TAIL", "WHISKERS", "WINGS", "TUSKS", "BODY_ARMOR_MOD" ],
"cancels": [ "ARM_FEATHERS", "CF_HAIR", "HAIRROOTS", "INK_GLANDS", "THORNS", "TRANSPIRATION", "WEB_RAPPEL", "WEB_ROPE" ],
"description": "You don't have any tails, whiskers, horns, or miscellaneous extra bits."
},
@@ -283,7 +283,17 @@
"player_display": false,
"dummy": true,
"category": [ "HUMAN" ],
- "cancels": [ "DISIMMUNE", "DISRESISTANT", "INFIMMUNE", "INFRESIST", "NONADDICTIVE", "PARAIMMUNE", "POISRESIST", "STIMBOOST" ],
+ "cancels": [
+ "DISIMMUNE",
+ "DISRESISTANT",
+ "INFIMMUNE",
+ "INFRESIST",
+ "NONADDICTIVE",
+ "PARAIMMUNE",
+ "POISRESIST",
+ "STIMBOOST",
+ "SEASONAL_ALLERGIES"
+ ],
"description": "Your immune system is more or less normal for a human."
},
{
@@ -746,6 +756,16 @@
"visibility": 8,
"social_modifiers": { "intimidate": 4 }
},
+ {
+ "type": "mutation",
+ "id": "SEASONAL_AFFECTIVE",
+ "name": { "str": "Seasonal Affective Disorder" },
+ "points": -1,
+ "description": "You tend to have bouts of depression during the fall and especially winter. Taking antidepressants can help.",
+ "starting_trait": true,
+ "types": [ "ATTITUDE" ],
+ "category": [ "PLANT", "ELFA", "MEDICAL" ]
+ },
{
"type": "mutation",
"id": "GOODHEARING",
@@ -2431,7 +2451,7 @@
"points": 1,
"description": "Man's oldest and most well known friends are all Lupines. Somehow you've mutated something that reminds other survivors of your more domestic relatives. A softer edge around the eyes, maybe.",
"types": [ "EYES" ],
- "prereqs": [ "LIGHTFUR" ],
+ "prereqs": [ "LUPINE_FUR", "LUPINE_FUR_SUMMER" ],
"category": [ "LUPINE" ],
"mixed_effect": true,
"social_modifiers": { "lie": -5, "persuade": 5, "intimidate": -5 }
@@ -3019,10 +3039,10 @@
"ugliness": 2,
"bodytemp_sleep": 75,
"description": "Light fur has grown to cover your entire body, providing marginal protection against attacks and slight protection from cold.",
- "category": [ "MOUSE", "BEAST", "CATTLE", "RAT", "FELINE", "LUPINE", "RABBIT", "URSINE" ],
+ "category": [ "MOUSE", "BEAST", "RAT", "LUPINE", "URSINE", "FELINE", "RABBIT", "CATTLE" ],
"types": [ "SKIN" ],
"prereqs": [ "HIRSUTE" ],
- "changes_to": [ "FUR", "FELINE_FUR", "LUPINE_FUR", "RABBIT_FUR" ],
+ "changes_to": [ "FUR", "FELINE_FUR", "LUPINE_FUR", "RABBIT_FUR", "LUPINE_FUR_SUMMER" ],
"integrated_armor": [ "integrated_lightfur" ]
},
{
@@ -3035,7 +3055,7 @@
"bodytemp_sleep": 200,
"description": "Thick black fur has grown to cover your entire body, providing minor protection against attacks, and considerable protection from cold.",
"types": [ "SKIN" ],
- "changes_to": [ "URSINE_FUR" ],
+ "changes_to": [ "URSINE_FUR", "URSINE_FUR_SUMMER" ],
"prereqs": [ "LIGHTFUR" ],
"category": [ "CATTLE", "RAT", "URSINE" ],
"integrated_armor": [ "integrated_fur" ]
@@ -3052,8 +3072,22 @@
"types": [ "SKIN" ],
"prereqs": [ "FUR" ],
"category": [ "URSINE" ],
+ "prevented_by": [ "URSINE_FUR_SUMMER" ],
"integrated_armor": [ "integrated_ursine_fur" ]
},
+ {
+ "type": "mutation",
+ "id": "URSINE_FUR_SUMMER",
+ "name": { "str": "Scruffy Fur" },
+ "points": 4,
+ "visibility": 10,
+ "ugliness": 4,
+ "bodytemp_sleep": 225,
+ "description": "You've lost your fluffy undercoat for the summer. This feels a lot better in the heat, but it's less protective and looks a little bedraggled.",
+ "types": [ "SKIN" ],
+ "prereqs": [ "FUR" ],
+ "integrated_armor": [ "integrated_ursine_fur_summer" ]
+ },
{
"type": "mutation",
"id": "LUPINE_FUR",
@@ -3066,8 +3100,22 @@
"types": [ "SKIN" ],
"prereqs": [ "LIGHTFUR" ],
"category": [ "LUPINE" ],
+ "prevented_by": [ "LUPINE_FUR_SUMMER" ],
"integrated_armor": [ "integrated_lupine_fur" ]
},
+ {
+ "type": "mutation",
+ "id": "LUPINE_FUR_SUMMER",
+ "name": { "str": "Summer Coat" },
+ "points": 2,
+ "visibility": 10,
+ "ugliness": 3,
+ "bodytemp_sleep": 175,
+ "description": "Your entire body is covered in dense fur, but it's thinned out a bit for the summer, which may provide some relief from the heat at the cost of physical protection.",
+ "types": [ "SKIN" ],
+ "prereqs": [ "LIGHTFUR" ],
+ "integrated_armor": [ "integrated_lupine_fur_summer" ]
+ },
{
"type": "mutation",
"id": "FELINE_FUR",
@@ -3176,7 +3224,7 @@
],
"category": [ "CHIMERA" ],
"threshreq": [ "THRESH_CHIMERA" ],
- "types": [ "SKIN" ],
+ "types": [ "SKIN", "BODY_ARMOR", "ARMOR", "BODY_ARMOR_MOD" ],
"prereqs": [ "PATCHSKIN2" ],
"integrated_armor": [ "integrated_patchskin3" ]
},
@@ -3618,10 +3666,23 @@
"description": "All the hair on your body has turned to long, grass-like leaves. Apart from being physically striking, these provide you with a minor amount of nutrients while in sunlight when your head is uncovered. Slightly reduces wet effects.",
"types": [ "HAIR" ],
"prereqs": [ "PLANTSKIN", "BARK" ],
- "changes_to": [ "LEAVES2" ],
+ "changes_to": [ "LEAVES2", "LEAVES2_FALL", "LEAVES2_WINTER", "LEAVES3", "LEAVES3_FALL", "LEAVES3_WINTER" ],
"category": [ "PLANT", "ELFA" ],
+ "prevented_by": [ "LEAVES_WINTER" ],
"wet_protection": [ { "part": "head", "ignored": 1 } ]
},
+ {
+ "type": "mutation",
+ "id": "LEAVES_WINTER",
+ "name": { "str": "Dead Leaves" },
+ "points": 3,
+ "visibility": 5,
+ "ugliness": 2,
+ "description": "In place of hair, you have long, grassy leaves which have gone dormant for the winter, turning dry and yellow like straw. They help keep you warm, but that's about it.",
+ "types": [ "HAIR" ],
+ "leads_to": [ "LEAVES2", "LEAVES2_FALL", "LEAVES2_WINTER", "LEAVES3", "LEAVES3_FALL", "LEAVES3_WINTER" ],
+ "bodytemp_modifiers": [ 25, 125 ]
+ },
{
"type": "mutation",
"id": "LEAVES2",
@@ -3631,14 +3692,44 @@
"ugliness": 5,
"description": "Your leaves have grown in size and prominence, with additional leaves sprouting along your arms. While your arms and head are uncovered, you will photosynthesize nutrients while in sunlight. Reduces wet effects.",
"types": [ "HAIR" ],
- "prereqs": [ "LEAVES" ],
+ "prereqs": [ "LEAVES", "LEAVES_WINTER" ],
"prereqs2": [ "TRANSPIRATION" ],
"threshreq": [ "THRESH_PLANT" ],
- "changes_to": [ "LEAVES3" ],
+ "cancels": [ "LEAVES_WINTER" ],
+ "changes_to": [ "LEAVES3", "LEAVES3_FALL", "LEAVES3_WINTER" ],
"category": [ "PLANT" ],
+ "flags": [ "GLARE_RESIST" ],
+ "prevented_by": [ "LEAVES2_WINTER", "LEAVES2_FALL" ],
+ "wet_protection": [ { "part": "head", "ignored": 4 }, { "part": "arm_l", "ignored": 5 }, { "part": "arm_r", "ignored": 5 } ],
+ "encumbrance_covered": [ [ "arm_l", 5 ], [ "arm_r", 5 ] ]
+ },
+ {
+ "type": "mutation",
+ "id": "LEAVES2_FALL",
+ "name": { "str": "Turning Leaves" },
+ "points": 6,
+ "visibility": 10,
+ "ugliness": -1,
+ "description": "The leaves growing from your head and arms have taken on fall colors. While pretty, they can't photosynthesize as well as the green ones. Reduces wet effects.",
+ "types": [ "HAIR" ],
+ "threshreq": [ "THRESH_PLANT" ],
+ "leads_to": [ "LEAVES3" ],
+ "flags": [ "GLARE_RESIST" ],
"wet_protection": [ { "part": "head", "ignored": 4 }, { "part": "arm_l", "ignored": 5 }, { "part": "arm_r", "ignored": 5 } ],
"encumbrance_covered": [ [ "arm_l", 5 ], [ "arm_r", 5 ] ]
},
+ {
+ "type": "mutation",
+ "id": "LEAVES2_WINTER",
+ "name": { "str": "Dead Lush Leaves" },
+ "points": 6,
+ "player_display": false,
+ "description": "You have no leaves because it's wintertime. This keeps you warm by reducing heat loss, but you don't know that because you shouldn't be able to see this.",
+ "types": [ "HAIR" ],
+ "threshreq": [ "THRESH_PLANT" ],
+ "leads_to": [ "LEAVES3" ],
+ "bodytemp_modifiers": [ 50, 150 ]
+ },
{
"type": "mutation",
"id": "LEAVES3",
@@ -3648,13 +3739,41 @@
"ugliness": 6,
"description": "Your leaves are vibrant, large, and green, and have become a major source of nutrients for your body. Whenever your arms and head are uncovered you will gain a large amount of nutrients by standing in the sunlight. Reduces wet effects.",
"types": [ "HAIR" ],
- "prereqs": [ "LEAVES2" ],
+ "prereqs": [ "LEAVES2", "LEAVES2_FALL", "LEAVES2_WINTER" ],
"prereqs2": [ "TRANSPIRATION" ],
"threshreq": [ "THRESH_PLANT" ],
+ "cancels": [ "LEAVES2_FALL", "LEAVES2_WINTER" ],
+ "prevented_by": [ "LEAVES3_FALL", "LEAVES3_WINTER" ],
+ "flags": [ "GLARE_RESIST" ],
"category": [ "PLANT" ],
"wet_protection": [ { "part": "head", "ignored": 5 }, { "part": "arm_l", "ignored": 8 }, { "part": "arm_r", "ignored": 8 } ],
"encumbrance_covered": [ [ "arm_l", 10 ], [ "arm_r", 10 ] ]
},
+ {
+ "type": "mutation",
+ "id": "LEAVES3_FALL",
+ "name": { "str": "Autumn Foliage" },
+ "points": 9,
+ "visibility": 12,
+ "ugliness": -4,
+ "description": "Your head and upper limbs are covered in beautiful autumn leaves. If they're uncovered you'll still be able to photosynthesize, but not as well as in the warmer months. Reduces wet effects.",
+ "types": [ "HAIR" ],
+ "threshreq": [ "THRESH_PLANT" ],
+ "flags": [ "GLARE_RESIST" ],
+ "wet_protection": [ { "part": "head", "ignored": 5 }, { "part": "arm_l", "ignored": 8 }, { "part": "arm_r", "ignored": 8 } ],
+ "encumbrance_covered": [ [ "arm_l", 10 ], [ "arm_r", 10 ] ]
+ },
+ {
+ "type": "mutation",
+ "id": "LEAVES3_WINTER",
+ "name": { "str": "Dead Verdant Leaves" },
+ "points": 9,
+ "player_display": false,
+ "description": "It's winter, so all your leaves are gone. This keeps you warm by reducing heat loss, but you don't know that because you shouldn't be able to see this.",
+ "types": [ "HAIR" ],
+ "threshreq": [ "THRESH_PLANT" ],
+ "bodytemp_modifiers": [ 100, 300 ]
+ },
{
"type": "mutation",
"id": "TRANSPIRATION",
@@ -3676,14 +3795,33 @@
"visibility": 10,
"ugliness": -4,
"description": "You've started blooming where your scalp used to be. Your blossoms have a pleasant aroma, are visually striking, and are quite sensitive.",
- "prereqs": [ "PLANTSKIN", "BARK" ],
+ "prereqs": [ "PLANTSKIN" ],
"prereqs2": [ "HAIRROOTS" ],
"types": [ "SCENT" ],
"threshreq": [ "THRESH_PLANT", "THRESH_ELFA" ],
"category": [ "PLANT", "ELFA" ],
"changes_to": [ "ROSEBUDS" ],
"scent_mask": -200,
- "social_modifiers": { "lie": 10 }
+ "social_modifiers": { "lie": 10 },
+ "prevented_by": [
+ "FLOWERS_WINTER",
+ "ROSEBUDS_SUMMER",
+ "ROSEBUDS_FALL",
+ "ROSEBUDS_WINTER",
+ "ROSEBUDS_FALL_active",
+ "ROSEBUDS_FALL_PICKED"
+ ]
+ },
+ {
+ "type": "mutation",
+ "id": "FLOWERS_WINTER",
+ "name": { "str": "Dead Flowers" },
+ "points": 2,
+ "description": "No flowers in wintertime. As such this mutation is not supposed to be visible to the player.",
+ "types": [ "SCENT" ],
+ "threshreq": [ "THRESH_PLANT", "THRESH_ELFA" ],
+ "leads_to": [ "ROSEBUDS" ],
+ "player_display": false
},
{
"type": "mutation",
@@ -3692,13 +3830,87 @@
"points": 3,
"visibility": 10,
"ugliness": -6,
- "description": "The top of your head is blooming with rosebuds. They're eye catching, and have a strong fragrance that makes you pleasant to be around.",
+ "description": "The top of your head is blooming with rosebuds. They're eye catching, and have a mild fragrance that makes you pleasant to be around.",
+ "types": [ "SCENT" ],
+ "prereqs": [ "FLOWERS", "FLOWERS_WINTER" ],
+ "cancels": [ "SMELLY", "SMELLY2", "FLOWERS_WINTER" ],
+ "threshreq": [ "THRESH_PLANT", "THRESH_ELFA" ],
+ "category": [ "PLANT", "ELFA" ],
+ "social_modifiers": { "lie": 10, "persuade": 8 },
+ "prevented_by": [ "ROSEBUDS_SUMMER", "ROSEBUDS_FALL", "ROSEBUDS_FALL_PICKED", "ROSEBUDS_WINTER" ]
+ },
+ {
+ "type": "mutation",
+ "id": "ROSEBUDS_SUMMER",
+ "name": { "str": "Blooming Roses" },
+ "points": 3,
+ "visibility": 12,
+ "ugliness": -8,
+ "description": "Your head is crowned with radiant flowers that spread their petals wide. The dizzying fragrance attracts people and pollinators alike.",
+ "types": [ "SCENT" ],
+ "cancels": [ "SMELLY", "SMELLY2" ],
+ "threshreq": [ "THRESH_PLANT", "THRESH_ELFA" ],
+ "social_modifiers": { "lie": 15, "persuade": 12 }
+ },
+ {
+ "type": "mutation",
+ "id": "ROSEBUDS_FALL",
+ "name": { "str": "Fruiting" },
+ "points": 3,
+ "visibility": 12,
+ "ugliness": 2,
+ "active": true,
+ "transform": {
+ "target": "ROSEBUDS_FALL_active",
+ "msg_transform": "Most of the fruits are beyond consideration, but you pick what you can and discard the rest.",
+ "active": false,
+ "moves": 150
+ },
+ "description": "A few odd-looking fruits ripen on stems growing out of your head. They'll probably die off come winter, but you could activate this mutation to pick them before then, if you wanted.",
+ "encumbrance_always": [ [ "head", 10 ] ],
+ "restricts_gear": [ "head_crown" ],
+ "types": [ "SCENT" ],
+ "prereqs": [ "FLOWERS" ],
+ "cancels": [ "SMELLY", "SMELLY2" ],
+ "//": "Sorry elves, only true plants can reproduce this way.",
+ "threshreq": [ "THRESH_PLANT" ]
+ },
+ {
+ "type": "mutation",
+ "id": "ROSEBUDS_FALL_active",
+ "name": { "str": "Fruiting (picked)" },
+ "points": 3,
+ "active": true,
+ "description": "You shouldn't be able to see this, it's just used to proc the EOC.",
+ "types": [ "SCENT" ],
+ "prereqs": [ "FLOWERS" ],
+ "valid": false,
+ "cancels": [ "SMELLY", "SMELLY2", "ROSEBUDS_FALL" ],
+ "threshreq": [ "THRESH_PLANT" ]
+ },
+ {
+ "type": "mutation",
+ "id": "ROSEBUDS_FALL_PICKED",
+ "name": { "str": "Fruiting (picked)" },
+ "points": 3,
+ "description": "You've picked all your fruit and no longer have any, as such this mutation is not supposed to be visible.",
+ "types": [ "SCENT" ],
+ "prereqs": [ "FLOWERS" ],
+ "cancels": [ "SMELLY", "SMELLY2", "ROSEBUDS_FALL_active" ],
+ "threshreq": [ "THRESH_PLANT" ],
+ "player_display": false
+ },
+ {
+ "type": "mutation",
+ "id": "ROSEBUDS_WINTER",
+ "name": { "str": "Dead Roses" },
+ "points": 3,
+ "description": "No flowers in wintertime. As such this mutation is not supposed to be visible to the player.",
"types": [ "SCENT" ],
"prereqs": [ "FLOWERS" ],
"cancels": [ "SMELLY", "SMELLY2" ],
"threshreq": [ "THRESH_PLANT", "THRESH_ELFA" ],
- "category": [ "PLANT", "ELFA" ],
- "social_modifiers": { "lie": 15, "persuade": 10 }
+ "player_display": false
},
{
"type": "mutation",
@@ -4101,6 +4313,15 @@
"category": [ "MEDICAL" ],
"flags": [ "INFECTION_IMMUNE" ]
},
+ {
+ "type": "mutation",
+ "id": "SEASONAL_ALLERGIES",
+ "name": { "str": "Seasonal Allergies" },
+ "points": -1,
+ "starting_trait": true,
+ "description": "You tend to get hay fever, especially in springtime. Antihistamines are your friend.",
+ "category": [ "CHIMERA", "BEAST" ]
+ },
{
"type": "mutation",
"id": "M_IMMUNE",
@@ -5550,11 +5771,11 @@
{
"type": "mutation",
"id": "CANINE_EARS",
- "name": { "str": "Canine Ears" },
+ "name": { "str": "Animal Ears" },
"points": 1,
"visibility": 4,
"ugliness": 1,
- "description": "Your ears have extended into long, pointed ones, like those of a canine. They enhance your hearing, allowing you to hear at greater distances.",
+ "description": "You have large ears with broad pinnae, like a dog or a cow. They enhance your hearing, allowing you to hear at greater distances.",
"types": [ "EARS" ],
"category": [ "BEAST", "CATTLE", "CHIMERA", "LUPINE" ],
"changes_to": [ "LUPINE_EARS" ],
@@ -5569,6 +5790,7 @@
"ugliness": 1,
"description": "Your hearing has evolved further and is now on par with that of wolves. You can hear things significantly farther away.",
"types": [ "EARS" ],
+ "prereqs": [ "CANINE_EARS" ],
"category": [ "LUPINE" ],
"hearing_modifier": 1.75
},
@@ -7031,6 +7253,7 @@
"description": "Sunlight makes you uncomfortable. If you are outdoors and the weather is Sunny, you suffer -1 to all stats.",
"types": [ "SUNLIGHT" ],
"changes_to": [ "TROGLO2" ],
+ "cancels": [ "SEASONAL_AFFECTIVE" ],
"category": [ "BEAST", "INSECT", "SLIME", "SPIDER", "BATRACHIAN", "RAT", "TROGLOBITE" ]
},
{
@@ -7549,7 +7772,17 @@
"visibility": 4,
"ugliness": 2,
"description": "Roots have started growing from your leaf-like hair. They don't seem to do much.",
- "prereqs": [ "LEAVES" ],
+ "prereqs": [
+ "LEAVES",
+ "LEAVES2",
+ "LEAVES3",
+ "LEAVES_WINTER",
+ "LEAVES2_FALL",
+ "LEAVES2_WINTER",
+ "LEAVES3",
+ "LEAVES3_FALL",
+ "LEAVES3_WINTER"
+ ],
"category": [ "PLANT", "ELFA" ]
},
{
@@ -7612,7 +7845,7 @@
"points": 10,
"visibility": 7,
"ugliness": 1,
- "description": "Every inch of your skin is packed with chlorophyll and you have strong roots. Sleeping on diggable soil will satisfy any hunger or thirst you might have. Activate this mutation to force yourself to sleep until nightfall.",
+ "description": "You've truly become a walking plant, though you mostly feel like sleeping in the sunshine. When you do, your roots and bark will take in more nutrients than ever.",
"purifiable": false,
"types": [ "LEGS", "FEET" ],
"prereqs": [ "ROOTS3" ],
diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json b/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json
index aa4c98d4bbed7..45248b15697a7 100644
--- a/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json
+++ b/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json
@@ -37,6 +37,7 @@
{ "trait": "VEGETARIAN" },
{ "trait": "SQUEAMISH" },
{ "trait": "MOODSWINGS" },
+ { "trait": "SEASONAL_ALLERGIES" },
{ "trait": "SLOWHEALER" },
{ "trait": "SLOWRUNNER" },
{ "trait": "DISORGANIZED" },
diff --git a/data/json/npcs/starting_traits.json b/data/json/npcs/starting_traits.json
index 68564724666b0..42ee1307729f9 100644
--- a/data/json/npcs/starting_traits.json
+++ b/data/json/npcs/starting_traits.json
@@ -66,7 +66,9 @@
{ "trait": "SCHIZOPHRENIC", "prob": 1 },
{ "trait": "SQUEAMISH", "prob": 20 },
{ "trait": "ANTIWHEAT", "prob": 5 },
- { "trait": "WOOLALLERGY", "prob": 5 }
+ { "trait": "WOOLALLERGY", "prob": 5 },
+ { "trait": "SEASONAL_ALLERGIES", "prob": 8 },
+ { "trait": "SEASONAL_AFFECTIVE", "prob": 5 }
]
},
{
diff --git a/data/json/player_activities.json b/data/json/player_activities.json
index 0476075a30387..e84050b047293 100644
--- a/data/json/player_activities.json
+++ b/data/json/player_activities.json
@@ -944,6 +944,16 @@
"based_on": "time",
"no_resume": true
},
+ {
+ "id": "ACT_MUTANT_TREE_COMMUNION",
+ "type": "activity_type",
+ "activity_level": "NO_EXERCISE",
+ "verb": "communing with the mutant tree",
+ "rooted": true,
+ "suspendable": false,
+ "based_on": "time",
+ "no_resume": true
+ },
{
"id": "ACT_EAT_MENU",
"type": "activity_type",
diff --git a/data/json/snippets/snippets.json b/data/json/snippets/snippets.json
index f860a8c5d0706..0acec1c7270d3 100644
--- a/data/json/snippets/snippets.json
+++ b/data/json/snippets/snippets.json
@@ -149,6 +149,21 @@
"In the minute shifts and pivots of the trees, you hear the language of the universe."
]
},
+ {
+ "type": "snippet",
+ "category": "mutant_tree_communion",
+ "text": [
+ "You feel something like laughter through your roots.",
+ "The trees hear you, the first of your kind.",
+ "The impossible task of survival seems suddenly quite simple.",
+ "You feel the presence of another like yourself.",
+ "An inquisitive mind probes at you, its curiosity unique among the whispering leaves.",
+ "The brief sensation that someone is holding your hand is almost enough to bring you to tears.",
+ "You dream of a wooded grove. Peace. Family.",
+ "In your mind's eye you walk the woods, a familiar presence by your side.",
+ "A gentle feeling washes over you like a tender hug."
+ ]
+ },
{
"type": "snippet",
"category": "headshop_graffiti",
diff --git a/data/json/uncraft/comestibles/fruit.json b/data/json/uncraft/comestibles/fruit.json
index 1cd3084110111..082905f81a344 100644
--- a/data/json/uncraft/comestibles/fruit.json
+++ b/data/json/uncraft/comestibles/fruit.json
@@ -123,5 +123,13 @@
"activity_level": "NO_EXERCISE",
"time": "30 s",
"components": [ [ [ "seed_maianthemum_stellatum", 1 ] ] ]
+ },
+ {
+ "result": "mutfruit",
+ "type": "uncraft",
+ "activity_level": "LIGHT_EXERCISE",
+ "time": "30 s",
+ "qualities": [ { "id": "CUT", "level": 1 } ],
+ "components": [ [ [ "mutfruit_peeled", 1 ] ], [ [ "seed_mutant", 1 ] ] ]
}
]
diff --git a/data/mods/Aftershock/items/ethereal.json b/data/mods/Aftershock/items/ethereal.json
index f53172ae8f5fc..5b5432160e0e2 100644
--- a/data/mods/Aftershock/items/ethereal.json
+++ b/data/mods/Aftershock/items/ethereal.json
@@ -21,6 +21,7 @@
"NO_TAKEOFF",
"NONCONDUCTIVE",
"UNBREAKABLE",
+ "TRANSPARENT",
"ALLOWS_NATURAL_ATTACKS"
],
"relic_data": { "passive_effects": [ { "id": "ench_climate_control_warm" } ] },
@@ -52,6 +53,7 @@
"NO_TAKEOFF",
"NONCONDUCTIVE",
"UNBREAKABLE",
+ "TRANSPARENT",
"ALLOWS_NATURAL_ATTACKS"
],
"relic_data": { "passive_effects": [ { "id": "ench_climate_control_warm" }, { "id": "ench_cold_armor" } ] },
diff --git a/data/mods/Magiclysm/items/ethereal_items.json b/data/mods/Magiclysm/items/ethereal_items.json
index d23d7773f9152..2b5ee00c390be 100644
--- a/data/mods/Magiclysm/items/ethereal_items.json
+++ b/data/mods/Magiclysm/items/ethereal_items.json
@@ -71,7 +71,7 @@
"to_hit": -2,
"symbol": ",",
"color": "light_green",
- "flags": [ "LIGHT_300", "AURA", "SEMITANGIBLE", "UNBREAKABLE", "ALLOWS_NATURAL_ATTACKS" ],
+ "flags": [ "LIGHT_300", "AURA", "SEMITANGIBLE", "UNBREAKABLE", "ALLOWS_NATURAL_ATTACKS", "TRANSPARENT" ],
"armor": [ { "covers": [ "head" ] } ],
"melee_damage": { "bash": 8 }
},
@@ -87,7 +87,7 @@
"symbol": ",",
"color": "light_green",
"material": [ "magical_material" ],
- "flags": [ "LIGHT_8", "AURA", "SEMITANGIBLE", "UNBREAKABLE", "ALLOWS_NATURAL_ATTACKS" ],
+ "flags": [ "LIGHT_8", "AURA", "SEMITANGIBLE", "UNBREAKABLE", "ALLOWS_NATURAL_ATTACKS", "TRANSPARENT" ],
"armor": [ { "covers": [ "head" ] } ]
},
{
@@ -108,7 +108,7 @@
"sided": true,
"material_thickness": 4,
"techniques": [ "WBLOCK_3" ],
- "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "BLOCK_WHILE_WORN" ],
+ "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "BLOCK_WHILE_WORN", "TRANSPARENT" ],
"armor": [ { "encumbrance": 10, "coverage": 70, "covers": [ "arm_l", "arm_r", "hand_l", "hand_r" ] } ],
"melee_damage": { "bash": 14 }
},
@@ -130,7 +130,7 @@
"material_thickness": 0.2,
"environmental_protection": 2,
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MOVE_COST", "add": -5 } ] } ] },
- "flags": [ "OVERSIZE", "WATERPROOF", "ROLLER_QUAD", "BELTED" ],
+ "flags": [ "OVERSIZE", "WATERPROOF", "ROLLER_QUAD", "BELTED", "TRANSPARENT" ],
"armor": [ { "encumbrance": 0, "coverage": 100, "covers": [ "foot_l", "foot_r" ] } ],
"melee_damage": { "bash": 6 }
},
@@ -295,7 +295,8 @@
"ONLY_ONE",
"NO_REPAIR",
"NO_SALVAGE",
- "ZERO_WEIGHT"
+ "ZERO_WEIGHT",
+ "TRANSPARENT"
],
"armor": [ { "encumbrance": [ 5, 10 ], "coverage": 40, "covers": [ "torso" ] } ]
},
@@ -612,7 +613,8 @@
"NO_TAKEOFF",
"NONCONDUCTIVE",
"UNBREAKABLE",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"armor": [
{
@@ -634,7 +636,7 @@
"symbol": "o",
"color": "white",
"material": [ "magical_material" ],
- "flags": [ "PERSONAL", "SEMITANGIBLE", "OVERSIZE", "ONLY_ONE", "TRADER_AVOID", "NO_TAKEOFF", "NONCONDUCTIVE" ],
+ "flags": [ "PERSONAL", "SEMITANGIBLE", "OVERSIZE", "ONLY_ONE", "TRADER_AVOID", "NO_TAKEOFF", "NONCONDUCTIVE", "TRANSPARENT" ],
"relic_data": { "passive_effects": [ { "id": "ench_aura_feral" } ] }
},
{
@@ -649,7 +651,7 @@
"symbol": "o",
"color": "white",
"material": [ "magical_material" ],
- "flags": [ "PERSONAL", "SEMITANGIBLE", "OVERSIZE", "ONLY_ONE", "TRADER_AVOID", "NO_TAKEOFF", "NONCONDUCTIVE" ],
+ "flags": [ "PERSONAL", "SEMITANGIBLE", "OVERSIZE", "ONLY_ONE", "TRADER_AVOID", "NO_TAKEOFF", "NONCONDUCTIVE", "TRANSPARENT" ],
"relic_data": { "passive_effects": [ { "id": "ench_aura_feral_plus" } ] }
},
{
@@ -767,7 +769,8 @@
"NONCONDUCTIVE",
"OVERSIZE",
"UNBREAKABLE",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "id": "ench_aura_caustic" } ] }
},
@@ -811,7 +814,8 @@
"GOODCARDIO",
"ANIMALDISCORD2",
"MUTE",
- "LARGE_OK"
+ "LARGE_OK",
+ "TRANSPARENT"
]
}
]
@@ -839,7 +843,8 @@
"OVERSIZE",
"PADDED",
"UNBREAKABLE",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": {
"passive_effects": [
@@ -872,7 +877,16 @@
"color": "light_gray",
"qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 12 ] ],
"weapon_category": [ "CLAWS" ],
- "flags": [ "UNBREAKABLE_MELEE", "NONCONDUCTIVE", "NO_UNWIELD", "MAGIC_FOCUS", "TRADER_AVOID", "NO_REPAIR", "NO_SALVAGE" ],
+ "flags": [
+ "UNBREAKABLE_MELEE",
+ "NONCONDUCTIVE",
+ "NO_UNWIELD",
+ "MAGIC_FOCUS",
+ "TRADER_AVOID",
+ "NO_REPAIR",
+ "NO_SALVAGE",
+ "TRANSPARENT"
+ ],
"techniques": [ "WBLOCK_2", "RAPID" ],
"relic_data": { "passive_effects": [ { "id": "ench_subzero_talons" } ] },
"armor": [
@@ -896,7 +910,7 @@
"material": [ "concentrated_mana" ],
"warmth": 0,
"material_thickness": 0,
- "flags": [ "ONLY_ONE", "OVERSIZE", "PERSONAL", "STURDY", "NO_REPAIR", "NO_SALVAGE", "TRADER_AVOID", "PADDED" ],
+ "flags": [ "ONLY_ONE", "OVERSIZE", "PERSONAL", "STURDY", "NO_REPAIR", "NO_SALVAGE", "TRADER_AVOID", "PADDED", "TRANSPARENT" ],
"relic_data": { "passive_effects": [ { "id": "ench_armor_spirit" } ] },
"armor": [
{
@@ -969,7 +983,7 @@
],
"material_thickness": 3.3,
"environmental_protection": 8,
- "flags": [ "ONLY_ONE", "OVERSIZE", "PERSONAL", "STURDY", "PADDED" ]
+ "flags": [ "ONLY_ONE", "OVERSIZE", "PERSONAL", "STURDY", "PADDED", "TRANSPARENT" ]
},
{
"id": "pocket_sun",
@@ -1039,7 +1053,7 @@
"weight_multiplier": 0
}
],
- "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "BELTED", "WATERPROOF", "PADDED", "TARDIS" ],
+ "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "BELTED", "WATERPROOF", "PADDED", "TARDIS", "TRANSPARENT" ],
"armor": [ { "covers": [ "arm_l" ], "coverage": 0, "encumbrance": 0 } ]
},
{
@@ -1248,7 +1262,8 @@
"TRADER_AVOID",
"PSYSHIELD_PARTIAL",
"UNBREAKABLE",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
]
},
{
@@ -1283,7 +1298,8 @@
"PSYSHIELD_PARTIAL",
"PORTAL_PROOF",
"UNBREAKABLE",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
]
},
{
@@ -1438,7 +1454,8 @@
"TRADER_AVOID",
"NO_REPAIR",
"NO_TAKEOFF",
- "NONCONDUCTIVE"
+ "NONCONDUCTIVE",
+ "TRANSPARENT"
],
"relic_data": {
"passive_effects": [
diff --git a/data/mods/MindOverMatter/items/psions_summon_items.json b/data/mods/MindOverMatter/items/psions_summon_items.json
index 971e3fda561f1..a2ee5b6c248b5 100644
--- a/data/mods/MindOverMatter/items/psions_summon_items.json
+++ b/data/mods/MindOverMatter/items/psions_summon_items.json
@@ -21,7 +21,8 @@
"REBREATHER",
"WATER_FRIENDLY",
"ONLY_ONE",
- "NO_DROP"
+ "NO_DROP",
+ "TRANSPARENT"
],
"environmental_protection": -5,
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
@@ -48,7 +49,8 @@
"SEMITANGIBLE",
"ONLY_ONE",
"WATER_FRIENDLY",
- "NO_DROP"
+ "NO_DROP",
+ "TRANSPARENT"
],
"qualities": [
[ "WRENCH", 1 ],
@@ -81,7 +83,8 @@
"NONCONDUCTIVE",
"UNBREAKABLE",
"ZERO_WEIGHT",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
"armor": [
@@ -110,7 +113,8 @@
"NONCONDUCTIVE",
"UNBREAKABLE",
"ZERO_WEIGHT",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
"armor": [
@@ -139,7 +143,8 @@
"NONCONDUCTIVE",
"UNBREAKABLE",
"ZERO_WEIGHT",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
"armor": [
@@ -168,7 +173,8 @@
"NONCONDUCTIVE",
"UNBREAKABLE",
"ZERO_WEIGHT",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
"armor": [
@@ -197,7 +203,8 @@
"NONCONDUCTIVE",
"UNBREAKABLE",
"ZERO_WEIGHT",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
"armor": [
@@ -226,7 +233,8 @@
"NONCONDUCTIVE",
"UNBREAKABLE",
"ZERO_WEIGHT",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
"armor": [
@@ -248,7 +256,7 @@
"price_postapoc": 0,
"symbol": "[",
"color": "dark_gray",
- "flags": [ "RAD_DETECT", "PERSONAL", "ZERO_WEIGHT" ],
+ "flags": [ "RAD_DETECT", "PERSONAL", "ZERO_WEIGHT", "TRANSPARENT" ],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] }
},
{
@@ -272,7 +280,8 @@
"ZERO_WEIGHT",
"NO_UNLOAD",
"NO_RELOAD",
- "IS_UPS"
+ "IS_UPS",
+ "TRANSPARENT"
],
"pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "battery": 1000 } } ],
"relic_data": { "charge_info": { "recharge_type": "periodic", "time": "2 s", "regenerate_ammo": true } },
@@ -339,7 +348,18 @@
"price_postapoc": 1,
"symbol": "$",
"color": "red",
- "flags": [ "PERSONAL", "PADDED", "UNBREAKABLE", "INTEGRATED", "SEMITANGIBLE", "ZERO_WEIGHT", "LIGHT_20", "FIRE", "NO_DROP" ],
+ "flags": [
+ "PERSONAL",
+ "PADDED",
+ "UNBREAKABLE",
+ "INTEGRATED",
+ "SEMITANGIBLE",
+ "ZERO_WEIGHT",
+ "LIGHT_20",
+ "FIRE",
+ "NO_DROP",
+ "TRANSPARENT"
+ ],
"qualities": [ [ "BLOW_HOT_AIR", 1 ] ],
"use_action": [ { "type": "firestarter", "moves": 30 }, { "type": "HEAT_FOOD" } ],
"relic_data": { "passive_effects": [ { "has": "HELD", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
@@ -364,7 +384,8 @@
"SEMITANGIBLE",
"NO_DROP",
"INTEGRATED",
- "PADDED"
+ "PADDED",
+ "TRANSPARENT"
],
"use_action": [ { "type": "transform", "target": "item_photokinetic_radio_on", "menu_text": "Switch to scanning mode" } ],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] }
@@ -386,7 +407,8 @@
"ZERO_WEIGHT",
"NO_DROP",
"INTEGRATED",
- "PADDED"
+ "PADDED",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] }
},
@@ -401,7 +423,18 @@
"price_postapoc": 1,
"symbol": "$",
"color": "red",
- "flags": [ "PERSONAL", "PADDED", "UNBREAKABLE", "INTEGRATED", "SEMITANGIBLE", "ZERO_WEIGHT", "LIGHT_50", "FIRE", "NO_DROP" ],
+ "flags": [
+ "PERSONAL",
+ "PADDED",
+ "UNBREAKABLE",
+ "INTEGRATED",
+ "SEMITANGIBLE",
+ "ZERO_WEIGHT",
+ "LIGHT_50",
+ "FIRE",
+ "NO_DROP",
+ "TRANSPARENT"
+ ],
"qualities": [ [ "WELD", 2 ] ],
"use_action": [ { "type": "firestarter", "moves": 10 }, { "type": "OXYTORCH" } ],
"relic_data": { "passive_effects": [ { "has": "HELD", "condition": "ALWAYS", "values": [ { "value": "MAX_MANA", "add": 0 } ] } ] },
@@ -420,7 +453,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -448,7 +481,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -476,7 +509,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -504,7 +537,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -532,7 +565,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -560,7 +593,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -588,7 +621,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -616,7 +649,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -644,7 +677,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -672,7 +705,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -700,7 +733,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -728,7 +761,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -756,7 +789,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -784,7 +817,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -812,7 +845,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -840,7 +873,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -868,7 +901,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -896,7 +929,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -924,7 +957,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -952,7 +985,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -980,7 +1013,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1008,7 +1041,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1036,7 +1069,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1064,7 +1097,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1092,7 +1125,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1120,7 +1153,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1148,7 +1181,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1176,7 +1209,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1204,7 +1237,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1232,7 +1265,7 @@
"symbol": "[",
"looks_like": "ragpouch",
"color": "yellow",
- "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT" ],
+ "flags": [ "INTEGRATED", "UNBREAKABLE", "AURA", "NO_SALVAGE", "TARDIS", "ZERO_WEIGHT", "TRANSPARENT" ],
"pocket_data": [
{
"pocket_type": "CONTAINER",
diff --git a/data/mods/Xedra_Evolved/items/ethereal_items.json b/data/mods/Xedra_Evolved/items/ethereal_items.json
index 1319cab411466..307cff127af5d 100644
--- a/data/mods/Xedra_Evolved/items/ethereal_items.json
+++ b/data/mods/Xedra_Evolved/items/ethereal_items.json
@@ -19,7 +19,8 @@
"NO_TAKEOFF",
"NONCONDUCTIVE",
"UNBREAKABLE",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "BONUS_DODGE", "add": 2 } ] } ] },
"armor": [
@@ -51,7 +52,8 @@
"NO_TAKEOFF",
"NONCONDUCTIVE",
"UNBREAKABLE",
- "ALLOWS_NATURAL_ATTACKS"
+ "ALLOWS_NATURAL_ATTACKS",
+ "TRANSPARENT"
],
"relic_data": {
"passive_effects": [
diff --git a/doc/MUTATIONS.md b/doc/MUTATIONS.md
index 42c3a91cfb9d0..e2910c71e2f90 100644
--- a/doc/MUTATIONS.md
+++ b/doc/MUTATIONS.md
@@ -145,6 +145,7 @@ Note that **all new traits that can be obtained through mutation must be purifia
"cancels": [ "ROT1", "ROT2", "ROT3" ], // Cancels these mutations when mutating.
"changes_to": [ "FASTHEALER2" ], // Can change into these mutations when mutating further.
"leads_to": [ ], // Mutations that add to this one.
+ "prevented_by": [ "LEAVES2" ], // Can't mutate toward this mutation if you have the listed one.
"passive_mods": { // Increases stats with the listed value. Negative means a stat reduction.
"per_mod": 1, // Possible values: per_mod, str_mod, dex_mod, int_mod
"str_mod": 2
diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp
index b27b3a7cbdbee..9159c7a5f65b5 100644
--- a/src/activity_handlers.cpp
+++ b/src/activity_handlers.cpp
@@ -139,6 +139,7 @@ static const activity_id ACT_MULTIPLE_FISH( "ACT_MULTIPLE_FISH" );
static const activity_id ACT_MULTIPLE_MINE( "ACT_MULTIPLE_MINE" );
static const activity_id ACT_MULTIPLE_MOP( "ACT_MULTIPLE_MOP" );
static const activity_id ACT_MULTIPLE_READ( "ACT_MULTIPLE_READ" );
+static const activity_id ACT_MUTANT_TREE_COMMUNION( "ACT_MUTANT_TREE_COMMUNION" );
static const activity_id ACT_OPERATION( "ACT_OPERATION" );
static const activity_id ACT_PICKAXE( "ACT_PICKAXE" );
static const activity_id ACT_PLANT_SEED( "ACT_PLANT_SEED" );
@@ -221,8 +222,10 @@ static const species_id species_HUMAN( "HUMAN" );
static const species_id species_ZOMBIE( "ZOMBIE" );
static const trait_id trait_DEBUG_HS( "DEBUG_HS" );
+static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" );
static const trait_id trait_SPIRITUAL( "SPIRITUAL" );
static const trait_id trait_STOCKY_TROGLO( "STOCKY_TROGLO" );
+static const trait_id trait_THRESH_PLANT( "THRESH_PLANT" );
static const zone_type_id zone_type_FARM_PLOT( "FARM_PLOT" );
@@ -244,6 +247,7 @@ activity_handlers::do_turn_functions = {
{ ACT_MULTIPLE_MOP, multiple_mop_do_turn },
{ ACT_MULTIPLE_BUTCHER, multiple_butcher_do_turn },
{ ACT_MULTIPLE_FARM, multiple_farm_do_turn },
+ { ACT_MUTANT_TREE_COMMUNION, mutant_tree_communion_do_turn },
{ ACT_FETCH_REQUIRED, fetch_do_turn },
{ ACT_BUILD, build_do_turn },
{ ACT_EAT_MENU, eat_menu_do_turn },
@@ -1581,6 +1585,45 @@ void activity_handlers::fill_liquid_do_turn( player_activity *act, Character *yo
}
}
+void activity_handlers::mutant_tree_communion_do_turn( player_activity *act, Character *you )
+{
+ int communioncycles = 0;
+ // The mutant tree is intelligent, but communicating via mycelium is slow
+ if( calendar::once_every( 2_minutes ) ) {
+ bool adjacent_mutant_tree = false;
+ map &here = get_map();
+ for( const tripoint &p2 : here.points_in_radius( you->pos(), 1 ) ) {
+ if( here.has_flag( ter_furn_flag::TFLAG_MUTANT_TREE, p2 ) ) {
+ adjacent_mutant_tree = true;
+ }
+ }
+ if( adjacent_mutant_tree == false ) {
+ if( you->has_trait( trait_THRESH_PLANT ) && !you->has_trait( trait_PSYCHOPATH ) ) {
+ you->add_msg_if_player( m_bad,
+ _( "A shock runs through your xylem as you realize your connection to the mutant tree has been lost." ) );
+ you->add_morale( MORALE_FEELING_BAD, -10, 10, 6_hours, 2_hours );
+ } else {
+ you->add_msg_if_player(
+ _( "You feel a sense of loss as you realize your connection to the mutant tree has been cut off." ) );
+ }
+ act->set_to_null();
+ }
+ if( one_in( 128 ) ) {
+ communioncycles += 1;
+ you->add_msg_if_player( "%s", SNIPPET.random_from_category( "mutant_tree_communion" ).value_or(
+ translation() ) );
+ you->add_morale( MORALE_TREE_COMMUNION, 4, 30, 18_hours, 8_hours );
+ you->mod_daily_health( rng( 0, 1 ), 5 );
+ if( communioncycles >= 20 ) {
+ you->add_msg_if_player(
+ _( "You retract your roots, feeling a lingering sense of warmth after your communion." ) );
+ you->add_morale( MORALE_TREE_COMMUNION, 20, 20, 18_hours, 8_hours );
+ act->set_to_null();
+ }
+ }
+ }
+}
+
// Repurposing the activity's index to convey the number of friends participating
void activity_handlers::generic_game_turn_handler( player_activity *act, Character *you,
int morale_bonus, int morale_max_bonus )
@@ -3250,7 +3293,7 @@ void activity_handlers::plant_seed_finish( player_activity *act, Character *you
} else {
here.furn_set( examp, f_plant_seed );
}
- you->add_msg_player_or_npc( _( "You plant some %s." ), _( " plants some %s." ),
+ you->add_msg_player_or_npc( _( "You plant your %s." ), _( " plants their %s." ),
item::nname( seed_id ) );
}
// Go back to what we were doing before
@@ -3658,10 +3701,35 @@ void activity_handlers::pull_creature_finish( player_activity *act, Character *y
void activity_handlers::tree_communion_do_turn( player_activity *act, Character *you )
{
// There's an initial rooting process.
+ bool adjacent_mutant_tree = false;
if( act->values.front() > 0 ) {
act->values.front() -= 1;
if( act->values.front() == 0 ) {
- if( you->has_trait( trait_id( trait_SPIRITUAL ) ) ) {
+ map &here = get_map();
+ for( const tripoint &p2 : here.points_in_radius( you->pos(), 1 ) ) {
+ if( here.has_flag( ter_furn_flag::TFLAG_MUTANT_TREE, p2 ) ) {
+ adjacent_mutant_tree = true;
+ }
+ }
+ if( adjacent_mutant_tree == true ) {
+ uilist mutant_tree_query;
+ mutant_tree_query.text = string_format(
+ _( "Something familiar reaches out to your roots as the communion begins." ) );
+ mutant_tree_query.addentry( 1, true, 'f', _( "Focus only on the mutant tree." ) );
+ mutant_tree_query.addentry( 2, true, 's',
+ _( "Spread your roots in communion with all nearby trees." ) );
+ mutant_tree_query.query();
+ switch( mutant_tree_query.ret ) {
+ case 1:
+ you->assign_activity( ACT_MUTANT_TREE_COMMUNION );
+ return;
+ case 2:
+ add_msg( m_neutral, _( "The mutant tree's voice blends with the chorus of green." ) );
+ return;
+ default:
+ return;
+ }
+ } else if( you->has_trait( trait_id( trait_SPIRITUAL ) ) ) {
you->add_msg_if_player( m_good, _( "The ancient tree spirits answer your call." ) );
} else {
you->add_msg_if_player( m_good, _( "Your communion with the trees has begun." ) );
diff --git a/src/activity_handlers.h b/src/activity_handlers.h
index 1b29b437a43eb..de9d961494337 100644
--- a/src/activity_handlers.h
+++ b/src/activity_handlers.h
@@ -188,6 +188,7 @@ void multiple_fish_do_turn( player_activity *act, Character *you );
void multiple_read_do_turn( player_activity *act, Character *you );
void multiple_mine_do_turn( player_activity *act, Character *you );
void multiple_mop_do_turn( player_activity *act, Character *you );
+void mutant_tree_communion_do_turn( player_activity *act, Character *you );
void operation_do_turn( player_activity *act, Character *you );
void pickaxe_do_turn( player_activity *act, Character *you );
void pulp_do_turn( player_activity *act, Character *you );
@@ -218,6 +219,7 @@ void gunmod_add_finish( player_activity *act, Character *you );
void heat_item_finish( player_activity *act, Character *you );
void jackhammer_finish( player_activity *act, Character *you );
void mend_item_finish( player_activity *act, Character *you );
+void mutant_tree_communion_finish( player_activity *act, Character *you );
void operation_finish( player_activity *act, Character *you );
void pickaxe_finish( player_activity *act, Character *you );
void plant_seed_finish( player_activity *act, Character *you );
diff --git a/src/character.cpp b/src/character.cpp
index 4c7d070a72841..ca21d8fe776b7 100644
--- a/src/character.cpp
+++ b/src/character.cpp
@@ -5043,6 +5043,34 @@ void Character::update_needs( int rate_multiplier )
}
}
+ map &here = get_map();
+ if( calendar::once_every( 10_minutes ) && ( has_trait( trait_CHLOROMORPH ) ||
+ has_trait( trait_M_SKIN3 ) || has_trait( trait_WATERSLEEP ) ) &&
+ here.is_outside( pos() ) ) {
+ if( has_trait( trait_CHLOROMORPH ) && get_map().has_flag( ter_furn_flag::TFLAG_PLOWABLE, pos() ) &&
+ is_barefoot() ) {
+ if( get_thirst() >= -40 ) {
+ mod_thirst( -5 );
+ }
+ // Assuming eight hours of sleep, this will take care of Iron and Calcium needs
+ vitamin_mod( vitamin_iron, 2 );
+ vitamin_mod( vitamin_calcium, 2 );
+ }
+ if( has_trait( trait_M_SKIN3 ) ) {
+ // Spores happen!
+ if( here.has_flag_ter_or_furn( ter_furn_flag::TFLAG_FUNGUS, pos() ) ) {
+ if( get_fatigue() >= 0 ) {
+ mod_fatigue( -5 ); // Local guides need less sleep on fungal soil
+ }
+ if( calendar::once_every( 1_hours ) ) {
+ spores(); // spawn some P O O F Y B O I S
+ }
+ }
+ }
+ if( has_trait( trait_WATERSLEEP ) ) {
+ mod_fatigue( -3 ); // Fish sleep less in water
+ }
+ }
}
if( is_avatar() && wasnt_fatigued && get_fatigue() > fatigue_levels::DEAD_TIRED && !lying ) {
if( !activity ) {
@@ -8926,8 +8954,6 @@ void Character::fall_asleep()
// If you're not fatigued enough for 10 days, you won't sleep the whole thing.
// In practice, the fatigue from filling the tank from (no msg) to Time For Bed
// will last about 8 days.
- } else if( has_active_mutation( trait_CHLOROMORPH ) ) {
- fall_asleep( 1_days );
} else {
fall_asleep( 10_hours ); // default max sleep time.
}
@@ -10935,7 +10961,6 @@ int Character::sleep_spot( const tripoint &p ) const
int sleepy = static_cast( comfort_info.level );
bool watersleep = has_trait( trait_WATERSLEEP );
- bool activechloro = has_active_mutation( trait_CHLOROMORPH );
if( has_addiction( addiction_sleeping_pill ) ) {
sleepy -= 4;
@@ -10947,7 +10972,8 @@ int Character::sleep_spot( const tripoint &p ) const
sleepy += 10; //comfy water!
}
- if( activechloro ) {
+ if( has_trait( trait_CHLOROMORPH ) &&
+ get_map().has_flag_ter( ter_furn_flag::TFLAG_PLOWABLE, pos() ) ) {
sleepy += 25; // It's time for a nice nap.
}
diff --git a/src/character_attire.cpp b/src/character_attire.cpp
index a75213592fcd0..c1ab16acfcdfb 100644
--- a/src/character_attire.cpp
+++ b/src/character_attire.cpp
@@ -2351,11 +2351,14 @@ void outfit::bodypart_exposure( std::map &bp_exposure,
// What body parts does this item cover?
body_part_set covered = it.get_covered_body_parts();
for( const bodypart_id &bp : all_body_parts ) {
+ float part_exposure = 1.0;
if( !covered.test( bp.id() ) ) {
continue;
}
// How much exposure does this item leave on this part? (1.0 == naked)
- float part_exposure = ( 100 - it.get_coverage( bp ) ) / 100.0f;
+ if( !it.has_flag( flag_TRANSPARENT ) ) {
+ part_exposure = ( 100 - it.get_coverage( bp ) ) / 100.0f;
+ }
// Coverage multiplies, so two layers with 50% coverage will together give 75%
bp_exposure[bp] *= part_exposure;
}
diff --git a/src/flag.cpp b/src/flag.cpp
index 6bff6d9147004..0389207f55f6f 100644
--- a/src/flag.cpp
+++ b/src/flag.cpp
@@ -334,6 +334,7 @@ const flag_id flag_TOW_CABLE( "TOW_CABLE" );
const flag_id flag_TRADER_AVOID( "TRADER_AVOID" );
const flag_id flag_TRADER_KEEP( "TRADER_KEEP" );
const flag_id flag_TRADER_KEEP_EQUIPPED( "TRADER_KEEP_EQUIPPED" );
+const flag_id flag_TRANSPARENT( "TRANSPARENT" );
const flag_id flag_TWO_WAY_RADIO( "TWO_WAY_RADIO" );
const flag_id flag_UNBREAKABLE( "UNBREAKABLE" );
const flag_id flag_UNBREAKABLE_MELEE( "UNBREAKABLE_MELEE" );
diff --git a/src/flag.h b/src/flag.h
index 5d142cfb4d537..d12a88d160937 100644
--- a/src/flag.h
+++ b/src/flag.h
@@ -340,6 +340,7 @@ extern const flag_id flag_TOW_CABLE;
extern const flag_id flag_TRADER_AVOID;
extern const flag_id flag_TRADER_KEEP;
extern const flag_id flag_TRADER_KEEP_EQUIPPED;
+extern const flag_id flag_TRANSPARENT;
extern const flag_id flag_TWO_WAY_RADIO;
extern const flag_id flag_UNBREAKABLE;
extern const flag_id flag_UNBREAKABLE_MELEE;
diff --git a/src/item.cpp b/src/item.cpp
index f28c2e97c1619..bdcea20e42fbd 100644
--- a/src/item.cpp
+++ b/src/item.cpp
@@ -13997,6 +13997,30 @@ std::string item::get_plant_name() const
return type->seed->plant_name.translated();
}
+std::optional item::get_plant_seedling_form() const
+{
+ if( !type->seed ) {
+ return std::nullopt;
+ }
+ return type->seed->seedling_form;
+}
+
+std::optional item::get_plant_mature_form() const
+{
+ if( !type->seed ) {
+ return std::nullopt;
+ }
+ return type->seed->mature_form;
+}
+
+std::optional item::get_plant_harvestable_form() const
+{
+ if( !type->seed ) {
+ return std::nullopt;
+ }
+ return type->seed->harvestable_form;
+}
+
bool item::is_dangerous() const
{
if( has_flag( flag_DANGEROUS ) ) {
diff --git a/src/item.h b/src/item.h
index 607554d455ba0..859cf5bae5f3d 100644
--- a/src/item.h
+++ b/src/item.h
@@ -1983,8 +1983,19 @@ class item : public visitable
* translated. Returns an empty string for non-seed items.
*/
std::string get_plant_name() const;
+ /**
+ * Furniture ID of what the plant grows into. Defaults to f_plant_seedling
+ */
+ std::optional get_plant_seedling_form() const;
+ /**
+ * Furniture ID of what the plant grows into. Defaults to f_plant_mature
+ */
+ std::optional get_plant_mature_form() const;
+ /**
+ * Furniture ID of what the plant grows into. Defaults to f_plant_harvestable
+ */
+ std::optional get_plant_harvestable_form() const;
/*@}*/
-
/**
* @name Armor related functions.
*
diff --git a/src/item_factory.cpp b/src/item_factory.cpp
index 841b507f2bbf6..9dee8ab711f0d 100644
--- a/src/item_factory.cpp
+++ b/src/item_factory.cpp
@@ -69,6 +69,10 @@ static const ammotype ammo_NULL( "NULL" );
static const damage_type_id damage_bash( "bash" );
static const damage_type_id damage_bullet( "bullet" );
+static const furn_str_id furn_f_plant_harvest( "f_plant_harvest" );
+static const furn_str_id furn_f_plant_mature( "f_plant_mature" );
+static const furn_str_id furn_f_plant_seedling( "f_plant_seedling" );
+
static const gun_mode_id gun_mode_DEFAULT( "DEFAULT" );
static const gun_mode_id gun_mode_MELEE( "MELEE" );
@@ -3396,6 +3400,9 @@ void islot_seed::load( const JsonObject &jo )
mandatory( jo, was_loaded, "fruit", fruit_id );
optional( jo, was_loaded, "seeds", spawn_seeds, true );
optional( jo, was_loaded, "byproducts", byproducts );
+ optional( jo, was_loaded, "seedling_form", seedling_form, furn_f_plant_seedling );
+ optional( jo, was_loaded, "mature_form", mature_form, furn_f_plant_mature );
+ optional( jo, was_loaded, "harvestable_form", harvestable_form, furn_f_plant_harvest );
optional( jo, was_loaded, "required_terrain_flag", required_terrain_flag,
ter_furn_flag::TFLAG_PLANTABLE );
}
diff --git a/src/itype.h b/src/itype.h
index d82a905b699c6..67c15f358c5a9 100644
--- a/src/itype.h
+++ b/src/itype.h
@@ -1075,6 +1075,18 @@ struct islot_seed {
* Name of the plant.
*/
translation plant_name;
+ /**
+ * What the plant sprouts into. Defaults to f_plant_seedling.
+ */
+ furn_str_id seedling_form;
+ /**
+ * What the plant grows into. Defaults to f_plant_mature.
+ */
+ furn_str_id mature_form;
+ /**
+ * The plant's final growth stage. Defaults to f_plant_harvest.
+ */
+ furn_str_id harvestable_form;
/**
* Type id of the fruit item.
*/
diff --git a/src/map.cpp b/src/map.cpp
index e892177ff7366..10cc9a4bc03a6 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -8242,6 +8242,7 @@ void map::grow_plant( const tripoint &p )
furn_set( p, f_null );
return;
}
+ //furn.name() = seed->get_plant_name();
const time_duration plantEpoch = seed->get_plant_epoch();
if( seed->age() >= plantEpoch * furn.plant->growth_multiplier &&
!furn.has_flag( ter_furn_flag::TFLAG_GROWTH_HARVEST ) ) {
@@ -8259,12 +8260,13 @@ void map::grow_plant( const tripoint &p )
}
rotten_item_spawn( *seed, p );
- furn_set( p, furn_str_id( furn.plant->transform ) );
+ //Become a seedling
+ std::optional seedling_form = seed->get_plant_seedling_form();
+ furn_set( p, furn_str_id( seedling_form.value() ) );
} else if( seed->age() < plantEpoch * 3 * furn.plant->growth_multiplier ) {
if( has_flag_furn( ter_furn_flag::TFLAG_GROWTH_MATURE, p ) ) {
return;
}
-
// Remove fertilizer if any
map_stack::iterator fertilizer = std::find_if( items.begin(), items.end(), []( const item & it ) {
return it.has_flag( flag_FERTILIZER );
@@ -8272,13 +8274,15 @@ void map::grow_plant( const tripoint &p )
if( fertilizer != items.end() ) {
items.erase( fertilizer );
}
-
rotten_item_spawn( *seed, p );
//You've skipped the seedling stage so roll monsters twice
if( !has_flag_furn( ter_furn_flag::TFLAG_GROWTH_SEEDLING, p ) ) {
rotten_item_spawn( *seed, p );
}
- furn_set( p, furn_str_id( furn.plant->transform ) );
+ //Become a mature plant
+ std::optional mature_form = seed->get_plant_mature_form();
+ furn_set( p, furn_str_id( mature_form.value() ) );
+
} else {
//You've skipped two stages so roll monsters two times
if( has_flag_furn( ter_furn_flag::TFLAG_GROWTH_SEEDLING, p ) ) {
@@ -8293,7 +8297,9 @@ void map::grow_plant( const tripoint &p )
rotten_item_spawn( *seed, p );
rotten_item_spawn( *seed, p );
}
- furn_set( p, furn_str_id( furn.plant->transform ) );
+ //Become a harvestable plant.
+ std::optional harvestable_form = seed->get_plant_harvestable_form();
+ furn_set( p, furn_str_id( harvestable_form.value() ) );
}
}
}
diff --git a/src/mapdata.cpp b/src/mapdata.cpp
index 025541d606ec8..a39cefd7c7389 100644
--- a/src/mapdata.cpp
+++ b/src/mapdata.cpp
@@ -206,6 +206,7 @@ std::string enum_to_string( ter_furn_flag data )
case ter_furn_flag::TFLAG_PLOWABLE: return "PLOWABLE";
case ter_furn_flag::TFLAG_ORGANIC: return "ORGANIC";
case ter_furn_flag::TFLAG_CONSOLE: return "CONSOLE";
+ case ter_furn_flag::TFLAG_TREE_PLANTABLE: return "TREE_PLANTABLE";
case ter_furn_flag::TFLAG_PLANTABLE: return "PLANTABLE";
case ter_furn_flag::TFLAG_GROWTH_HARVEST: return "GROWTH_HARVEST";
case ter_furn_flag::TFLAG_MOUNTABLE: return "MOUNTABLE";
@@ -264,6 +265,7 @@ std::string enum_to_string( ter_furn_flag data )
case ter_furn_flag::TFLAG_GRAZABLE: return "GRAZABLE";
case ter_furn_flag::TFLAG_GRAZER_INEDIBLE: return "GRAZER_INEDIBLE";
case ter_furn_flag::TFLAG_BROWSABLE: return "BROWSABLE";
+ case ter_furn_flag::TFLAG_MUTANT_TREE: return "MUTANT_TREE";
// *INDENT-ON*
case ter_furn_flag::NUM_TFLAG_FLAGS:
diff --git a/src/mapdata.h b/src/mapdata.h
index ff929ec4e8123..959ab1cdbf4aa 100644
--- a/src/mapdata.h
+++ b/src/mapdata.h
@@ -173,6 +173,7 @@ struct plant_data {
* FLOWER - This furniture is a flower
* SHRUB - This terrain is a shrub
* TREE - This terrain is a tree
+ * MUTANT_TREE - This furniture is a special tree grown from a post-thresh plant mutant, probably the player
* HARVESTED - This terrain has been harvested so it won't bear any fruit
* YOUNG - This terrain is a young tree
* FUNGUS - Fungal covered
@@ -258,6 +259,7 @@ enum class ter_furn_flag : int {
TFLAG_PLOWABLE,
TFLAG_ORGANIC,
TFLAG_CONSOLE,
+ TFLAG_TREE_PLANTABLE,
TFLAG_PLANTABLE,
TFLAG_GROWTH_HARVEST,
TFLAG_MOUNTABLE,
@@ -313,6 +315,7 @@ enum class ter_furn_flag : int {
TFLAG_ACTIVE_GENERATOR,
TFLAG_SMALL_HIDE,
TFLAG_NO_FLOOR_WATER,
+ TFLAG_MUTANT_TREE,
NUM_TFLAG_FLAGS
};
diff --git a/src/mutation.cpp b/src/mutation.cpp
index 0e6bf07e3d0e7..d4ae930861877 100644
--- a/src/mutation.cpp
+++ b/src/mutation.cpp
@@ -59,6 +59,8 @@ static const json_character_flag json_flag_SMALL( "SMALL" );
static const json_character_flag json_flag_TINY( "TINY" );
static const json_character_flag json_flag_TREE_COMMUNION_PLUS( "TREE_COMMUNION_PLUS" );
+static const move_mode_id move_mode_prone( "prone" );
+
static const mtype_id mon_player_blob( "mon_player_blob" );
static const mutation_category_id mutation_category_ANY( "ANY" );
@@ -876,20 +878,25 @@ void Character::activate_mutation( const trait_id &mut )
return;
} else if( mut == trait_TREE_COMMUNION || mut == trait_ARVORE_FOREST_MAPPING ) {
tdata.powered = false;
- if( !overmap_buffer.ter( global_omt_location() ).obj().is_wooded() ) {
- add_msg_if_player( m_info, _( "You can only do that in a wooded area." ) );
- return;
- }
// Check for adjacent trees.
bool adjacent_tree = false;
+ bool adjacent_mutant_tree = false;
map &here = get_map();
for( const tripoint &p2 : here.points_in_radius( pos(), 1 ) ) {
if( here.has_flag( ter_furn_flag::TFLAG_TREE, p2 ) ) {
adjacent_tree = true;
}
+ if( here.has_flag( ter_furn_flag::TFLAG_MUTANT_TREE, p2 ) ) {
+ adjacent_mutant_tree = true;
+ }
+ }
+ if( !overmap_buffer.ter( global_omt_location() ).obj().is_wooded() && !adjacent_mutant_tree ) {
+ add_msg_if_player( m_info, _( "You can only do that in a wooded area." ) );
+ return;
}
+
if( !adjacent_tree ) {
- add_msg_if_player( m_info, _( "You can only do that next to a tree." ) );
+ add_msg_if_player( m_info, _( "You can only do that next to a fully grown tree." ) );
return;
}
@@ -899,8 +906,9 @@ void Character::activate_mutation( const trait_id &mut )
has_flag( json_flag_CHLOROMORPH ) ) {
add_msg_if_player( _( "You reach out to the trees with your roots." ) );
} else {
+ set_movement_mode( move_mode_prone );
add_msg_if_player(
- _( "You lay next to the trees letting your hair roots tangle with the trees." ) );
+ _( "You lie down, letting your hair roots tangle with the tree's." ) );
}
assign_activity( ACT_TREE_COMMUNION );
@@ -1479,9 +1487,11 @@ bool Character::mutate_towards( const trait_id &mut, const mutation_category_id
bool c_has_both_prereqs = false;
bool c_has_prereq1 = false;
bool c_has_prereq2 = false;
+ bool c_has_prevented_by = false;
std::vector canceltrait;
std::vector prereqs1 = mdata.prereqs;
std::vector prereqs2 = mdata.prereqs2;
+ std::vector prevented_by = mdata.prevented_by;
std::vector cancel = mdata.cancels;
std::vector same_type = get_mutations_in_types( mdata.types );
std::vector all_prereqs = get_all_mutation_prereqs( mut );
@@ -1500,6 +1510,14 @@ bool Character::mutate_towards( const trait_id &mut, const mutation_category_id
}
}
+ for( size_t i = 0; ( !c_has_prevented_by ) && i < prevented_by.size(); i++ ) {
+ if( has_trait( prevented_by[i] ) ) {
+ add_msg_debug( debugmode::DF_MUTATION,
+ "mutate_towards: tried to gain %s, but it's prevented by an existing mutation.", mdata.id.c_str() );
+ return false;
+ }
+ }
+
std::vector cancel_recheck = cancel;
for( size_t i = 0; i < cancel.size(); i++ ) {
diff --git a/src/mutation.h b/src/mutation.h
index cb23c1b236360..76980df4675d0 100644
--- a/src/mutation.h
+++ b/src/mutation.h
@@ -402,6 +402,8 @@ struct mutation_branch {
std::set flags; // Mutation flags
std::set active_flags; // Mutation flags only when active
std::set inactive_flags; // Mutation flags only when inactive
+ std::vector
+ prevented_by; // Traits listed here will block this mutation from being acquired
std::map protection; // Mutation wet effects
std::map encumbrance_always; // Mutation encumbrance that always applies
// Mutation encumbrance that applies when covered with unfitting item
diff --git a/src/mutation_data.cpp b/src/mutation_data.cpp
index 3729fffec0ecc..b6e511ac7314c 100644
--- a/src/mutation_data.cpp
+++ b/src/mutation_data.cpp
@@ -502,6 +502,7 @@ void mutation_branch::load( const JsonObject &jo, const std::string &src )
optional( jo, was_loaded, "active_flags", active_flags, flag_reader{} );
optional( jo, was_loaded, "inactive_flags", inactive_flags, flag_reader{} );
optional( jo, was_loaded, "types", types, string_reader{} );
+ optional( jo, was_loaded, "prevented_by", prevented_by, trait_reader{} );
for( JsonArray pair : jo.get_array( "moncams" ) ) {
moncams.insert( std::pair( mtype_id( pair.get_string( 0 ) ), pair.get_int( 1 ) ) );
diff --git a/src/npc.cpp b/src/npc.cpp
index 7a1429ce04551..c6569db2bfdf5 100644
--- a/src/npc.cpp
+++ b/src/npc.cpp
@@ -3979,4 +3979,4 @@ std::unique_ptr get_talker_for( npc &guy )
std::unique_ptr get_talker_for( npc *guy )
{
return std::make_unique( guy );
-}
+}
\ No newline at end of file
diff --git a/src/player_hardcoded_effects.cpp b/src/player_hardcoded_effects.cpp
index 7569f762cc4b8..8c369825cd99f 100644
--- a/src/player_hardcoded_effects.cpp
+++ b/src/player_hardcoded_effects.cpp
@@ -123,13 +123,9 @@ static const trait_id trait_HEAVYSLEEPER2( "HEAVYSLEEPER2" );
static const trait_id trait_HIBERNATE( "HIBERNATE" );
static const trait_id trait_INFRESIST( "INFRESIST" );
static const trait_id trait_M_IMMUNE( "M_IMMUNE" );
-static const trait_id trait_M_SKIN3( "M_SKIN3" );
static const trait_id trait_THRESH_MYCUS( "THRESH_MYCUS" );
-static const trait_id trait_WATERSLEEP( "WATERSLEEP" );
static const vitamin_id vitamin_blood( "blood" );
-static const vitamin_id vitamin_calcium( "calcium" );
-static const vitamin_id vitamin_iron( "iron" );
static const vitamin_id vitamin_redcells( "redcells" );
static void eff_fun_onfire( Character &u, effect &it )
@@ -1030,45 +1026,6 @@ static void eff_fun_sleep( Character &u, effect &it )
it.set_duration( 1_turns * dice( 3, 100 ) );
}
- // TODO: Move this to update_needs when NPCs can mutate
- if( calendar::once_every( 10_minutes ) && ( u.has_trait( trait_CHLOROMORPH ) ||
- u.has_trait( trait_M_SKIN3 ) || u.has_trait( trait_WATERSLEEP ) ) &&
- here.is_outside( u.pos() ) ) {
- if( u.has_trait( trait_CHLOROMORPH ) ) {
- // Hunger and thirst fall before your Chloromorphic physiology!
- if( incident_sun_irradiance( get_weather().weather_id, calendar::turn ) > irradiance::low ) {
- if( u.has_active_mutation( trait_CHLOROMORPH ) && ( u.get_fatigue() <= 25 ) ) {
- u.set_fatigue( 25 );
- }
- if( u.get_hunger() >= -30 ) {
- u.mod_hunger( -5 );
- // photosynthesis warrants absorbing kcal directly
- u.mod_stored_kcal( 43 );
- }
- }
- if( u.get_thirst() >= -40 ) {
- u.mod_thirst( -5 );
- }
- // Assuming eight hours of sleep, this will take care of Iron and Calcium needs
- u.vitamin_mod( vitamin_iron, 2 );
- u.vitamin_mod( vitamin_calcium, 2 );
- }
- if( u.has_trait( trait_M_SKIN3 ) ) {
- // Spores happen!
- if( here.has_flag_ter_or_furn( ter_furn_flag::TFLAG_FUNGUS, u.pos() ) ) {
- if( u.get_fatigue() >= 0 ) {
- u.mod_fatigue( -5 ); // Local guides need less sleep on fungal soil
- }
- if( calendar::once_every( 1_hours ) ) {
- u.spores(); // spawn some P O O F Y B O I S
- }
- }
- }
- if( u.has_trait( trait_WATERSLEEP ) ) {
- u.mod_fatigue( -3 ); // Fish sleep less in water
- }
- }
-
// Check mutation category strengths to see if we're mutated enough to get a dream
// If we've crossed a threshold, always show dreams for that category
// Otherwise, check for the category that we have the most vitamins in our blood for
diff --git a/src/suffer.cpp b/src/suffer.cpp
index 5ce3558d76000..501bff45dc022 100644
--- a/src/suffer.cpp
+++ b/src/suffer.cpp
@@ -133,21 +133,30 @@ static const trait_id trait_ASTHMA( "ASTHMA" );
static const trait_id trait_CHAOTIC( "CHAOTIC" );
static const trait_id trait_CHAOTIC_BAD( "CHAOTIC_BAD" );
static const trait_id trait_CHEMIMBALANCE( "CHEMIMBALANCE" );
+static const trait_id trait_CHLOROMORPH( "CHLOROMORPH" );
static const trait_id trait_DEBUG_NOTEMP( "DEBUG_NOTEMP" );
static const trait_id trait_FRESHWATEROSMOSIS( "FRESHWATEROSMOSIS" );
static const trait_id trait_HAS_NEMESIS( "HAS_NEMESIS" );
+static const trait_id trait_JAUNDICE( "JAUNDICE" );
static const trait_id trait_JITTERY( "JITTERY" );
static const trait_id trait_KILLER( "KILLER" );
static const trait_id trait_LEAVES( "LEAVES" );
static const trait_id trait_LEAVES2( "LEAVES2" );
+static const trait_id trait_LEAVES2_FALL( "LEAVES2_FALL" );
static const trait_id trait_LEAVES3( "LEAVES3" );
+static const trait_id trait_LEAVES3_FALL( "LEAVES3_FALL" );
static const trait_id trait_MOODSWINGS( "MOODSWINGS" );
static const trait_id trait_MUCUS_SECRETION( "MUCUS_SECRETION" );
static const trait_id trait_M_BLOSSOMS( "M_BLOSSOMS" );
static const trait_id trait_M_SPORES( "M_SPORES" );
static const trait_id trait_NARCOLEPTIC( "NARCOLEPTIC" );
static const trait_id trait_NONADDICTIVE( "NONADDICTIVE" );
+static const trait_id trait_NO_LEFT_ARM( "NO_LEFT_ARM" );
+static const trait_id trait_NO_LEFT_LEG( "NO_LEFT_LEG" );
+static const trait_id trait_NO_RIGHT_ARM( "NO_RIGHT_ARM" );
+static const trait_id trait_NO_RIGHT_LEG( "NO_RIGHT_LEG" );
static const trait_id trait_PER_SLIME( "PER_SLIME" );
+static const trait_id trait_PLANTSKIN( "PLANTSKIN" );
static const trait_id trait_PYROMANIA( "PYROMANIA" );
static const trait_id trait_RADIOACTIVE1( "RADIOACTIVE1" );
static const trait_id trait_RADIOACTIVE2( "RADIOACTIVE2" );
@@ -166,6 +175,9 @@ static const trait_id trait_TROGLO( "TROGLO" );
static const trait_id trait_TROGLO2( "TROGLO2" );
static const trait_id trait_TROGLO3( "TROGLO3" );
static const trait_id trait_UNSTABLE( "UNSTABLE" );
+static const trait_id trait_VINES1( "VINES1" );
+static const trait_id trait_VINES2( "VINES2" );
+static const trait_id trait_VINES3( "VINES3" );
static const trait_id trait_VOMITOUS( "VOMITOUS" );
static const trait_id trait_WEB_SPINNER( "WEB_SPINNER" );
static const trait_id trait_WEB_WEAVER( "WEB_WEAVER" );
@@ -176,7 +188,7 @@ static const vitamin_id vitamin_vitC( "vitC" );
namespace suffer
{
static void from_sunburn( Character &you, bool severe );
-static void in_sunlight( Character &you );
+static void in_sunlight( Character &you, outfit &worn );
static void water_damage( Character &you, const trait_id &mut_id );
static void mutation_power( Character &you, const trait_id &mut_id );
static void while_underwater( Character &you );
@@ -641,7 +653,7 @@ void suffer::from_asthma( Character &you, const int current_stim )
}
}
-void suffer::in_sunlight( Character &you )
+void suffer::in_sunlight( Character &you, outfit &worn )
{
const tripoint position = you.pos();
@@ -651,30 +663,136 @@ void suffer::in_sunlight( Character &you )
const bool leafy = you.has_trait( trait_LEAVES ) ||
you.has_trait( trait_LEAVES2 ) ||
- you.has_trait( trait_LEAVES3 );
+ you.has_trait( trait_LEAVES2_FALL ) ||
+ you.has_trait( trait_LEAVES3 ) ||
+ you.has_trait( trait_LEAVES3_FALL ) ||
+ you.has_trait( trait_PLANTSKIN ) ||
+ you.has_trait( trait_JAUNDICE );
+ float phelloderm_surface = 0.0;
+ float exposure = 0.0;
int sunlight_nutrition = 0;
if( leafy ) {
- const bool leafier = you.has_trait( trait_LEAVES2 );
- const bool leafiest = you.has_trait( trait_LEAVES3 );
- const double sleeve_factor = you.armwear_factor();
- const bool has_hat = you.wearing_something_on( bodypart_id( "head" ) );
+ // Phelloderm and bark photosynthesize.
+ if( you.has_trait( trait_PLANTSKIN ) || you.has_trait( trait_JAUNDICE ) ) {
+ std::map bp_exposure = you.bodypart_exposure();
+ for( auto &bp_exp : bp_exposure ) {
+ bodypart_id bp = bp_exp.first;
+ exposure = bp_exp.second;
+ if( ( ( ( bp == body_part_arm_l ) || ( bp == body_part_hand_l ) ) &&
+ you.has_trait( trait_NO_LEFT_ARM ) )
+ || ( ( ( bp == body_part_arm_r ) || ( bp == body_part_hand_r ) ) &&
+ you.has_trait( trait_NO_RIGHT_ARM ) )
+ || ( ( ( bp == body_part_leg_l ) || ( bp == body_part_foot_l ) ) &&
+ you.has_trait( trait_NO_LEFT_LEG ) )
+ || ( ( ( bp == body_part_leg_r ) || ( bp == body_part_foot_r ) ) &&
+ you.has_trait( trait_NO_RIGHT_LEG ) ) ) {
+ exposure = 0.0;
+ }
+ phelloderm_surface += exposure;
+ }
+ // The Jaundice mutation means you have some chloroplasts in your skin, but not as many.
+ if( you.has_trait( trait_JAUNDICE ) ) {
+ phelloderm_surface *= .5;
+ };
+ // Multiply phelloderm_surface here so we can average it with head_exposure later.
+ phelloderm_surface *= 8.33;
+ }
+ // The Jaundice mutation means you have some chloroplasts in your skin, but not as many.
+ if( you.has_trait( trait_JAUNDICE ) ) {
+ phelloderm_surface *= .5;
+ }
+ // Multiply phelloderm_surface here so we can average it with head_exposure later.
+ phelloderm_surface *= 8.33;
+ const bool leafier = you.has_trait( trait_LEAVES2 ) || you.has_trait( trait_LEAVES2_FALL );
+ const bool leafiest = you.has_trait( trait_LEAVES3 ) || you.has_trait( trait_LEAVES3_FALL );
+ const bodypart_id left_arm( "arm_l" );
+ const bodypart_id right_arm( "arm_r" );
+ const bodypart_id head( "head" );
+ // TODO: Limbify vines and give them some way to be covered. For now they will use the average of your arm coverage.
+ // We'll assume they poke out of your sleeves to do their thing.
+ float head_leaf_surface = 100 - worn.coverage_with_flags_exclude( head, { flag_INTEGRATED, flag_TRANSPARENT } );
+ float rarm_leaf_surface = .5 - ( worn.coverage_with_flags_exclude( right_arm, { flag_INTEGRATED, flag_TRANSPARENT } )
+ * .005 );
+ float larm_leaf_surface = .5 - ( worn.coverage_with_flags_exclude( left_arm, { flag_INTEGRATED, flag_TRANSPARENT } )
+ * .005 );
+ float vine_leaf_surface = rarm_leaf_surface + larm_leaf_surface;
+ if( you.has_trait( trait_NO_LEFT_ARM ) ) {
+ larm_leaf_surface = .0;
+ }
+ if( you.has_trait( trait_NO_RIGHT_ARM ) ) {
+ rarm_leaf_surface = .0;
+ }
+ if( you.has_trait( trait_VINES1 ) ) {
+ vine_leaf_surface = vine_leaf_surface * 0.5;
+ }
+ if( !you.has_trait( trait_VINES1 ) && !you.has_trait( trait_VINES2 ) &&
+ !you.has_trait( trait_VINES3 ) ) {
+ vine_leaf_surface = 0;
+ }
const float weather_factor = std::min( incident_sun_irradiance( get_weather().weather_id,
calendar::turn ) / irradiance::moderate, 1.f );
const int player_local_temp = units::to_fahrenheit( get_weather().get_temperature( position ) );
- const int flux = ( player_local_temp - 65 ) / 2;
- if( !has_hat ) {
- sunlight_nutrition += ( 100 + flux ) * weather_factor;
- }
+ int flux = ( player_local_temp - 32 ) / 5;
+ // Efficiency rapidly falls off when it's too hot due to photosynthesis being an enzymatic process.
+ // Some tropical plants can overcome this with specific adaptations, but that would probably be its own mutation.
+ if( player_local_temp > 104 ) {
+ flux -= ( player_local_temp - 104 ) * 3;
+ }
+ if( you.has_trait( trait_LEAVES ) ) {
+ head_leaf_surface *= .5;
+ }
+ if( you.has_trait( trait_LEAVES3 ) ) {
+ head_leaf_surface *= 1.5;
+ }
+ if( you.has_trait( trait_LEAVES3 ) ) {
+ head_leaf_surface *= 1.75;
+ }
+ if( you.has_trait( trait_LEAVES2_FALL ) || you.has_trait( trait_LEAVES3_FALL ) ) {
+ vine_leaf_surface *= .9;
+ larm_leaf_surface *= .9;
+ rarm_leaf_surface *= .9;
+ head_leaf_surface *= .9;
+ }
+ if( !you.has_trait( trait_LEAVES ) && !you.has_trait( trait_LEAVES2 ) &&
+ !you.has_trait( trait_LEAVES2_FALL ) && !you.has_trait( trait_LEAVES3 ) &&
+ !you.has_trait( trait_LEAVES3_FALL ) ) {
+ head_leaf_surface = 0;
+ }
+ sunlight_nutrition += ( ( 20 + flux ) * weather_factor ) * ( ( head_leaf_surface +
+ phelloderm_surface ) / 200 );
if( leafier || leafiest ) {
- const int rate = ( 100 * sleeve_factor + flux ) * 2;
- sunlight_nutrition += rate * ( leafiest ? 2 : 1 ) * weather_factor;
+ const int rate = std::max( round( 7 * ( ( larm_leaf_surface + rarm_leaf_surface +
+ vine_leaf_surface ) / 2 ) + flux ), 0.0f ) * 2;
+ sunlight_nutrition += rate * ( leafiest ? 1.75 : 1.5 ) * weather_factor;
+ }
+ you.get_size();
+ // Multiply by the proportional difference in average height, as height roughly determines armspan,
+ // and that's how far out our branches extend.
+ if( you.get_size() == creature_size::tiny ) {
+ sunlight_nutrition *= .015;
+ }
+ if( you.get_size() == creature_size::small ) {
+ sunlight_nutrition *= .7;
+ }
+ if( you.get_size() == creature_size::large ) {
+ sunlight_nutrition *= 1.54;
+ }
+ if( you.get_size() == creature_size::huge ) {
+ sunlight_nutrition *= 2.35;
+ }
+ // Chloromorph makes photosynthesis more efficient while the animal parts are in sleep mode.
+ if( you.has_effect( effect_sleep ) && you.has_trait( trait_CHLOROMORPH ) ) {
+ sunlight_nutrition *= 1.1;
}
- }
- if( x_in_y( sunlight_nutrition, 18000 ) ) {
- you.vitamin_mod( vitamin_vitC, 1 );
+ if( x_in_y( sunlight_nutrition, 12000 ) ) {
+ you.vitamin_mod( vitamin_vitC, 1 );
+ you.mod_hunger( -1 );
+ // Photosynthesis absorbs kcal directly.
+ you.mod_stored_kcal( 1 );
+ you.stomach.ate();
+ }
}
-
if( you.has_flag( json_flag_SUNBURN ) ) {
suffer::from_sunburn( you, true );
}
@@ -831,20 +949,30 @@ void suffer::from_sunburn( Character &you, bool severe )
}
// If no UV-/glare-protection gear is worn the eyes should be treated as unprotected
exposure = 1.0;
- } else if( ( you.get_wielded_item() && you.get_wielded_item()->has_flag( flag_RAIN_PROTECT ) )
+ } else if( ( you.get_wielded_item() && you.get_wielded_item()->has_flag( flag_RAIN_PROTECT ) &&
+ !you.get_wielded_item()->has_flag( flag_TRANSPARENT ) )
|| ( ( bp == body_part_hand_l || bp == body_part_hand_r )
&& you.worn_with_flag( flag_POCKETS )
&& you.can_use_pockets() )
|| ( bp == body_part_head
&& you.worn_with_flag( flag_HOOD )
&& you.can_use_hood() )
+ || ( ( ( bp == body_part_arm_l ) || ( bp == body_part_hand_l ) ) &&
+ you.has_trait( trait_NO_LEFT_ARM ) )
+ || ( ( ( bp == body_part_arm_r ) || ( bp == body_part_hand_r ) ) &&
+ you.has_trait( trait_NO_RIGHT_ARM ) )
+ || ( ( ( bp == body_part_leg_l ) || ( bp == body_part_foot_l ) ) &&
+ you.has_trait( trait_NO_LEFT_LEG ) )
+ || ( ( ( bp == body_part_leg_r ) || ( bp == body_part_foot_r ) ) &&
+ you.has_trait( trait_NO_RIGHT_LEG ) )
|| ( bp == body_part_mouth
&& you.worn_with_flag( flag_COLLAR )
&& you.can_use_collar() ) ) {
// Eyes suffer even in the presence of the checks in this branch!
- // Umbrellas can keep the sun off all bodyparts
+ // Umbrellas can keep the sun off all bodyparts, unless you grabbed a clear one
// Pockets can keep the sun off your hands if you don't wield a too large item
// Hoods can keep the sun off your unencumbered head
+ // Missing limbs can't get sunburned
// Collars can keep the sun off your unencumbered mouth
continue;
}
@@ -1666,7 +1794,7 @@ void Character::suffer()
suffer::from_asthma( *this, current_stim );
}
- suffer::in_sunlight( *this );
+ suffer::in_sunlight( *this, worn );
suffer::from_exertion( *this );
suffer::from_item_dropping( *this );
suffer::from_other_mutations( *this );
diff --git a/tools/spell_checker/dictionary.txt b/tools/spell_checker/dictionary.txt
index c59d01044eebb..8a70a58775cca 100644
--- a/tools/spell_checker/dictionary.txt
+++ b/tools/spell_checker/dictionary.txt
@@ -2353,6 +2353,7 @@ prigs
primeside
privet
prizefights
+proc
procedurally
procompsignathids
proficiencies
@@ -3167,6 +3168,7 @@ uncured
undecipherable
underbarrel
underbody
+undercoat
undercovering
underfongen
undergrown