From 91252bd210e88f116f4b2a6357d9fc525f80bb5f Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:16:11 -0800 Subject: [PATCH 001/192] Healing fix --- code/game/objects/items/rogueitems/instruments.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/rogueitems/instruments.dm b/code/game/objects/items/rogueitems/instruments.dm index 9d5c2852e85..c1898500c2b 100644 --- a/code/game/objects/items/rogueitems/instruments.dm +++ b/code/game/objects/items/rogueitems/instruments.dm @@ -97,8 +97,9 @@ soundloop.start() for(var/mob/living/carbon/human/L in viewers(7)) L.add_stress(stressevent) - var/datum/status_effect/buff/healing/musicalhealing/heal_effect = L.apply_status_effect(/datum/status_effect/buff/healing/musicalhealing) - heal_effect.healing_on_tick = healthbonus + if(L.mind) + var/datum/status_effect/buff/healing/musicalhealing/heal_effect = L.apply_status_effect(/datum/status_effect/buff/healing/musicalhealing) + heal_effect.healing_on_tick = healthbonus else playing = FALSE soundloop.stop() From d4a60e0c79f85bfe22a1e52ca4cf34e9f6ee32ff Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sat, 23 Nov 2024 19:14:26 -0800 Subject: [PATCH 002/192] Simplification --- code/game/objects/items/rogueitems/instruments.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/rogueitems/instruments.dm b/code/game/objects/items/rogueitems/instruments.dm index c1898500c2b..9c0335ae482 100644 --- a/code/game/objects/items/rogueitems/instruments.dm +++ b/code/game/objects/items/rogueitems/instruments.dm @@ -97,7 +97,7 @@ soundloop.start() for(var/mob/living/carbon/human/L in viewers(7)) L.add_stress(stressevent) - if(L.mind) + if(!issimple(L)) var/datum/status_effect/buff/healing/musicalhealing/heal_effect = L.apply_status_effect(/datum/status_effect/buff/healing/musicalhealing) heal_effect.healing_on_tick = healthbonus else From 1d6b2e54bcab5bef82b3b15493d7fe89670d6bd7 Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sun, 24 Nov 2024 07:43:33 -0800 Subject: [PATCH 003/192] Cleric spell issue (#90) --- code/controllers/subsystem/rogue/devotion.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/rogue/devotion.dm b/code/controllers/subsystem/rogue/devotion.dm index 39da862d71c..feb945118b7 100644 --- a/code/controllers/subsystem/rogue/devotion.dm +++ b/code/controllers/subsystem/rogue/devotion.dm @@ -132,7 +132,7 @@ if(!H || !H.mind || !patron) return - var/list/spelllist = list(/obj/effect/proc_holder/spell/targeted/churn, patron.t0) + var/list/spelllist = list(/obj/effect/proc_holder/spell/targeted/churn, patron.t0, patron.t1) for(var/spell_type in spelllist) if(!spell_type || H.mind.has_spell(spell_type)) continue From 6040384ad92681708ebeb78e90254dfe9a1f59d4 Mon Sep 17 00:00:00 2001 From: 83ATR Date: Sun, 24 Nov 2024 18:54:52 +0200 Subject: [PATCH 004/192] Miscelaneous fixes and changes --- code/controllers/subsystem/rogue/magic_tab.dm | 2 +- code/datums/traits/good.dm | 2 +- .../client/customizer/customizers/organ/eyes.dm | 17 ++++++++++++----- .../carbon/human/species_types/furry/kobold.dm | 4 ++-- .../carbon/human/species_types/furry/lupian.dm | 4 ++-- .../carbon/human/species_types/furry/tabaxi.dm | 4 ++-- .../human/species_types/furry/vulpkanin.dm | 4 ++-- .../species_types/roguetown/dwarf/dwarfm.dm | 2 +- .../human/species_types/roguetown/elf/_elf.dm | 2 +- .../human/species_types/roguetown/elf/elfd.dm | 4 ++-- .../human/species_types/roguetown/elf/elfs.dm | 4 ++-- .../species_types/roguetown/other/halfelf.dm | 4 ++-- .../species_types/roguetown/other/tiefling.dm | 6 ++++-- code/modules/surgery/organs/eyes.dm | 12 ++++++++---- .../code/datums/traits/unspecial.dm | 3 ++- 15 files changed, 44 insertions(+), 30 deletions(-) diff --git a/code/controllers/subsystem/rogue/magic_tab.dm b/code/controllers/subsystem/rogue/magic_tab.dm index a1ac6c0af0d..2378b5c8604 100644 --- a/code/controllers/subsystem/rogue/magic_tab.dm +++ b/code/controllers/subsystem/rogue/magic_tab.dm @@ -20,7 +20,7 @@ // TODO: GLOBAL LISTS OF SPELLS, THIS IS PAINFUL var/list/combat_spells = list(/obj/effect/proc_holder/spell/invoked/projectile/fireball,/obj/effect/proc_holder/spell/invoked/projectile/lightningbolt,/obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e,/obj/effect/proc_holder/spell/invoked/projectile/fetch,/obj/effect/proc_holder/spell/invoked/projectile/spitfire,/obj/effect/proc_holder/spell/invoked/projectile/firebolt5e,/obj/effect/proc_holder/spell/invoked/projectile/rayoffrost5e,/obj/effect/proc_holder/spell/invoked/projectile/acidsplash5e,/obj/effect/proc_holder/spell/invoked/blade_burst,/obj/effect/proc_holder/spell/invoked/frostbite5e,/obj/effect/proc_holder/spell/invoked/poisonspray5e,/obj/effect/proc_holder/spell/invoked/arcyne_storm,/obj/effect/proc_holder/spell/invoked/chilltouch5e,/obj/effect/proc_holder/spell/invoked/infestation5e,/obj/effect/proc_holder/spell/invoked/mindsliver5e,/obj/effect/proc_holder/spell/targeted/lightninglure5e,/obj/effect/proc_holder/spell/invoked/greenflameblade5e,) var/list/defense_spells = list(/obj/effect/proc_holder/spell/invoked/forcewall_weak,/obj/effect/proc_holder/spell/self/bladeward5e,) - var/list/utility_spells = list(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,) + var/list/utility_spells = list(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,/obj/effect/proc_holder/spell/targeted/touch/prestidigitation,) var/categories = list("Combat", "Defense", "Utility", "Exit Spell Selection") diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 5fca6085f24..5d7ca76a482 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -172,7 +172,7 @@ datum/quirk/fan_mime var/obj/item/organ/eyes/eyes = H.getorgan(/obj/item/organ/eyes) if(!eyes || eyes.lighting_alpha) return - eyes.see_in_dark = 7 + eyes.see_in_dark = 7 // Same as half-darksight eyes eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT eyes.Insert(H) diff --git a/code/modules/client/customizer/customizers/organ/eyes.dm b/code/modules/client/customizer/customizers/organ/eyes.dm index eba6a3b8d12..f3d1e937bcc 100644 --- a/code/modules/client/customizer/customizers/organ/eyes.dm +++ b/code/modules/client/customizer/customizers/organ/eyes.dm @@ -75,12 +75,19 @@ /datum/customizer_choice/organ/eyes/humanoid -/datum/customizer_choice/organ/eyes/elf - organ_type = /obj/item/organ/eyes/night_vision/elf +/datum/customizer_choice/organ/eyes/full_darksight + organ_type = /obj/item/organ/eyes/night_vision/full_darksight -/datum/customizer/organ/eyes/elf - customizer_choices = list(/datum/customizer_choice/organ/eyes/elf) - default_choice = /datum/customizer_choice/organ/eyes/elf +/datum/customizer/organ/eyes/full_darksight + customizer_choices = list(/datum/customizer_choice/organ/eyes/full_darksight) + default_choice = /datum/customizer_choice/organ/eyes/full_darksight + +/datum/customizer_choice/organ/eyes/half_darksight + organ_type = /obj/item/organ/eyes/half_darksight + +/datum/customizer/organ/eyes/half_darksight + customizer_choices = list(/datum/customizer_choice/organ/eyes/half_darksight) + default_choice = /datum/customizer_choice/organ/eyes/half_darksight /datum/customizer/organ/eyes/moth customizer_choices = list(/datum/customizer_choice/organ/eyes/moth) diff --git a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm index b76b83ed91f..5360b5df2da 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm @@ -47,7 +47,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/lizard, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -60,7 +60,7 @@ ORGAN_SLOT_HORNS = /obj/item/organ/horns, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid/bald_default, /datum/customizer/bodypart_feature/hair/facial/humanoid/shaved_default, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm index 939f0d58129..b1e992b79f8 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm @@ -50,7 +50,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans. ORGAN_SLOT_EARS = /obj/item/organ/ears/lupian, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -65,7 +65,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm index 8fb1ee66c1b..9b4f98612c7 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm @@ -44,7 +44,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears/tabaxi, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -59,7 +59,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm index bfe166fc1dc..d478b782552 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm @@ -42,7 +42,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans. ORGAN_SLOT_EARS = /obj/item/organ/ears/vulpkanin, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -57,7 +57,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid/vulpkian, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm index 6c8b23e095e..e35417ff0d1 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm @@ -50,7 +50,7 @@ race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/full_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/_elf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/_elf.dm index b0fa2f18723..af809965bb2 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/_elf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/_elf.dm @@ -9,7 +9,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/elf, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/full_darksight, ORGAN_SLOT_EARS = /obj/item/organ/ears, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm index 9f089d70a03..68d3ec141e5 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm @@ -66,7 +66,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/elf, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/full_darksight, ORGAN_SLOT_EARS = /obj/item/organ/ears/elf, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -79,7 +79,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/elf, + /datum/customizer/organ/eyes/full_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm index fd31a4952a9..42df77209cf 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm @@ -53,7 +53,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/elf, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/full_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears/elfw, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -66,7 +66,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/elf, + /datum/customizer/organ/eyes/full_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm index 8c78c3ae890..9e8858eb65a 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm @@ -52,7 +52,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/halfelf, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears/elfw, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -61,7 +61,7 @@ ORGAN_SLOT_ANUS = /obj/item/organ/filling_organ/anus, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm index c1549fd894e..ef06ac9683f 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm @@ -53,7 +53,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/full_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears/tiefling, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -66,13 +66,15 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/full_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, /datum/customizer/bodypart_feature/face_detail, + /* /datum/customizer/organ/horns/humanoid/tiefling, /datum/customizer/organ/tail/tiefling, + */ // Duplicates /datum/customizer/bodypart_feature/underwear, /datum/customizer/organ/horns/humanoid/tiefling, /datum/customizer/organ/tail/tiefling, diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 18428f2fa6c..efbf2faa171 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -183,17 +183,21 @@ name = "fung-eye" desc = "" -/obj/item/organ/eyes/night_vision/elf - name = "elf eyes" +// Standardized darksight eyes + +/obj/item/organ/eyes/night_vision/full_darksight + name = "darksight eyes" desc = "" see_in_dark = 14 -/obj/item/organ/eyes/halfelf - name = "half-elf eyes" +/obj/item/organ/eyes/half_darksight + name = "half-darksight eyes" desc = "" see_in_dark = 7 lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT +// + /obj/item/organ/eyes/goblin name = "goblin eyes" desc = "" diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 3d00e5a6c4f..e7bb41d3f33 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -11,7 +11,7 @@ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(!eyes) return - eyes.see_in_dark = 7 + eyes.see_in_dark = 14 // Same as full darksight eyes eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE eyes.Insert(H) @@ -314,6 +314,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/engineering, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/tanning, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/smelting, 3, TRUE) //lets be real you are taking this for smithing only. H.mind.special_items["Hammer"] = /obj/item/rogueweapon/hammer/claw //works same as normal hammer. for smithing From b376caa463c029565ff63fcb7c1a9686eae95884 Mon Sep 17 00:00:00 2001 From: 83ATR Date: Sun, 24 Nov 2024 19:14:33 +0200 Subject: [PATCH 005/192] Forgot the warlock book --- .../jobs/job_types/roguetown/adventurer/types/combat/warlock.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm index 0479396e058..a155d9f4400 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm @@ -485,7 +485,7 @@ //removed eldritch blast and infestation spell1 = pick(/obj/effect/proc_holder/spell/invoked/projectile/fireball,/obj/effect/proc_holder/spell/invoked/projectile/lightningbolt,/obj/effect/proc_holder/spell/invoked/projectile/fetch,/obj/effect/proc_holder/spell/invoked/projectile/spitfire,/obj/effect/proc_holder/spell/invoked/projectile/firebolt5e,/obj/effect/proc_holder/spell/invoked/projectile/rayoffrost5e,/obj/effect/proc_holder/spell/invoked/projectile/acidsplash5e,/obj/effect/proc_holder/spell/invoked/blade_burst,/obj/effect/proc_holder/spell/invoked/frostbite5e,/obj/effect/proc_holder/spell/invoked/poisonspray5e,/obj/effect/proc_holder/spell/invoked/arcyne_storm,/obj/effect/proc_holder/spell/invoked/chilltouch5e,/obj/effect/proc_holder/spell/invoked/mindsliver5e,/obj/effect/proc_holder/spell/targeted/lightninglure5e,/obj/effect/proc_holder/spell/invoked/greenflameblade5e,) spell2 = pick(/obj/effect/proc_holder/spell/invoked/forcewall_weak,/obj/effect/proc_holder/spell/self/bladeward5e,) - spell3 = pick(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,) + spell3 = pick(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,/obj/effect/proc_holder/spell/targeted/touch/prestidigitation,) /obj/item/book/rogue/eldritch/equipped(mob/living/user) From d67c69d876d302636a6280933a5e0fe38595165b Mon Sep 17 00:00:00 2001 From: Murderfox Date: Mon, 25 Nov 2024 03:56:39 +1030 Subject: [PATCH 006/192] Druid Description / Vault Deepening The vault is getting expanded. - it is now deeper. Harder to reach (though not impossible to break into because IT SHOULD BE POSSIBLE WITH SKILL! (cope!!) - Flavortext for the lore of the setting towards both roles. Yippee! --- _maps/map_files/dreamhold/Dreamhold.dmm | 659 +++++++++--------- .../jobs/job_types/roguetown/church/druid.dm | 2 +- .../roguetown/goblin/tribalshaman.dm | 2 +- 3 files changed, 337 insertions(+), 326 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 69dc842529f..5691f613ed9 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -473,10 +473,8 @@ name = "Shores of the Emerald Coast" }) "auK" = ( -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/structure/closet/crate/chest/dungeon/treasure, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/turf/open/floor/rogue/greenstone, +/area/rogue/under/cavewet) "auO" = ( /obj/structure/flora/roguetree/burnt, /turf/open/floor/rogue/dirt/road, @@ -1548,10 +1546,8 @@ name = "Shrine of Natures" }) "bhN" = ( -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/structure/closet/crate/chest/dungeon/mimic, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/under/cavewet) "biE" = ( /obj/effect/spawner/roguemap/treeorbush, /turf/open/floor/rogue/grass, @@ -3801,6 +3797,13 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"dcD" = ( +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/structure/closet/crate/chest/dungeon/treasure, +/obj/item/roguegem/blue, +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/naturalstone, +/area/rogue/under/cavewet) "dcK" = ( /obj/structure/flora/grass/jungle/b, /mob/living/simple_animal/hostile/retaliate/rogue/saiga, @@ -3976,11 +3979,8 @@ first_time_text = "The Dreamers Demesne.." }) "diM" = ( -/obj/structure/stairs/stone{ - dir = 4 - }, -/turf/open/floor/rogue/dirt, -/area/rogue/under/cavewet/bogcaves) +/turf/open/floor/rogue/naturalstone, +/area/rogue/under/cavewet) "diU" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/water/cleanshallow, @@ -4438,15 +4438,10 @@ name = "Ravenloft Academy" }) "dzN" = ( -/obj/structure/closet/crate/chest, -/obj/item/scomstone, -/obj/item/scomstone, -/obj/item/scomstone, -/obj/item/scomstone, -/obj/item/scomstone, -/obj/item/scomstone, +/obj/structure/roguemachine/scomm, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/area/rogue/under/cavewet) "dzU" = ( /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/bath{ @@ -5020,14 +5015,16 @@ name = "Silver Dragon" }) "dYz" = ( -/obj/structure/mineral_door/wood/donjon{ - locked = 1; - lockid = "vault"; - max_integrity = 4000; - name = "reinforced treasury door" - }, +/obj/structure/closet/crate/chest, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, /turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/area/rogue/under/cavewet) "dYB" = ( /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ @@ -5828,13 +5825,11 @@ /turf/open/floor/carpet/red, /area/rogue/indoors/shelter/town) "eFh" = ( -/obj/item/bodypart/r_arm/rprosthetic/clock, -/obj/item/bodypart/l_leg/rprosthetic/clock, -/obj/item/bodypart/r_leg/rprosthetic/clock, -/obj/item/bodypart/l_arm/rprosthetic/clock, +/obj/structure/closet/crate/chest/dungeon/treasure, +/obj/effect/spawner/trap, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/area/rogue/under/cavewet) "eFk" = ( /obj/structure/table/wood{ dir = 1; @@ -12146,15 +12141,7 @@ first_time_text = "Stonehedge" }) "jJW" = ( -/obj/structure/closet/crate/chest, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/turf/open/floor/rogue/naturalstone, +/turf/closed/mineral/rogue/bedrock, /area/rogue/indoors/town/vault) "jJX" = ( /obj/structure/flora/newbranch{ @@ -13206,9 +13193,11 @@ first_time_text = "The Dreamers Demesne.." }) "kAr" = ( -/mob/living/simple_animal/hostile/retaliate/rogue/mossback, -/turf/open/floor/rogue/dirt/ambush, -/area/rogue/outdoors/river) +/obj/item/bodypart/r_arm/rprosthetic/clock, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/item/bodypart/l_leg/rprosthetic/clock, +/turf/open/floor/rogue/naturalstone, +/area/rogue/under/cavewet) "kAv" = ( /turf/closed, /area/rogue/outdoors/beach{ @@ -19565,10 +19554,14 @@ first_time_text = "The Dreamers Demesne.." }) "pKP" = ( -/obj/item/roguegem/blue, -/obj/structure/closet/crate/chest/dungeon/treasure, +/obj/structure/closet/crate/chest, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/item/roguegem/yellow, +/obj/item/roguegem/violet, +/obj/item/roguegem/red, +/obj/item/scrying, /turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/area/rogue/under/cavewet) "pKQ" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/blocks, @@ -22533,7 +22526,7 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/tavern) "rTO" = ( -/turf/closed/wall/mineral/rogue/stone/moss, +/turf/closed/wall/mineral/rogue/stone/window/moss, /area/rogue/indoors/town/vault) "rTR" = ( /obj/structure/stairs{ @@ -23434,10 +23427,9 @@ name = "far stonehedge" }) "sJF" = ( -/obj/structure/roguemachine/scomm, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/area/rogue/under/cavewet) "sJQ" = ( /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/hexstone, @@ -23678,6 +23670,13 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) +"sRq" = ( +/obj/structure/ladder, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "sRs" = ( /obj/structure/spacevine/dendor, /turf/open/floor/rogue/dirt, @@ -23760,14 +23759,13 @@ /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) "sVs" = ( -/obj/structure/closet/crate/chest, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/item/roguegem/yellow, -/obj/item/roguegem/violet, -/obj/item/roguegem/red, -/obj/item/scrying, +/obj/machinery/light/rogue/wallfire/candle/blue, +/obj/structure/roguemachine/steward{ + lockid = "vault"; + name = "COINKEEPER" + }, /turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/area/rogue/under/cavewet) "sVJ" = ( /obj/structure/flora/grass/jungle, /turf/closed/wall/mineral/rogue/decostone/mossy, @@ -25491,10 +25489,12 @@ first_time_text = "The Twilight Woods" }) "umc" = ( -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/structure/closet/crate/chest/dungeon/mimic, +/obj/item/bodypart/r_leg/rprosthetic/clock, +/obj/item/bodypart/l_arm/rprosthetic/clock, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/area/rogue/under/cavewet) "umj" = ( /obj/structure/spider/stickyweb{ dir = 8; @@ -26973,6 +26973,11 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"vwy" = ( +/obj/structure/ladder, +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/greenstone, +/area/rogue/under/cavewet) "vwV" = ( /obj/structure/bookcase, /obj/item/book/granter/spell/spells5e/bladeward5e, @@ -27172,9 +27177,14 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "vFo" = ( -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/structure/mineral_door/wood/donjon{ + locked = 1; + lockid = "vault"; + max_integrity = 4000; + name = "reinforced treasury door" + }, /turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/area/rogue/under/cavewet) "vFL" = ( /obj/machinery/light/rogue/torchholder, /turf/closed/wall/mineral/rogue/wooddark, @@ -29325,9 +29335,10 @@ /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/caves) "xAd" = ( -/mob/living/simple_animal/hostile/retaliate/rogue/mossback, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/river) +/obj/structure/closet/crate/chest/dungeon/mimic, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/turf/open/floor/rogue/naturalstone, +/area/rogue/under/cavewet) "xAs" = ( /obj/effect/spawner/roguemap/tree, /turf/open/water/cleanshallow, @@ -49365,8 +49376,6 @@ amU amU amU amU -amU -amU bLQ amU amU @@ -49378,7 +49387,9 @@ amU amU amU cAf -amU +bLQ +bLQ +bLQ amU cAf qMz @@ -49563,8 +49574,6 @@ viu ven ven tcx -cDX -cDX cCE rOl ecG @@ -49580,7 +49589,9 @@ amU amU amU amU -amU +bLQ +bLQ +bLQ amU bLQ fDV @@ -49765,8 +49776,6 @@ rOl ven rqC tcx -tcx -cDX cDX cDX cDX @@ -49784,6 +49793,8 @@ amU cAf bLQ bLQ +bLQ +bLQ cAf fDV qMz @@ -49969,8 +49980,6 @@ fyQ wSG amU amU -amU -amU cDX rOl amU @@ -49984,7 +49993,9 @@ bLQ amU bLQ bLQ -cAf +bLQ +bLQ +bLQ cAf bLQ fDV @@ -50171,8 +50182,6 @@ ven wSG amU amU -amU -amU rOl cDX hpp @@ -50186,7 +50195,9 @@ amU bLQ bLQ amU -amU +bLQ +bLQ +bLQ cAf amU gTO @@ -50373,8 +50384,6 @@ viu wSG amU amU -amU -amU iwj cDX viu @@ -50389,6 +50398,8 @@ bLQ bLQ bLQ bLQ +bLQ +bLQ cAf cAf qMz @@ -50576,8 +50587,6 @@ amU amU amU amU -amU -amU rOl tmR viu @@ -50591,6 +50600,8 @@ amU amU amU bLQ +bLQ +bLQ cAf amU qMz @@ -50779,8 +50790,6 @@ amU amU amU amU -amU -amU cDX viu rOl @@ -50794,6 +50803,8 @@ amU amU bLQ bLQ +bLQ +bLQ cAf qMz qMz @@ -50978,8 +50989,6 @@ rOl bLQ bLQ bLQ -bLQ -bLQ amU amU amU @@ -50994,21 +51003,23 @@ bLQ bLQ bLQ amU -amU +bLQ +bLQ +bLQ bLQ amU fDV gTO gTO -gTO -qMz -qMz -fDV -qMz -qMz -qMz -fDV -fDV +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM gTO gTO fDV @@ -51180,8 +51191,6 @@ rOl bLQ bLQ bLQ -bLQ -bLQ amU amU amU @@ -51196,21 +51205,23 @@ amU amU amU amU -amU +bLQ +bLQ +bLQ amU bLQ fDV gTO qMz -gTO -gTO -qMz -qMz -fDV -fDV -fDV -fDV -fDV +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM fDV fDV fDV @@ -51382,8 +51393,6 @@ rOl bLQ bLQ bLQ -bLQ -bLQ amU amU amU @@ -51399,20 +51408,22 @@ amU amU amU amU +bLQ +bLQ amU bLQ qMz gTO gTO -gTO -gTO -gTO -gTO -fDV -fDV -gTO -fDV -fDV +nhM +bhN +bhN +bhN +bhN +bhN +bhN +bhN +nhM fDV qMz fDV @@ -51586,8 +51597,6 @@ bLQ bLQ bLQ bLQ -bLQ -bLQ amU amU amU @@ -51601,22 +51610,24 @@ cDX amU amU amU +bLQ +bLQ amU bLQ qMz gTO gTO -gTO -gTO -gTO -gTO -gTO -fDV -fDV -fDV -fDV -fDV -fDV +nhM +bhN +dcD +diM +sJF +eFh +sJF +bhN +nhM +nhM +nhM fDV fDV gTO @@ -51787,8 +51798,6 @@ bLQ bLQ bLQ bLQ -bLQ -bLQ amU amU bLQ @@ -51803,22 +51812,24 @@ oas hpp amU amU +bLQ +bLQ amU bLQ gTO gTO gTO -gTO -gTO -gTO -gTO -gTO -fDV -fDV -fDV -fDV -fDV -fDV +nhM +bhN +xAd +sJF +diM +sJF +umc +bhN +nhM +nhM +nhM fDV fDV fDV @@ -51988,8 +51999,6 @@ eHu bLQ bLQ bLQ -bLQ -bLQ amU bLQ bLQ @@ -52005,22 +52014,24 @@ viu viu amU amU +bLQ +bLQ cAf amU gTO gTO gTO -gTO -gTO -gTO -gTO -qMz -gTO -fDV -fDV -fDV -fDV -fDV +nhM +bhN +kAr +diM +sJF +bhN +bhN +bhN +bhN +nhM +nhM qMz fDV fDV @@ -52189,8 +52200,6 @@ rOl eHu amU amU -bLQ -bLQ amU bLQ bLQ @@ -52207,22 +52216,24 @@ cDX viu iwj amU +bLQ +bLQ cAf amU gTO gTO gTO -gTO -gTO -qMz -gTO -qMz -qMz -qMz -fDV -qMz -qMz -fDV +nhM +bhN +dYz +sJF +sJF +vFo +auK +vwy +bhN +nhM +nhM qMz fDV fDV @@ -52393,8 +52404,6 @@ amU amU bLQ bLQ -bLQ -bLQ amU bLQ bLQ @@ -52409,22 +52418,24 @@ cDX cDX rOl amU +bLQ +bLQ amU amU gTO gTO gTO -gTO -gTO -gTO -fDV -fDV -qMz -qMz -qMz -fDV -gTO -qMz +nhM +bhN +dzN +diM +sJF +bhN +bhN +bhN +bhN +nhM +nhM fDV qMz fDV @@ -52593,8 +52604,6 @@ rOl qvI amU amU -amU -bLQ bLQ bLQ amU @@ -52611,22 +52620,24 @@ cDX rOl tvY amU +bLQ +bLQ amU amU gTO gTO gTO -qMz -qMz -gTO -fDV -fDV -qMz -fDV -fDV -fDV -qMz -qMz +nhM +bhN +sVs +xAd +pKP +bhN +nhM +nhM +nhM +nhM +nhM fDV fDV fDV @@ -52801,8 +52812,6 @@ amU amU amU amU -amU -amU bLQ amU amU @@ -52813,22 +52822,24 @@ rOl amU amU amU +bLQ +bLQ cAf bLQ fDV gTO gTO -qMz -qMz -qMz -qMz -qMz -qMz -fDV -fDV -fDV -fDV -fDV +nhM +bhN +bhN +bhN +bhN +bhN +nhM +nhM +nhM +nhM +nhM fDV fDV fDV @@ -52997,8 +53008,6 @@ riB rOl wSG wSG -pla -wSG amU amU bLQ @@ -53015,20 +53024,22 @@ rOl amU amU amU +bLQ +bLQ cAf bLQ fDV gTO qMz -qMz -gTO -gTO -fDV -gTO -qMz -qMz -fDV -fDV +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM fDV qMz fDV @@ -53199,8 +53210,6 @@ pla rOl rOl rOl -rOl -wSG amU amU bLQ @@ -53219,18 +53228,20 @@ amU amU bLQ bLQ +bLQ +bLQ fDV gTO qMz -gTO -gTO -gTO -gTO -qMz -qMz -qMz -fDV -fDV +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM qMz qMz fDV @@ -53401,8 +53412,6 @@ wSG wSG wSG pla -rOl -pla amU amU bLQ @@ -53420,6 +53429,8 @@ amU amU amU bLQ +bLQ +bLQ amU fDV gTO @@ -53603,8 +53614,6 @@ amU amU amU wSG -diM -wSG amU amU bLQ @@ -53623,6 +53632,8 @@ amU amU bLQ bLQ +bLQ +bLQ gTO gTO gTO @@ -53805,8 +53816,6 @@ amU amU amU pla -wSG -pla amU amU amU @@ -53825,6 +53834,8 @@ amU amU bLQ bLQ +bLQ +bLQ fDV qMz qMz @@ -54007,8 +54018,6 @@ amU amU amU wSG -wSG -wSG amU amU amU @@ -54026,6 +54035,8 @@ amU amU amU bLQ +bLQ +bLQ cAf qMz gTO @@ -54209,8 +54220,6 @@ wSG amU amU wSG -wSG -wSG amU amU amU @@ -54229,6 +54238,8 @@ amU bLQ bLQ bLQ +bLQ +bLQ qMz qMz gTO @@ -54414,8 +54425,6 @@ amU amU amU amU -amU -amU cDX jCr cDX @@ -54429,6 +54438,8 @@ amU amU amU bLQ +bLQ +bLQ amU amU gTO @@ -54614,8 +54625,6 @@ ecG amU amU amU -amU -amU ecG cDX viu @@ -54630,7 +54639,9 @@ amU amU amU bLQ -amU +bLQ +bLQ +bLQ amU amU fDV @@ -54815,8 +54826,6 @@ viu rOl cCE rOl -rOl -rOl cDX cDX viu @@ -54832,7 +54841,9 @@ amU amU bLQ bLQ -amU +bLQ +bLQ +bLQ amU amU fDV @@ -55017,8 +55028,6 @@ viu oGD jlE jlE -cCE -viu cDX cDX rOl @@ -55032,9 +55041,11 @@ amU amU amU bLQ -amU -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ amU amU fDV @@ -55219,8 +55230,6 @@ amU amU amU eaj -tmR -viu cDX iwj amU @@ -55233,12 +55242,14 @@ amU bLQ bLQ bLQ -amU -amU -amU +bLQ +bLQ +bLQ amU bLQ bLQ +bLQ +bLQ fDV gTO gTO @@ -55428,14 +55439,14 @@ amU amU amU amU -amU -amU bLQ bLQ bLQ -amU -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ bLQ bLQ bLQ @@ -55633,14 +55644,14 @@ amU bLQ bLQ bLQ -amU -amU -amU bLQ bLQ bLQ -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ bLQ bLQ fDV @@ -55833,11 +55844,11 @@ amU amU bLQ bLQ -amU -amU -amU -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ bLQ amU amU @@ -56035,9 +56046,9 @@ amU bLQ bLQ amU -amU -amU -amU +bLQ +bLQ +bLQ amU bLQ amU @@ -56237,9 +56248,9 @@ amU bLQ amU amU -amU -amU -amU +bLQ +bLQ +bLQ amU bLQ amU @@ -56437,11 +56448,11 @@ bLQ bLQ amU bLQ -amU -amU -amU -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ bLQ amU amU @@ -56639,9 +56650,9 @@ bLQ amU bLQ bLQ -amU -amU -amU +bLQ +bLQ +bLQ amU bLQ amU @@ -56841,7 +56852,7 @@ bLQ amU bLQ amU -amU +bLQ amU bLQ bLQ @@ -81717,10 +81728,10 @@ rxm bFf bFf rPi -tkQ +cDz cDz bFf -xAd +kqH kqH xDh cqD @@ -81919,8 +81930,8 @@ rxm bFf bFf rPi -kAr -tkQ +cDz +cDz tkQ tkQ xiN @@ -86555,10 +86566,10 @@ ifi cgq cgq rxm -rTO -vFo -vFo -dzN +jJW +jJW +jJW +jJW rTO bCN vxU @@ -86757,10 +86768,10 @@ ifi ifi ifi rxm -rTO -bhN -vFo -vFo +jJW +jJW +jJW +jJW rTO mgS vxU @@ -86959,10 +86970,10 @@ nVt nVt ifi rxm -rTO -eFh -umc -bhN +jJW +jJW +jJW +jJW rTO ekG hCp @@ -87161,12 +87172,12 @@ ifi nVt ifi rxm -rTO jJW -vFo -vFo -dYz -dYB +jJW +jJW +jJW +rTO +sRq may dYB hCp @@ -87363,10 +87374,10 @@ nVt nVt ifi rxm -rTO -sJF -vFo -auK +jJW +jJW +jJW +jJW rTO ekG hCp @@ -87565,10 +87576,10 @@ nVt ifi ifi rxm -rTO -pKP -auK -sVs +jJW +jJW +jJW +jJW rTO mgS vxU @@ -87767,10 +87778,10 @@ ifi ifi ifi rxm -rTO -rTO -rTO -rTO +jJW +jJW +jJW +jJW rTO fdl vxU diff --git a/code/modules/jobs/job_types/roguetown/church/druid.dm b/code/modules/jobs/job_types/roguetown/church/druid.dm index 3fabca31929..1eea6c90d8f 100644 --- a/code/modules/jobs/job_types/roguetown/church/druid.dm +++ b/code/modules/jobs/job_types/roguetown/church/druid.dm @@ -12,7 +12,7 @@ allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_DIVINE_PATRONS //gets set to dendor on the outfit anyways lol outfit = /datum/outfit/job/roguetown/druid - tutorial = "You have always been drawn to the wild, and the wild drawn to you. When your calling came, it was from Sylvarn. Your patron claims dominion over all of nature and promises bounty to those who act in his name to bring balance to His domain. The Wilds are the most comfortable place for you, toiling alongside soilsons and soilbrides although sometimes what lies beyond the gates fills your soul with a feral yearning." + tutorial = "You have always been drawn to the wild, and the wild drawn to you. When your calling came, it was from Nature and it's deities. You act as a medium between the natural and magickal worlds, often caught between it and the changing pace of society. The people still depend on you for wisdom and balance in this city; and it is often up to you and the various orders who survey the woodland realm to maintain any form of law: be it the lands or the peoples." display_order = JDO_DRUID give_bank_account = FALSE diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm index 738dd5b1f62..9078fbffa2f 100644 --- a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm +++ b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm @@ -7,7 +7,7 @@ spawn_positions = 1 allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS - tutorial = "A tribal druidic shaman that works with shaman magic to heal the wounded and bring the dead back. They also take care of the farming on the side." + tutorial = "A tribal druidic shaman that works with shaman magic to heal the wounded and bring even dead back. Their prowess with druidic magic allows them to grow crops and guide the tribe with their wisdoms." display_order = JDO_TRIBALSHAMAN spells = list(/obj/effect/proc_holder/spell/self/convertrole/tribal, /obj/effect/proc_holder/spell/invoked/cure_rot, /obj/effect/proc_holder/spell/invoked/heal/shaman, /obj/effect/proc_holder/spell/invoked/revive/shaman) outfit = /datum/outfit/job/roguetown/tribalshaman From 6fe386907ba1dda62a0b25ce75bad7a44efc7591 Mon Sep 17 00:00:00 2001 From: Murderfox Date: Mon, 25 Nov 2024 04:09:02 +1030 Subject: [PATCH 007/192] Update Dreamhold.dmm - fixed a missing wall from therecent serfstone vendor in the hall - flavor for the nerve master fucked w/ vault container stuff. --- _maps/map_files/dreamhold/Dreamhold.dmm | 353 ++++++++++++------------ 1 file changed, 173 insertions(+), 180 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 5691f613ed9..d2568b783f5 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -473,8 +473,10 @@ name = "Shores of the Emerald Coast" }) "auK" = ( -/turf/open/floor/rogue/greenstone, -/area/rogue/under/cavewet) +/obj/structure/closet/crate/chest/dungeon/mimic, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/turf/open/floor/rogue/naturalstone, +/area/rogue/indoors/town/vault) "auO" = ( /obj/structure/flora/roguetree/burnt, /turf/open/floor/rogue/dirt/road, @@ -1546,8 +1548,11 @@ name = "Shrine of Natures" }) "bhN" = ( -/turf/closed/wall/mineral/rogue/stone/moss, -/area/rogue/under/cavewet) +/obj/structure/closet/crate/chest/dungeon/treasure, +/obj/effect/spawner/trap, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/turf/open/floor/rogue/naturalstone, +/area/rogue/indoors/town/vault) "biE" = ( /obj/effect/spawner/roguemap/treeorbush, /turf/open/floor/rogue/grass, @@ -3797,13 +3802,6 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) -"dcD" = ( -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/structure/closet/crate/chest/dungeon/treasure, -/obj/item/roguegem/blue, -/obj/machinery/light/rogue/wallfire/candle/blue, -/turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) "dcK" = ( /obj/structure/flora/grass/jungle/b, /mob/living/simple_animal/hostile/retaliate/rogue/saiga, @@ -3979,8 +3977,14 @@ first_time_text = "The Dreamers Demesne.." }) "diM" = ( +/obj/machinery/light/rogue/wallfire/candle/blue, +/obj/structure/roguemachine/steward{ + lockid = "vault"; + name = "COINKEEPER" + }, +/obj/structure/roguemachine/camera, /turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/area/rogue/indoors/town/vault) "diU" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/water/cleanshallow, @@ -4438,10 +4442,11 @@ name = "Ravenloft Academy" }) "dzN" = ( -/obj/structure/roguemachine/scomm, +/obj/item/bodypart/r_arm/rprosthetic/clock, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/item/bodypart/l_leg/rprosthetic/clock, /turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/area/rogue/indoors/town/vault) "dzU" = ( /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/bath{ @@ -5015,16 +5020,14 @@ name = "Silver Dragon" }) "dYz" = ( -/obj/structure/closet/crate/chest, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, +/obj/structure/mineral_door/wood/donjon{ + locked = 1; + lockid = "vault"; + max_integrity = 4000; + name = "reinforced treasury door" + }, /turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/area/rogue/indoors/town/vault) "dYB" = ( /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ @@ -5825,11 +5828,10 @@ /turf/open/floor/carpet/red, /area/rogue/indoors/shelter/town) "eFh" = ( -/obj/structure/closet/crate/chest/dungeon/treasure, -/obj/effect/spawner/trap, +/obj/structure/roguemachine/camera/left, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/area/rogue/indoors/town/vault) "eFk" = ( /obj/structure/table/wood{ dir = 1; @@ -7698,7 +7700,7 @@ /obj/item/scomstone/bad, /obj/item/scomstone/bad, /obj/item/scomstone/bad, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -12141,7 +12143,15 @@ first_time_text = "Stonehedge" }) "jJW" = ( -/turf/closed/mineral/rogue/bedrock, +/obj/structure/closet/crate/chest, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/turf/open/floor/rogue/naturalstone, /area/rogue/indoors/town/vault) "jJX" = ( /obj/structure/flora/newbranch{ @@ -13193,11 +13203,8 @@ first_time_text = "The Dreamers Demesne.." }) "kAr" = ( -/obj/item/bodypart/r_arm/rprosthetic/clock, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/item/bodypart/l_leg/rprosthetic/clock, -/turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/turf/open/floor/rogue/greenstone, +/area/rogue/outdoors/caves) "kAv" = ( /turf/closed, /area/rogue/outdoors/beach{ @@ -19554,14 +19561,12 @@ first_time_text = "The Dreamers Demesne.." }) "pKP" = ( -/obj/structure/closet/crate/chest, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/item/roguegem/yellow, -/obj/item/roguegem/violet, -/obj/item/roguegem/red, -/obj/item/scrying, -/turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/obj/structure/ladder, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "pKQ" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/blocks, @@ -22526,7 +22531,7 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/tavern) "rTO" = ( -/turf/closed/wall/mineral/rogue/stone/window/moss, +/turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/town/vault) "rTR" = ( /obj/structure/stairs{ @@ -23427,9 +23432,10 @@ name = "far stonehedge" }) "sJF" = ( +/obj/structure/roguemachine/scomm, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/area/rogue/indoors/town/vault) "sJQ" = ( /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/hexstone, @@ -23670,13 +23676,6 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) -"sRq" = ( -/obj/structure/ladder, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "sRs" = ( /obj/structure/spacevine/dendor, /turf/open/floor/rogue/dirt, @@ -23759,13 +23758,14 @@ /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) "sVs" = ( -/obj/machinery/light/rogue/wallfire/candle/blue, -/obj/structure/roguemachine/steward{ - lockid = "vault"; - name = "COINKEEPER" - }, +/obj/structure/closet/crate/chest, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/item/roguegem/yellow, +/obj/item/roguegem/violet, +/obj/item/roguegem/red, +/obj/item/scrying, /turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/area/rogue/indoors/town/vault) "sVJ" = ( /obj/structure/flora/grass/jungle, /turf/closed/wall/mineral/rogue/decostone/mossy, @@ -25489,12 +25489,10 @@ first_time_text = "The Twilight Woods" }) "umc" = ( -/obj/structure/closet/crate/chest/dungeon/mimic, -/obj/item/bodypart/r_leg/rprosthetic/clock, -/obj/item/bodypart/l_arm/rprosthetic/clock, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/obj/structure/ladder, +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/greenstone, +/area/rogue/outdoors/caves) "umj" = ( /obj/structure/spider/stickyweb{ dir = 8; @@ -26973,11 +26971,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) -"vwy" = ( -/obj/structure/ladder, -/obj/machinery/light/rogue/wallfire/candle/blue/l, -/turf/open/floor/rogue/greenstone, -/area/rogue/under/cavewet) "vwV" = ( /obj/structure/bookcase, /obj/item/book/granter/spell/spells5e/bladeward5e, @@ -27177,14 +27170,9 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "vFo" = ( -/obj/structure/mineral_door/wood/donjon{ - locked = 1; - lockid = "vault"; - max_integrity = 4000; - name = "reinforced treasury door" - }, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/area/rogue/indoors/town/vault) "vFL" = ( /obj/machinery/light/rogue/torchholder, /turf/closed/wall/mineral/rogue/wooddark, @@ -28850,9 +28838,12 @@ first_time_text = "The Twilight Woods" }) "xfT" = ( -/obj/item/reagent_containers/hypospray/medipen/sealbottle/purify, -/turf/closed/wall/mineral/rogue/stone/moss, -/area/rogue/outdoors/river) +/obj/structure/closet/crate/chest/dungeon/mimic, +/obj/item/bodypart/r_leg/rprosthetic/clock, +/obj/item/bodypart/l_arm/rprosthetic/clock, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/turf/open/floor/rogue/naturalstone, +/area/rogue/indoors/town/vault) "xgm" = ( /obj/machinery/light/rogue/firebowl, /turf/open/floor/rogue/dirt, @@ -29335,10 +29326,12 @@ /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/caves) "xAd" = ( -/obj/structure/closet/crate/chest/dungeon/mimic, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/structure/closet/crate/chest/dungeon/treasure, +/obj/item/roguegem/blue, +/obj/machinery/light/rogue/wallfire/candle/blue, /turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) +/area/rogue/indoors/town/vault) "xAs" = ( /obj/effect/spawner/roguemap/tree, /turf/open/water/cleanshallow, @@ -51010,7 +51003,7 @@ bLQ amU fDV gTO -gTO +nhM nhM nhM nhM @@ -51212,7 +51205,6 @@ amU bLQ fDV gTO -qMz nhM nhM nhM @@ -51222,7 +51214,8 @@ nhM nhM nhM nhM -fDV +nhM +nhM fDV fDV fDV @@ -51414,17 +51407,17 @@ amU bLQ qMz gTO -gTO nhM -bhN -bhN -bhN -bhN -bhN -bhN -bhN nhM -fDV +rTO +rTO +rTO +rTO +rTO +rTO +rTO +nhM +nhM qMz fDV fDV @@ -51616,15 +51609,15 @@ amU bLQ qMz gTO -gTO nhM -bhN -dcD -diM -sJF +nhM +rTO +xAd eFh -sJF +vFo bhN +vFo +rTO nhM nhM nhM @@ -51818,15 +51811,15 @@ amU bLQ gTO gTO -gTO nhM -bhN -xAd -sJF -diM -sJF -umc -bhN +nhM +rTO +auK +vFo +vFo +vFo +xfT +rTO nhM nhM nhM @@ -52020,16 +52013,16 @@ cAf amU gTO gTO -gTO nhM -bhN -kAr -diM -sJF -bhN -bhN -bhN -bhN +nhM +rTO +dzN +vFo +vFo +rTO +rTO +rTO +lyF nhM nhM qMz @@ -52222,16 +52215,16 @@ cAf amU gTO gTO -gTO nhM -bhN -dYz -sJF -sJF +nhM +rTO +jJW vFo -auK -vwy -bhN +vFo +dYz +kAr +umc +lyF nhM nhM qMz @@ -52424,16 +52417,16 @@ amU amU gTO gTO -gTO nhM -bhN -dzN -diM +nhM +rTO sJF -bhN -bhN -bhN -bhN +vFo +vFo +rTO +lyF +lyF +lyF nhM nhM fDV @@ -52626,13 +52619,13 @@ amU amU gTO gTO -gTO nhM -bhN +nhM +rTO +diM +auK sVs -xAd -pKP -bhN +rTO nhM nhM nhM @@ -52828,13 +52821,13 @@ cAf bLQ fDV gTO -gTO nhM -bhN -bhN -bhN -bhN -bhN +nhM +rTO +rTO +rTO +rTO +rTO nhM nhM nhM @@ -53030,7 +53023,7 @@ cAf bLQ fDV gTO -qMz +nhM nhM nhM nhM @@ -53232,7 +53225,7 @@ bLQ bLQ fDV gTO -qMz +nhM nhM nhM nhM @@ -84758,7 +84751,7 @@ bFf bFf bFf prw -xfT +prw xDh xDh xDh @@ -86566,11 +86559,11 @@ ifi cgq cgq rxm -jJW -jJW -jJW -jJW -rTO +rxm +rxm +rxm +rxm +mgS bCN vxU wJA @@ -86768,11 +86761,11 @@ ifi ifi ifi rxm -jJW -jJW -jJW -jJW -rTO +rxm +rxm +rxm +rxm +mgS mgS vxU ekG @@ -86970,11 +86963,11 @@ nVt nVt ifi rxm -jJW -jJW -jJW -jJW -rTO +rxm +rxm +rxm +rxm +mgS ekG hCp dYB @@ -87172,12 +87165,12 @@ ifi nVt ifi rxm -jJW -jJW -jJW -jJW -rTO -sRq +rxm +rxm +rxm +rxm +mgS +pKP may dYB hCp @@ -87374,11 +87367,11 @@ nVt nVt ifi rxm -jJW -jJW -jJW -jJW -rTO +rxm +rxm +rxm +rxm +mgS ekG hCp dYB @@ -87576,11 +87569,11 @@ nVt ifi ifi rxm -jJW -jJW -jJW -jJW -rTO +rxm +rxm +rxm +rxm +mgS mgS vxU vxU @@ -87778,11 +87771,11 @@ ifi ifi ifi rxm -jJW -jJW -jJW -jJW -rTO +rxm +rxm +rxm +rxm +mgS fdl vxU cgq From fdc3c231fb58c18c36eda62808433559495cf8c3 Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sun, 24 Nov 2024 12:57:04 -0800 Subject: [PATCH 008/192] Thief Diety spell re-flavoring and revival (#94) * Thief revival * Thief flavor * Thief-flavored revival --- code/datums/gods/patrons/inhumen_pantheon.dm | 1 + .../modules/spells/roguetown/acolyte/xylix.dm | 30 +++++++------------ code/modules/spells/roguetown/acolyte/zizo.dm | 2 ++ 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/code/datums/gods/patrons/inhumen_pantheon.dm b/code/datums/gods/patrons/inhumen_pantheon.dm index 4a9f9305add..1aaf531e2f2 100644 --- a/code/datums/gods/patrons/inhumen_pantheon.dm +++ b/code/datums/gods/patrons/inhumen_pantheon.dm @@ -48,6 +48,7 @@ t1 = /obj/effect/proc_holder/spell/invoked/Joy_takes_flight t2 = /obj/effect/proc_holder/spell/invoked/Laughing_god t3 = /obj/effect/proc_holder/spell/invoked/Smokebomb + t4 = /obj/effect/proc_holder/spell/invoked/revive_inhumen/thief confess_lines = list( "I TAKE WITH SKILLED AND NIMBLE HANDS!", "THIEFLORD'S GIFT CONSUME YOU!", diff --git a/code/modules/spells/roguetown/acolyte/xylix.dm b/code/modules/spells/roguetown/acolyte/xylix.dm index b3af81f4449..eea0f4ac004 100644 --- a/code/modules/spells/roguetown/acolyte/xylix.dm +++ b/code/modules/spells/roguetown/acolyte/xylix.dm @@ -1,6 +1,6 @@ // Xylixan /obj/effect/proc_holder/spell/invoked/Joy_takes_flight - name = "Joy takes flight" + name = "Steal Speed" overlay_state = "Joy Takes Flight" releasedrain = 30 chargedrain = 0 @@ -11,7 +11,7 @@ chargedloop = null req_items = list(/obj/item/clothing/neck/roguetown/psicross) sound = 'sound/magic/webspin.ogg' - invocation = "My trick is done, I'll speed from sight! I'll move so fast that joy takes flight!" + invocation = "Take my strength and grant me swiftness!" invocation_type = "shout" associated_skill = /datum/skill/magic/holy antimagic_allowed = TRUE @@ -28,7 +28,7 @@ return FALSE /obj/effect/proc_holder/spell/invoked/Laughing_god - name = "Laughing god" + name = "Steal Time" desc = "" overlay_state = "Laughing God" releasedrain = 30 @@ -39,7 +39,7 @@ movement_interrupt = FALSE req_items = list(/obj/item/clothing/neck/roguetown/psicross) sound = 'sound/magic/webspin.ogg' - invocation = "The Trickster skirts the edges of the rule, whilst witless louts are made to act the fool!" + invocation = "Take their time!" invocation_type = "shout" associated_skill = /datum/skill/magic/holy antimagic_allowed = TRUE @@ -49,22 +49,14 @@ /obj/effect/proc_holder/spell/invoked/Laughing_god/cast(list/targets, mob/living/user) if(isliving(targets[1])) - if(prob(75)) - var/mob/living/target = targets[1] - var/giggle_to_public = pick("[target] giggles!", "[target] struggles to not chuckle!", "[target] starts to laugh!", "[target] frowns, as if they don't get the joke") - var/giggle_to_target = pick("That is so funny!", "You start to giggle!", "Your mouth turns upwards in a smile!", "What a horrible thing to say...") - target.visible_message(span_warning("[giggle_to_public]"), span_warning("[giggle_to_target]")) - target.Stun(10) - target.Jitter(rand(5)) - if(prob(66)) - target.emote(pick("giggle","laugh","chuckle")) - else - user.Stun(40) - user.visible_message(span_userdanger("Looks like I am the fool...")) - + var/mob/living/target = targets[1] + var/freeze_to_public = pick("[target] slows to a stop!", "[target] struggles to move!", "[target] freezes in place!") + var/freeze_to_target = pick("You can't seem to move!", "Your body fails you for a moment!", "Your muscles lock up!") + target.visible_message(span_warning("[freeze_to_public]"), span_warning("[freeze_to_target]")) + target.Stun(10) /obj/effect/proc_holder/spell/invoked/Smokebomb - name = "Smoke Bomb" + name = "Steal Sight" overlay_state = "Smoke Bomb" releasedrain = 30 chargedrain = 0 @@ -74,7 +66,7 @@ range = 0 warnie = "sydwarning" movement_interrupt = FALSE - invocation = "The Trickster is a clever chap, it's time to hide under his cap!" + invocation = "Steal away their sight!" invocation_type = "whisper" sound = 'sound/misc/area.ogg' associated_skill = /datum/skill/magic/holy diff --git a/code/modules/spells/roguetown/acolyte/zizo.dm b/code/modules/spells/roguetown/acolyte/zizo.dm index 2aecd3ff76c..cf02e0ead1d 100644 --- a/code/modules/spells/roguetown/acolyte/zizo.dm +++ b/code/modules/spells/roguetown/acolyte/zizo.dm @@ -134,3 +134,5 @@ return TRUE return FALSE +/obj/effect/proc_holder/spell/invoked/revive_inhumen/thief + name = "Steal Death" From 028864909f417c62ebd2006197efff52018047c5 Mon Sep 17 00:00:00 2001 From: 83ATR Date: Sun, 24 Nov 2024 22:58:16 +0200 Subject: [PATCH 009/192] Suggestions --- code/modules/surgery/organs/eyes.dm | 2 +- modular_stonehedge/code/datums/traits/unspecial.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index efbf2faa171..00cbd046770 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -194,7 +194,7 @@ name = "half-darksight eyes" desc = "" see_in_dark = 7 - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE // diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index e7bb41d3f33..ccbccc65a39 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -13,7 +13,7 @@ return eyes.see_in_dark = 14 // Same as full darksight eyes eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - eyes.Insert(H) + H.update_sight() /datum/quirk/thickskin name = "Tough" From 7d66ca4630f98062bf384345e1e2d85109248a4f Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sun, 24 Nov 2024 13:02:43 -0800 Subject: [PATCH 010/192] The Great Adventurer Stat-ening (#89) * Amazon speed buff * Hunter buffs * Bard stats * Mushroom resistance * Half-decent stats * Closer Ranger stats on Dwarf Ranger * Knife training * Swashbuckling and trickstery * Warrior perception * Dwarven warrior training * More dwarven skill * Actually this is a much better idea * Lucky archaeologist --- .../roguetown/adventurer/types/combat/amazon.dm | 1 + .../roguetown/adventurer/types/combat/barbarian.dm | 3 ++- .../roguetown/adventurer/types/combat/bard.dm | 9 +++++---- .../roguetown/adventurer/types/combat/cleric.dm | 1 + .../roguetown/adventurer/types/combat/dbomb.dm | 7 ++++--- .../adventurer/types/combat/donator/dwarfwarrior.dm | 11 +++++++++-- .../roguetown/adventurer/types/combat/dwarfranger.dm | 3 ++- .../roguetown/adventurer/types/combat/ranger.dm | 2 +- .../adventurer/types/combat/rare/treasurehunter.dm | 2 +- .../roguetown/adventurer/types/combat/rogue.dm | 2 ++ .../roguetown/adventurer/types/combat/warrior.dm | 8 +++++--- 11 files changed, 33 insertions(+), 16 deletions(-) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm index da4daf36aaf..fb972f1811f 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm @@ -40,6 +40,7 @@ H.change_stat("intelligence", -1) H.change_stat("constitution", 2) H.change_stat("endurance", 2) + H.change_stat("speed", 2) backpack_contents = list(/obj/item/restraints/legcuffs/bola, /obj/item/restraints/legcuffs/bola, /obj/item/restraints/legcuffs/bola) ADD_TRAIT(H, TRAIT_DEATHBYSNOOSNOO, TRAIT_GENERIC) //doubles sex damage ADD_TRAIT(H, TRAIT_STRONGTHROW, TRAIT_GENERIC) //mighty throws, javelins etc diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm index f17f7d5e6e5..b672d258e41 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm @@ -70,7 +70,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/craft/traps, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/labor/fishing, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 1, TRUE) @@ -91,6 +91,7 @@ armor = /obj/item/clothing/suit/roguetown/armor/leather/hide H.change_stat("intelligence", -1) // The hunter is smarter, more skilled -- but not as tough. H.change_stat("strength", 2) + H.change_stat("perception", 1) H.change_stat("constitution", 2) H.change_stat("endurance", 3) H.dna.species.soundpack_m = new /datum/voicepack/male/warrior() diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm index 5785844b59e..d45ba04365a 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm @@ -47,7 +47,7 @@ beltr = /obj/item/rogueweapon/huntingknife/idagger H.change_stat("intelligence", 1) H.change_stat("perception", 2) - H.change_stat("endurance", 1) + H.change_stat("endurance", 2) H.change_stat("speed", 2) if("Skald") H.set_blindness(0) @@ -81,11 +81,12 @@ beltl = /obj/item/storage/belt/rogue/pouch/coins/mid l_hand = /obj/item/rogueweapon/sword/iron H.change_stat("constitution", 2) - H.change_stat("strength", 1) + H.change_stat("strength", 2) H.change_stat("speed", 1) + H.change_stat("endurance", 1) if("Arcanist") H.set_blindness(0) - to_chat(H, span_warning("Some bards are can craft musical sorceries, so it makes sense some pick up actual ones. Perhaps not as good as the real deal, of course.")) + to_chat(H, span_warning("Many bards can craft musical sorceries, so it makes sense some pick up traditional sorcery. Not quite as good as the real deal, of course.")) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 2, TRUE) @@ -113,7 +114,7 @@ backl = /obj/item/storage/backpack/rogue/satchel beltl = /obj/item/storage/belt/rogue/pouch/coins/poor beltr = /obj/item/rogueweapon/huntingknife/idagger/steel - H.change_stat("intelligence", 1) + H.change_stat("intelligence", 2) H.change_stat("perception", 2) H.change_stat("endurance", 1) H.change_stat("speed", 2) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm index 5b90e4582c7..29d8cd96995 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm @@ -107,6 +107,7 @@ H.change_stat("endurance", 2) H.change_stat("speed", 1) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_GENERIC) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_glowshroom) // HEARTHSTONE ADD: cloistered cleric subclass (lighter armored and equipped) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm index da1c793e5e9..0cd61ed5ec1 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm @@ -31,11 +31,12 @@ H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/tanning, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE) - H.change_stat("strength", 1) - H.change_stat("endurance", 1) + H.change_stat("strength", 2) + H.change_stat("endurance", 2) + H.change_stat("intelligence", 2) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm index e9178cd3117..5f8edc4ea80 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm @@ -34,7 +34,6 @@ else r_hand = /obj/item/rogueweapon/halberd beltl = /obj/item/rogueweapon/huntingknife - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) @@ -44,7 +43,15 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/labor/butchering, 1, TRUE) - H.change_stat("constitution", 3) // Seven points just like Warrior. They already get a debuff racial to speed. Please do not stack it God please. + H.mind.adjust_skillrank_up_to(/datum/skill/labor/mining, 3, TRUE) + + H.change_stat("constitution", 3) // Eight points just like Warrior. They already get a debuff racial to speed. Please do not stack it God please. + H.change_stat("perception", 1) H.change_stat("strength", 2) H.change_stat("endurance", 2) ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + + H.give_fightingstyle(TRUE) + + H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/secondwind) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm index 3a70b2d8a53..abaae8ffa91 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm @@ -35,7 +35,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/tanning, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) @@ -48,3 +48,4 @@ H.change_stat("endurance", 1) H.change_stat("speed", 1) ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm index 22a408dffb8..4df83b8aa6b 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm @@ -69,7 +69,7 @@ backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/reagent_containers/glass/bottle/rogue/trekkersdelight = 1) beltl = /obj/item/quiver/arrows H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm index 3129e33deb8..22246850797 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm @@ -48,4 +48,4 @@ H.change_stat("intelligence", 1) H.change_stat("speed", 2) H.change_stat("endurance", -2) - H.change_stat("fortune", 1) + H.change_stat("fortune", 3) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm index d98183a8093..4f45906334c 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm @@ -184,6 +184,7 @@ ADD_TRAIT(H, TRAIT_NOSEGRAB, TRAIT_GENERIC) //funny nose grab. H.change_stat("strength", 1) H.change_stat("speed", 2) + H.change_stat("perception", 1) H.change_stat("intelligence", 2) H.visible_message(span_info("I trained as a swashbuckler. I have some skills and tricks under my cape.")) @@ -215,6 +216,7 @@ beltr = /obj/item/rogueweapon/huntingknife/idagger/steel beltl = /obj/item/rogueweapon/huntingknife/idagger/steel backpack_contents = list(/obj/item/lockpick) + ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) //extra damage to groin (dirty fighting) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm index eadb2b5f8ff..96d46c4b154 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm @@ -40,7 +40,8 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) H.change_stat("strength", 2) - H.change_stat("endurance", 2) // 7 stat points total as a low-skill martial role without magic. Compared to Pally with 5 points. + H.change_stat("perception", 1) + H.change_stat("endurance", 2) // 8 stat points total as a low-skill martial role without magic. Compared to Pally with 7 points. H.change_stat("constitution", 2) H.change_stat("speed", 1) shoes = /obj/item/clothing/shoes/roguetown/boots @@ -103,7 +104,7 @@ H.change_stat("endurance", 1) // Weaker endurance compared to a traditional warrior/soldier. Smarter due to study of rare magical beasts. H.change_stat("constitution", 2) H.change_stat("intelligence", 1) - H.change_stat("speed", 1) + H.change_stat("perception", 1) shoes = /obj/item/clothing/shoes/roguetown/boots gloves = /obj/item/clothing/gloves/roguetown/leather belt = /obj/item/storage/belt/rogue/leather @@ -162,7 +163,8 @@ ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DECEIVING_MEEKNESS, TRAIT_GENERIC) - H.change_stat("strength", 2) + H.change_stat("strength", 1) + H.change_stat("perception", 1) H.change_stat("endurance", 1) H.change_stat("speed", 2) H.change_stat("intelligence", 2) From e793d71e2c0eb5c778b6da0a3e45822e8330f16a Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 00:18:52 +0300 Subject: [PATCH 011/192] goddening --- .../items/rogueitems/natural/stones.dm | 2 +- code/game/objects/structures/fluff.dm | 2 +- code/game/objects/structures/hidden_doors.dm | 2 +- .../antagonists/roguetown/villain/zizocult.dm | 10 +++---- code/modules/clothing/rogueclothes/hats.dm | 8 +++--- .../job_types/roguetown/church/grandmaster.dm | 18 ++++++------- .../job_types/roguetown/church/templar.dm | 18 ++++++------- code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 2 +- .../living/simple_animal/hostile/hostile.dm | 3 +++ .../hostile/megafauna/megafauna.dm | 1 + .../mob/living/simple_animal/simple_animal.dm | 1 + .../mob/living/simple_animal/slime/slime.dm | 4 +-- .../surgery/surgeries/organ_manipulation.dm | 6 ++--- .../code/datums/traits/unspecial.dm | 12 +++++++++ modular_stonehedge/code/lewdai/lewdai.dm | 6 +++++ strings/accent_universal.json | 24 ++++++++--------- strings/phobia.json | 26 +++++++++---------- 18 files changed, 85 insertions(+), 62 deletions(-) diff --git a/code/game/objects/items/rogueitems/natural/stones.dm b/code/game/objects/items/rogueitems/natural/stones.dm index 585959e15eb..d1aa5091098 100644 --- a/code/game/objects/items/rogueitems/natural/stones.dm +++ b/code/game/objects/items/rogueitems/natural/stones.dm @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(stone_personalities, list( "Goring", "Destruction", "Hell", - "Zizo", + "Levishth", "Flames", "Darkness", "Light", diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index bb86ca3abf7..d85afb1edc4 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -1309,7 +1309,7 @@ if(!L || !message) return FALSE var/message2recognize = sanitize_hear_message(message) - if(findtext(message2recognize, "zizo")) + if(findtext(message2recognize, "levishth")) L.add_stress(/datum/stressevent/psycurse) L.adjust_fire_stacks(100) L.IgniteMob() diff --git a/code/game/objects/structures/hidden_doors.dm b/code/game/objects/structures/hidden_doors.dm index 98646121669..c1fc46f5a0d 100644 --- a/code/game/objects/structures/hidden_doors.dm +++ b/code/game/objects/structures/hidden_doors.dm @@ -253,7 +253,7 @@ proc/magic_word() "necra", "noc", "psydon", - "zizo" + "levishth" ) return pick(magic_word) diff --git a/code/modules/antagonists/roguetown/villain/zizocult.dm b/code/modules/antagonists/roguetown/villain/zizocult.dm index 223d0c08547..bbe547f8550 100644 --- a/code/modules/antagonists/roguetown/villain/zizocult.dm +++ b/code/modules/antagonists/roguetown/villain/zizocult.dm @@ -167,13 +167,13 @@ GLOBAL_LIST_EMPTY(ritualslist) /mob/living/carbon/human/proc/praise() set name = "Praise the Godhead!" - set category = "ZIZO" - audible_message("[src] praises " + span_bold("Zizo") + "!") + set category = "LEVISHTH" + audible_message("[src] praises " + span_bold("Levishth") + "!") playsound(src.loc, 'sound/vo/cult/praise.ogg', 45, 1) /mob/living/carbon/human/proc/communicate() set name = "Communicate" - set category = "ZIZO" + set category = "LEVISHTH" var/datum/game_mode/chaosmode/C = SSticker.mode var/speak = input("What do you speak of?", "HEARTHSTONE") as text|null @@ -398,7 +398,7 @@ GLOBAL_LIST_EMPTY(ritualslist) /mob/living/carbon/human/proc/draw_sigil() set name = "Draw Sigil" - set category = "ZIZO" + set category = "LEVISHTH" var/list/runes = list("Servantry", "Transmutation", "Fleshcrafting") @@ -415,7 +415,7 @@ GLOBAL_LIST_EMPTY(ritualslist) /mob/living/carbon/human/proc/release_minion() set name = "Release follower" - set category = "ZIZO" + set category = "LEVISHTH" var/datum/game_mode/chaosmode/C = SSticker.mode var/list/mob/living/carbon/human/possible = list() diff --git a/code/modules/clothing/rogueclothes/hats.dm b/code/modules/clothing/rogueclothes/hats.dm index d7bf7dcb209..21a48c82d94 100644 --- a/code/modules/clothing/rogueclothes/hats.dm +++ b/code/modules/clothing/rogueclothes/hats.dm @@ -1963,7 +1963,7 @@ "Stripes"="stripes_decoration", "Red Castle"="castle_red_decoration", "White Castle"="castle_white_decoration", - "Graggar"="graggar_decoration", + "Jayx"="graggar_decoration", "Efreet"="efreet_decoration", "Sun"="sun_decoration", "Feathers"="feathers_decoration", @@ -2017,7 +2017,7 @@ "Stripes"="stripes_houndecoration", "Red Castle"="castle_red_houndecoration", "White Castle"="castle_white_houndecoration", - "Graggar"="graggar_houndecoration", + "Jayx"="graggar_houndecoration", "Efreet"="efreet_houndecoration", "Sun"="sun_houndecoration", "Feathers"="feathers_houndecoration", @@ -2071,7 +2071,7 @@ "Stripes"="stripes_bucket", "Red Castle"="castle_red_bucket", "White Castle"="castle_white_bucket", - "Graggar"="graggar_bucket", + "Jayx"="graggar_bucket", "Efreet"="efreet_bucket", "Sun"="sun_bucket", "Feathers"="feathers_bucket", @@ -2125,7 +2125,7 @@ "Stripes"="stripes_gbucket", "Red Castle"="castle_red_gbucket", "White Castle"="castle_white_gbucket", - "Graggar"="graggar_gbucket", + "Jayx"="graggar_gbucket", "Efreet"="efreet_gbucket", "Sun"="sun_gbucket", "Feathers"="feathers_gbucket", diff --git a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm index 243456f14f3..73092beccac 100644 --- a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm +++ b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm @@ -25,27 +25,27 @@ neck = /obj/item/clothing/neck/roguetown/psicross/astrata cloak = /obj/item/clothing/cloak/templar/psydon switch(H.patron.name) - if("Astrata") + if("Elysius") wrists = /obj/item/clothing/neck/roguetown/psicross/astrata head = /obj/item/clothing/head/roguetown/helmet/heavy/astratahelm cloak = /obj/item/clothing/cloak/templar/astrata - if("Dendor") + if("Sylvarn") wrists = /obj/item/clothing/neck/roguetown/psicross/dendor head = /obj/item/clothing/head/roguetown/helmet/heavy/dendorhelm cloak = /obj/item/clothing/cloak/templar/dendor - if("Necra") + if("Yamais") wrists = /obj/item/clothing/neck/roguetown/psicross/necra head = /obj/item/clothing/head/roguetown/helmet/heavy/necrahelm cloak = /obj/item/clothing/cloak/templar/necra - if("Pestra") + if("Hermeir") wrists = /obj/item/clothing/neck/roguetown/psicross/pestra head = /obj/item/clothing/head/roguetown/helmet/heavy/pestrahelm cloak = /obj/item/clothing/cloak/templar/pestra - if("Noc") + if("Lune") wrists = /obj/item/clothing/neck/roguetown/psicross/noc head = /obj/item/clothing/head/roguetown/helmet/heavy/nochelm cloak = /obj/item/clothing/cloak/templar/noc - if("Eora") //Eora content from Stonekeep + if("Viiritri") //Eora content from Stonekeep head = /obj/item/clothing/head/roguetown/helmet/heavy/eorahelm wrists = /obj/item/clothing/neck/roguetown/psicross/eora cloak = /obj/item/clothing/cloak/templar/eora @@ -53,15 +53,15 @@ head = /obj/item/clothing/head/roguetown/helmet/heavy/ravoxhelm wrists = /obj/item/clothing/neck/roguetown/psicross/ravox cloak = /obj/item/clothing/cloak/templar/ravox - if("Xylix") + if("Onder") head = /obj/item/clothing/head/roguetown/helmet/heavy/xylixhelm wrists = /obj/item/clothing/neck/roguetown/psicross/xylix cloak = /obj/item/clothing/cloak/templar/xylix - if("Malum") + if("Svaeryog") head = /obj/item/clothing/head/roguetown/helmet/malumhelmet wrists = /obj/item/clothing/neck/roguetown/psicross/malum cloak = /obj/item/clothing/cloak/templar/malum - if("Abyssor") + if("Abyssia") head = /obj/item/clothing/head/roguetown/helmet/heavy/abyssorhelm wrists = /obj/item/clothing/neck/roguetown/psicross/abyssor cloak = /obj/item/clothing/cloak/templar/abyssor diff --git a/code/modules/jobs/job_types/roguetown/church/templar.dm b/code/modules/jobs/job_types/roguetown/church/templar.dm index 9717aaf2e1f..2613d05a02f 100644 --- a/code/modules/jobs/job_types/roguetown/church/templar.dm +++ b/code/modules/jobs/job_types/roguetown/church/templar.dm @@ -26,27 +26,27 @@ neck = /obj/item/clothing/neck/roguetown/psicross/silver cloak = /obj/item/clothing/cloak/templar/psydon switch(H.patron.name) - if("Astrata") + if("Elysius") wrists = /obj/item/clothing/neck/roguetown/psicross/astrata head = /obj/item/clothing/head/roguetown/helmet/heavy/astratahelm cloak = /obj/item/clothing/cloak/templar/astrata - if("Dendor") + if("Sylvarn") wrists = /obj/item/clothing/neck/roguetown/psicross/dendor head = /obj/item/clothing/head/roguetown/helmet/heavy/dendorhelm cloak = /obj/item/clothing/cloak/templar/dendor - if("Necra") + if("Yamais") wrists = /obj/item/clothing/neck/roguetown/psicross/necra head = /obj/item/clothing/head/roguetown/helmet/heavy/necrahelm cloak = /obj/item/clothing/cloak/templar/necra - if("Pestra") + if("Hermeir") wrists = /obj/item/clothing/neck/roguetown/psicross/pestra head = /obj/item/clothing/head/roguetown/helmet/heavy/pestrahelm cloak = /obj/item/clothing/cloak/templar/pestra - if("Noc") + if("Lune") wrists = /obj/item/clothing/neck/roguetown/psicross/noc head = /obj/item/clothing/head/roguetown/helmet/heavy/nochelm cloak = /obj/item/clothing/cloak/templar/noc - if("Eora") //Eora content from Stonekeep + if("Viiritri") //Eora content from Stonekeep head = /obj/item/clothing/head/roguetown/helmet/heavy/eorahelm wrists = /obj/item/clothing/neck/roguetown/psicross/eora cloak = /obj/item/clothing/cloak/templar/eora @@ -54,15 +54,15 @@ head = /obj/item/clothing/head/roguetown/helmet/heavy/ravoxhelm wrists = /obj/item/clothing/neck/roguetown/psicross/ravox cloak = /obj/item/clothing/cloak/templar/ravox - if("Xylix") + if("Onder") head = /obj/item/clothing/head/roguetown/helmet/heavy/xylixhelm wrists = /obj/item/clothing/neck/roguetown/psicross/xylix cloak = /obj/item/clothing/cloak/templar/xylix - if("Malum") + if("Svaeryog") head = /obj/item/clothing/head/roguetown/helmet/malumhelmet wrists = /obj/item/clothing/neck/roguetown/psicross/malum cloak = /obj/item/clothing/cloak/templar/malum - if("Abyssor") + if("Abyssia") head = /obj/item/clothing/head/roguetown/helmet/heavy/abyssorhelm wrists = /obj/item/clothing/neck/roguetown/psicross/abyssor cloak = /obj/item/clothing/cloak/templar/abyssor diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 64f54350a6d..3142097ecdb 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -112,7 +112,7 @@ if(possible_len) var/datum/surgery_step/done_step if(possible_len > 1) - var/input = input(user, "Which surgery step do you want to perform?", "PESTRA", ) as null|anything in possible_steps + var/input = input(user, "Which surgery step do you want to perform?", "HERMEIR", ) as null|anything in possible_steps if(input) done_step = possible_steps[input] else diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 3174629525b..c72838708a1 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -292,7 +292,7 @@ if(possible_len) var/datum/surgery_step/done_step if(possible_len > 1) - var/input = input(user, "Which surgery step do you want to perform?", "PESTRA", ) as null|anything in possible_steps + var/input = input(user, "Which surgery step do you want to perform?", "HERMEIR", ) as null|anything in possible_steps if(input) done_step = possible_steps[input] else diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 5f1f02d3739..b2c7ddf2792 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -239,6 +239,9 @@ if(M.name in friends) return FALSE + if(ignore_laying) //used for bosses etc. + ignore_lying = FALSE + if(ishuman(the_target)) var/mob/living/carbon/human/th = the_target if(ignore_lying && th.lying && !th.get_active_held_item()) //if is laying and holding nothing, and not in cmode. Ignore. diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 14b4aca7c63..19f62f5a11c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -29,6 +29,7 @@ layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + ignore_laying = TRUE // rip them apart. var/list/crusher_loot var/achievement_type var/crusher_achievement_type diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index e4057c33859..615122e8761 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -250,6 +250,7 @@ GLOBAL_VAR_INIT(farm_animals, FALSE) /mob/living/simple_animal/hostile var/retreating + var/ignore_laying = FALSE /mob/living/simple_animal/hostile/updatehealth() ..() diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 08655d1e2ec..4fabb34def4 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -364,7 +364,7 @@ if(possible_len) var/datum/surgery_step/done_step if(possible_len > 1) - var/input = input(M, "Which surgery step do you want to perform?", "PESTRA", ) as null|anything in possible_steps + var/input = input(M, "Which surgery step do you want to perform?", "HERMEIR", ) as null|anything in possible_steps if(input) done_step = possible_steps[input] else @@ -392,7 +392,7 @@ if(possible_len) var/datum/surgery_step/done_step if(length(possible_steps) > 1) - var/input = input(user, "Which surgery step do you want to perform?", "PESTRA", ) as null|anything in possible_steps + var/input = input(user, "Which surgery step do you want to perform?", "HERMEIR", ) as null|anything in possible_steps if(input) done_step = possible_steps[input] else diff --git a/code/modules/surgery/surgeries/organ_manipulation.dm b/code/modules/surgery/surgeries/organ_manipulation.dm index 58c4dcc4bcd..42e7dbb8395 100644 --- a/code/modules/surgery/surgeries/organ_manipulation.dm +++ b/code/modules/surgery/surgeries/organ_manipulation.dm @@ -116,7 +116,7 @@ GLOBAL_LIST_INIT(moldable_organs, list(BODY_ZONE_PRECISE_GROIN=list(ORGAN_SLOT_P organs -= found_organ organs[found_organ.name] = found_organ - var/selected = input(user, "Remove which organ?", "PESTRA") as null|anything in sortList(organs) + var/selected = input(user, "Remove which organ?", "HERMEIR") as null|anything in sortList(organs) if(QDELETED(user) || QDELETED(target) || !user.Adjacent(target) || (user.get_active_held_item() != tool)) return FALSE var/obj/item/organ/final_organ = organs[selected] @@ -202,7 +202,7 @@ GLOBAL_LIST_INIT(moldable_organs, list(BODY_ZONE_PRECISE_GROIN=list(ORGAN_SLOT_P if(!length(organs)) to_chat(user, span_warning("There are no organs you can mold in [target]'s [parse_zone(target_zone)]!")) return FALSE - var/selected = input(user, "Create which organ?", "PESTRA") as null|anything in sortList(organs) + var/selected = input(user, "Create which organ?", "HERMEIR") as null|anything in sortList(organs) if(QDELETED(user) || QDELETED(target) || !user.Adjacent(target) || (user.get_active_held_item() != tool)) return FALSE if(target.getorganslot(selected)) @@ -257,7 +257,7 @@ GLOBAL_LIST_INIT(moldable_organs, list(BODY_ZONE_PRECISE_GROIN=list(ORGAN_SLOT_P organs -= found_organ organs[found_organ.name] = found_organ - var/selected = input(user, "Sever which part?", "PESTRA") as null|anything in sortList(organs) + var/selected = input(user, "Sever which part?", "HERMEIR") as null|anything in sortList(organs) if(QDELETED(user) || QDELETED(target) || !user.Adjacent(target) || (user.get_active_held_item() != tool)) return FALSE var/obj/item/organ/final_organ = organs[selected] diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 3d00e5a6c4f..920f0de733b 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -1,6 +1,8 @@ //BE SPECIAL converted most to regular quirk traits for consistency in characters -- vide noir. //Will need rebalancing costs and stuff. +//includes non special related, original traits aswell cuz we dumb. + /datum/quirk/greaternightvision name = "Darkvision" desc = "I can easily see in the dark." @@ -581,3 +583,13 @@ /datum/quirk/pacifist/on_spawn() var/mob/living/carbon/human/H = quirk_holder ADD_TRAIT(H, TRAIT_PACIFISM, QUIRK_TRAIT) + + +/datum/quirk/pacifist + name = "Endowment Curse" + desc = "I was cursed with endowment... This makes life hard." + value = -2 + +/datum/quirk/pacifist/on_spawn() + var/mob/living/carbon/human/H = quirk_holder + ADD_TRAIT(H, TRAIT_ENDOWMENT, QUIRK_TRAIT) diff --git a/modular_stonehedge/code/lewdai/lewdai.dm b/modular_stonehedge/code/lewdai/lewdai.dm index 78b8bd50cc3..1f7b4b54e8c 100644 --- a/modular_stonehedge/code/lewdai/lewdai.dm +++ b/modular_stonehedge/code/lewdai/lewdai.dm @@ -197,6 +197,12 @@ Lewd_Tick() . = ..() +/mob/living/simple_animal/hostile/retaliate/rogue/Retaliate() + . = ..() + if(sexcon) + if(sexcon.current_action) + stoppedfucking() + /mob/living/simple_animal/Initialize() . = ..() if(erpable) diff --git a/strings/accent_universal.json b/strings/accent_universal.json index aa001704f1b..2e2a02c8a1a 100644 --- a/strings/accent_universal.json +++ b/strings/accent_universal.json @@ -2,12 +2,12 @@ "universal": { "life": "lyfe", "lantern": "lamptern", - "lucifer": "zizo", - "Beelzebub": "zizo", - "Abaddon": "eora", - "Belphegor": "eora", - "Asmodeus": "eora", - "satan": "zizo", + "lucifer": "levishth", + "Beelzebub": "levishth", + "Abaddon": "viiritri", + "Belphegor": "viiritri", + "Asmodeus": "viiritri", + "satan": "levishth", "ERP": "bush whacking", "day": "dae", "monday": "moonsdae", @@ -27,11 +27,11 @@ "jesus": "gods", "christ": "savior", "allah": "gods", - "yahweh": "zizo", - "yahveh": "zizo", - "yhwh": "zizo", - "yhvh": "zizo", - "jehovah": "zizo", + "yahweh": "levishth", + "yahveh": "levishth", + "yhwh": "levishth", + "yhvh": "levishth", + "jehovah": "levishth", "retarded": "foolish", "retard": "nimrod", "negro": "gnerd", @@ -107,7 +107,7 @@ "werewolfs": "verewolfs", "wolf": "volf", "wolves": "volfs", - "lolth": "graggar", + "lolth": "jayx", "wolfpit": "volfpit", "PQ": "reputation" } diff --git a/strings/phobia.json b/strings/phobia.json index 87ed8917444..8d4183602a7 100644 --- a/strings/phobia.json +++ b/strings/phobia.json @@ -296,19 +296,19 @@ "underworld", "afterlife", "psydon", - "astrata", - "noc", - "dendor", - "abyssor", + "elysius", + "lune", + "sylvarn", + "abyssia", "ravox", - "necra", - "xylix", - "pestra", - "malum", - "eora", - "zizo", - "graggar", - "matthios", - "baotha" + "yamais", + "onder", + "hermeir", + "svaeryog", + "viiritri", + "levishth", + "jayx", + "the thief", + "the sacrifice" ] } From f5540f36e111ca9691843b7d4703d61802af854b Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sun, 24 Nov 2024 18:42:09 +0300 Subject: [PATCH 012/192] fuck knee stingers --- _maps/map_files/otherz/forest.dmm | 352 +++++------------- code/datums/components/rotting.dm | 8 +- .../sex_actions/deviant/tailpegging_anal.dm | 9 +- .../deviant/tailpegging_vaginal.dm | 9 +- .../datums/sexcon/sex_actions/sex/anal_sex.dm | 9 +- .../sexcon/sex_actions/sex/throat_sex.dm | 3 +- .../sexcon/sex_actions/sex/vaginal_sex.dm | 9 +- code/game/objects/effects/glowshroom.dm | 56 +++ .../game/objects/items/rogueitems/keyrings.dm | 2 +- .../job_types/roguetown/garrison/veteran.dm | 1 + code/modules/roguetown/roguemachine/scomm.dm | 6 +- .../game/objects/items/class_selectors.dm | 12 +- 12 files changed, 190 insertions(+), 286 deletions(-) diff --git a/_maps/map_files/otherz/forest.dmm b/_maps/map_files/otherz/forest.dmm index f9627ad1ff1..d324e1f8900 100644 --- a/_maps/map_files/otherz/forest.dmm +++ b/_maps/map_files/otherz/forest.dmm @@ -90,12 +90,6 @@ /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/cave/minotaurcave) -"av" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/river) "aw" = ( /obj/structure/flora/newtree, /obj/structure/fluff/railing/fence, @@ -253,9 +247,7 @@ name = "Wood elf Tribes" }) "bD" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /obj/structure/spacevine, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) @@ -263,12 +255,6 @@ /obj/structure/fermenting_barrel/random/beer, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/cave/minotaurcave) -"bH" = ( -/obj/structure/glowshroom, -/turf/open/water/swamp, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) "bI" = ( /obj/structure/flora/wildplant/wild_herbs, /turf/open/floor/rogue/grass, @@ -474,9 +460,7 @@ /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/shelter/town/dwarf) "cH" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/closed/mineral/random/rogue/med, /area/rogue/under/cavewet) "cI" = ( @@ -660,12 +644,6 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) -"dV" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/shelter/woods/overgrownfort) "dX" = ( /obj/structure/spacevine, /turf/open/floor/rogue/cobblerock, @@ -795,12 +773,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"eE" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/water/swamp, -/area/rogue/indoors/shelter/woods/overgrownfort) "eF" = ( /turf/closed/wall/shroud{ opacity = 0 @@ -816,14 +788,6 @@ /obj/structure/flora/ausbushes/ywflowers, /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) -"eL" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/water, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) @@ -1136,9 +1100,7 @@ /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) "gQ" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -1420,9 +1382,7 @@ /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/river) "iu" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/grass, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -1501,20 +1461,12 @@ /turf/open/water/swamp, /area/rogue/indoors/cave/underdark) "iO" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /obj/structure/flora/ausbushes/ppflowers, /obj/item/clothing/head/peaceflower{ name = "Viriitran Bud" }, /turf/open/floor/rogue/dirt, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) -"iQ" = ( -/obj/structure/glowshroom, -/turf/open/water, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) @@ -1689,12 +1641,6 @@ /obj/effect/wisp, /obj/structure/flora/wildplant/wild_herbs, /turf/open/floor/rogue/grass, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) -"jQ" = ( -/obj/structure/glowshroom, -/turf/open/water/cleanshallow, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) @@ -1749,9 +1695,7 @@ first_time_text = "The Mountain Passe" }) "kg" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /turf/open/water/river{ icon_state = "rockwd" }, @@ -2034,9 +1978,7 @@ /turf/open/floor/rogue/dirt, /area/rogue/outdoors/river) "ma" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/open/water/swamp, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -2163,9 +2105,7 @@ name = "Wood elf Tribes" }) "mD" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/cobblerock, /area/rogue/indoors/shelter/woods/overgrownfort) "mE" = ( @@ -2379,7 +2319,7 @@ name = "Wood elf Tribes" }) "nJ" = ( -/obj/structure/glowshroom, +/obj/structure/safeglowshroom, /turf/open/water/swamp, /area/rogue/outdoors/river) "nP" = ( @@ -2420,9 +2360,7 @@ first_time_text = "The Deepwoods" }) "oa" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/dirt/road, /area/rogue/indoors/cave/underdark) "ob" = ( @@ -2476,9 +2414,7 @@ /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/cave/underdark) "ou" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/grass, /area/rogue/under/cavewet) "ov" = ( @@ -2768,9 +2704,7 @@ first_time_text = "The Deepwoods" }) "qi" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /obj/structure/flora/ausbushes/brflowers, /turf/open/floor/rogue/grass, /area/rogue/outdoors/woods{ @@ -3140,9 +3074,7 @@ first_time_text = "The Deepwoods" }) "sy" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/naturalstone, /area/rogue/under/cavewet) "sA" = ( @@ -3370,7 +3302,7 @@ first_time_text = "The Deepwoods" }) "tZ" = ( -/obj/structure/glowshroom, +/obj/structure/safeglowshroom, /turf/open/water/swamp, /area/rogue/indoors/shelter/woods/overgrownfort) "ua" = ( @@ -3625,9 +3557,7 @@ /obj/structure/fluff/railing/border{ dir = 4 }, -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/blocks{ icon_state = "paving" }, @@ -3640,12 +3570,6 @@ /mob/living/simple_animal/hostile/retaliate/rogue/mudcrab, /turf/open/water/cleanshallow, /area/rogue/under/cavewet) -"vs" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) "vt" = ( /obj/structure/spacevine, /obj/structure/spacevine, @@ -3723,9 +3647,7 @@ first_time_text = "The Deepwoods" }) "vT" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /turf/open/water/cleanshallow, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -4016,7 +3938,7 @@ }, /area/rogue/outdoors/river) "xG" = ( -/obj/structure/glowshroom, +/obj/structure/safeglowshroom, /turf/open/water/swamp, /area/rogue/indoors/cave/underdark) "xO" = ( @@ -4069,10 +3991,6 @@ /obj/machinery/light/rogue/hearth, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/shelter/town/dwarf) -"xY" = ( -/obj/structure/glowshroom, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/cave/underdark) "yb" = ( /obj/effect/wisp, /turf/open/floor/rogue/shroud, @@ -5232,7 +5150,7 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/shelter/woods/overgrownfort) "EE" = ( -/obj/structure/glowshroom, +/obj/structure/safeglowshroom, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) "EF" = ( @@ -5575,7 +5493,7 @@ /turf/open/floor/grass, /area/rogue/indoors/cave/minotaurcave) "GV" = ( -/obj/structure/glowshroom, +/obj/structure/safeglowshroom, /obj/item/natural/rock, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) @@ -5620,9 +5538,7 @@ name = "Wood elf Tribes" }) "Hj" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/open/water/swamp/deep, /area/rogue/indoors/cave/underdark) "Hl" = ( @@ -5842,10 +5758,6 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) -"Ix" = ( -/obj/structure/glowshroom, -/turf/open/floor/rogue/naturalstone, -/area/rogue/under/cavewet) "IA" = ( /obj/structure/table/wood{ dir = 1; @@ -5936,14 +5848,6 @@ /obj/effect/wisp, /turf/open/water/swamp, /area/rogue/indoors/shelter/woods/overgrownfort) -"IW" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/water/swamp, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) "IX" = ( /obj/structure/bars/passage{ redstone_id = "bogguardjail" @@ -6080,12 +5984,6 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) -"JH" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/water/swamp, -/area/rogue/outdoors/river) "JI" = ( /obj/structure/spacevine, /turf/open/water/swamp, @@ -6170,7 +6068,7 @@ first_time_text = "The Deepwoods" }) "Kf" = ( -/obj/structure/glowshroom, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -6196,10 +6094,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"Kn" = ( -/obj/structure/glowshroom, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/shelter/woods/overgrownfort) "Ko" = ( /obj/structure/fluff/walldeco/stone{ icon_state = "walldec6" @@ -6231,12 +6125,6 @@ }, /turf/open/floor/bronze, /area/rogue/indoors/shelter/town/dwarf) -"Kx" = ( -/obj/structure/glowshroom, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) "Ky" = ( /obj/structure/flora/roguegrass/maneater/real, /obj/structure/flora/newtree, @@ -6268,12 +6156,6 @@ }, /turf/open/floor/rogue/dirt/road, /area/rogue/indoors/shelter/woods/overgrownfort) -"KH" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/water/swamp, -/area/rogue/indoors/cave/underdark) "KJ" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/mineral_door/wood/deadbolt{ @@ -7158,9 +7040,7 @@ /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) "PM" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /turf/open/water, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -7500,9 +7380,7 @@ /turf/open/water/swamp, /area/rogue/outdoors/river) "RU" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, +/obj/structure/safeglowshroom, /turf/open/floor/rogue/cobblerock, /area/rogue/indoors/cave/underdark) "RW" = ( @@ -7560,14 +7438,6 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) -"Su" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) "Sy" = ( /turf/open/floor/rogue/rooftop, /area/rogue/outdoors/tribalfort{ @@ -7585,9 +7455,7 @@ }) "SE" = ( /obj/structure/flora/roguegrass/water, -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, +/obj/structure/safeglowshroom, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) "SF" = ( @@ -8315,14 +8183,6 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) -"Xt" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) "Xw" = ( /obj/structure/flora/rogueshroom/happyrandom{ icon_state = "mush2" @@ -8555,12 +8415,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"YK" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/river) "YO" = ( /obj/structure/spacevine, /turf/open/floor/rogue/dirt/road, @@ -8650,14 +8504,6 @@ "Zl" = ( /turf/open/water/swamp/deep, /area/rogue/under/cavewet) -"Zq" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/woods{ - first_time_text = "The Deepwoods" - }) "Zr" = ( /obj/structure/fluff/statue/knight/r, /turf/open/floor/bronze, @@ -8730,12 +8576,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"ZX" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/water/swamp, -/area/rogue/indoors/shelter/woods/overgrownfort) "ZY" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -17071,7 +16911,7 @@ ZA pL HR EI -KH +xG Ec Gx Gx @@ -20271,7 +20111,7 @@ pd CC iN iN -xY +RU JQ JQ sj @@ -20399,7 +20239,7 @@ Aj KZ JQ sj -xY +RU hQ hQ hQ @@ -22675,7 +22515,7 @@ Ly Ly aZ RR -ZX +tZ iB iB iB @@ -23078,7 +22918,7 @@ BJ BJ iB iB -eE +tZ bK BJ iB @@ -24272,7 +24112,7 @@ Ly aZ wT iB -ZX +tZ iB iB iB @@ -24406,7 +24246,7 @@ aZ wT mk xx -eE +tZ IV hd wT @@ -28459,7 +28299,7 @@ FN FN FN FN -vs +sy No FN FN @@ -28731,7 +28571,7 @@ SB SB sb sb -vs +sy ou SB sb @@ -29127,7 +28967,7 @@ FN FN et et -vs +sy SB SB sb @@ -29264,7 +29104,7 @@ sy GI No No -Ix +sy FN FN FN @@ -29392,7 +29232,7 @@ FN FN et et -Ix +sy SB SB No @@ -30583,14 +30423,14 @@ wO wO Cw FN -Ix +sy sb SB sb sb et et -vs +sy sy et et @@ -41438,7 +41278,7 @@ lC BJ iB hI -dV +mD BP BP Ud @@ -42498,7 +42338,7 @@ CM CM CM CM -Kn +mD BJ Jt bW @@ -45313,7 +45153,7 @@ uB yy ma xe -IW +ma yy DK yy @@ -45443,7 +45283,7 @@ Ng uB uB yy -bH +ma yy ma yy @@ -45455,7 +45295,7 @@ ma ma eu eu -IW +ma yy Hw aA @@ -45554,7 +45394,7 @@ Hr NI Ng uB -Su +vT Hr Hr Ng @@ -45715,7 +45555,7 @@ xe yy Ja yy -bH +ma eu eu yy @@ -46087,8 +45927,8 @@ Hr Hr Hr Hr -Zq -Zq +iu +iu Hv uB Ja @@ -46219,7 +46059,7 @@ SD Hr LE SD -Kx +iu tS Ng XM @@ -46620,7 +46460,7 @@ Ng Ng NI NI -Kx +iu uB Ja Ja @@ -46747,7 +46587,7 @@ Ja Hr Hr Hr -Su +vT uB Ng Ng @@ -46876,7 +46716,7 @@ NI NI Ng Ja -Su +vT Hr Hr vT @@ -46957,8 +46797,8 @@ qZ EF EF el -av -YK +EE +EE EF EF EF @@ -47009,7 +46849,7 @@ Ng Ng Ng Ja -jQ +vT Hr Hr uB @@ -47106,7 +46946,7 @@ yK aT yK aT -YK +EE gc Nt Qi @@ -47239,7 +47079,7 @@ yK yK yK aT -av +EE gc Nt Qi @@ -47793,10 +47633,10 @@ CT EF EF el -av +EE SE EF -av +EE EF EF EF @@ -48049,7 +47889,7 @@ EF el qZ EE -YK +EE mb Ng NI @@ -48367,7 +48207,7 @@ Hr hF lX lX -JH +nJ RS Nm RS @@ -48890,7 +48730,7 @@ iw Ng yy ma -IW +ma yy Jj uB @@ -48911,7 +48751,7 @@ aA aA aA Ng -JH +nJ ao lX lX @@ -48934,7 +48774,7 @@ Sb Eo lX EF -YK +EE EF lK cM @@ -49024,7 +48864,7 @@ Ng Ng xe ma -bH +ma uB Jj hF @@ -49173,7 +49013,7 @@ Ng PY uB Jj -IW +ma aA aA aA @@ -49302,7 +49142,7 @@ WV yy yy Mx -bH +ma eu yy Jj @@ -49819,7 +49659,7 @@ Kt Kt Kt Hw -bH +ma nZ Hw yy @@ -50338,7 +50178,7 @@ NI NI aA yy -bH +ma Ng Ng Ng @@ -50373,7 +50213,7 @@ Mx NI Hw NI -IW +ma yy xe aA @@ -50750,7 +50590,7 @@ GN Mx Ng Ng -IW +ma Ng Ng Ng @@ -50897,7 +50737,7 @@ dF Ng Jj Ng -bH +ma Vp xe NI @@ -50906,7 +50746,7 @@ yy hX eu eu -bH +ma uB Jj NI @@ -51006,7 +50846,7 @@ yy Ng Ng mw -IW +ma NI aA yy @@ -51565,7 +51405,7 @@ aA aA aA yy -IW +ma yy yy US @@ -51803,7 +51643,7 @@ NI Ng Ng Mx -IW +ma NI aA aA @@ -51834,7 +51674,7 @@ iC aA Hw yy -Kx +iu Mx Ng Ng @@ -52563,7 +52403,7 @@ EF EF iT lK -YK +EE KU lX mb @@ -52697,7 +52537,7 @@ EF iT iT Zj -av +EE lX KU NI @@ -52795,7 +52635,7 @@ uB uB Ng mb -YK +EE EF aT aT @@ -52928,7 +52768,7 @@ dp Ng Ng lK -av +EE EF aT aT @@ -53338,8 +53178,8 @@ yK EF EF GV -YK -av +EE +EE lK RW yK @@ -53767,7 +53607,7 @@ KU kD Mx NI -Kx +iu Ja Ja Ja @@ -55599,7 +55439,7 @@ Lu NI Ng NI -Zq +iu NI vt dF @@ -55732,7 +55572,7 @@ EA Lu Ng NI -Kx +iu dF vt It @@ -55885,8 +55725,8 @@ EV EV KU JP -Zq -Kx +iu +iu Ng uB Ja @@ -56230,7 +56070,7 @@ Ng Mx Ng Ng -Kx +iu NI NI IJ @@ -56582,7 +56422,7 @@ NI NI PU iO -Xt +gQ NI NI NI @@ -57205,7 +57045,7 @@ NI tS tS Ng -Zq +iu NI NI NI @@ -58150,7 +57990,7 @@ NI NI tS tS -Kx +iu vF oh Ng @@ -60158,7 +59998,7 @@ NI NI NI NI -Kx +iu Ng Tg Ng @@ -60348,7 +60188,7 @@ uB Ng Ng uB -Kx +iu NI NI NI @@ -60436,7 +60276,7 @@ dF IH uB uB -iQ +PM Km Km gt @@ -60569,7 +60409,7 @@ dF Ng Ng uB -eL +PM PM gt gt @@ -60839,7 +60679,7 @@ Mx uB gt gt -Xt +gQ Ng Ng Vl diff --git a/code/datums/components/rotting.dm b/code/datums/components/rotting.dm index 176656d8d5e..68caa4cdcff 100644 --- a/code/datums/components/rotting.dm +++ b/code/datums/components/rotting.dm @@ -84,9 +84,9 @@ if(dustme) //stonehedge mob decomposition C.visible_message(span_smallgreen("[C] decomposes...")) - var/datum/reagents/R = new/datum/reagents(20) + var/datum/reagents/R = new/datum/reagents(5) R.my_atom = src - R.add_reagent(/datum/pollutant/rot, 20) + R.add_reagent(/datum/reagent/organpoison, 5) var/datum/effect_system/smoke_spread/chem/smoke = new smoke.set_up(R, 2, get_turf(C), FALSE) smoke.start() @@ -130,9 +130,9 @@ if(amount > 20 MINUTES) //stonehedge simple mob decomposition L.visible_message(span_smallgreen("[L] decomposes..!")) - var/datum/reagents/R = new/datum/reagents(20) + var/datum/reagents/R = new/datum/reagents(5) R.my_atom = src - R.add_reagent(/datum/pollutant/rot, 20) + R.add_reagent(/datum/reagent/organpoison, 5) //stonehedge simple mob decomposition end qdel(src) return L.dust(drop_items=TRUE) diff --git a/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm b/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm index 5f1dd3a177e..f77b5a049b1 100644 --- a/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm +++ b/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm @@ -39,10 +39,11 @@ var/obj/item/bodypart/BPG = target.get_bodypart(BODY_ZONE_PRECISE_GROIN) var/obj/item/bodypart/BPC = target.get_bodypart(BODY_ZONE_CHEST) if(user.sexcon.force > SEX_FORCE_LOW) - BPC.add_wound(/datum/wound/fracture/chest) - BPG.add_wound(/datum/wound/fracture/groin) - target.apply_damage(15, BRUTE, BPC) - target.apply_damage(15, BRUTE, BPG) + if(prob(20)) + BPC.add_wound(/datum/wound/fracture/chest) + BPG.add_wound(/datum/wound/fracture/groin) + target.apply_damage(5, BRUTE, BPC) + target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen user.visible_message(span_warning("[user] tries and fails to insert their tiny tail into [target]'s butt!")) else diff --git a/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm b/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm index 6d7cb11910a..e2d1a250f51 100644 --- a/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm +++ b/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm @@ -39,10 +39,11 @@ var/obj/item/bodypart/BPG = target.get_bodypart(BODY_ZONE_PRECISE_GROIN) var/obj/item/bodypart/BPC = target.get_bodypart(BODY_ZONE_CHEST) if(user.sexcon.force > SEX_FORCE_LOW) - BPC.add_wound(/datum/wound/fracture/chest) - BPG.add_wound(/datum/wound/fracture/groin) - target.apply_damage(15, BRUTE, BPC) - target.apply_damage(15, BRUTE, BPG) + if(prob(20)) + BPC.add_wound(/datum/wound/fracture/chest) + BPG.add_wound(/datum/wound/fracture/groin) + target.apply_damage(5, BRUTE, BPC) + target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen user.visible_message(span_warning("[user] tries and fails to insert their tiny tail into [target]'s cunt!")) else diff --git a/code/datums/sexcon/sex_actions/sex/anal_sex.dm b/code/datums/sexcon/sex_actions/sex/anal_sex.dm index 5117cb45672..a8bd59a1409 100644 --- a/code/datums/sexcon/sex_actions/sex/anal_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/anal_sex.dm @@ -53,10 +53,11 @@ var/obj/item/bodypart/BPG = target.get_bodypart(BODY_ZONE_PRECISE_GROIN) var/obj/item/bodypart/BPC = target.get_bodypart(BODY_ZONE_CHEST) if(user.sexcon.force > SEX_FORCE_LOW) - BPC.add_wound(/datum/wound/fracture/chest) - BPG.add_wound(/datum/wound/fracture/groin) - target.apply_damage(15, BRUTE, BPC) - target.apply_damage(15, BRUTE, BPG) + if(prob(20)) + BPC.add_wound(/datum/wound/fracture/chest) + BPG.add_wound(/datum/wound/fracture/groin) + target.apply_damage(5, BRUTE, BPC) + target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen user.visible_message(span_warning("[user] tries and fails to insert their tiny cock into [target]'s butt!")) else diff --git a/code/datums/sexcon/sex_actions/sex/throat_sex.dm b/code/datums/sexcon/sex_actions/sex/throat_sex.dm index 1fa3210e7fc..53ca2de9a19 100644 --- a/code/datums/sexcon/sex_actions/sex/throat_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/throat_sex.dm @@ -55,7 +55,8 @@ var/oxyloss = 1.3 if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) oxyloss*=2 - user.sexcon.perform_sex_action(target, 0, 7, FALSE) + if(!isseelie(user)) //cock too small + user.sexcon.perform_sex_action(target, 0, 7, FALSE) user.sexcon.perform_deepthroat_oxyloss(target, oxyloss) target.sexcon.handle_passive_ejaculation() diff --git a/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm b/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm index 36f613507aa..58c0f01e6dd 100644 --- a/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm @@ -53,10 +53,11 @@ var/obj/item/bodypart/BPG = target.get_bodypart(BODY_ZONE_PRECISE_GROIN) var/obj/item/bodypart/BPC = target.get_bodypart(BODY_ZONE_CHEST) if(user.sexcon.force > SEX_FORCE_LOW) - BPC.add_wound(/datum/wound/fracture/chest) - BPG.add_wound(/datum/wound/fracture/groin) - target.apply_damage(15, BRUTE, BPC) - target.apply_damage(15, BRUTE, BPG) + if(prob(20)) + BPC.add_wound(/datum/wound/fracture/chest) + BPG.add_wound(/datum/wound/fracture/groin) + target.apply_damage(5, BRUTE, BPC) + target.apply_damage(5, BRUTE, BPG) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Non-Seelie action user.visible_message(span_warning("[user] tries and fails to insert their tiny cock into [target]'s cunt.")) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 25a2d978fe2..e6268bc547e 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -4,6 +4,7 @@ name = "kneestingers" desc = "" anchored = TRUE + max_integrity = 10 opacity = 0 density = FALSE icon = 'icons/roguetown/misc/foliage.dmi' @@ -84,3 +85,58 @@ var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src)) I.desc = "" qdel(src) + +/obj/structure/safeglowshroom + name = "glowshroom" + desc = "the actually liked sibling of kneestingers." + anchored = TRUE + opacity = 0 + max_integrity = 10 + density = FALSE + icon = 'icons/roguetown/misc/foliage.dmi' + icon_state = "glowshroom1" //replaced in New + color = "#00fffb" + layer = ABOVE_NORMAL_TURF_LAYER + max_integrity = 30 + blade_dulling = DULLING_CUT + resistance_flags = FLAMMABLE + debris = list(/obj/item/natural/fibers = 1, /obj/item/reagent_containers/food/snacks/grown/shroom = 1) + +/obj/structure/safeglowshroom/fire_act(added, maxstacks) + visible_message(span_warning("[src] catches fire!")) + var/turf/T = get_turf(src) + qdel(src) + new /obj/effect/hotspot(T) + +/obj/structure/safeglowshroom/New(loc, obj/item/seeds/newseed, mutate_stats) + ..() + set_light(1.5, 1.5, "#00fffb") + + icon_state = "glowshroom[rand(1,3)]" + + pixel_x = rand(-4, 4) + pixel_y = rand(0,5) + +/obj/structure/safeglowshroom/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + if(damage_type == BURN && damage_amount) + playsound(src.loc, 'sound/blank.ogg', 100, TRUE) + +/obj/structure/safeglowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + take_damage(5, BURN, 0, 0) + +/obj/structure/safeglowshroom/acid_act(acidpwr, acid_volume) + . = 1 + visible_message(span_danger("[src] melts away!")) + var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src)) + I.desc = "" + qdel(src) + +/obj/structure/safeglowshroom/Destroy() + var/datum/reagents/R = new/datum/reagents(5) + R.my_atom = src + R.add_reagent(/datum/reagent/berrypoison, 5) + var/datum/effect_system/smoke_spread/chem/smoke = new + smoke.set_up(R, 4, get_turf(src), FALSE) + smoke.start() + . = ..() diff --git a/code/game/objects/items/rogueitems/keyrings.dm b/code/game/objects/items/rogueitems/keyrings.dm index 1fd7474f729..96c7cf50c91 100644 --- a/code/game/objects/items/rogueitems/keyrings.dm +++ b/code/game/objects/items/rogueitems/keyrings.dm @@ -259,7 +259,7 @@ keys = list(/obj/item/roguekey/farm, /obj/item/roguekey/butcher) /obj/item/storage/keyring/veteran - keys = list(/obj/item/roguekey/veteran, /obj/item/roguekey/vault) + keys = list(/obj/item/roguekey/veteran, /obj/item/roguekey/vault, /obj/item/roguekey/steward) /obj/item/storage/keyring/sheriff keys = list(/obj/item/roguekey/sheriff_office, /obj/item/roguekey/keep_dungeon, /obj/item/roguekey/town_dungeon, /obj/item/roguekey/bog_barracks, /obj/item/roguekey/keep_barracks, /obj/item/roguekey/walls, /obj/item/roguekey/manor, /obj/item/roguekey/graveyard) diff --git a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm index 62853a862b6..14696e7e8bb 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm @@ -36,5 +36,6 @@ /datum/outfit/job/roguetown/veteran/pre_equip(mob/living/carbon/human/H, visualsOnly) . = ..() cloak = /obj/item/clothing/cloak/half/vet + r_hand = /obj/item/scomstone l_hand = /obj/item/class_selector/veteran //this is where they equip shit. H.verbs |= /mob/proc/haltyell diff --git a/code/modules/roguetown/roguemachine/scomm.dm b/code/modules/roguetown/roguemachine/scomm.dm index ebab509af5f..b6499bb1f4c 100644 --- a/code/modules/roguetown/roguemachine/scomm.dm +++ b/code/modules/roguetown/roguemachine/scomm.dm @@ -173,8 +173,8 @@ w_class = WEIGHT_CLASS_SMALL flags_1 = HEAR_1 muteinmouth = TRUE - var/listening = TRUE - var/speaking = FALSE //Start muted its weird. + var/listening = FALSE //Start muted its weird. + var/speaking = TRUE sellprice = 50 //wip /obj/item/scomstone/attack_right(mob/user) @@ -195,7 +195,7 @@ playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) listening = !listening speaking = !speaking - to_chat(user, span_info("I [speaking ? "unmute" : "mute"] the scomstone.")) + to_chat(user, span_info("I turn the scomstone to [speaking ? "listening" : "broadcasting"] mode.")) update_icon() /obj/item/scomstone/Destroy() diff --git a/modular_stonehedge/code/game/objects/items/class_selectors.dm b/modular_stonehedge/code/game/objects/items/class_selectors.dm index e905b5b0a66..1cd2d908cf4 100644 --- a/modular_stonehedge/code/game/objects/items/class_selectors.dm +++ b/modular_stonehedge/code/game/objects/items/class_selectors.dm @@ -60,7 +60,8 @@ dressup(H, inventory_items) if("Rogue") H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/rogue_vanish) - inventory_items = list(/obj/item/storage/belt/rogue/pouch/coins/rich, + inventory_items = list( + /obj/item/clothing/neck/roguetown/bervor, /obj/item/clothing/shoes/roguetown/boots/armor, /obj/item/storage/belt/rogue/leather, /obj/item/clothing/gloves/roguetown/chain, @@ -70,8 +71,9 @@ /obj/item/quiver/Pbolts, /obj/item/rogueweapon/sword/estoc, /obj/item/lockpickring/mundane, - /obj/item/rogueweapon/huntingknife/idagger/steel/parrying = 1, - /obj/item/storage/keyring/veteran = 1 + /obj/item/rogueweapon/huntingknife/idagger/steel/parrying, + /obj/item/storage/keyring/veteran, + /obj/item/storage/belt/rogue/pouch/coins/rich, ) if(H.gender == FEMALE) //funny inventory_items += /obj/item/clothing/suit/roguetown/armor/leather/studded/bikini @@ -125,8 +127,8 @@ /obj/item/storage/belt/rogue/pouch/coins/rich, /obj/item/storage/backpack/rogue/satchel, /obj/item/rogueweapon/shield/wood, - /obj/item/rogueweapon/huntingknife/idagger/steel/parrying = 1, - /obj/item/storage/keyring/veteran = 1 + /obj/item/rogueweapon/huntingknife/idagger/steel/parrying, + /obj/item/storage/keyring/veteran, ) var/datum/devotion/C = new /datum/devotion(H, H.patron) switch(H.patron?.type) From 80081f9c8831c39989b074acefb0c44cf939fca1 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sun, 24 Nov 2024 21:01:51 +0300 Subject: [PATCH 013/192] Update keyrings.dm --- code/game/objects/items/rogueitems/keyrings.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/rogueitems/keyrings.dm b/code/game/objects/items/rogueitems/keyrings.dm index 96c7cf50c91..0117e18e8b5 100644 --- a/code/game/objects/items/rogueitems/keyrings.dm +++ b/code/game/objects/items/rogueitems/keyrings.dm @@ -259,7 +259,7 @@ keys = list(/obj/item/roguekey/farm, /obj/item/roguekey/butcher) /obj/item/storage/keyring/veteran - keys = list(/obj/item/roguekey/veteran, /obj/item/roguekey/vault, /obj/item/roguekey/steward) + keys = list(/obj/item/roguekey/veteran, /obj/item/roguekey/vault, /obj/item/roguekey/steward, /obj/item/roguekey/keep_dungeon, /obj/item/roguekey/town_dungeon, /obj/item/roguekey/bog_barracks, /obj/item/roguekey/keep_barracks, /obj/item/roguekey/walls, /obj/item/roguekey/graveyard) /obj/item/storage/keyring/sheriff keys = list(/obj/item/roguekey/sheriff_office, /obj/item/roguekey/keep_dungeon, /obj/item/roguekey/town_dungeon, /obj/item/roguekey/bog_barracks, /obj/item/roguekey/keep_barracks, /obj/item/roguekey/walls, /obj/item/roguekey/manor, /obj/item/roguekey/graveyard) From e1dfaa271338de8add292700484a4e4148e19e0a Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 00:31:31 +0300 Subject: [PATCH 014/192] Update _rogue.dm --- code/modules/events/rogue/_rogue.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/events/rogue/_rogue.dm b/code/modules/events/rogue/_rogue.dm index c726b5ad993..427582bba4b 100644 --- a/code/modules/events/rogue/_rogue.dm +++ b/code/modules/events/rogue/_rogue.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_INIT(badomens, list()) var/used switch(eventreason) if(OMEN_ROUNDSTART) - used = "Zizo." + used = "Levishth." if(OMEN_NOLORD) used = "The Monarch is dead! We need a new ruler." if(OMEN_NOPRIEST) @@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(badomens, list()) if(OMEN_SKELETONSIEGE) used = "Unwelcome visitors!" if("ascend") - used = "Zizo will rise once again." + used = "Levishth will rise once again." if(eventreason && used) priority_announce(used, "Bad Omen", 'sound/misc/evilevent.ogg') From 7e1e82ddf5ea04deab90fb290c9cc64f38b790d0 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 00:57:33 +0300 Subject: [PATCH 015/192] undo glowy moment --- _maps/map_files/otherz/forest.dmm | 352 ++++++++++++++++++++++-------- 1 file changed, 256 insertions(+), 96 deletions(-) diff --git a/_maps/map_files/otherz/forest.dmm b/_maps/map_files/otherz/forest.dmm index d324e1f8900..f9627ad1ff1 100644 --- a/_maps/map_files/otherz/forest.dmm +++ b/_maps/map_files/otherz/forest.dmm @@ -90,6 +90,12 @@ /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/cave/minotaurcave) +"av" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/river) "aw" = ( /obj/structure/flora/newtree, /obj/structure/fluff/railing/fence, @@ -247,7 +253,9 @@ name = "Wood elf Tribes" }) "bD" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /obj/structure/spacevine, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) @@ -255,6 +263,12 @@ /obj/structure/fermenting_barrel/random/beer, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/cave/minotaurcave) +"bH" = ( +/obj/structure/glowshroom, +/turf/open/water/swamp, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "bI" = ( /obj/structure/flora/wildplant/wild_herbs, /turf/open/floor/rogue/grass, @@ -460,7 +474,9 @@ /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/shelter/town/dwarf) "cH" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/closed/mineral/random/rogue/med, /area/rogue/under/cavewet) "cI" = ( @@ -644,6 +660,12 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) +"dV" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/shelter/woods/overgrownfort) "dX" = ( /obj/structure/spacevine, /turf/open/floor/rogue/cobblerock, @@ -773,6 +795,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) +"eE" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/water/swamp, +/area/rogue/indoors/shelter/woods/overgrownfort) "eF" = ( /turf/closed/wall/shroud{ opacity = 0 @@ -788,6 +816,14 @@ /obj/structure/flora/ausbushes/ywflowers, /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) +"eL" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/water, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) @@ -1100,7 +1136,9 @@ /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) "gQ" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -1382,7 +1420,9 @@ /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/river) "iu" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -1461,12 +1501,20 @@ /turf/open/water/swamp, /area/rogue/indoors/cave/underdark) "iO" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /obj/structure/flora/ausbushes/ppflowers, /obj/item/clothing/head/peaceflower{ name = "Viriitran Bud" }, /turf/open/floor/rogue/dirt, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) +"iQ" = ( +/obj/structure/glowshroom, +/turf/open/water, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) @@ -1641,6 +1689,12 @@ /obj/effect/wisp, /obj/structure/flora/wildplant/wild_herbs, /turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) +"jQ" = ( +/obj/structure/glowshroom, +/turf/open/water/cleanshallow, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) @@ -1695,7 +1749,9 @@ first_time_text = "The Mountain Passe" }) "kg" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /turf/open/water/river{ icon_state = "rockwd" }, @@ -1978,7 +2034,9 @@ /turf/open/floor/rogue/dirt, /area/rogue/outdoors/river) "ma" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/open/water/swamp, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -2105,7 +2163,9 @@ name = "Wood elf Tribes" }) "mD" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/open/floor/rogue/cobblerock, /area/rogue/indoors/shelter/woods/overgrownfort) "mE" = ( @@ -2319,7 +2379,7 @@ name = "Wood elf Tribes" }) "nJ" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom, /turf/open/water/swamp, /area/rogue/outdoors/river) "nP" = ( @@ -2360,7 +2420,9 @@ first_time_text = "The Deepwoods" }) "oa" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/open/floor/rogue/dirt/road, /area/rogue/indoors/cave/underdark) "ob" = ( @@ -2414,7 +2476,9 @@ /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/cave/underdark) "ou" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/open/floor/rogue/grass, /area/rogue/under/cavewet) "ov" = ( @@ -2704,7 +2768,9 @@ first_time_text = "The Deepwoods" }) "qi" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /obj/structure/flora/ausbushes/brflowers, /turf/open/floor/rogue/grass, /area/rogue/outdoors/woods{ @@ -3074,7 +3140,9 @@ first_time_text = "The Deepwoods" }) "sy" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/open/floor/rogue/naturalstone, /area/rogue/under/cavewet) "sA" = ( @@ -3302,7 +3370,7 @@ first_time_text = "The Deepwoods" }) "tZ" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom, /turf/open/water/swamp, /area/rogue/indoors/shelter/woods/overgrownfort) "ua" = ( @@ -3557,7 +3625,9 @@ /obj/structure/fluff/railing/border{ dir = 4 }, -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/open/floor/rogue/blocks{ icon_state = "paving" }, @@ -3570,6 +3640,12 @@ /mob/living/simple_animal/hostile/retaliate/rogue/mudcrab, /turf/open/water/cleanshallow, /area/rogue/under/cavewet) +"vs" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/floor/rogue/naturalstone, +/area/rogue/under/cavewet) "vt" = ( /obj/structure/spacevine, /obj/structure/spacevine, @@ -3647,7 +3723,9 @@ first_time_text = "The Deepwoods" }) "vT" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /turf/open/water/cleanshallow, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -3938,7 +4016,7 @@ }, /area/rogue/outdoors/river) "xG" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom, /turf/open/water/swamp, /area/rogue/indoors/cave/underdark) "xO" = ( @@ -3991,6 +4069,10 @@ /obj/machinery/light/rogue/hearth, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/shelter/town/dwarf) +"xY" = ( +/obj/structure/glowshroom, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/cave/underdark) "yb" = ( /obj/effect/wisp, /turf/open/floor/rogue/shroud, @@ -5150,7 +5232,7 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/shelter/woods/overgrownfort) "EE" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) "EF" = ( @@ -5493,7 +5575,7 @@ /turf/open/floor/grass, /area/rogue/indoors/cave/minotaurcave) "GV" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom, /obj/item/natural/rock, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) @@ -5538,7 +5620,9 @@ name = "Wood elf Tribes" }) "Hj" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/open/water/swamp/deep, /area/rogue/indoors/cave/underdark) "Hl" = ( @@ -5758,6 +5842,10 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) +"Ix" = ( +/obj/structure/glowshroom, +/turf/open/floor/rogue/naturalstone, +/area/rogue/under/cavewet) "IA" = ( /obj/structure/table/wood{ dir = 1; @@ -5848,6 +5936,14 @@ /obj/effect/wisp, /turf/open/water/swamp, /area/rogue/indoors/shelter/woods/overgrownfort) +"IW" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/water/swamp, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "IX" = ( /obj/structure/bars/passage{ redstone_id = "bogguardjail" @@ -5984,6 +6080,12 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) +"JH" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/water/swamp, +/area/rogue/outdoors/river) "JI" = ( /obj/structure/spacevine, /turf/open/water/swamp, @@ -6068,7 +6170,7 @@ first_time_text = "The Deepwoods" }) "Kf" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -6094,6 +6196,10 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) +"Kn" = ( +/obj/structure/glowshroom, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/shelter/woods/overgrownfort) "Ko" = ( /obj/structure/fluff/walldeco/stone{ icon_state = "walldec6" @@ -6125,6 +6231,12 @@ }, /turf/open/floor/bronze, /area/rogue/indoors/shelter/town/dwarf) +"Kx" = ( +/obj/structure/glowshroom, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "Ky" = ( /obj/structure/flora/roguegrass/maneater/real, /obj/structure/flora/newtree, @@ -6156,6 +6268,12 @@ }, /turf/open/floor/rogue/dirt/road, /area/rogue/indoors/shelter/woods/overgrownfort) +"KH" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/water/swamp, +/area/rogue/indoors/cave/underdark) "KJ" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/mineral_door/wood/deadbolt{ @@ -7040,7 +7158,9 @@ /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) "PM" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /turf/open/water, /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" @@ -7380,7 +7500,9 @@ /turf/open/water/swamp, /area/rogue/outdoors/river) "RU" = ( -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom3" + }, /turf/open/floor/rogue/cobblerock, /area/rogue/indoors/cave/underdark) "RW" = ( @@ -7438,6 +7560,14 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) +"Su" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "Sy" = ( /turf/open/floor/rogue/rooftop, /area/rogue/outdoors/tribalfort{ @@ -7455,7 +7585,9 @@ }) "SE" = ( /obj/structure/flora/roguegrass/water, -/obj/structure/safeglowshroom, +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) "SF" = ( @@ -8183,6 +8315,14 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) +"Xt" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "Xw" = ( /obj/structure/flora/rogueshroom/happyrandom{ icon_state = "mush2" @@ -8415,6 +8555,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) +"YK" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/river) "YO" = ( /obj/structure/spacevine, /turf/open/floor/rogue/dirt/road, @@ -8504,6 +8650,14 @@ "Zl" = ( /turf/open/water/swamp/deep, /area/rogue/under/cavewet) +"Zq" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "Zr" = ( /obj/structure/fluff/statue/knight/r, /turf/open/floor/bronze, @@ -8576,6 +8730,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) +"ZX" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/water/swamp, +/area/rogue/indoors/shelter/woods/overgrownfort) "ZY" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -16911,7 +17071,7 @@ ZA pL HR EI -xG +KH Ec Gx Gx @@ -20111,7 +20271,7 @@ pd CC iN iN -RU +xY JQ JQ sj @@ -20239,7 +20399,7 @@ Aj KZ JQ sj -RU +xY hQ hQ hQ @@ -22515,7 +22675,7 @@ Ly Ly aZ RR -tZ +ZX iB iB iB @@ -22918,7 +23078,7 @@ BJ BJ iB iB -tZ +eE bK BJ iB @@ -24112,7 +24272,7 @@ Ly aZ wT iB -tZ +ZX iB iB iB @@ -24246,7 +24406,7 @@ aZ wT mk xx -tZ +eE IV hd wT @@ -28299,7 +28459,7 @@ FN FN FN FN -sy +vs No FN FN @@ -28571,7 +28731,7 @@ SB SB sb sb -sy +vs ou SB sb @@ -28967,7 +29127,7 @@ FN FN et et -sy +vs SB SB sb @@ -29104,7 +29264,7 @@ sy GI No No -sy +Ix FN FN FN @@ -29232,7 +29392,7 @@ FN FN et et -sy +Ix SB SB No @@ -30423,14 +30583,14 @@ wO wO Cw FN -sy +Ix sb SB sb sb et et -sy +vs sy et et @@ -41278,7 +41438,7 @@ lC BJ iB hI -mD +dV BP BP Ud @@ -42338,7 +42498,7 @@ CM CM CM CM -mD +Kn BJ Jt bW @@ -45153,7 +45313,7 @@ uB yy ma xe -ma +IW yy DK yy @@ -45283,7 +45443,7 @@ Ng uB uB yy -ma +bH yy ma yy @@ -45295,7 +45455,7 @@ ma ma eu eu -ma +IW yy Hw aA @@ -45394,7 +45554,7 @@ Hr NI Ng uB -vT +Su Hr Hr Ng @@ -45555,7 +45715,7 @@ xe yy Ja yy -ma +bH eu eu yy @@ -45927,8 +46087,8 @@ Hr Hr Hr Hr -iu -iu +Zq +Zq Hv uB Ja @@ -46059,7 +46219,7 @@ SD Hr LE SD -iu +Kx tS Ng XM @@ -46460,7 +46620,7 @@ Ng Ng NI NI -iu +Kx uB Ja Ja @@ -46587,7 +46747,7 @@ Ja Hr Hr Hr -vT +Su uB Ng Ng @@ -46716,7 +46876,7 @@ NI NI Ng Ja -vT +Su Hr Hr vT @@ -46797,8 +46957,8 @@ qZ EF EF el -EE -EE +av +YK EF EF EF @@ -46849,7 +47009,7 @@ Ng Ng Ng Ja -vT +jQ Hr Hr uB @@ -46946,7 +47106,7 @@ yK aT yK aT -EE +YK gc Nt Qi @@ -47079,7 +47239,7 @@ yK yK yK aT -EE +av gc Nt Qi @@ -47633,10 +47793,10 @@ CT EF EF el -EE +av SE EF -EE +av EF EF EF @@ -47889,7 +48049,7 @@ EF el qZ EE -EE +YK mb Ng NI @@ -48207,7 +48367,7 @@ Hr hF lX lX -nJ +JH RS Nm RS @@ -48730,7 +48890,7 @@ iw Ng yy ma -ma +IW yy Jj uB @@ -48751,7 +48911,7 @@ aA aA aA Ng -nJ +JH ao lX lX @@ -48774,7 +48934,7 @@ Sb Eo lX EF -EE +YK EF lK cM @@ -48864,7 +49024,7 @@ Ng Ng xe ma -ma +bH uB Jj hF @@ -49013,7 +49173,7 @@ Ng PY uB Jj -ma +IW aA aA aA @@ -49142,7 +49302,7 @@ WV yy yy Mx -ma +bH eu yy Jj @@ -49659,7 +49819,7 @@ Kt Kt Kt Hw -ma +bH nZ Hw yy @@ -50178,7 +50338,7 @@ NI NI aA yy -ma +bH Ng Ng Ng @@ -50213,7 +50373,7 @@ Mx NI Hw NI -ma +IW yy xe aA @@ -50590,7 +50750,7 @@ GN Mx Ng Ng -ma +IW Ng Ng Ng @@ -50737,7 +50897,7 @@ dF Ng Jj Ng -ma +bH Vp xe NI @@ -50746,7 +50906,7 @@ yy hX eu eu -ma +bH uB Jj NI @@ -50846,7 +51006,7 @@ yy Ng Ng mw -ma +IW NI aA yy @@ -51405,7 +51565,7 @@ aA aA aA yy -ma +IW yy yy US @@ -51643,7 +51803,7 @@ NI Ng Ng Mx -ma +IW NI aA aA @@ -51674,7 +51834,7 @@ iC aA Hw yy -iu +Kx Mx Ng Ng @@ -52403,7 +52563,7 @@ EF EF iT lK -EE +YK KU lX mb @@ -52537,7 +52697,7 @@ EF iT iT Zj -EE +av lX KU NI @@ -52635,7 +52795,7 @@ uB uB Ng mb -EE +YK EF aT aT @@ -52768,7 +52928,7 @@ dp Ng Ng lK -EE +av EF aT aT @@ -53178,8 +53338,8 @@ yK EF EF GV -EE -EE +YK +av lK RW yK @@ -53607,7 +53767,7 @@ KU kD Mx NI -iu +Kx Ja Ja Ja @@ -55439,7 +55599,7 @@ Lu NI Ng NI -iu +Zq NI vt dF @@ -55572,7 +55732,7 @@ EA Lu Ng NI -iu +Kx dF vt It @@ -55725,8 +55885,8 @@ EV EV KU JP -iu -iu +Zq +Kx Ng uB Ja @@ -56070,7 +56230,7 @@ Ng Mx Ng Ng -iu +Kx NI NI IJ @@ -56422,7 +56582,7 @@ NI NI PU iO -gQ +Xt NI NI NI @@ -57045,7 +57205,7 @@ NI tS tS Ng -iu +Zq NI NI NI @@ -57990,7 +58150,7 @@ NI NI tS tS -iu +Kx vF oh Ng @@ -59998,7 +60158,7 @@ NI NI NI NI -iu +Kx Ng Tg Ng @@ -60188,7 +60348,7 @@ uB Ng Ng uB -iu +Kx NI NI NI @@ -60276,7 +60436,7 @@ dF IH uB uB -PM +iQ Km Km gt @@ -60409,7 +60569,7 @@ dF Ng Ng uB -PM +eL PM gt gt @@ -60679,7 +60839,7 @@ Mx uB gt gt -gQ +Xt Ng Ng Vl From 58aef033bfb398a6549da529fffbf41c6125b339 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 01:59:10 +0300 Subject: [PATCH 016/192] map stuff --- _maps/map_files/dreamhold/Dreamhold.dmm | 775 ++++++++++++-------- _maps/templates/shelter_3.dmm | 14 +- code/modules/clothing/rogueclothes/pants.dm | 2 + 3 files changed, 484 insertions(+), 307 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index d2568b783f5..19d2f13e1f9 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -134,6 +134,14 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"aeO" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa2" + }, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "afp" = ( /obj/structure/fluff/railing/border{ dir = 9 @@ -330,6 +338,12 @@ "aoy" = ( /turf/open/floor/rogue/hexstone, /area/rogue/outdoors/caves) +"aoF" = ( +/obj/structure/flora/newtree, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "apc" = ( /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/blocks, @@ -493,8 +507,7 @@ /turf/closed/wall/mineral/rogue/decostone/mossy/cand, /area/rogue/indoors/town/tavern) "avu" = ( -/obj/effect/landmark/events/haunts, -/turf/open/floor/rogue/dirt/road, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -973,6 +986,20 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"aLD" = ( +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "aMz" = ( /obj/structure/flora/grass/jungle{ icon_state = "grassa1" @@ -1992,10 +2019,15 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/library) "bCN" = ( -/mob/living/simple_animal/hostile/rogue/skeleton/bow{ - name = "Skellter"; - faction = list("undead", "noble"ssssss) - }, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/mace/cudgel, +/obj/item/storage/backpack/rogue/backpack/surgery, +/obj/item/rope/chain, +/obj/item/rope/chain, +/obj/item/rope/chain, +/obj/item/dildo/silver, +/obj/item/rogueweapon/mace/cudgel, +/obj/machinery/light/rogue/wallfire/candle/blue, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -2509,10 +2541,16 @@ }, /area/rogue/outdoors/river) "bYK" = ( -/obj/structure/flora/roguegrass, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/mineral_door/wood/donjon{ + desc = "Armory"; + locked = 1; + lockid = "vault"; + name = "Treasury" + }, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "bZv" = ( /obj/structure/flora/rogueshroom/happyrandom{ @@ -2801,10 +2839,19 @@ /turf/open/water/river, /area/rogue/outdoors/caves) "coD" = ( -/obj/structure/fluff/statue/tdummy, -/turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/rack/rogue, +/obj/item/rogueweapon/sword/estoc, +/obj/item/rogueweapon/sword/estoc, +/obj/item/rogueweapon/sword/rapier, +/obj/item/rogueweapon/sword/rapier, +/obj/item/clothing/head/roguetown/helmet/skullcap, +/obj/item/clothing/head/roguetown/helmet/skullcap, +/obj/item/clothing/head/roguetown/helmet/skullcap, +/obj/item/clothing/head/roguetown/helmet/skullcap, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "coM" = ( /obj/structure/flora/roguegrass, @@ -3581,6 +3628,10 @@ }, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/river) +"cVC" = ( +/obj/structure/chair/bench/ultimacouch, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/shelter/town) "cVH" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/cleanshallow, @@ -3978,11 +4029,8 @@ }) "diM" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/obj/structure/roguemachine/steward{ - lockid = "vault"; - name = "COINKEEPER" - }, /obj/structure/roguemachine/camera, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/town/vault) "diU" = ( @@ -5726,9 +5774,15 @@ first_time_text = "The Dreamers Demesne.." }) "eAg" = ( -/obj/machinery/light/rogue/wallfire/candle/l, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/warehouse) +/obj/item/clothing/cloak/stabard/surcoat, +/obj/item/clothing/cloak/stabard/surcoat, +/obj/item/clothing/cloak/stabard/surcoat, +/obj/machinery/gear_painter/dye_bin, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "eAi" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/grass/jungle/b, @@ -5917,8 +5971,8 @@ /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/library) "eJl" = ( -/obj/structure/flora/grass/jungle, -/turf/open/floor/rogue/grass, +/obj/structure/flora/roguegrass, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -7744,8 +7798,9 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) "gar" = ( +/obj/structure/closet/crate/roguecloset, /turf/open/floor/rogue/blocks/stone/stonepattern2, -/area/rogue/indoors/town/warehouse) +/area/rogue/indoors/shelter/town) "gaZ" = ( /obj/structure/fluff/alch, /turf/open/floor/rogue/ruinedwood/spiral, @@ -7946,6 +8001,13 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"ggJ" = ( +/obj/structure/feedinghole, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "ggK" = ( /obj/structure/rack/rogue/shelf/big, /obj/item/reagent_containers/food/snacks/grown/rogue/sweetleafdry, @@ -8774,6 +8836,12 @@ dir = 1 }, /turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) +"gZN" = ( +/obj/effect/landmark/events/haunts, +/turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -9471,7 +9539,9 @@ /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) "hCp" = ( -/obj/structure/bars/cemetery, +/obj/item/clothing/cloak/tabard, +/obj/item/clothing/cloak/tabard, +/obj/item/clothing/cloak/tabard, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -9761,6 +9831,17 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"hPh" = ( +/obj/item/clothing/suit/roguetown/armor/leather/studded, +/obj/item/clothing/suit/roguetown/armor/leather/studded, +/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, +/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, +/obj/structure/rack/rogue, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "hPQ" = ( /obj/structure/fermenting_barrel, /turf/open/floor/rogue/ruinedwood/spiral, @@ -11717,6 +11798,19 @@ /obj/structure/spacevine, /turf/open/floor/rogue/naturalstone, /area/rogue/under/cavewet/bogcaves) +"jwm" = ( +/obj/structure/rack/rogue, +/obj/item/rogueweapon/sword/cutlass, +/obj/item/rogueweapon/sword/cutlass, +/obj/item/rogueweapon/mace, +/obj/item/rogueweapon/mace, +/obj/item/rogueweapon/shield/tower, +/obj/item/rogueweapon/shield/tower, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "jwr" = ( /obj/structure/fluff/traveltile/forest{ aportalgoesto = "forest3"; @@ -12630,7 +12724,7 @@ first_time_text = "The Twilight Woods" }) "kcf" = ( -/obj/structure/fluff/statue/lewd, +/obj/structure/fluff/statue/lewd/random, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "kct" = ( @@ -12742,6 +12836,18 @@ first_time_text = "Druids Grove"; name = "Grove" }) +"kgd" = ( +/obj/structure/rack/rogue, +/obj/item/rogueweapon/shield/tower/metal, +/obj/item/rogueweapon/shield/tower/metal, +/obj/item/rogueweapon/sword/falchion, +/obj/item/rogueweapon/sword/falchion, +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "kgp" = ( /obj/effect/wisp, /turf/open/floor/rogue/grass, @@ -13114,6 +13220,11 @@ /obj/machinery/light/rogue/hearth, /turf/open/floor/rogue/blocks/green, /area/rogue/indoors/shelter/mountains) +"ktO" = ( +/obj/structure/bed/rogue/inn/wool, +/obj/effect/landmark/start/shophand, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/shelter/town) "ktX" = ( /turf/open/floor/rogue/rooftop{ dir = 1 @@ -13204,7 +13315,10 @@ }) "kAr" = ( /turf/open/floor/rogue/greenstone, -/area/rogue/outdoors/caves) +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "kAv" = ( /turf/closed, /area/rogue/outdoors/beach{ @@ -13883,8 +13997,8 @@ name = "Shores of the Emerald Coast" }) "laG" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/rogue/dirt, +/obj/structure/fluff/statue/tdummy, +/turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -15007,10 +15121,13 @@ name = "far stonehedge" }) "may" = ( -/obj/structure/mineral_door/bars{ - locked = 1; - lockid = "vault" - }, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/flail, +/obj/item/rogueweapon/flail, +/obj/item/rogueweapon/duster, +/obj/item/rogueweapon/duster, +/obj/item/rogueweapon/duster, +/obj/item/rogueweapon/spear/billhook, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -19005,6 +19122,12 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"piY" = ( +/obj/structure/fluff/statue/lewd/random, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/bath{ + first_time_text = "The Dreamers Demesne.." + }) "pjg" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/fullgrass, @@ -19879,8 +20002,8 @@ }, /area/rogue/outdoors/river) "pVI" = ( -/obj/structure/flora/roguegrass, -/turf/open/floor/rogue/dirt/road, +/obj/structure/flora/grass/jungle, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -20725,8 +20848,10 @@ first_time_text = "Stonehedge" }) "qBY" = ( +/obj/structure/bed/rogue/inn/wool, +/obj/effect/landmark/start/shophand, /turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/warehouse) +/area/rogue/indoors/shelter/town) "qCy" = ( /obj/structure/flora/roguetree/happyrandom{ desc = "An old, beloved tree that even elves could love."; @@ -23134,9 +23259,17 @@ /turf/open/water/swamp, /area/rogue/outdoors/caves) "swb" = ( -/obj/effect/landmark/start/shophand, -/turf/open/floor/rogue/ruinedwood/herringbone, -/area/rogue/indoors/shelter/town) +/obj/structure/rack/rogue, +/obj/item/rogueweapon/sword/sabre, +/obj/item/rogueweapon/sword/sabre, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "swA" = ( /obj/structure/bed/rogue/inn/wool, /turf/open/floor/rogue/twig, @@ -24996,15 +25129,8 @@ /turf/closed/wall/mineral/rogue/wooddark/window, /area/rogue/indoors/shelter/town) "tTg" = ( -/obj/structure/rack/rogue/shelf/big, -/obj/item/rogueweapon/mace/woodclub, -/obj/item/rogueweapon/mace/woodclub, -/obj/item/rogueweapon/mace/wsword, -/obj/item/rogueweapon/mace/wsword, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null - }) +/turf/closed/wall/mineral/rogue/stone/window/moss, +/area/rogue/indoors/town/vault) "tTx" = ( /obj/effect/decal/border/ruinedwood/inverted{ dir = 1 @@ -25492,7 +25618,10 @@ /obj/structure/ladder, /obj/machinery/light/rogue/wallfire/candle/blue/l, /turf/open/floor/rogue/greenstone, -/area/rogue/outdoors/caves) +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "umj" = ( /obj/structure/spider/stickyweb{ dir = 8; @@ -25538,8 +25667,8 @@ name = "far stonehedge" }) "unr" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/rogue/dirt/road, +/obj/structure/flora/roguegrass, +/turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -26452,9 +26581,15 @@ name = "Silver Dragon" }) "uXz" = ( -/obj/machinery/light/rogue/wallfire/candle/r, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/warehouse) +/obj/structure/rack/rogue/shelf/big, +/obj/item/rogueweapon/mace/woodclub, +/obj/item/rogueweapon/mace/woodclub, +/obj/item/rogueweapon/mace/wsword, +/obj/item/rogueweapon/mace/wsword, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "uXB" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/water/swamp, @@ -26620,6 +26755,13 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"vdK" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "ven" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/floor/rogue/grass, @@ -27595,10 +27737,10 @@ name = "Shores of the Emerald Coast" }) "vXN" = ( -/obj/structure/fluff/statue/tdummy, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/turf/open/floor/rogue/blocks/bluestone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "vYA" = ( /obj/machinery/loom, @@ -28359,6 +28501,16 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"wJs" = ( +/obj/item/clothing/wrists/roguetown/bracers/leather, +/obj/item/clothing/wrists/roguetown/bracers/leather, +/obj/item/clothing/wrists/roguetown/bracers, +/obj/item/clothing/wrists/roguetown/bracers, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wJA" = ( /obj/structure/fluff/walldeco/innsign{ icon_state = "medposter5" @@ -28674,6 +28826,23 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"wYQ" = ( +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wZa" = ( /obj/effect/wisp, /turf/open/floor/rogue/herringbone, @@ -51620,14 +51789,14 @@ vFo rTO nhM nhM -nhM -fDV -fDV -gTO -qMz -fDV -fDV -fDV +vxU +dYB +dYB +dYB +gfu +bCN +jwm +wJA qMz qMz fDV @@ -51822,14 +51991,14 @@ xfT rTO nhM nhM -nhM -fDV -fDV -fDV -fDV -fDV -fDV -fDV +vxU +ggJ +dYB +dYB +vXN +aLD +wJs +swb qMz qMz fDV @@ -52022,16 +52191,16 @@ vFo rTO rTO rTO -lyF -nhM +vxU nhM -qMz -fDV -fDV -fDV -fDV -fDV -qMz +vxU +dYB +dYB +dYB +vXN +dYB +dYB +hPh fDV qMz qMz @@ -52224,16 +52393,16 @@ vFo dYz kAr umc -lyF -nhM +vxU nhM -qMz -fDV -fDV -qMz -fDV -fDV -fDV +vxU +dYB +dYB +dYB +vXN +pKP +dYB +dYB fDV fDV fDV @@ -52423,19 +52592,19 @@ rTO sJF vFo vFo -rTO -lyF -lyF -lyF -nhM +tTg +mgS +vxU +vxU nhM -fDV -qMz -fDV -fDV -fDV -qMz -qMz +vxU +dYB +dYB +dYB +vXN +eAg +hCp +wYQ fDV fDV fDV @@ -52625,19 +52794,19 @@ rTO diM auK sVs -rTO -nhM -nhM -nhM +tTg +fdl +vxU nhM nhM -fDV -fDV -fDV -qMz -fDV -qMz -qMz +vxU +dYB +dYB +dYB +gfu +kgd +coD +may fDV fDV fDV @@ -52828,18 +52997,18 @@ rTO rTO rTO rTO +vxU +vxU nhM nhM -nhM -nhM -nhM -fDV -fDV -fDV -fDV -fDV -fDV -fDV +vxU +vxU +vxU +vxU +mgS +mgS +vxU +vxU fDV qMz fDV @@ -78900,7 +79069,7 @@ rxm lyF lyF vVw -vVw +cqD fuN lyF nVt @@ -80313,8 +80482,8 @@ prw xDh xDh rps -rps -ayy +vVw +mtE prw lyF lyF @@ -80515,8 +80684,8 @@ rps rps rps rps -rps -rps +vVw +vVw prw lyF rxm @@ -80717,8 +80886,8 @@ rps rps ayy rps -rps -rps +vVw +vVw prw lyF rxm @@ -80919,8 +81088,8 @@ xDh ayy ayy rps -rps -rps +vVw +vVw prw lyF lyF @@ -86357,7 +86526,7 @@ ifi ifi cgq rxm -lyF +vxU vxU vxU vxU @@ -86559,13 +86728,13 @@ ifi cgq cgq rxm -rxm -rxm -rxm -rxm -mgS -bCN vxU +dYB +dYB +dYB +gfu +bCN +jwm wJA vxU vxU @@ -86761,18 +86930,18 @@ ifi ifi ifi rxm -rxm -rxm -rxm -rxm -mgS -mgS vxU -ekG -hCp +ggJ +dYB +dYB +vXN +aLD +wJs +swb +vxU +nPq dYB dYB -tno vxU rxm rxm @@ -86963,18 +87132,18 @@ nVt nVt ifi rxm -rxm -rxm -rxm -rxm -mgS -ekG -hCp +vxU dYB -may dYB dYB -sip +vXN +dYB +dYB +hPh +gfu +ekG +dYB +tno bTu rxm nVt @@ -87165,18 +87334,18 @@ ifi nVt ifi rxm -rxm -rxm -rxm -rxm -mgS +vxU +dYB +dYB +dYB +vXN pKP -may dYB -hCp dYB -pFl -seH +bYK +dYB +dYB +sip bTu nVt nVt @@ -87367,18 +87536,18 @@ nVt nVt ifi rxm -rxm -rxm -rxm -rxm -mgS -ekG -hCp +vxU dYB -hCp dYB dYB -nPq +vXN +eAg +hCp +wYQ +gfu +ekG +pFl +seH vxU nVt nVt @@ -87569,14 +87738,14 @@ nVt ifi ifi rxm -rxm -rxm -rxm -rxm -mgS -mgS -vxU vxU +dYB +dYB +dYB +gfu +kgd +coD +may vxU kvH kvH @@ -87771,15 +87940,15 @@ ifi ifi ifi rxm -rxm -rxm -rxm -rxm +vxU +vxU +vxU +vxU +mgS mgS -fdl vxU -cgq -cgq +vxU +vxU bTu vxU vxU @@ -87977,9 +88146,9 @@ rxm rxm rxm rxm -vxU -vxU -vxU +cgq +cgq +cgq cgq cgq nVt @@ -121110,7 +121279,7 @@ mJe eND bTI bTI -jql +avu uCN eND eND @@ -121308,14 +121477,14 @@ qJZ nFS beK beK -qJZ -ucZ -nfU -tNZ -jql -uCN -ucZ -nfU +vdK +aoF +uXz +elJ +elJ +pMv +eTV +tHt ucZ wSv sPl @@ -121510,14 +121679,14 @@ qJZ beK beK beK -weq -ucZ -uCN -xKV -jql -tNZ -xKV -ucZ +rLF +aeO +avu +elJ +laG +elJ +avu +pVI vQz nfU wSv @@ -121712,14 +121881,14 @@ qJZ beK beK beK -qMs -okm -tNZ -xKV -jql -uCN -myd -myd +dpz +elJ +gZN +elJ +elJ +elJ +pMv +elJ ucZ gsy uCN @@ -121914,14 +122083,14 @@ vmN beK beK vIa -qJZ -uCN -ucZ -nfU -unr -uCN -ucZ -uCN +beK +avu +elJ +elJ +avu +elJ +pMv +pMv idV ucZ ucZ @@ -122116,14 +122285,14 @@ qJZ beK beK beK -gGI -uCN -tTg -npg -jql -unr -eTV -tHt +beK +elJ +elJ +elJ +elJ +elJ +laG +avu okm ucZ uCN @@ -122318,13 +122487,13 @@ qJZ nFS beK beK -tEM -dok -jql -jql -coD -jql -jql +beK +elJ +pMv +pMv +elJ +elJ +elJ eJl dok wSv @@ -122520,14 +122689,14 @@ qJZ vIa beK beK -dpz -jql +xDM +elJ avu -jql -jql -jql +pMv +elJ +elJ +unr unr -npg xKV tNZ vQz @@ -122722,14 +122891,14 @@ qMs beK beK beK -ijB -jql -jql -jql -jql -jql -unr -laG +xhh +npg +elJ +elJ +pMv +pMv +avu +ucZ dok uCN ucZ @@ -122924,14 +123093,14 @@ qJZ beK beK nFS -ijB -jql -jql -jql -jql -jql -coD +gGI +xKV +laG +avu +laG jql +xKV +jFL ucZ myd idV @@ -123126,14 +123295,14 @@ qJZ beK beK nFS -ijB -jql -unr -unr -jql -jql -jql -bYK +tLk +ucZ +wSv +gBA +ucZ +ucZ +tNZ +ucZ ucZ wSv uCN @@ -123328,14 +123497,14 @@ tLk beK beK vIa -xDM -jql -jql -unr -jql -jql -pVI -tNZ +tLk +ucZ +ucZ +ucZ +wSv +ucZ +ucZ +uCN gBA wSv wSv @@ -123530,15 +123699,15 @@ qJZ beK beK beK -xhh -npg -jql -jql -unr -unr -npg +qJZ +uCN +uCN ucZ ucZ +xKV +xKV +uCN +ucZ uCN wSv fbr @@ -123732,14 +123901,14 @@ qJZ vIa beK beK -gGI -xKV -coD +ijB npg -vXN -jql +uCN +wSv +uCN +wSv xKV -jFL +ucZ uCN ghL ucZ @@ -124288,7 +124457,7 @@ nXV lss nXV jsd -nXV +piY jsd nXV jsd @@ -127502,8 +127671,8 @@ sWi tNb leL qBY -eAg -qBY +wGe +jxO xOB qCD mtr @@ -127703,8 +127872,8 @@ tNb qQe tNb xOB -qBY -qBY +cVC +jxO gar lbH jxO @@ -127905,8 +128074,8 @@ tNb sWi tNb xOB -gar -qBY +jrT +jxO gar aNY mtr @@ -128107,8 +128276,8 @@ tNb sWi tNb xOB -gar -uXz +ktO +tOT leL leL wkE @@ -162651,7 +162820,7 @@ sPk sPk xOB bnB -swb +bnB bnB xOB kcG @@ -162853,7 +163022,7 @@ vMS vMS dNq bnB -swb +bnB bnB xOB pbh diff --git a/_maps/templates/shelter_3.dmm b/_maps/templates/shelter_3.dmm index e607deb791b..91da8e5406f 100644 --- a/_maps/templates/shelter_3.dmm +++ b/_maps/templates/shelter_3.dmm @@ -62,6 +62,13 @@ }, /turf/open/floor/rogue/greenstone, /area/rogue/indoors) +"fY" = ( +/obj/structure/chair/wood/rogue/fancy{ + dir = 8 + }, +/obj/structure/roguemachine/scomm, +/turf/open/floor/rogue/greenstone, +/area/rogue/indoors) "gi" = ( /obj/structure/table/vtable/v2, /obj/structure/lever/wall{ @@ -349,9 +356,8 @@ /turf/open/floor/rogue/greenstone, /area/rogue/indoors) "UK" = ( -/obj/structure/roguemachine/merchantvend{ - icon_state = "goldvendor"; - locked = 0 +/obj/structure/roguemachine/merchantvend/public{ + icon_state = "goldvendor" }, /turf/closed/wall/mineral/rogue/craftstone, /area/rogue/indoors) @@ -452,7 +458,7 @@ oF fW rV FX -Kf +fY Kf ld ld diff --git a/code/modules/clothing/rogueclothes/pants.dm b/code/modules/clothing/rogueclothes/pants.dm index 3219ca0428c..7aa9cf700f5 100644 --- a/code/modules/clothing/rogueclothes/pants.dm +++ b/code/modules/clothing/rogueclothes/pants.dm @@ -124,6 +124,8 @@ name = "studded skirt" icon = 'modular_stonehedge/icons/armor/pants.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/pants.dmi' + //slightly better than normal iron chain by 10 blunt and stab. + armor = list("blunt" = 50, "slash" = 80, "stab" = 50, "bullet" = 10, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) desc = "Short studded skirt made of fine leather and iron." icon_state = "studdedskirt" genitalaccess = TRUE From abfaf14abeab7c2de5b4074c601b50f9e92649cd Mon Sep 17 00:00:00 2001 From: Enite Date: Sun, 24 Nov 2024 17:59:19 -0500 Subject: [PATCH 017/192] Spawner adjustments (#98) * Notes * Spawner Expansion * That might be too high --------- Co-authored-by: Enite --- _maps/map_files/otherz/ashlands.dmm | 2 +- _maps/map_files/otherz/forest.dmm | 76 ++++++------------- .../structures/roguetown/mobspawner.dm | 29 ++++--- code/game/objects/structures/spawner.dm | 58 ++++++++++---- 4 files changed, 83 insertions(+), 82 deletions(-) diff --git a/_maps/map_files/otherz/ashlands.dmm b/_maps/map_files/otherz/ashlands.dmm index e9826236e5d..7754e1539fe 100644 --- a/_maps/map_files/otherz/ashlands.dmm +++ b/_maps/map_files/otherz/ashlands.dmm @@ -11367,7 +11367,7 @@ fx Ag pC wj -VL +wj wj Yg Lc diff --git a/_maps/map_files/otherz/forest.dmm b/_maps/map_files/otherz/forest.dmm index f9627ad1ff1..65bb50c0664 100644 --- a/_maps/map_files/otherz/forest.dmm +++ b/_maps/map_files/otherz/forest.dmm @@ -795,12 +795,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"eE" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/water/swamp, -/area/rogue/indoors/shelter/woods/overgrownfort) "eF" = ( /turf/closed/wall/shroud{ opacity = 0 @@ -1681,7 +1675,6 @@ "jO" = ( /obj/structure/bed/rogue/inn/hay, /obj/item/bedsheet/rogue/cloth, -/obj/structure/spawner/invisible/skeleton, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) "jP" = ( @@ -1738,10 +1731,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"kc" = ( -/obj/effect/mob_spawner/goblin, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/shelter/woods/overgrownfort) "ke" = ( /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/rogue/grass, @@ -1920,6 +1909,10 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) +"ln" = ( +/obj/effect/mob_spawner/goblin, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/woods/overgrownfort) "lq" = ( /obj/structure/flora/roguegrass/fungus_bush, /turf/open/floor/rogue/dirt, @@ -3369,10 +3362,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"tZ" = ( -/obj/structure/glowshroom, -/turf/open/water/swamp, -/area/rogue/indoors/shelter/woods/overgrownfort) "ua" = ( /obj/structure/stairs{ dir = 4 @@ -3491,10 +3480,6 @@ "uH" = ( /turf/closed/wall/mineral/rogue/wooddark/vertical, /area/rogue/outdoors/woods/wraithhouse) -"uK" = ( -/obj/effect/mob_spawner/goblin, -/turf/closed/wall/mineral/rogue/stone/moss, -/area/rogue/indoors/shelter/woods/overgrownfort) "uL" = ( /obj/machinery/light/rogue/smelter/great, /turf/open/floor/rogue/metal, @@ -4003,11 +3988,6 @@ }, /turf/open/floor/bronze, /area/rogue/indoors/shelter/town/dwarf) -"xz" = ( -/obj/structure/chair/stool/rogue, -/obj/effect/mob_spawner/goblin, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/shelter/woods/overgrownfort) "xF" = ( /obj/structure/flora/roguegrass/water, /turf/open/water/river{ @@ -7208,10 +7188,6 @@ /obj/machinery/light/rogue/firebowl, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) -"Qf" = ( -/obj/effect/mob_spawner/goblin, -/turf/open/floor/rogue/dirt/road, -/area/rogue/indoors/shelter/woods/overgrownfort) "Qh" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -8192,10 +8168,6 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) -"Wx" = ( -/mob/living/carbon/human/species/skeleton/npc/dungeon/boss, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/shelter/woods/overgrownfort) "WA" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/swamp/deep, @@ -8290,6 +8262,10 @@ }, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/cave/underdark) +"Xf" = ( +/obj/effect/mob_spawner/skeleton, +/turf/open/floor/rogue/dirt/road, +/area/rogue/indoors/shelter/woods/overgrownfort) "Xg" = ( /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/woods{ @@ -8730,12 +8706,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"ZX" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/water/swamp, -/area/rogue/indoors/shelter/woods/overgrownfort) "ZY" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -21876,7 +21846,7 @@ Ly hQ hQ aZ -hI +BJ BJ aZ aZ @@ -22543,7 +22513,7 @@ Ly aZ hT wT -Wx +BJ BJ BJ iB @@ -22675,7 +22645,7 @@ Ly Ly aZ RR -ZX +iB iB iB iB @@ -22814,7 +22784,7 @@ wT iB bK iB -hI +BJ BJ aZ wT @@ -23078,8 +23048,8 @@ BJ BJ iB iB -eE -bK +iB +Xf BJ iB wT @@ -23344,7 +23314,7 @@ wT IV iB iB -mD +BJ aZ BJ BJ @@ -24138,7 +24108,7 @@ Ly Ly aZ iB -tZ +iB iB iB iB @@ -24272,7 +24242,7 @@ Ly aZ wT iB -ZX +iB iB iB iB @@ -24406,7 +24376,7 @@ aZ wT mk xx -eE +iB IV hd wT @@ -58998,7 +58968,7 @@ RX pI bl gS -Qf +bK BJ BJ Gn @@ -59253,7 +59223,7 @@ BP BP lF Cg -xz +Cg ew Or iF @@ -59526,7 +59496,7 @@ PL BP BP Vo -uK +BP BP Lk gS @@ -59788,7 +59758,7 @@ ew ew ew ew -RX +ln BP MT RX @@ -60195,7 +60165,7 @@ RX RX BP qI -kc +BJ BJ BJ bK diff --git a/code/game/objects/structures/roguetown/mobspawner.dm b/code/game/objects/structures/roguetown/mobspawner.dm index 8043ca5344f..6cbc507c113 100644 --- a/code/game/objects/structures/roguetown/mobspawner.dm +++ b/code/game/objects/structures/roguetown/mobspawner.dm @@ -1,27 +1,24 @@ var/global/total_spawned_mobs = 0 -var/global/max_total_spawned_mobs = 30 // New global variable for the total limit +var/global/max_total_spawned_mobs = 100 // New global variable for the total limit /obj/effect/mob_spawner icon = 'icons/effects/landmarks_static.dmi' icon_state = "random_loot" var/spawn_timer var/max_spawned_mobs = 1 + var/mobs_to_spawn = 0 var/current_spawned_mobs = 0 - var/spawn_interval = 600 // Default to 60 seconds - var/list/ambush_mobs = list( - /mob/living/carbon/human/species/skeleton/npc/ambush = 20, - /mob/living/simple_animal/hostile/retaliate/rogue/wolf = 40, - /mob/living/simple_animal/hostile/retaliate/rogue/bigrat = 60, - /mob/living/simple_animal/hostile/retaliate/rogue/spider = 40, - /mob/living/carbon/human/species/goblin/npc/ambush/cave = 30 - ) + var/spawn_interval = 3600 //6 minutes + var/spawn_range = 10 //radius in which mobs can be spawned + var/player_range = 15 //range at which a nearby player will pause the spawner + var/list/accepted_turfs = list(/turf/open/floor/rogue/dirt) //prevents mobs from being spawned on unwanted turfs outside your dungeon + var/list/ambush_mobs = list(/mob/living/carbon/human/species/skeleton/npc/ambush = 20) var/list/adventurer_landmarks = list() // Store landmarks here - var/area/valid_area = /area/rogue/outdoors/bog // Define the valid area + var/area/valid_area = /area/rogue/outdoors/bog //Useful for randomly generated maps, will delete spawners created outside this area. New() ..() // Call the parent constructor - spawn_interval = rand(2400, 3600) // RNG between 4 minutes and 6 minutes - adventurer_landmarks = get_all_adventurer_landmarks() + adventurer_landmarks = get_all_adventurer_landmarks() //prevents spawners from being placed near player spawns if (!is_in_valid_area(src)) del src // Delete the spawner if it's not in the valid area else @@ -32,7 +29,7 @@ var/global/max_total_spawned_mobs = 30 // New global variable for the total limi proc/spawn_and_continue() if (total_spawned_mobs < max_total_spawned_mobs && current_spawned_mobs < max_spawned_mobs) - spawn_random_mobs(2) // Attempt to spawn 2 mobs each time + spawn_random_mobs(mobs_to_spawn) start_spawning() proc/spawn_random_mobs(var/num_to_spawn) @@ -55,7 +52,7 @@ var/global/max_total_spawned_mobs = 30 // New global variable for the total limi proc/get_random_valid_turf() var/list/valid_turfs = list() - for (var/turf/T in range(4, src)) + for (var/turf/T in range(spawn_range, src)) if (is_valid_spawn_turf(T)) valid_turfs += T if (valid_turfs.len == 0) @@ -63,6 +60,8 @@ var/global/max_total_spawned_mobs = 30 // New global variable for the total limi return pick(valid_turfs) proc/is_valid_spawn_turf(turf/T) + if (istype(T, accepted_turfs)) + return FALSE if (istype(T, /turf/closed)) return FALSE if (!is_in_valid_area(T)) @@ -70,7 +69,7 @@ var/global/max_total_spawned_mobs = 30 // New global variable for the total limi for (var/L in adventurer_landmarks) if (get_dist(T, L) < 10) return FALSE - if (players_nearby(T, 10)) + if (players_nearby(T, player_range)) return FALSE return TRUE diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index cbe5f5077f1..76f08b1eb19 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -147,6 +147,8 @@ /mob/living/simple_animal/hostile/rogue/ghost/wraith/wraith2 = 1, /mob/living/simple_animal/hostile/rogue/ghost/wraith/wraith3 = 1) +//Destructible mob spawners. Have a faster respawn rate, useful for events. + /obj/structure/spawner/monster name = "monster hole" desc = "" @@ -203,11 +205,13 @@ /mob/living/simple_animal/hostile/retaliate/rogue/bogtroll = 4, /mob/living/simple_animal/hostile/retaliate/rogue/cavetroll = 4) +//Indestructible invisible mob spawners. Use these for areas with respawning chests. + /obj/structure/spawner/invisible name = "" desc = "" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - spawn_time = 3600 + spawn_time = 4200 //7 minutes max_mobs = 1 mob_types = list( /mob/living/simple_animal/hostile/rogue/gravelord = 1) @@ -273,10 +277,10 @@ /obj/structure/spawner/invisible/monster/minotaur max_mobs = 1 mob_types = list( - /mob/living/simple_animal/hostile/retaliate/rogue/minotaur = 4, - /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe = 3, - /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/female = 4, - /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe/female = 3) + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur = 5, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe = 1, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/female = 5, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe/female = 1) /obj/structure/spawner/invisible/monster/wolf max_mobs = 2 @@ -323,13 +327,41 @@ spawn_text = "appears out of hiding!" faction = list("orcs") -/obj/effect/mob_spawner/goblin - max_spawned_mobs = 6 - valid_area = /area/rogue/indoors/shelter/woods/overgrownfort +//Invisible spawners capable of handling carbon mobs. Use in dungeons and areas with respawning chests. +/obj/effect/mob_spawner/goblin + max_spawned_mobs = 14 + mobs_to_spawn = 7 + spawn_interval = 3000 //5 minutes + spawn_range = 10 + player_range = 15 + valid_area = /area/rogue + accepted_turfs = list( + /turf/open/floor/rogue/cobblerock, + /turf/open/floor/rogue/ruinedwood/spiral, + /turf/open/floor/rogue/blocks) + ambush_mobs = list( + /mob/living/carbon/human/species/goblin/npc = 6, + /mob/living/carbon/human/species/goblin/npc/hell = 1, + /mob/living/carbon/human/species/goblin/npc/cave = 4, + /mob/living/carbon/human/species/goblin/npc/sea= 1, + /mob/living/carbon/human/species/goblin/npc/moon = 1) + +/obj/effect/mob_spawner/skeleton + max_spawned_mobs = 10 + mobs_to_spawn = 5 + spawn_interval = 3600 //6 minutes + spawn_range = 10 + player_range = 15 + valid_area = /area/rogue + accepted_turfs = list( + /turf/open/floor/rogue/cobblerock, + /turf/open/water/swamp, + /turf/open/floor/rogue/dirt/road) ambush_mobs = list( - /mob/living/carbon/human/species/goblin/npc = 6, //archer - /mob/living/carbon/human/species/goblin/npc/hell = 1, - /mob/living/carbon/human/species/goblin/npc/cave = 4, - /mob/living/carbon/human/species/goblin/npc/sea= 1, - /mob/living/carbon/human/species/goblin/npc/moon = 1) + /mob/living/simple_animal/hostile/rogue/skeleton/guard/shield = 40, + /mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow = 30, + /mob/living/simple_animal/hostile/rogue/skeleton/guard/crypt_guard = 20, + /mob/living/simple_animal/hostile/rogue/skeleton/guard/crypt_guard_spear = 20, + /mob/living/carbon/human/species/skeleton/npc/dungeon = 30, + /mob/living/carbon/human/species/skeleton/npc/dungeon/boss = 5) From 96bf873d54ffdf847be2b3fa9676dd607aa726f1 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 02:32:54 +0300 Subject: [PATCH 018/192] sleevening and more map shit fix --- _maps/map_files/dreamhold/Dreamhold.dmm | 23 +++++++++++++++--- code/game/objects/effects/landmarks.dm | 2 +- code/modules/clothing/clothing.dm | 6 +++++ code/modules/clothing/rogueclothes/armor.dm | 5 ++++ .../clothing/onmob/helpers/sleeves_armor.dmi | Bin 0 -> 1310 bytes 5 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 19d2f13e1f9..58b4a7a4124 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -28847,6 +28847,13 @@ /obj/effect/wisp, /turf/open/floor/rogue/herringbone, /area/rogue/under/cavewet/bogcaves) +"wZi" = ( +/obj/effect/landmark/start/monk, +/turf/open/floor/rogue/cobble, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "wZF" = ( /obj/structure/flora/roguegrass/maneater/real{ aggroed = 1 @@ -29201,6 +29208,14 @@ /obj/item/seeds/berryrogue/poison, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/exposed/bath) +"xlt" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/landmark/start/monk, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xlC" = ( /obj/structure/chair/bench/church/smallbench, /turf/open/floor/rogue/ruinedwood/herringbone, @@ -153983,8 +153998,8 @@ kan iYC kan dAL -rsg -rsg +wZi +wZi sfZ emy qgd @@ -154387,8 +154402,8 @@ nfv ghn kan dAL -sfZ -sfZ +xlt +xlt kan wOd dAL diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 6f1c368bcf4..c67a2405f7b 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -249,7 +249,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/monk - name = "Priest" + name = "Monk" icon_state = "arrow" /obj/effect/landmark/start/druid diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 73e94d0d8b7..bfe1b08aca6 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -241,6 +241,12 @@ if(user.used_intent.type != INTENT_HARM && ismoth(M)) var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name + if(clothing_as_food.obj_integrity <= 10) + to_chat(M, span_notice("There is nothing left to eat on that...")) + return + if(clothing_as_food.smeltresult) //if its a smeltable damn thing its probably metal. + to_chat(M, span_notice("I can't eat that.")) + return if(clothing_as_food.attack(M, user, def_zone)) take_damage(15, sound_effect=FALSE) qdel(clothing_as_food) diff --git a/code/modules/clothing/rogueclothes/armor.dm b/code/modules/clothing/rogueclothes/armor.dm index 0c941998790..0ad59ba8c2d 100644 --- a/code/modules/clothing/rogueclothes/armor.dm +++ b/code/modules/clothing/rogueclothes/armor.dm @@ -308,6 +308,7 @@ desc = "Half plate in bikini form, still just as protective somehow." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "halfplatekini" item_state = "halfplatekini" allowed_sex = list(FEMALE) @@ -340,6 +341,7 @@ desc = "Full plate in bikini form, full package and full exposure." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "platekini" allowed_sex = list(FEMALE) armor_class = ARMOR_CLASS_HEAVY @@ -613,6 +615,7 @@ desc = "Flexible cowhide armor. Lightweight, better than nothing. Now in tasteful bikini shape." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "leatherkini" item_state = "leatherkini" allowed_sex = list(FEMALE) @@ -631,6 +634,7 @@ desc = "Studded leather is the most durable of all hides and leathers and about as light. This one is in bikini form." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "studleatherkini" item_state = "studleatherkini" allowed_sex = list(FEMALE) @@ -649,6 +653,7 @@ desc = "A light armor of wildbeast hide. Far more durable than leather. This will not keep a person warm though..." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "hidearmorkini" item_state = "hidearmorkini" allowed_sex = list(FEMALE) diff --git a/modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi b/modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi new file mode 100644 index 0000000000000000000000000000000000000000..179fbe06dbb25b4d8dc2ed0d12ae3f4f24a9053a GIT binary patch literal 1310 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;51P*4PNNa2yKajEv@Ck7R(n>;HqHN3tiV{T; z&ilK$s%)YQ9mFMes=~WT(v1fM7K44p1JX5jrhw9!mOaDB{YV8c);LpbW<<(*(%L;DE z`?-r{q{`j;+J4P*d5vV7jt0+`eKs2wutcuhC&#L=W|E(F#jIN$pO*Lkf2|w1|Al^+ zAJa`%&&G<#_(hWgu57;dLZpPPW!knSPZtPj^MAS9w(^c+P#CNF{PN{`T&z-QoxY9& z{??bLwUqrYth>SElJK(O+$PS?dCLNXR}yI^lH0|WC^PZ!6KiaBrZUM#xhz{7gsR)eAn~fP2B%eYQE`ve$jgkhwDDO z+GXl}`1AjrL!;JwqqD02HdXSyW@4>M$QG?iNLK}7)2f7I*D3{|X<#6-S?8wcp6yR7 zew|qNaP8c4?&}>EJ^fR;jWL_aIO_Cr^Mu$Gx7Q_CTEkt_woF_9e!*00&NCTvrw3m+ zwf0ErmOlC83#LjgVuYFY#Bi^8`jeY=b9gqmNuE;IIllSlUIpi$EY4pNkIB7#%=?4q zb_3U6)pf@<)*Sj|vEq=H#)OMqZyJ+-w!B}zgNaKeUQCMF5_`UuLAXPQ75$Ni2 z^X2vRjwx=d58XZc@_xL)%!^U`_BDsqEquRzL;a+UauPExTIsX?x(x~pn_F>@jG~VB zCto8~Fn|NcGs{kb~#o5tz4 z-=0^`_$nxB6g9Uxq4QhNq7&*JY{5`{7*%QV43B)3 zoF2>t3?K5U(zk5$w^N*1<7D)+CB^LpC>6hWZGIz4cGaW!9bZ8zJzf1=);T3K0RRLq BKZF1P literal 0 HcmV?d00001 From cf06e4ff32855928cefa9ead2e1798eba4ae13ee Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 02:43:09 +0300 Subject: [PATCH 019/192] fuck --- code/modules/jobs/job_types/roguetown/church/grandmaster.dm | 2 +- code/modules/jobs/job_types/roguetown/church/templar.dm | 2 +- strings/phobia.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm index 73092beccac..19b84cc538a 100644 --- a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm +++ b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm @@ -49,7 +49,7 @@ head = /obj/item/clothing/head/roguetown/helmet/heavy/eorahelm wrists = /obj/item/clothing/neck/roguetown/psicross/eora cloak = /obj/item/clothing/cloak/templar/eora - if("Ravox") + if("Minhur") head = /obj/item/clothing/head/roguetown/helmet/heavy/ravoxhelm wrists = /obj/item/clothing/neck/roguetown/psicross/ravox cloak = /obj/item/clothing/cloak/templar/ravox diff --git a/code/modules/jobs/job_types/roguetown/church/templar.dm b/code/modules/jobs/job_types/roguetown/church/templar.dm index 2613d05a02f..ca8d2ba4938 100644 --- a/code/modules/jobs/job_types/roguetown/church/templar.dm +++ b/code/modules/jobs/job_types/roguetown/church/templar.dm @@ -50,7 +50,7 @@ head = /obj/item/clothing/head/roguetown/helmet/heavy/eorahelm wrists = /obj/item/clothing/neck/roguetown/psicross/eora cloak = /obj/item/clothing/cloak/templar/eora - if("Ravox") + if("Minhur") head = /obj/item/clothing/head/roguetown/helmet/heavy/ravoxhelm wrists = /obj/item/clothing/neck/roguetown/psicross/ravox cloak = /obj/item/clothing/cloak/templar/ravox diff --git a/strings/phobia.json b/strings/phobia.json index 8d4183602a7..deb608191d6 100644 --- a/strings/phobia.json +++ b/strings/phobia.json @@ -300,7 +300,7 @@ "lune", "sylvarn", "abyssia", - "ravox", + "minhur", "yamais", "onder", "hermeir", From 0d22606cb825818d2a7c4d7e4779a5f5a59ca693 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 02:45:26 +0300 Subject: [PATCH 020/192] Update LOOC.dm --- modular_hearthstone/code/interface/LOOC.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modular_hearthstone/code/interface/LOOC.dm b/modular_hearthstone/code/interface/LOOC.dm index be40e3ba1f2..f297b9e10e2 100644 --- a/modular_hearthstone/code/interface/LOOC.dm +++ b/modular_hearthstone/code/interface/LOOC.dm @@ -34,9 +34,11 @@ if(!msg) return +/* if(!(prefs.chat_toggles & CHAT_OOC)) to_chat(src, " You have OOC muted.") return +*/ if(!holder) if(findtext(msg, "byond://")) From b3bec397b2930e67c6aa243988c3ea215424aafb Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 02:57:54 +0300 Subject: [PATCH 021/192] Update cunnilingus.dm --- code/datums/sexcon/sex_actions/oral/cunnilingus.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/sexcon/sex_actions/oral/cunnilingus.dm b/code/datums/sexcon/sex_actions/oral/cunnilingus.dm index 569d33d223a..c828557b903 100644 --- a/code/datums/sexcon/sex_actions/oral/cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/oral/cunnilingus.dm @@ -51,7 +51,7 @@ user.sexcon.perform_sex_action(target, 2, 3, TRUE) if(target.sexcon.check_active_ejaculation()) target.visible_message(span_lovebold("[target] ejaculates into [user]'s mouth!")) - target.sexcon.cum_into() + target.sexcon.ejaculate() /datum/sex_action/cunnilingus/on_finish(mob/living/user, mob/living/target) ..() From 4825e4fe4ff467e340544e6a62739b402a249dbb Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 03:09:26 +0300 Subject: [PATCH 022/192] unshitcode --- code/datums/sexcon/sex_actions/oral/cunnilingus.dm | 2 +- code/datums/sexcon/sexcon.dm | 10 +++++++--- .../reagents/chemistry/reagents/other_reagents.dm | 4 ++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/code/datums/sexcon/sex_actions/oral/cunnilingus.dm b/code/datums/sexcon/sex_actions/oral/cunnilingus.dm index c828557b903..73292acc3d8 100644 --- a/code/datums/sexcon/sex_actions/oral/cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/oral/cunnilingus.dm @@ -51,7 +51,7 @@ user.sexcon.perform_sex_action(target, 2, 3, TRUE) if(target.sexcon.check_active_ejaculation()) target.visible_message(span_lovebold("[target] ejaculates into [user]'s mouth!")) - target.sexcon.ejaculate() + target.sexcon.cum_into(girljuice = TRUE) /datum/sex_action/cunnilingus/on_finish(mob/living/user, mob/living/target) ..() diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index 9331f3cf3b6..d1b7b6a0357 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -204,7 +204,7 @@ add_cum_floor(get_turf(target)) after_ejaculation() -/datum/sex_controller/proc/cum_into(oral = FALSE, vaginal = FALSE, anal = FALSE, nipple = FALSE) +/datum/sex_controller/proc/cum_into(oral = FALSE, vaginal = FALSE, anal = FALSE, nipple = FALSE, girljuice = FALSE) var/obj/item/organ/filling_organ/testicles/testes = user.getorganslot(ORGAN_SLOT_TESTICLES) if(!issimple(target) && target.mind) log_combat(user, target, "Came inside [target]") @@ -224,8 +224,12 @@ target.adjust_triumphs(1) target.add_stress(/datum/stressevent/cummax) to_chat(target, span_love("Our sex was a true TRIUMPH!")) - else - target.add_stress(/datum/stressevent/cumok) + else + target.add_stress(/datum/stressevent/cumok) + if(girljuice) + target.reagents.add_reagent(/datum/reagent/water/pussjuice, 10) + after_ejaculation() + return if(issimple(target)) if(testes) //simple target just remove the coom. var/cum_to_take = CLAMP((testes.reagents.maximum_volume/2), 1, testes.reagents.total_volume) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b6be1f260f1..ba8e7211be8 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -134,6 +134,10 @@ var/hydration = 12 alpha = 100 +/datum/reagent/water/pussjuice + name = "pussy juice" + description = "A strange slightly gooey substance." + /datum/chemical_reaction/grosswaterify name = "grosswater" id = /datum/reagent/water/gross From 9be8ab7353340ef02f28dddfd5ecad0a28b4e8c4 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 03:19:58 +0300 Subject: [PATCH 023/192] cunnicunni --- code/datums/sexcon/sex_actions/force/force_cunnilingus.dm | 4 +++- code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm | 2 +- code/datums/sexcon/sexcon.dm | 7 +++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/code/datums/sexcon/sex_actions/force/force_cunnilingus.dm b/code/datums/sexcon/sex_actions/force/force_cunnilingus.dm index d30c64f89ba..f3143e0f254 100644 --- a/code/datums/sexcon/sex_actions/force/force_cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/force/force_cunnilingus.dm @@ -44,7 +44,9 @@ do_thrust_animate(target, user) user.sexcon.perform_sex_action(user, 2, 4, TRUE) - user.sexcon.handle_passive_ejaculation() + if(user.sexcon.check_active_ejaculation()) + user.visible_message(span_lovebold("[user] ejaculates into [target]'s mouth!")) + user.sexcon.cum_into(girljuice = TRUE) user.sexcon.perform_sex_action(target, 0, 2, FALSE) target.sexcon.handle_passive_ejaculation() diff --git a/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm b/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm index e8feda385e2..c5ff5633e52 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm @@ -23,7 +23,7 @@ user.sexcon.perform_sex_action(target, 4, 3, TRUE) if(target.sexcon.check_active_ejaculation()) target.visible_message(span_love("[target] ejaculates into [user]'s mouth!")) - target.sexcon.cum_into(oral = TRUE) + target.sexcon.cum_into(girljuice = TRUE) /datum/sex_action/npc_cunnilingus/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] stops licking [target]'s cunt ...")) diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index d1b7b6a0357..54fd413a53b 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -227,8 +227,11 @@ else target.add_stress(/datum/stressevent/cumok) if(girljuice) - target.reagents.add_reagent(/datum/reagent/water/pussjuice, 10) - after_ejaculation() + if(!issimple(target)) + target.reagents.add_reagent(/datum/reagent/water/pussjuice, 10) + after_ejaculation() + else + after_ejaculation() return if(issimple(target)) if(testes) //simple target just remove the coom. From 340965de6ee9f9d661ab09cb6568bbc1eabe5f10 Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sun, 24 Nov 2024 17:22:09 -0800 Subject: [PATCH 024/192] less shitty incantations --- code/modules/spells/roguetown/acolyte/xylix.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/spells/roguetown/acolyte/xylix.dm b/code/modules/spells/roguetown/acolyte/xylix.dm index eea0f4ac004..47ef0fbed1f 100644 --- a/code/modules/spells/roguetown/acolyte/xylix.dm +++ b/code/modules/spells/roguetown/acolyte/xylix.dm @@ -11,7 +11,7 @@ chargedloop = null req_items = list(/obj/item/clothing/neck/roguetown/psicross) sound = 'sound/magic/webspin.ogg' - invocation = "Take my strength and grant me swiftness!" + invocation = "Sap my strength and speed my step!" invocation_type = "shout" associated_skill = /datum/skill/magic/holy antimagic_allowed = TRUE @@ -39,7 +39,7 @@ movement_interrupt = FALSE req_items = list(/obj/item/clothing/neck/roguetown/psicross) sound = 'sound/magic/webspin.ogg' - invocation = "Take their time!" + invocation = "Take their time and make it mine!" invocation_type = "shout" associated_skill = /datum/skill/magic/holy antimagic_allowed = TRUE @@ -66,7 +66,7 @@ range = 0 warnie = "sydwarning" movement_interrupt = FALSE - invocation = "Steal away their sight!" + invocation = "Steal away their sight so your work may be done!" invocation_type = "whisper" sound = 'sound/misc/area.ogg' associated_skill = /datum/skill/magic/holy From ce8b210f41976adce166a582c60997768e05c3bf Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sun, 24 Nov 2024 17:29:50 -0800 Subject: [PATCH 025/192] revive text --- code/modules/spells/roguetown/acolyte/zizo.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/spells/roguetown/acolyte/zizo.dm b/code/modules/spells/roguetown/acolyte/zizo.dm index cf02e0ead1d..84e05dfabb5 100644 --- a/code/modules/spells/roguetown/acolyte/zizo.dm +++ b/code/modules/spells/roguetown/acolyte/zizo.dm @@ -136,3 +136,5 @@ /obj/effect/proc_holder/spell/invoked/revive_inhumen/thief name = "Steal Death" + invocation = "Steal their soul from the grasp of Yamais!" + invocation_type = "shout" From 440c3f971d5563442d42ac33fb7052bdbfed70de Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sun, 24 Nov 2024 17:44:22 -0800 Subject: [PATCH 026/192] Mindless check --- code/game/objects/items/rogueitems/instruments.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/rogueitems/instruments.dm b/code/game/objects/items/rogueitems/instruments.dm index 9c0335ae482..c1898500c2b 100644 --- a/code/game/objects/items/rogueitems/instruments.dm +++ b/code/game/objects/items/rogueitems/instruments.dm @@ -97,7 +97,7 @@ soundloop.start() for(var/mob/living/carbon/human/L in viewers(7)) L.add_stress(stressevent) - if(!issimple(L)) + if(L.mind) var/datum/status_effect/buff/healing/musicalhealing/heal_effect = L.apply_status_effect(/datum/status_effect/buff/healing/musicalhealing) heal_effect.healing_on_tick = healthbonus else From d6a67146cb6132d854718a62eb8b0965dbb35ea2 Mon Sep 17 00:00:00 2001 From: Murderfox <47763263+Murderfoxen@users.noreply.github.com> Date: Mon, 25 Nov 2024 22:31:59 +1030 Subject: [PATCH 027/192] Church / Hall Updates (#102) - Undercroft with burial chambers and ritual area for Luneites and other patrons to bury. It is elven themed and not meant to look modern at all. - Guild hall has it's armory yassified. (it was ugly.) and the zoneing so stewards can get their care packages from the armory. - Added a single holding cell so adventurer guild captains and such can try and imprison problem folk near the infirmary. I think it's an awful idea to give them cells but whatever! We have so many geniuses on this server who want the same gameplay loops! 8) /salt --- _maps/map_files/dreamhold/Dreamhold.dmm | 2047 ++++++++++++++--------- 1 file changed, 1290 insertions(+), 757 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 58b4a7a4124..3380179b842 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -182,6 +182,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"ajl" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ajE" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/grass/jungle, @@ -987,19 +994,8 @@ name = "far stonehedge" }) "aLD" = ( -/obj/item/clothing/gloves/roguetown/chain/iron, -/obj/item/clothing/gloves/roguetown/chain/iron, -/obj/item/clothing/gloves/roguetown/chain/iron, -/obj/item/clothing/gloves/roguetown/chain/iron, -/obj/item/clothing/under/roguetown/chainlegs, -/obj/item/clothing/under/roguetown/chainlegs, -/obj/item/clothing/under/roguetown/chainlegs, -/obj/item/clothing/under/roguetown/chainlegs, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "aMz" = ( /obj/structure/flora/grass/jungle{ icon_state = "grassa1" @@ -1607,6 +1603,13 @@ /obj/effect/wisp, /turf/open/transparent/openspace, /area/rogue/outdoors/river) +"biY" = ( +/obj/structure/bars/steel, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bjo" = ( /obj/item/grown/log/tree/small, /obj/item/grown/log/tree/small, @@ -1912,6 +1915,15 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"bwR" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bxb" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/grass/jungle/b, @@ -2194,6 +2206,15 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"bJP" = ( +/obj/item/burial_shroud, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/shovel, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bLr" = ( /obj/effect/landmark/start/nightmaiden{ dir = 4 @@ -2536,9 +2557,7 @@ }) "bYy" = ( /obj/effect/landmark/event_spawn, -/turf/open/water/river{ - icon_state = "rockwd" - }, +/turf/open/water/cleanshallow, /area/rogue/outdoors/river) "bYK" = ( /obj/structure/mineral_door/wood/donjon{ @@ -2666,6 +2685,13 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"ced" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ceg" = ( /obj/structure/fluff/statue/tdummy2, /turf/open/floor/rogue/grass, @@ -2808,6 +2834,14 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"cnh" = ( +/obj/structure/closet/crate/coffin, +/obj/item/reagent_containers/glass/cup/silver, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "cnk" = ( /obj/structure/chair/wood{ dir = 1 @@ -2834,6 +2868,13 @@ /obj/structure/fermenting_barrel/random/water, /turf/open/floor/carpet/royalblack, /area/rogue/indoors/town/bath) +"cot" = ( +/obj/effect/wisp, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "coA" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/water/river, @@ -2888,6 +2929,13 @@ }, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) +"cql" = ( +/obj/item/clothing/wrists/roguetown/bracers/leather, +/obj/item/clothing/wrists/roguetown/bracers/leather, +/obj/item/clothing/wrists/roguetown/bracers, +/obj/item/clothing/wrists/roguetown/bracers, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "cqm" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -2963,6 +3011,15 @@ }, /turf/open/floor/rogue/tile, /area/rogue/indoors/town) +"ctq" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa2" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ctv" = ( /obj/structure/chair/wood/rogue{ dir = 4 @@ -3027,6 +3084,12 @@ }, /turf/open/floor/rogue/cobble/mossy, /area/rogue/under/cavewet/bogcaves) +"cwI" = ( +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "cwU" = ( /obj/structure/flora/roguetree/happyrandom{ desc = "An old, beloved tree that even elves could love."; @@ -3384,6 +3447,12 @@ /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/grass, /area/rogue/under/cavewet/bogcaves) +"cMq" = ( +/obj/item/clothing/cloak/tabard, +/obj/item/clothing/cloak/tabard, +/obj/item/clothing/cloak/tabard, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "cMN" = ( /obj/effect/decal/stone/mossy{ dir = 4 @@ -4509,6 +4578,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"dAt" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dAL" = ( /obj/effect/landmark/start/priest, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -5178,11 +5254,12 @@ first_time_text = "The Twilight Woods" }) "ebw" = ( -/obj/structure/stairs/stone{ - dir = 4 - }, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/dirt, -/area/rogue/outdoors/caves) +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ebN" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -5393,9 +5470,12 @@ name = "Shores of the Emerald Coast" }) "eju" = ( -/obj/effect/wisp, -/turf/open/floor/rogue/dirt/ambush, -/area/rogue/outdoors/caves) +/obj/structure/bed/rogue/bedroll, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ejZ" = ( /obj/structure/flora/ausbushes/sunnybush, /turf/open/floor/rogue/grass, @@ -5774,14 +5854,10 @@ first_time_text = "The Dreamers Demesne.." }) "eAg" = ( -/obj/item/clothing/cloak/stabard/surcoat, -/obj/item/clothing/cloak/stabard/surcoat, -/obj/item/clothing/cloak/stabard/surcoat, -/obj/machinery/gear_painter/dye_bin, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" +/turf/closed/wall/shroud, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "eAi" = ( /obj/structure/flora/grass/jungle/b, @@ -6639,7 +6715,7 @@ name = "Vint"; faction = list("undead", "noble"ssssss) }, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/greenstone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -6774,6 +6850,15 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"fiN" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "fjc" = ( /obj/structure/flora/ausbushes/brflowers, /obj/structure/flora/ausbushes/ppflowers, @@ -7573,6 +7658,15 @@ /obj/machinery/light/rogue/wallfire/candle, /turf/open/floor/rogue/carpet, /area/rogue/indoors/shelter/town) +"fSm" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "fSn" = ( /obj/structure/mineral_door/wood/fancywood{ locked = 1; @@ -7665,6 +7759,16 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) +"fWE" = ( +/obj/structure/lever{ + name = "Holding Cell Lever"; + redstone_id = "Hcell" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "fXv" = ( /obj/structure/flora/rogueshroom/happyrandom{ icon_state = "mush4" @@ -7832,7 +7936,6 @@ /obj/structure/chair/bench{ dir = 8 }, -/obj/effect/landmark/start/gravedigger, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -7988,6 +8091,15 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"gfS" = ( +/obj/structure/table/church{ + icon_state = "churchtable_mid" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ggh" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/newtree, @@ -8003,11 +8115,8 @@ }) "ggJ" = ( /obj/structure/feedinghole, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "ggK" = ( /obj/structure/rack/rogue/shelf/big, /obj/item/reagent_containers/food/snacks/grown/rogue/sweetleafdry, @@ -8017,6 +8126,13 @@ /obj/item/reagent_containers/food/snacks/grown/rogue/sweetleafdry, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/tavern) +"ggN" = ( +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ghn" = ( /turf/closed/wall/mineral/rogue/decostone/mossy/blue{ dir = 8; @@ -8550,6 +8666,13 @@ }, /turf/open/floor/rogue/cobble, /area/rogue/indoors/shelter/town) +"gHQ" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gIm" = ( /obj/structure/glowshroom, /turf/open/floor/rogue/grass, @@ -8610,6 +8733,14 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"gMk" = ( +/obj/effect/wisp, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gMx" = ( /obj/effect/wisp, /turf/open/water/swamp, @@ -8625,6 +8756,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"gNQ" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gNW" = ( /obj/structure/flora/roguegrass/water/reeds, /obj/structure/glowshroom{ @@ -8888,6 +9026,16 @@ }, /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +"hbt" = ( +/obj/structure/table/wood{ + dir = 1; + icon_state = "longtable" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -9101,9 +9249,7 @@ first_time_text = null }) "hlx" = ( -/obj/item/roguebin/trash{ - name = "Offerings" - }, +/obj/structure/ladder, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -9276,6 +9422,13 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"hrL" = ( +/obj/machinery/light/rogue/wallfire/candle/blue/r, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "hrX" = ( /obj/structure/closet/crate/roguecloset/dark, /obj/item/book/granter/spell/spells5e/mindsliver5e, @@ -9539,10 +9692,7 @@ /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) "hCp" = ( -/obj/item/clothing/cloak/tabard, -/obj/item/clothing/cloak/tabard, -/obj/item/clothing/cloak/tabard, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -9832,12 +9982,10 @@ name = "far stonehedge" }) "hPh" = ( -/obj/item/clothing/suit/roguetown/armor/leather/studded, -/obj/item/clothing/suit/roguetown/armor/leather/studded, -/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, -/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, -/obj/structure/rack/rogue, -/turf/open/floor/rogue/ruinedwood/spiral, +/obj/item/reagent_containers/glass/bucket/wooden/spell_water, +/obj/item/natural/worms/leech, +/obj/item/natural/worms/leech/cheele, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -10280,6 +10428,16 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"ifC" = ( +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ifI" = ( /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/rogue/dirt, @@ -10322,6 +10480,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"ihH" = ( +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ihJ" = ( /obj/structure/mineral_door/wood/donjon{ locked = 1; @@ -10857,6 +11022,16 @@ icon_state = "medposter3" }, /turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) +"iCp" = ( +/obj/structure/bars/passage{ + name = "Holding Cell"; + redstone_id = "Hcell" + }, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -11258,6 +11433,16 @@ "iVM" = ( /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +"iWr" = ( +/obj/structure/mineral_door/wood/violet{ + lockid = "church"; + name = "Undercroft" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -13079,10 +13264,11 @@ /turf/open/floor/rogue/grass, /area/rogue/under/cavewet/bogcaves) "knX" = ( -/obj/structure/closet/dirthole/closed/loot, -/obj/structure/gravemarker, /turf/open/floor/rogue/dirt, -/area/rogue/outdoors/river) +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "koq" = ( /obj/structure/crabnest, /turf/open/water/cleanshallow, @@ -13675,6 +13861,15 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/cleanshallow, /area/rogue/outdoors/caves) +"kOm" = ( +/obj/structure/closet/dirthole/grave, +/obj/structure/flora/grass/jungle/b, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "kOt" = ( /obj/machinery/light/rogue/wallfire{ pixel_x = 32 @@ -14111,6 +14306,15 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"lhp" = ( +/obj/structure/closet/crate/chest, +/obj/item/storage/roguebag, +/obj/item/storage/roguebag, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "lhr" = ( /turf/closed/wall/mineral/rogue/decostone/mossy/cand, /area/rogue/under/cave) @@ -14280,7 +14484,7 @@ /area/rogue/outdoors/caves) "lmb" = ( /obj/structure/fermenting_barrel/water, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -14856,6 +15060,12 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"lOA" = ( +/turf/closed/wall/mineral/rogue/decostone/mossy/cand, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "lOX" = ( /obj/effect/landmark/start/cook, /turf/open/floor/rogue/blocks/stonered/tiny, @@ -15258,6 +15468,13 @@ }, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/caves) +"mjc" = ( +/obj/structure/chair/stool/rogue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "mjk" = ( /obj/structure/fermenting_barrel/beer, /turf/open/floor/rogue/ruinedwood/spiral, @@ -15963,6 +16180,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"mHs" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa1" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "mHJ" = ( /obj/machinery/light/rogue/firebowl, /turf/open/floor/rogue/grass, @@ -16445,6 +16671,14 @@ first_time_text = "Ravenloft Academy"; name = "Schoolgrounds" }) +"mZl" = ( +/obj/structure/closet/dirthole/closed/loot, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "mZn" = ( /obj/structure/flora/roguegrass/maneater/real{ aggroed = 1 @@ -16549,6 +16783,15 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"neW" = ( +/obj/structure/winch{ + redstone_id = "Advarmory" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "neX" = ( /obj/structure/table/vtable/v2, /obj/machinery/light/rogue/wallfire/candle/blue/r, @@ -16737,6 +16980,15 @@ /obj/effect/mist, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) +"nlT" = ( +/obj/structure/table/wood{ + icon_state = "longtable" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "nlW" = ( /obj/structure/fluff/railing/border{ dir = 6 @@ -17252,6 +17504,22 @@ icon_state = "rockwd" }, /area/rogue/outdoors/caves) +"nFF" = ( +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "nFS" = ( /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ @@ -18324,6 +18592,19 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"oEy" = ( +/obj/structure/table/wood{ + dir = 1; + icon_state = "longtable_mid" + }, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "oEA" = ( /turf/open/floor/rogue/cobble, /area/rogue/outdoors/woods{ @@ -18393,6 +18674,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"oGW" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "oHf" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -18503,13 +18791,10 @@ /turf/open/water/swamp/deep, /area/rogue/under/cavewet/bogcaves) "oKt" = ( -/obj/machinery/light/rogue/torchholder{ - dir = 4 - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "oKu" = ( /obj/structure/flora/newtree, @@ -18663,9 +18948,12 @@ /turf/open/floor/rogue/blocks/green, /area/rogue/indoors/town/bath) "oSy" = ( -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/outdoors/river) +/obj/structure/bars/cemetery, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "oSL" = ( /obj/structure/wallladder{ dir = 8 @@ -18704,7 +18992,7 @@ /obj/structure/fluff/walldeco/steward{ name = "Appraiser Within" }, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -19497,6 +19785,13 @@ /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/grass, /area/rogue/under/cavewet/bogcaves) +"pDC" = ( +/obj/item/clothing/cloak/stabard/surcoat, +/obj/item/clothing/cloak/stabard/surcoat, +/obj/item/clothing/cloak/stabard/surcoat, +/obj/machinery/gear_painter/dye_bin, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "pDN" = ( /obj/structure/flora/newtree, /turf/open/floor/rogue/grass, @@ -19685,7 +19980,8 @@ }) "pKP" = ( /obj/structure/ladder, -/turf/open/floor/rogue/ruinedwood/spiral, +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -19914,6 +20210,19 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"pRc" = ( +/obj/structure/table/wood{ + dir = 10; + icon_state = "tablewood2"; + pixel_y = 5 + }, +/obj/item/candle/skull/lit, +/obj/item/reagent_containers/glass/cup/wooden, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "pRH" = ( /obj/structure/roguetent, /turf/open/floor/rogue/ruinedwood/spiral, @@ -19980,6 +20289,16 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"pUi" = ( +/obj/item/burial_shroud, +/obj/structure/rack/rogue, +/obj/machinery/light/rogue/wallfire/candle/blue/r, +/obj/item/rogueweapon/shovel, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pUK" = ( /obj/machinery/light/rogue/torchholder/l{ dir = 8 @@ -20431,6 +20750,14 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"qlF" = ( +/obj/structure/closet/dirthole/closed, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "qlZ" = ( /obj/structure/glowshroom, /turf/open/floor/rogue/dirt, @@ -20784,6 +21111,15 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"qxR" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "qyw" = ( /mob/living/simple_animal/hostile/retaliate/rogue/wolf, /turf/open/floor/rogue/dirt, @@ -20842,10 +21178,14 @@ name = "far stonehedge" }) "qBH" = ( -/obj/effect/landmark/start/priest, -/turf/open/transparent/openspace, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" +/obj/structure/mineral_door/wood/violet{ + lockid = "church"; + name = "Burial Grounds" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "qBY" = ( /obj/structure/bed/rogue/inn/wool, @@ -21034,6 +21374,13 @@ /obj/effect/mist, /turf/open/water/bath, /area/rogue/indoors/town/bath) +"qJk" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "qJn" = ( /obj/structure/flora/roguetree/happyrandom{ desc = "An old, beloved tree that even elves could love."; @@ -21300,6 +21647,20 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"qTv" = ( +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "qTD" = ( /obj/structure/spacevine, /turf/closed/mineral/random/rogue, @@ -21528,6 +21889,16 @@ first_time_text = "Ravenloft Academy"; name = "Ravenloft Academy" }) +"qZo" = ( +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "qZN" = ( /obj/structure/flora/roguegrass, /obj/structure/flora/roguegrass/fungus_bush, @@ -21935,6 +22306,13 @@ /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/dirt, /area/rogue/under/cavewet/bogcaves) +"rrk" = ( +/obj/structure/safeglowshroom, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "rrq" = ( /obj/structure/rack/rogue, /obj/item/clothing/suit/roguetown/shirt/belldress/red{ @@ -23259,13 +23637,8 @@ /turf/open/water/swamp, /area/rogue/outdoors/caves) "swb" = ( -/obj/structure/rack/rogue, -/obj/item/rogueweapon/sword/sabre, -/obj/item/rogueweapon/sword/sabre, -/obj/item/rogueweapon/huntingknife/idagger/steel, -/obj/item/rogueweapon/huntingknife/idagger/steel, -/obj/item/rogueweapon/huntingknife/idagger/steel, -/turf/open/floor/rogue/ruinedwood/spiral, +/obj/structure/bookcase, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -24684,6 +25057,14 @@ "tzK" = ( /turf/open/floor/rogue/greenstone, /area/rogue/indoors/shelter/mountains) +"tzZ" = ( +/obj/structure/closet/dirthole/grave, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tAi" = ( /obj/structure/roguetent, /turf/open/floor/rogue/ruinedwood/spiral, @@ -25104,6 +25485,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"tRy" = ( +/obj/structure/safeglowshroom, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tRQ" = ( /obj/structure/flora/roguegrass, /obj/effect/spawner/roguemap/shroud, @@ -25256,6 +25644,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"tWw" = ( +/obj/effect/landmark/start/gravedigger, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tXF" = ( /obj/effect/decal/border/ruinedwood/inverted{ dir = 8 @@ -25384,9 +25779,16 @@ name = "Silver Dragon" }) "ucX" = ( -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/tame/saddled, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/caves) +/obj/structure/closet/crate/chest, +/obj/item/rope/chain, +/obj/item/rope/chain, +/obj/item/rope, +/obj/item/rope, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "ucZ" = ( /turf/open/floor/rogue/grass, /area/rogue/outdoors/rtfield{ @@ -25425,6 +25827,21 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"udV" = ( +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/structure/rack/rogue, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "udW" = ( /obj/structure/fluff/railing/border{ dir = 8 @@ -25826,6 +26243,13 @@ /obj/structure/ladder/earth, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/caves) +"uuU" = ( +/obj/structure/roguetent, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "uvi" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -26116,6 +26540,13 @@ /obj/structure/flora/roguetree/burnt, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) +"uDi" = ( +/obj/effect/wisp, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "uDp" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -26156,6 +26587,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"uFk" = ( +/obj/structure/bars/steel, +/turf/open/water/river{ + icon_state = "rockwd" + }, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "uFo" = ( /obj/structure/spacevine, /turf/open/water/swamp, @@ -26489,6 +26929,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"uSz" = ( +/obj/structure/spacevine, +/obj/machinery/light/rogue/torchholder, +/turf/open/water/river{ + icon_state = "rockwd" + }, +/area/rogue/outdoors/river) "uSC" = ( /mob/living/simple_animal/hostile/retaliate/rogue/spider, /obj/structure/spider/stickyweb{ @@ -26824,9 +27271,15 @@ name = "Tavern Stables" }) "vhA" = ( -/obj/item/natural/stone, -/turf/open/floor/rogue/dirt/ambush, -/area/rogue/outdoors/river) +/obj/machinery/light/rogue/torchholder{ + dir = 1; + pixel_y = 26 + }, +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "vil" = ( /obj/structure/fluff/railing/border, /turf/open/floor/rogue/cobble/mossy, @@ -27189,6 +27642,18 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"vzQ" = ( +/obj/structure/rack/rogue, +/obj/item/rogueweapon/sword/sabre, +/obj/item/rogueweapon/sword/sabre, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "vAd" = ( /obj/structure/spawner/invisible/monster/mossback, /turf/open/water{ @@ -27737,6 +28202,10 @@ name = "Shores of the Emerald Coast" }) "vXN" = ( +/obj/structure/bars/passage{ + name = "Armory"; + redstone_id = "Advarmory" + }, /turf/open/floor/rogue/blocks/bluestone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -27922,6 +28391,13 @@ "wjU" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/under/cave) +"wkA" = ( +/obj/structure/spacevine/dendor, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "wkB" = ( /turf/closed/wall/mineral/rogue/decostone, /area/rogue/outdoors/river) @@ -28071,13 +28547,37 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/shelter/bog) "wqe" = ( -/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame/saddled, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/caves) +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/flora/grass/jungle/b, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +"wqg" = ( +/obj/structure/roguewindow/stained/silver{ + opacity = 0 + }, +/obj/structure/bars/steel, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "wqn" = ( /obj/machinery/light/rogue/torchholder, /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors/shelter/town) +"wqN" = ( +/obj/structure/bars/cemetery, +/turf/closed/wall/shroud, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "wrl" = ( /obj/structure/flora/rogueshroom/happyrandom{ icon_state = "mush4" @@ -28502,14 +29002,10 @@ name = "Shores of the Emerald Coast" }) "wJs" = ( -/obj/item/clothing/wrists/roguetown/bracers/leather, -/obj/item/clothing/wrists/roguetown/bracers/leather, -/obj/item/clothing/wrists/roguetown/bracers, -/obj/item/clothing/wrists/roguetown/bracers, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "wJA" = ( /obj/structure/fluff/walldeco/innsign{ @@ -28827,18 +29323,8 @@ first_time_text = "The Twilight Woods" }) "wYQ" = ( -/obj/item/clothing/cloak/stabard, -/obj/item/clothing/cloak/stabard, -/obj/item/clothing/cloak/stabard, -/obj/item/clothing/suit/roguetown/armor/chainmail, -/obj/item/clothing/suit/roguetown/armor/chainmail, -/obj/item/clothing/neck/roguetown/chaincoif/iron, -/obj/item/clothing/neck/roguetown/chaincoif/iron, -/obj/item/clothing/neck/roguetown/chaincoif/iron, -/obj/item/clothing/neck/roguetown/chaincoif/iron, -/obj/item/clothing/suit/roguetown/armor/chainmail, -/obj/item/clothing/suit/roguetown/armor/chainmail, -/turf/open/floor/rogue/ruinedwood/spiral, +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -28854,6 +29340,13 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) +"wZn" = ( +/obj/structure/bars/steel, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wZF" = ( /obj/structure/flora/roguegrass/maneater/real{ aggroed = 1 @@ -29144,7 +29637,6 @@ /obj/structure/chair/bench{ dir = 4 }, -/obj/effect/landmark/start/gravedigger, /turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -29252,6 +29744,10 @@ }) "xnW" = ( /obj/structure/closet/crate/roguecloset, +/obj/item/rope, +/obj/item/rope, +/obj/item/rope/chain, +/obj/item/rope/chain, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -29265,6 +29761,13 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"xoV" = ( +/obj/structure/bed/rogue/bedroll, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "xoX" = ( /obj/machinery/light/rogue/wallfire/candle/l, /turf/open/floor/rogue/carpet, @@ -29362,6 +29865,14 @@ }, /turf/open/floor/rogue/wood/nosmooth, /area/rogue/indoors/town) +"xsZ" = ( +/obj/effect/wisp, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xto" = ( /obj/structure/table/wood{ dir = 5; @@ -29738,7 +30249,7 @@ /obj/structure/chair/bench/church/smallbench{ dir = 8 }, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -29820,6 +30331,17 @@ }, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/town) +"xKJ" = ( +/obj/item/clothing/suit/roguetown/armor/leather/studded, +/obj/item/clothing/suit/roguetown/armor/leather/studded, +/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, +/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, +/obj/structure/rack/rogue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "xKM" = ( /obj/structure/table/wood{ dir = 1; @@ -30006,6 +30528,16 @@ /obj/structure/glowshroom, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) +"xRS" = ( +/obj/structure/table/church{ + icon_state = "churchtable_end" + }, +/obj/item/rogueweapon/huntingknife/idagger/silver, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xSa" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/spacevine/dendor, @@ -30061,9 +30593,11 @@ name = "Ravenloft Academy" }) "xUo" = ( -/obj/effect/wisp, -/turf/open/water/swamp, -/area/rogue/outdoors/caves) +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xUU" = ( /obj/structure/table/church/m, /obj/structure/fluff/psycross{ @@ -30428,13 +30962,12 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) "yjm" = ( -/obj/item/reagent_containers/glass/bucket/wooden/spell_water, -/obj/item/natural/worms/leech, -/obj/item/natural/worms/leech/cheele, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" +/obj/effect/wisp, +/obj/structure/spacevine/dendor, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "yjw" = ( /obj/structure/flora/roguegrass/water, @@ -51804,14 +52337,14 @@ vFo rTO nhM nhM -vxU -dYB -dYB -dYB -gfu -bCN -jwm -wJA +nhM +fDV +fDV +fDV +fDV +fDV +fDV +fDV qMz qMz fDV @@ -52006,14 +52539,14 @@ xfT rTO nhM nhM -vxU -ggJ -dYB -dYB -vXN -aLD -wJs -swb +nhM +fDV +fDV +fDV +fDV +fDV +fDV +fDV qMz qMz fDV @@ -52208,14 +52741,14 @@ rTO rTO vxU nhM -vxU -dYB -dYB -dYB -vXN -dYB -dYB -hPh +nhM +fDV +fDV +fDV +fDV +fDV +fDV +fDV fDV qMz qMz @@ -52410,14 +52943,14 @@ kAr umc vxU nhM -vxU -dYB -dYB -dYB -vXN -pKP -dYB -dYB +nhM +fDV +fDV +fDV +fDV +fDV +fDV +fDV fDV fDV fDV @@ -52612,14 +53145,14 @@ mgS vxU vxU nhM -vxU -dYB -dYB -dYB -vXN -eAg -hCp -wYQ +nhM +fDV +fDV +fDV +fDV +fDV +fDV +fDV fDV fDV fDV @@ -52814,14 +53347,14 @@ fdl vxU nhM nhM -vxU -dYB -dYB -dYB -gfu -kgd -coD -may +nhM +fDV +fDV +fDV +fDV +fDV +fDV +fDV fDV fDV fDV @@ -53016,14 +53549,14 @@ vxU vxU nhM nhM -vxU -vxU -vxU -vxU -mgS -mgS -vxU -vxU +nhM +fDV +fDV +fDV +fDV +fDV +fDV +fDV fDV qMz fDV @@ -80899,7 +81432,7 @@ rps ayy rps rps -ayy +uSz rps vVw vVw @@ -81683,11 +82216,11 @@ vVw xDh xDh prw -cgq -cgq -cgq -cgq -lzV +nVt +nVt +nVt +nVt +rPi prw prw awm @@ -81885,12 +82418,12 @@ oSM xDh xDh prw -cgq -cgq +nVt +nVt nVt nVt rPi -lzV +rPi prw prw xDh @@ -82088,9 +82621,9 @@ xDh xDh prw lyF -cgq nVt -vYC +nVt +nVt rPi rPi rPi @@ -82283,19 +82816,19 @@ cgq cgq nVt nVt -lzV +rPi xDh vVw xDh xDh prw lyF -cgq nVt -jrB -vYC -vYC -tmk +nVt +nVt +nVt +nVt +nVt lyF prw xDh @@ -82310,9 +82843,9 @@ bFf bFf bFf rPi -cDz -cDz -cDz +rPi +rPi +rPi cDz cDz xbK @@ -82484,22 +83017,22 @@ cgq cgq cgq nVt -cgq -lzV +nVt +rPi xDh vVw xDh xDh prw -vYC -cgq nVt -jrB -jrB -vYC -tmk -tmk -prw +nVt +nVt +nVt +nVt +nVt +nVt +nVt +rPi prw awm xDh @@ -82509,12 +83042,12 @@ xDh bFf bFf bFf -rxm -rxm -rxm -rxm -nVt -rPi +vxU +vxU +vxU +vxU +vxU +vxU tkQ cDz vVw @@ -82682,9 +83215,9 @@ cgq cgq cgq cgq -cgq -cgq -cgq +lyF +nVt +nVt nVt nVt xDh @@ -82693,16 +83226,16 @@ vVw xDh xDh xDh -vYC -vYC nVt +xUo +eAg +xUo +xUo nVt nVt nVt -tmk -wqe -xDh -xDh +rPi +rPi prw xDh xDh @@ -82711,14 +83244,14 @@ prw prw bFf bFf -rxm -rxm -rxm -rxm -rxm +vxU +lmb +hCp +pRc +mjc +vxU rPi cDz -cDz vVw mtE prw @@ -82883,28 +83416,28 @@ cgq cgq cgq cgq -cgq -cgq -cgq -nVt +lyF nVt -rPi +tmk +tmk +tmk +xDh xDh xDh vVw xDh xDh xDh -tmk -vYC -jrB +nVt +xUo +ihH eju -cgq +xUo nVt -tmk -tmk -xDh -xDh +nVt +nVt +rPi +rPi prw prw xDh @@ -82913,13 +83446,13 @@ xDh lzV rPi rPi -rxm -rxm -rxm -rxm -rxm -bFf -cDz +vxU +hCp +hCp +hCp +hCp +vxU +rPi tkQ vVw vVw @@ -83085,29 +83618,29 @@ cgq cgq cgq cgq -cgq -cgq -cgq nVt -cgq +tmk +tmk +tmk +tmk xDh xDh xDh vVw xDh xDh -lzV -cgq -vYC -jrB -vYC -cgq +rPi +nVt +xUo +ced +kan +xUo +nVt +nVt +nVt +nVt +nVt nVt -tmk -tmk -ucX -tmk -vYC lyF prw prw @@ -83115,13 +83648,13 @@ xDh xDh prw rPi -rxm -rxm -rxm -rxm -rxm -bFf -tkQ +vxU +hCp +wZn +wZn +iCp +vxU +rPi tkQ vVw mtE @@ -83287,44 +83820,44 @@ cgq cgq cgq cgq -cgq -cgq -cgq -cgq +nVt +tmk +tmk +nVt nVt xDh xDh cBP -vVw xDh -prw -prw -lyF -lyF -vYC -vYC -jrB +xDh +rPi +xUo +xUo +xUo +kan +kan +xUo +nVt +nVt +nVt +nVt +nVt +nVt nVt -tmk -tmk -tmk -tmk -vYC -vYC rPi xDh xDh xDh xDh prw -rxm -rxm -rxm -rxm -rxm +vxU +xoV +wZn +fWE +hCp +vxU rPi -cDz -cDz +tkQ xbK vVw prw @@ -83489,44 +84022,44 @@ cgq cgq cgq cgq -cgq -cgq -cgq -cgq +nVt +tmk +tmk +tmk nVt oSM xDh bYy xDh xDh -prw -prw -lyF -cgq -vYC -vYC -vYC +rPi +xUo +xUo +eju +kan +ihH +xUo +nVt +nVt nVt nVt nVt nVt nVt -vYC -vYC rPi prw prw xDh xDh xDh -prw -rPi -bFf -rxm -rxm +vxU +vxU +uxq +mjc +hCp +vxU rPi -cDz -cDz +tkQ xbK vVw rPi @@ -83691,43 +84224,43 @@ cgq cgq cgq cgq -cgq -cgq -cgq -rPi -rPi -oSM -xDh -vVw -xDh -xDh lyF -lyF -cgq -vYC -jrB -cgq -vYC -vYC -vYC +nVt +tmk +xDh +rPi +xUo +lOA +wqg +wqg +lOA +xUo +xUo +xUo +lOA +uuU +lOA +xUo +xUo +xUo +xUo nVt nVt nVt -cgq rxm rPi rPi prw -prw +lzV xDh xDh xDh -prw +lzV +vxU +hCp +hCp +vxU rPi -rxm -rxm -bFf -tkQ tkQ vVw vVw @@ -83894,28 +84427,28 @@ cgq cgq cgq cgq -cgq -nVt -rPi -lzV -oSM -xDh -vVw -xDh -buM -lyF -lyF -cgq -cgq -jrB nVt nVt -vYC -vYC -vYC +xDh +rPi +lOA +ggN +wJs +wJs +wJs +lOA +xUo +xUo +fWg +kan +fWg +kan +bJP +bJP +xUo +xUo nVt nVt -vYC rxm bFf bFf @@ -83925,11 +84458,11 @@ prw xDh xDh xDh -prw -rxm -rxm -bFf -cDz +gkJ +hCp +hCp +vxU +rPi tkQ vVw vVw @@ -84095,27 +84628,27 @@ cgq cgq cgq cgq -cgq -lzV -prw +nVt +rPi prw -oSM -xDh -xDh -vVw xDh -buM -lyF -lyF -lyF -nVt -nVt -nVt -nVt +oSM +wqg +gNQ +kan +kan +kan +ggN +lOA +fWg +kan +kan +nlT +kan +kan +kan +wgl xUo -jrB -vYC -vYC nVt rxm rxm @@ -84127,10 +84660,10 @@ rPi xDh xDh xDh -prw -nVt -rxm -bFf +gkJ +hCp +hCp +vxU cDz tkQ vVw @@ -84296,28 +84829,28 @@ cgq cgq cgq cgq -cgq -cgq +nVt +nVt oSM xhl xDh xDh -xDh -xDh -vVw -xDh -lzV -cgq -ifi -ifi -cgq -xVg -cgq -nVt -nVt -ifi -ifi -cgq +wqg +gNQ +kan +hlx +kan +wJs +iWr +kan +tWw +kan +oEy +kan +tWw +kan +gfS +xUo nVt nVt nVt @@ -84329,12 +84862,12 @@ rPi prw xDh xDh -xDh -nVt -rxm +gkJ +hCp +hCp +vxU bFf cDz -cDz vVw vVw prw @@ -84498,28 +85031,28 @@ cgq cgq cgq cgq -cgq -cgq +nVt +nVt oKL xDh xDh xDh -xDh -rps -xDh -xDh -ifi -ifi -ifi -ifi -ifi -cgq -xVg -xVg -nVt -ifi -ifi -nVt +wqg +gNQ +kan +kan +kan +hrL +lOA +kan +kan +kan +hbt +kan +kan +kan +xRS +xUo nVt nVt nVt @@ -84531,12 +85064,12 @@ bFf prw prw xDh -xDh -xDh -bFf +gkJ +hCp +hCp vhA tkQ -tkQ +ayy vVw vVw prw @@ -84700,28 +85233,28 @@ cgq cgq cgq cgq -cgq +nVt nVt xDh xDh xDh -cBP -rps -xDh -xDh -lzV -ifi -cgq -cgq -cgq -ifi -cgq -cgq -xVg -cgq -ifi -ifi -cgq +xcU +lOA +hrL +wJs +wJs +wJs +lOA +xUo +xUo +jLy +wUB +kan +kan +pUi +bJP +xUo +xUo cgq nVt nVt @@ -84733,12 +85266,12 @@ bFf bFf prw prw -xDh -xDh -xDh -xDh -tkQ -cDz +gkJ +hCp +hCp +uFk +ayy +rps cqD vVw prw @@ -84907,23 +85440,23 @@ nVt xhl xDh xDh -cBP -rps -xDh -xDh -lzV -cgq -cgq -ifi -ifi -ifi -ifi -ifi -cgq -ifi -ifi -ifi -nVt +xcU +xUo +lOA +wqg +wqg +lOA +xUo +xUo +xUo +xUo +lOA +qBH +qBH +lOA +xUo +xUo +xUo nVt nVt nVt @@ -84935,12 +85468,12 @@ bFf bFf bFf prw -prw -xDh -xDh -xDh -xDh -xDh +vxU +hCp +hCp +uFk +rps +rps xbK vVw prw @@ -85108,24 +85641,24 @@ nVt cgq oSM xDh -cBP -cBP -rps +xcU +xcU xDh xDh -lzV -cgq -ifi -ifi -cgq -xVg -xVg -ifi -ifi -ifi -ifi -cgq -cgq +xDh +xDh +xUo +eAg +eAg +eHD +tRy +ifC +kan +oKt +oSy +ebw +cwI +xUo nVt nVt rxm @@ -85137,12 +85670,12 @@ vxU dwT vxU vxU -rPi -xDh -xDh -xDh -xDh -xDh +bTu +hCp +hCp +uFk +rps +rps xbK xbK prw @@ -85310,25 +85843,25 @@ rPi lzV xDh rps -rps -rps -rps xDh xDh -lzV -ifi -ifi -xVg -xVg -xVg -xVg -cgq -ifi -ifi -cgq -nVt +xDh +xDh +xDh +rPi +xUo +eAg +wkA +gHQ +knX +nFF +kan +kan +knX +ebw +qJk +xUo nVt -cgq rxm vxU vxU @@ -85339,12 +85872,12 @@ gfu gaZ riK vxU +qxR +hCp +hPh vxU -gkJ -gkJ -vxU -xDh -xDh +rps +rps xbK vVw prw @@ -85514,22 +86047,22 @@ rps rps rps cBP -buM -xDh -xDh -lzV -ifi -cgq -cgq -cgq -nVt -nVt -nVt -cgq -ifi -ifi -cgq -cgq +kqH +kqH +rPi +rPi +xUo +eHD +cot +ebw +tzZ +ebw +oKt +oKt +oSy +cwI +knX +eAg nVt rxm iCo @@ -85541,12 +86074,12 @@ dYB dYB dYB pRH -oKt -yjm +hCp +hCp lmb vxU prw -xDh +rps vVw vVw rPi @@ -85715,23 +86248,23 @@ rps vVw kqH kqH -lzV -lzV -lvd -lzV kqH -ifi -cgq -nVt -nVt -ifi -ifi -cgq -nVt -cgq -cgq -ifi -ifi +kqH +rPi +rPi +rPi +xUo +wkA +fiN +mZl +dAt +knX +uDi +kan +oSy +oSy +oSy +xUo nVt rxm uxq @@ -85743,8 +86276,8 @@ qFr dYB dYB pRH -dYB -cZz +hCp +hCp vxU vxU prw @@ -85914,26 +86447,26 @@ kqH kqH kqH kqH -lvd -lvd +kqH +kqH xVg cgq -xVg -xVg -ifi -ifi -cgq nVt -cgq -ifi -ifi -ifi -ifi -cgq nVt -xVg -cgq -ifi +nVt +nVt +xUo +eAg +rrk +ctq +tzZ +dAt +kan +kan +oSy +ebw +cwI +xUo nVt rxm ior @@ -85945,8 +86478,8 @@ afV dYB aIb gfu -dYB -cZz +hCp +hCp sWS vxU rPi @@ -86120,22 +86653,22 @@ cgq cgq xVg xVg -cgq -ifi -ifi -cgq -cgq nVt -cgq -ifi nVt -cgq -ifi -cgq nVt -xVg -cgq -ifi +nVt +xUo +eAg +eHD +cwI +knX +ebw +sfZ +kan +knX +gMk +qJk +xUo nVt rxm uxq @@ -86147,9 +86680,9 @@ qFr dYB dYB pRH -dYB -dYB -dYB +hCp +hCp +hCp vxU rPi rPi @@ -86321,24 +86854,24 @@ ifi ifi ifi ifi -ifi -ifi -ifi -ifi -ifi nVt nVt -ifi -ifi nVt -ifi -ifi nVt -xVg -xVg -ifi -ifi nVt +xUo +eAg +ajl +cwI +tzZ +knX +sfZ +oKt +oSy +knX +ebw +xUo +rxm rxm tcT hqX @@ -86350,7 +86883,7 @@ dYB dYB pRH oTv -dYB +hCp xHS vxU bFf @@ -86528,18 +87061,18 @@ nVt nVt nVt nVt -ifi -ifi -ifi -ifi -cgq -nVt -nVt -nVt -cgq -ifi -ifi -cgq +xUo +eAg +qZo +ebw +ebw +ebw +kan +oKt +oSy +oSy +oSy +eAg rxm vxU vxU @@ -86724,32 +87257,32 @@ ifi cgq nVt nVt -cgq -xVg -xVg -xVg -xVg nVt nVt -ifi -ifi -ifi -ifi -ifi -ifi -ifi -ifi -ifi -cgq -cgq +nVt +nVt +nVt +nVt +xUo +yjm +cwI +mHs +kOm +knX +oKt +kan +oSy +cwI +eAg +eAg rxm -vxU -dYB -dYB -dYB gfu bCN jwm +udV +gfu +wYQ +swb wJA vxU vxU @@ -86929,29 +87462,29 @@ xVg xVg xVg cgq -cgq -xVg -xVg nVt -ifi -ifi -cgq -cgq -xVg -xVg -cgq -cgq -ifi -ifi -ifi +nVt +nVt +xUo +eHD +ebw +qlF +knX +knX +kan +kan +knX +ebw +qJk +xUo rxm vxU ggJ -dYB -dYB -vXN aLD -wJs +aLD +vXN +hCp +hCp swb vxU nPq @@ -87132,29 +87665,29 @@ nVt nVt nVt cgq -cgq -xVg -ifi -ifi -nVt -xVg -xVg -xVg -cgq -nVt -nVt nVt nVt -ifi +xUo +fSm +gHQ +ebw +tzZ +ctq +kan +oKt +wqN +eAg +eAg +xUo rxm vxU -dYB -dYB -dYB +vzQ +aLD +aLD vXN -dYB -dYB -hPh +hCp +hCp +hCp gfu ekG dYB @@ -87335,28 +87868,28 @@ cgq cgq nVt cgq -ifi -ifi -cgq -nVt -nVt -nVt -nVt nVt -nVt -ifi -ifi -nVt -ifi +xUo +bwR +eHD +cwI +ctq +ebw +sfZ +oKt +oSy +oSy +wqN +xUo rxm vxU -dYB -dYB -dYB -vXN +xKJ +cql +aLD +gfu pKP -dYB -dYB +hCp +hCp bYK dYB dYB @@ -87537,28 +88070,28 @@ xVg cgq nVt cgq -ifi -ifi -cgq -cgq -xVg -cgq -ifi -cgq -nVt -ifi -nVt nVt -ifi +xUo +xUo +eHD +cot +tzZ +knX +xsZ +kan +oSy +eAg +eAg +xUo rxm vxU -dYB -dYB -dYB -vXN -eAg +pDC +cMq +qTv +mgS +hCp +hCp hCp -wYQ gfu ekG pFl @@ -87739,28 +88272,28 @@ cgq nVt nVt cgq -ifi -ifi -xVg -xVg -cgq -ifi -ifi -ifi nVt -ifi nVt -ifi -ifi +xUo +wkA +fSm +cwI +ebw +kan +oKt +knX +eAg +cnh +xUo rxm -vxU -dYB -dYB -dYB gfu kgd coD may +gfu +ucX +neW +lhp vxU kvH kvH @@ -87943,17 +88476,17 @@ ifi ifi cgq cgq -ifi -ifi -ifi -ifi -cgq -ifi +xUo +xUo +eHD +fiN +wqe +oGW +eAg +oSy +knX +cwI nVt -ifi -ifi -ifi -ifi rxm vxU vxU @@ -88146,21 +88679,21 @@ cgq cgq cgq cgq -cgq -cgq -cgq -cgq -cgq -cgq -nVt -cgq -cgq -cgq +xUo +xUo +xUo +xUo +biY +biY +xUo +xUo +xUo nVt rxm rxm rxm rxm +rxm cgq cgq cgq @@ -88351,9 +88884,9 @@ rxm rxm rxm rxm -rxm -rxm -rxm +cVH +tmk +cVH nVt nVt nVt @@ -88553,8 +89086,9 @@ rxm rxm cVH cVH -cVH -cVH +tmk +tmk +tmk cVH rxm rxm @@ -88564,7 +89098,6 @@ rxm rxm rxm rxm -rxm lyF lyF cgq @@ -88738,7 +89271,7 @@ nVt ifi nVt cgq -efC +ifi ifi ifi ifi @@ -88757,12 +89290,12 @@ cVH qRm tmk tmk +tmk wdl rxm rxm rxm rxm -rxm cgq cgq cgq @@ -88940,7 +89473,7 @@ cgq ifi nVt cgq -ebw +ifi ifi ifi ifi @@ -119041,8 +119574,8 @@ xDh xDh ePi kan -wgl kan +wgl kan xis nWJ @@ -119243,8 +119776,8 @@ xDh xDh ePi kan -xUU kan +xUU kan xis eHD @@ -119445,8 +119978,8 @@ xDh uNM ePi kan -ksK kan +ksK kan xis xAN @@ -120470,7 +121003,7 @@ xDh xcU xcU kqH -knX +kqH tNb sIo qMs @@ -121274,7 +121807,7 @@ oKu oKu xDh xDh -knX +kqH tNb tNb lwK @@ -122690,7 +123223,7 @@ xDh oKu kqH tNb -oSy +nWs qJZ pTW qJZ @@ -151768,7 +152301,7 @@ bcc bcc bcc bcc -qBH +bcc bcc dxy hGY From 6afce2927e3f7debcd2087c31845cec983f4d77c Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Mon, 25 Nov 2024 04:04:11 -0800 Subject: [PATCH 028/192] Musical trait works now hopefuly (#104) --- code/datums/traits/good.dm | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 5d7ca76a482..93f92fe2ebd 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -143,8 +143,8 @@ datum/quirk/fan_mime /datum/quirk/musician name = "Musician" - desc = "I am good at playing music." - value = 1 + desc = "I am good at playing music. I've also hidden a lute!" + value = 2 mob_trait = TRAIT_MUSICIAN gain_text = span_notice("I know everything about musical instruments.") lose_text = span_danger("I forget how musical instruments work.") @@ -152,12 +152,8 @@ datum/quirk/fan_mime /datum/quirk/musician/on_spawn() var/mob/living/carbon/human/H = quirk_holder - var/obj/item/choice_beacon/music/B = new(get_turf(H)) - var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "hands" = SLOT_HANDS, - ) - H.equip_in_one_of_slots(B, slots , qdel_on_fail = TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/music, 3, TRUE) + H.mind.special_items["Lute"] = /obj/item/rogue/instrument/lute /datum/quirk/night_vision name = "Low Light Vision" From 94716f2319eff0f2cfd22dca42cff25bf94d2f6a Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Mon, 25 Nov 2024 04:06:06 -0800 Subject: [PATCH 029/192] stealth nerf bad (#103) --- code/modules/spells/roguetown/acolyte/dendor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/spells/roguetown/acolyte/dendor.dm b/code/modules/spells/roguetown/acolyte/dendor.dm index 57d9a55bc1a..80ca37d62c4 100644 --- a/code/modules/spells/roguetown/acolyte/dendor.dm +++ b/code/modules/spells/roguetown/acolyte/dendor.dm @@ -100,7 +100,7 @@ associated_skill = /datum/skill/magic/holy invocation = "Nature spirits, come to me.." invocation_type = "whisper" //can be none, whisper, emote and shout - devotion_cost = 300 + devotion_cost = 60 /obj/effect/proc_holder/spell/targeted/conjure_glowshroom/cast(list/targets, mob/user = usr) . = ..() From 8a090ee9479a8059677f63e1e9c0c96c96d42c5e Mon Sep 17 00:00:00 2001 From: Murderfox <47763263+Murderfoxen@users.noreply.github.com> Date: Mon, 25 Nov 2024 22:36:29 +1030 Subject: [PATCH 030/192] Proper balancing for nettles. (#106) Rather than making them cost a ridiculous amount, this PR attempts to just change the amount of time people are electrocuted by the nettles to an amount that isn't as overpowered. This is intended to still keep them as a viable strategy without outright making them useless in combat. --- code/game/objects/effects/glowshroom.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index e6268bc547e..87e730eb5a2 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -28,7 +28,7 @@ if(HAS_TRAIT(L, TRAIT_KNEESTINGER_IMMUNITY)) //Dendor kneestinger immunity return TRUE - if(L.electrocute_act(30, src)) + if(L.electrocute_act(10, src)) L.consider_ambush() if(L.throwing) L.throwing.finalize(FALSE) @@ -42,7 +42,7 @@ var/mob/living/L = AM if(L.z == z) if(!HAS_TRAIT(L, TRAIT_KNEESTINGER_IMMUNITY)) - if(L.electrocute_act(30, src)) + if(L.electrocute_act(10, src)) L.emote("painscream") L.update_sneak_invis(TRUE) L.consider_ambush() @@ -52,7 +52,7 @@ if(isliving(user) && W && user.z == z) if(W.flags_1 & CONDUCT_1) var/mob/living/L = user - if(L.electrocute_act(30, src)) // The kneestingers will let you pass if you worship dendor, but they won't take your stupid ass hitting them. + if(L.electrocute_act(5, src)) // The kneestingers will let you pass if you worship dendor, but they won't take your stupid ass hitting them. L.emote("painscream") L.consider_ambush() if(L.throwing) From 5ade3e5f6713747b3551a8500e693eb506564767 Mon Sep 17 00:00:00 2001 From: Enite Date: Mon, 25 Nov 2024 08:05:34 -0500 Subject: [PATCH 031/192] More Spawner stuff (#107) * Notes * More Spawners --------- Co-authored-by: Enite --- _maps/map_files/dreamhold/Dreamhold.dmm | 2324 +++++++++-------- _maps/map_files/otherz/forest.dmm | 172 +- .../structures/roguetown/mobspawner.dm | 6 +- code/game/objects/structures/spawner.dm | 57 +- 4 files changed, 1300 insertions(+), 1259 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 3380179b842..0ca8398dfa9 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -165,6 +165,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"ahf" = ( +/obj/structure/chair/bench/church/smallbench{ + dir = 8 + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "ahG" = ( /obj/effect/landmark/events/haunts, /turf/open/floor/rogue/cobblerock, @@ -182,13 +191,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"ajl" = ( -/obj/structure/spacevine/dendor, -/turf/open/floor/grass, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ajE" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/grass/jungle, @@ -196,6 +198,15 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"ajF" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa2" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ajI" = ( /obj/structure/spacevine/dendor, /turf/open/floor/rogue/hexstone, @@ -469,6 +480,13 @@ }, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/river) +"atW" = ( +/obj/structure/spacevine, +/obj/machinery/light/rogue/torchholder, +/turf/open/water/river{ + icon_state = "rockwd" + }, +/area/rogue/outdoors/river) "auh" = ( /obj/effect/decal/border/ruinedwood/inverted, /turf/open/floor/rogue/dirt/road, @@ -518,6 +536,18 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) +"avB" = ( +/obj/structure/rack/rogue, +/obj/item/rogueweapon/sword/sabre, +/obj/item/rogueweapon/sword/sabre, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "avG" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -576,6 +606,16 @@ }, /turf/open/floor/rogue/blocks/green, /area/rogue/indoors/shelter/mountains) +"ayP" = ( +/obj/structure/mineral_door/wood/violet{ + lockid = "church"; + name = "Undercroft" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "azh" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -760,10 +800,26 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"aEX" = ( +/obj/structure/chair/bench{ + dir = 4 + }, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "aFr" = ( /obj/machinery/light/rogue/wallfire/candle/blue/l, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) +"aFt" = ( +/obj/structure/closet/crate/chest/refilling/weapon, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/caves) +"aFz" = ( +/obj/effect/mob_spawner/mossback, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/caves) "aFA" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -993,9 +1049,16 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"aLD" = ( -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/warehouse) +"aMy" = ( +/obj/structure/table/wood{ + dir = 1; + icon_state = "longtable" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "aMz" = ( /obj/structure/flora/grass/jungle{ icon_state = "grassa1" @@ -1603,13 +1666,6 @@ /obj/effect/wisp, /turf/open/transparent/openspace, /area/rogue/outdoors/river) -"biY" = ( -/obj/structure/bars/steel, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "bjo" = ( /obj/item/grown/log/tree/small, /obj/item/grown/log/tree/small, @@ -1915,15 +1971,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"bwR" = ( -/obj/structure/safeglowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "bxb" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/grass/jungle/b, @@ -2087,6 +2134,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"bFR" = ( +/obj/structure/ladder, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bGw" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobble/mossy, @@ -2206,15 +2260,6 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) -"bJP" = ( -/obj/item/burial_shroud, -/obj/structure/rack/rogue, -/obj/item/rogueweapon/shovel, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "bLr" = ( /obj/effect/landmark/start/nightmaiden{ dir = 4 @@ -2305,6 +2350,13 @@ /obj/structure/fluff/statue/dragonr, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) +"bOt" = ( +/obj/structure/bed/rogue/bedroll, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bOu" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/closed/wall/shroud, @@ -2363,6 +2415,15 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) +"bRi" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bRj" = ( /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/shelter/bog) @@ -2555,10 +2616,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"bYy" = ( -/obj/effect/landmark/event_spawn, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/river) "bYK" = ( /obj/structure/mineral_door/wood/donjon{ desc = "Armory"; @@ -2685,13 +2742,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"ced" = ( -/obj/structure/closet/crate/coffin, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ceg" = ( /obj/structure/fluff/statue/tdummy2, /turf/open/floor/rogue/grass, @@ -2705,6 +2755,16 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"ces" = ( +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ceG" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/dirt/road, @@ -2834,14 +2894,6 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) -"cnh" = ( -/obj/structure/closet/crate/coffin, -/obj/item/reagent_containers/glass/cup/silver, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "cnk" = ( /obj/structure/chair/wood{ dir = 1 @@ -2868,13 +2920,6 @@ /obj/structure/fermenting_barrel/random/water, /turf/open/floor/carpet/royalblack, /area/rogue/indoors/town/bath) -"cot" = ( -/obj/effect/wisp, -/turf/open/floor/grass, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "coA" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/water/river, @@ -2929,13 +2974,6 @@ }, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) -"cql" = ( -/obj/item/clothing/wrists/roguetown/bracers/leather, -/obj/item/clothing/wrists/roguetown/bracers/leather, -/obj/item/clothing/wrists/roguetown/bracers, -/obj/item/clothing/wrists/roguetown/bracers, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/warehouse) "cqm" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -3011,15 +3049,6 @@ }, /turf/open/floor/rogue/tile, /area/rogue/indoors/town) -"ctq" = ( -/obj/structure/flora/grass/jungle{ - icon_state = "grassa2" - }, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ctv" = ( /obj/structure/chair/wood/rogue{ dir = 4 @@ -3084,12 +3113,6 @@ }, /turf/open/floor/rogue/cobble/mossy, /area/rogue/under/cavewet/bogcaves) -"cwI" = ( -/turf/open/floor/grass, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "cwU" = ( /obj/structure/flora/roguetree/happyrandom{ desc = "An old, beloved tree that even elves could love."; @@ -3263,6 +3286,15 @@ }, /turf/open/floor/rogue/dirt, /area/rogue/under/cavewet/bogcaves) +"cCV" = ( +/obj/structure/closet/dirthole/grave, +/obj/structure/flora/grass/jungle/b, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "cDz" = ( /turf/open/floor/rogue/dirt/ambush, /area/rogue/outdoors/river) @@ -3447,12 +3479,6 @@ /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/grass, /area/rogue/under/cavewet/bogcaves) -"cMq" = ( -/obj/item/clothing/cloak/tabard, -/obj/item/clothing/cloak/tabard, -/obj/item/clothing/cloak/tabard, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/warehouse) "cMN" = ( /obj/effect/decal/stone/mossy{ dir = 4 @@ -3498,6 +3524,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"cNu" = ( +/obj/structure/bars/steel, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "cNM" = ( /obj/structure/flora/newtree, /obj/effect/decal/stone/mossy{ @@ -3714,6 +3747,12 @@ first_time_text = "Ravenloft Academy"; name = "Schoolgrounds" }) +"cVO" = ( +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "cWd" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobblerock, @@ -3776,6 +3815,10 @@ }, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) +"cXr" = ( +/obj/structure/closet/crate/chest/refilling/trait, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/caves) "cXt" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/river{ @@ -4190,6 +4233,14 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"dlk" = ( +/obj/structure/closet/dirthole/closed, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dlN" = ( /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/cave) @@ -4232,6 +4283,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"dmy" = ( +/obj/structure/safeglowshroom, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dmR" = ( /obj/structure/fluff/walldeco/wantedposter, /turf/open/floor/rogue/greenstone, @@ -4350,6 +4408,13 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) +"dqW" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "drI" = ( /obj/effect/landmark/events/haunts, /turf/open/floor/rogue/cobblerock, @@ -4435,6 +4500,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"dvC" = ( +/obj/structure/safeglowshroom, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dvN" = ( /obj/structure/closet/crate/roguecloset/inn/south, /obj/item/kitchen/spoon/plastic, @@ -4464,6 +4536,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"dwm" = ( +/obj/structure/bookcase, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "dwn" = ( /obj/structure/flora/roguegrass, /obj/structure/glowshroom{ @@ -4578,13 +4657,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"dAt" = ( -/obj/structure/flora/grass/jungle, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "dAL" = ( /obj/effect/landmark/start/priest, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -4731,6 +4803,16 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"dHL" = ( +/obj/structure/bars/passage{ + name = "Holding Cell"; + redstone_id = "Hcell" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "dId" = ( /obj/structure/stairs{ dir = 8 @@ -5253,13 +5335,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) -"ebw" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ebN" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -5469,13 +5544,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"eju" = ( -/obj/structure/bed/rogue/bedroll, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ejZ" = ( /obj/structure/flora/ausbushes/sunnybush, /turf/open/floor/rogue/grass, @@ -5698,6 +5766,15 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"etP" = ( +/obj/item/reagent_containers/glass/bucket/wooden/spell_water, +/obj/item/natural/worms/leech, +/obj/item/natural/worms/leech/cheele, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "etX" = ( /obj/structure/flora/roguegrass, /obj/structure/flora/roguetree/happyrandom{ @@ -5853,12 +5930,6 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) -"eAg" = ( -/turf/closed/wall/shroud, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "eAi" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/grass/jungle/b, @@ -5884,10 +5955,21 @@ /area/rogue/outdoors/woods{ first_time_text = "The Mountain Passe" }) +"eAD" = ( +/obj/structure/chair/stool/rogue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "eAI" = ( /obj/item/natural/rock/gem, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/cave) +"eAR" = ( +/obj/effect/landmark/event_spawn, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/river) "eBt" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/fermenting_barrel, @@ -6129,6 +6211,13 @@ /obj/structure/flora/grass/jungle/b, /obj/machinery/light/rogue/wallfire/candle/blue/r, /turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +"eLM" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -6710,16 +6799,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"fdl" = ( -/mob/living/simple_animal/hostile/rogue/skeleton/bow{ - name = "Vint"; - faction = list("undead", "noble"ssssss) - }, -/turf/open/floor/rogue/greenstone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "fdw" = ( /obj/structure/flora/newbranch/connector{ icon_state = "center-leaf1" @@ -6850,15 +6929,6 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) -"fiN" = ( -/obj/structure/safeglowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/floor/grass, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "fjc" = ( /obj/structure/flora/ausbushes/brflowers, /obj/structure/flora/ausbushes/ppflowers, @@ -7062,6 +7132,17 @@ "fro" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/indoors/shelter/town/roofs) +"frN" = ( +/obj/structure/closet/crate/chest, +/obj/item/rope/chain, +/obj/item/rope/chain, +/obj/item/rope, +/obj/item/rope, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "fsH" = ( /obj/structure/bearpelt, /turf/open/floor/rogue/ruinedwood/spiral, @@ -7373,6 +7454,13 @@ icon_state = "rockwd" }, /area/rogue/outdoors/river) +"fFQ" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "fFX" = ( /obj/structure/fluff/statue/knight/interior, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -7658,15 +7746,6 @@ /obj/machinery/light/rogue/wallfire/candle, /turf/open/floor/rogue/carpet, /area/rogue/indoors/shelter/town) -"fSm" = ( -/obj/structure/safeglowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "fSn" = ( /obj/structure/mineral_door/wood/fancywood{ locked = 1; @@ -7731,6 +7810,14 @@ }, /turf/open/floor/rogue/twig/platform, /area/rogue/indoors/shelter/town) +"fVg" = ( +/obj/structure/closet/crate/coffin, +/obj/item/reagent_containers/glass/cup/silver, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "fVH" = ( /obj/structure/table/wood{ dir = 1; @@ -7759,16 +7846,6 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) -"fWE" = ( -/obj/structure/lever{ - name = "Holding Cell Lever"; - redstone_id = "Hcell" - }, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "fXv" = ( /obj/structure/flora/rogueshroom/happyrandom{ icon_state = "mush4" @@ -7932,14 +8009,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"gbX" = ( -/obj/structure/chair/bench{ - dir = 8 - }, -/turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "gbY" = ( /obj/machinery/light/rogue/hearth, /obj/item/cooking/pan, @@ -8091,15 +8160,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"gfS" = ( -/obj/structure/table/church{ - icon_state = "churchtable_mid" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ggh" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/newtree, @@ -8113,10 +8173,6 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) -"ggJ" = ( -/obj/structure/feedinghole, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/warehouse) "ggK" = ( /obj/structure/rack/rogue/shelf/big, /obj/item/reagent_containers/food/snacks/grown/rogue/sweetleafdry, @@ -8126,13 +8182,6 @@ /obj/item/reagent_containers/food/snacks/grown/rogue/sweetleafdry, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/tavern) -"ggN" = ( -/obj/machinery/light/rogue/wallfire/candle/blue/l, -/turf/open/floor/rogue/twig, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ghn" = ( /turf/closed/wall/mineral/rogue/decostone/mossy/blue{ dir = 8; @@ -8652,6 +8701,15 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"gHx" = ( +/obj/structure/table/wood{ + icon_state = "longtable" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gHF" = ( /obj/effect/decal/dirt{ dir = 1 @@ -8666,13 +8724,6 @@ }, /turf/open/floor/rogue/cobble, /area/rogue/indoors/shelter/town) -"gHQ" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/grass, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "gIm" = ( /obj/structure/glowshroom, /turf/open/floor/rogue/grass, @@ -8689,6 +8740,13 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"gIK" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gJm" = ( /obj/machinery/light/rogue/torchholder{ dir = 4 @@ -8733,14 +8791,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"gMk" = ( -/obj/effect/wisp, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "gMx" = ( /obj/effect/wisp, /turf/open/water/swamp, @@ -8756,9 +8806,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"gNQ" = ( -/obj/structure/closet/crate/coffin, -/turf/open/floor/rogue/twig, +"gNI" = ( +/obj/structure/table/wood{ + dir = 1; + icon_state = "longtable_mid" + }, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -8788,6 +8844,13 @@ "gPq" = ( /turf/closed/mineral/random/rogue/high, /area/rogue/indoors/cave) +"gQG" = ( +/obj/item/clothing/wrists/roguetown/bracers/leather, +/obj/item/clothing/wrists/roguetown/bracers/leather, +/obj/item/clothing/wrists/roguetown/bracers, +/obj/item/clothing/wrists/roguetown/bracers, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "gQR" = ( /obj/structure/roguemachine/scomm/r, /obj/structure/flora/grass/jungle/b, @@ -8950,6 +9013,10 @@ /obj/item/roguekey/blacksmith, /turf/open/floor/rogue/carpet, /area/rogue/indoors/shelter/town) +"gYE" = ( +/obj/structure/closet/crate/chest/refilling/treasure, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/caves) "gYJ" = ( /obj/structure/flora/grass/jungle, /turf/closed/mineral/rogue/bedrock, @@ -9026,16 +9093,6 @@ }, /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) -"hbt" = ( -/obj/structure/table/wood{ - dir = 1; - icon_state = "longtable" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -9058,6 +9115,13 @@ icon_state = "rockwd" }, /area/rogue/outdoors/caves) +"hep" = ( +/obj/structure/bars/steel, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "heK" = ( /turf/open/water/bath, /area/rogue/indoors/shelter/bog) @@ -9137,6 +9201,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"hhP" = ( +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "hhT" = ( /obj/structure/fluff/clock{ pixel_y = 20 @@ -9156,6 +9226,16 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"hio" = ( +/obj/structure/roguewindow/stained/silver{ + opacity = 0 + }, +/obj/structure/bars/steel, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "his" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/chair/bench/church/smallbench{ @@ -9248,13 +9328,6 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) -"hlx" = ( -/obj/structure/ladder, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "hlz" = ( /obj/structure/stairs{ dir = 8 @@ -9399,6 +9472,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"hqu" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "hqE" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/palebush, @@ -9422,13 +9502,6 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) -"hrL" = ( -/obj/machinery/light/rogue/wallfire/candle/blue/r, -/turf/open/floor/rogue/twig, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "hrX" = ( /obj/structure/closet/crate/roguecloset/dark, /obj/item/book/granter/spell/spells5e/mindsliver5e, @@ -9591,11 +9664,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"hyR" = ( -/obj/effect/mist, -/obj/structure/spawner/invisible/monster/minotaur, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/caves) "hze" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/dirt, @@ -9637,6 +9705,20 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"hAi" = ( +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "hAj" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/closet/crate/roguecloset/inn/south, @@ -9691,12 +9773,6 @@ /obj/structure/fluff/littlebanners/greenblue, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) -"hCp" = ( -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "hCL" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/floor/rogue/naturalstone, @@ -9981,15 +10057,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"hPh" = ( -/obj/item/reagent_containers/glass/bucket/wooden/spell_water, -/obj/item/natural/worms/leech, -/obj/item/natural/worms/leech/cheele, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "hPQ" = ( /obj/structure/fermenting_barrel, /turf/open/floor/rogue/ruinedwood/spiral, @@ -10293,6 +10360,15 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"iac" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "iaH" = ( /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town) @@ -10428,16 +10504,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"ifC" = ( -/obj/structure/fluff/statue/gargoyle/moss/candles, -/obj/structure/fluff/psycross{ - name = "Divine Conduit" - }, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ifI" = ( /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/rogue/dirt, @@ -10480,13 +10546,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"ihH" = ( -/obj/structure/fermenting_barrel/water, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "ihJ" = ( /obj/structure/mineral_door/wood/donjon{ locked = 1; @@ -11022,16 +11081,6 @@ icon_state = "medposter3" }, /turf/closed/wall/mineral/rogue/stone/moss, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) -"iCp" = ( -/obj/structure/bars/passage{ - name = "Holding Cell"; - redstone_id = "Hcell" - }, -/turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -11051,6 +11100,12 @@ "iDn" = ( /turf/open/floor/rogue/naturalstone, /area/rogue) +"iDC" = ( +/turf/closed/wall/shroud, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "iDK" = ( /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/magiciantower{ @@ -11410,6 +11465,14 @@ }, /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/shelter/bog) +"iVn" = ( +/obj/structure/chair/bench{ + dir = 8 + }, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "iVv" = ( /obj/effect/wisp, /obj/structure/fluff/railing/wood{ @@ -11433,16 +11496,6 @@ "iVM" = ( /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) -"iWr" = ( -/obj/structure/mineral_door/wood/violet{ - lockid = "church"; - name = "Undercroft" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -11747,6 +11800,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"jja" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "jkg" = ( /obj/machinery/light/rogue/oven/south, /turf/open/floor/rogue/tile, @@ -12806,6 +12866,15 @@ dir = 4 }, /area/rogue/indoors/town) +"jXl" = ( +/obj/structure/fluff/walldeco/steward{ + name = "Appraiser Within" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "jXx" = ( /obj/structure/fluff/statue/pillar{ name = "Wooden Support" @@ -12814,6 +12883,10 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) +"jYU" = ( +/obj/effect/mob_spawner/mossback, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/river) "jYV" = ( /obj/structure/flora/roguegrass/water, /obj/item/natural/stone, @@ -13250,6 +13323,14 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"kno" = ( +/obj/effect/wisp, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "knB" = ( /obj/structure/flora/rogueshroom2, /turf/open/floor/rogue/dirt/nrich, @@ -13263,12 +13344,6 @@ }, /turf/open/floor/rogue/grass, /area/rogue/under/cavewet/bogcaves) -"knX" = ( -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "koq" = ( /obj/structure/crabnest, /turf/open/water/cleanshallow, @@ -13402,6 +13477,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"ktL" = ( +/obj/effect/landmark/start/gravedigger, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ktN" = ( /obj/machinery/light/rogue/hearth, /turf/open/floor/rogue/blocks/green, @@ -13464,6 +13546,15 @@ /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) +"kwu" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "kwE" = ( /turf/closed/mineral/random/rogue/med, /area/rogue/outdoors/caves) @@ -13861,15 +13952,6 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/cleanshallow, /area/rogue/outdoors/caves) -"kOm" = ( -/obj/structure/closet/dirthole/grave, -/obj/structure/flora/grass/jungle/b, -/obj/structure/gravemarker, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "kOt" = ( /obj/machinery/light/rogue/wallfire{ pixel_x = 32 @@ -14092,6 +14174,17 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) +"kUu" = ( +/obj/item/clothing/suit/roguetown/armor/leather/studded, +/obj/item/clothing/suit/roguetown/armor/leather/studded, +/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, +/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, +/obj/structure/rack/rogue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "kUS" = ( /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/rogue/dirt/road, @@ -14298,15 +14391,7 @@ /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/greenstone, /area/rogue/indoors/shelter/mountains) -"lgU" = ( -/turf/closed/wall/mineral/rogue/wooddark{ - icon_state = "wooddark-k" - }, -/area/rogue/indoors/town/tavern{ - first_time_text = "The Sylver Dragonne.."; - name = "Silver Dragon" - }) -"lhp" = ( +"lgP" = ( /obj/structure/closet/crate/chest, /obj/item/storage/roguebag, /obj/item/storage/roguebag, @@ -14315,6 +14400,14 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"lgU" = ( +/turf/closed/wall/mineral/rogue/wooddark{ + icon_state = "wooddark-k" + }, +/area/rogue/indoors/town/tavern{ + first_time_text = "The Sylver Dragonne.."; + name = "Silver Dragon" + }) "lhr" = ( /turf/closed/wall/mineral/rogue/decostone/mossy/cand, /area/rogue/under/cave) @@ -14482,13 +14575,6 @@ /obj/structure/spawner/invisible/monster/mossback, /turf/open/water/swamp, /area/rogue/outdoors/caves) -"lmb" = ( -/obj/structure/fermenting_barrel/water, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "lme" = ( /obj/structure/fluff/railing/border{ dir = 6 @@ -15020,6 +15106,16 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"lLf" = ( +/obj/structure/table/church{ + icon_state = "churchtable_end" + }, +/obj/item/rogueweapon/huntingknife/idagger/silver, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "lLg" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/newtree, @@ -15060,12 +15156,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"lOA" = ( -/turf/closed/wall/mineral/rogue/decostone/mossy/cand, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "lOX" = ( /obj/effect/landmark/start/cook, /turf/open/floor/rogue/blocks/stonered/tiny, @@ -15084,6 +15174,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"lPg" = ( +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "lPh" = ( /obj/structure/table/wood{ dir = 10; @@ -15347,6 +15444,13 @@ /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) +"mba" = ( +/obj/structure/roguetent, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "mbk" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -15468,13 +15572,6 @@ }, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/caves) -"mjc" = ( -/obj/structure/chair/stool/rogue, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "mjk" = ( /obj/structure/fermenting_barrel/beer, /turf/open/floor/rogue/ruinedwood/spiral, @@ -15503,6 +15600,13 @@ }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/bath) +"mks" = ( +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "mkx" = ( /turf/closed/mineral/rogue/coal, /area/rogue/outdoors/caves) @@ -15999,6 +16103,16 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"mAH" = ( +/obj/structure/lever{ + name = "Holding Cell Lever"; + redstone_id = "Hcell" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "mAI" = ( /obj/structure/spacevine, /turf/open/transparent/openspace, @@ -16180,15 +16294,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"mHs" = ( -/obj/structure/flora/grass/jungle{ - icon_state = "grassa1" - }, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "mHJ" = ( /obj/machinery/light/rogue/firebowl, /turf/open/floor/rogue/grass, @@ -16671,14 +16776,6 @@ first_time_text = "Ravenloft Academy"; name = "Schoolgrounds" }) -"mZl" = ( -/obj/structure/closet/dirthole/closed/loot, -/obj/structure/gravemarker, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "mZn" = ( /obj/structure/flora/roguegrass/maneater/real{ aggroed = 1 @@ -16783,15 +16880,6 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) -"neW" = ( -/obj/structure/winch{ - redstone_id = "Advarmory" - }, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "neX" = ( /obj/structure/table/vtable/v2, /obj/machinery/light/rogue/wallfire/candle/blue/r, @@ -16980,15 +17068,6 @@ /obj/effect/mist, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) -"nlT" = ( -/obj/structure/table/wood{ - icon_state = "longtable" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "nlW" = ( /obj/structure/fluff/railing/border{ dir = 6 @@ -16998,6 +17077,21 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"nmf" = ( +/obj/structure/winch{ + redstone_id = "Advarmory" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) +"nmp" = ( +/turf/closed/wall/mineral/rogue/decostone/mossy/cand, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "nmt" = ( /obj/effect/landmark/start/barkeep, /mob/living/simple_animal/pet/cat{ @@ -17105,10 +17199,6 @@ }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) -"nqF" = ( -/obj/structure/spawner/invisible/monster/mossback, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/caves) "nqU" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/sparsegrass, @@ -17230,6 +17320,14 @@ /obj/structure/bars/tough, /turf/open/transparent/openspace, /area/rogue) +"nvL" = ( +/obj/structure/closet/dirthole/grave, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "nvO" = ( /obj/machinery/light/rogue/torchholder{ dir = 1; @@ -17504,22 +17602,6 @@ icon_state = "rockwd" }, /area/rogue/outdoors/caves) -"nFF" = ( -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/obj/item/natural/dirtclod, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "nFS" = ( /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ @@ -17540,6 +17622,16 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) +"nGA" = ( +/obj/structure/bars/passage{ + name = "Armory"; + redstone_id = "Advarmory" + }, +/turf/open/floor/rogue/blocks/bluestone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "nGJ" = ( /obj/structure/spacevine, /turf/open/floor/rogue/naturalstone, @@ -18337,6 +18429,13 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"orJ" = ( +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "orU" = ( /obj/machinery/light/rogue/wallfire/candle/blue/r, /obj/structure/fluff/statue/small, @@ -18374,9 +18473,25 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"otA" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "otT" = ( /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors/town) +"oum" = ( +/obj/item/burial_shroud, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/shovel, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ouB" = ( /obj/structure/stairs/stone, /turf/open/floor/rogue/blocks/green, @@ -18592,19 +18707,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) -"oEy" = ( -/obj/structure/table/wood{ - dir = 1; - icon_state = "longtable_mid" - }, -/obj/structure/fluff/psycross{ - name = "Divine Conduit" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "oEA" = ( /turf/open/floor/rogue/cobble, /area/rogue/outdoors/woods{ @@ -18674,13 +18776,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"oGW" = ( -/obj/structure/spacevine/dendor, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "oHf" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -18790,12 +18885,6 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/swamp/deep, /area/rogue/under/cavewet/bogcaves) -"oKt" = ( -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "oKu" = ( /obj/structure/flora/newtree, /turf/open/water/cleanshallow, @@ -18941,19 +19030,20 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"oSq" = ( +/obj/structure/closet/dirthole/closed/loot, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "oSr" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/fluff/statue/knight/interior, /obj/machinery/light/rogue/firebowl/standing/blue, /turf/open/floor/rogue/blocks/green, /area/rogue/indoors/town/bath) -"oSy" = ( -/obj/structure/bars/cemetery, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "oSL" = ( /obj/structure/wallladder{ dir = 8 @@ -18988,15 +19078,6 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) -"oTv" = ( -/obj/structure/fluff/walldeco/steward{ - name = "Appraiser Within" - }, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "oTG" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/cleanshallow, @@ -19271,6 +19352,16 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"pfb" = ( +/obj/structure/mineral_door/wood/violet{ + lockid = "church"; + name = "Burial Grounds" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pfg" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -19432,6 +19523,12 @@ /obj/structure/fermenting_barrel/random/water, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) +"pjI" = ( +/obj/item/clothing/cloak/tabard, +/obj/item/clothing/cloak/tabard, +/obj/item/clothing/cloak/tabard, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "pkF" = ( /obj/structure/well, /turf/open/floor/rogue/grass, @@ -19534,6 +19631,9 @@ }, /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors/shelter/town) +"ppv" = ( +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "ppJ" = ( /obj/structure/flora/newtree, /obj/structure/flora/newtree, @@ -19607,6 +19707,14 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"puD" = ( +/obj/effect/wisp, +/obj/structure/spacevine/dendor, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pvc" = ( /obj/structure/table/wood{ dir = 6; @@ -19785,13 +19893,6 @@ /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/grass, /area/rogue/under/cavewet/bogcaves) -"pDC" = ( -/obj/item/clothing/cloak/stabard/surcoat, -/obj/item/clothing/cloak/stabard/surcoat, -/obj/item/clothing/cloak/stabard/surcoat, -/obj/machinery/gear_painter/dye_bin, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/warehouse) "pDN" = ( /obj/structure/flora/newtree, /turf/open/floor/rogue/grass, @@ -19816,6 +19917,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"pEs" = ( +/obj/effect/wisp, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pEz" = ( /obj/structure/table/wood{ icon_state = "longtable" @@ -19827,6 +19935,21 @@ }, /turf/open/floor/rogue/tile, /area/rogue/indoors/shelter/town) +"pEJ" = ( +/obj/effect/mob_spawner/wilderness, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) +"pEK" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pEM" = ( /obj/structure/flora/ausbushes/stalkybush, /turf/open/water/river{ @@ -19878,6 +20001,13 @@ }, /turf/open/floor/rogue/hexstone, /area/rogue/outdoors/caves) +"pFz" = ( +/obj/effect/wisp, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pFL" = ( /obj/machinery/light/rogue/lanternpost, /turf/open/floor/rogue/dirt, @@ -19978,14 +20108,6 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) -"pKP" = ( -/obj/structure/ladder, -/obj/machinery/light/rogue/wallfire/candle/blue, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "pKQ" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/blocks, @@ -20210,19 +20332,6 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) -"pRc" = ( -/obj/structure/table/wood{ - dir = 10; - icon_state = "tablewood2"; - pixel_y = 5 - }, -/obj/item/candle/skull/lit, -/obj/item/reagent_containers/glass/cup/wooden, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "pRH" = ( /obj/structure/roguetent, /turf/open/floor/rogue/ruinedwood/spiral, @@ -20289,16 +20398,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"pUi" = ( -/obj/item/burial_shroud, -/obj/structure/rack/rogue, -/obj/machinery/light/rogue/wallfire/candle/blue/r, -/obj/item/rogueweapon/shovel, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "pUK" = ( /obj/machinery/light/rogue/torchholder/l{ dir = 8 @@ -20333,6 +20432,13 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"pWc" = ( +/obj/machinery/light/rogue/wallfire/candle/blue/r, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pWd" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -20580,6 +20686,19 @@ /obj/machinery/anvil, /turf/open/floor/rogue/cobble, /area/rogue/indoors/shelter/town) +"qeA" = ( +/obj/structure/table/wood{ + dir = 10; + icon_state = "tablewood2"; + pixel_y = 5 + }, +/obj/item/candle/skull/lit, +/obj/item/reagent_containers/glass/cup/wooden, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "qeN" = ( /obj/structure/flora/ausbushes/ywflowers, /turf/open/water/cleanshallow, @@ -20600,6 +20719,16 @@ /obj/structure/fermenting_barrel/water, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) +"qfv" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 1; + pixel_y = 26 + }, +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "qfL" = ( /obj/structure/roguemachine/scomm/r, /turf/open/floor/rogue/ruinedwood/spiral, @@ -20620,6 +20749,12 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) +"qgp" = ( +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "qgq" = ( /obj/structure/flora/roguegrass/bush/wall, /turf/open/transparent/openspace, @@ -20750,14 +20885,6 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) -"qlF" = ( -/obj/structure/closet/dirthole/closed, -/obj/structure/gravemarker, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "qlZ" = ( /obj/structure/glowshroom, /turf/open/floor/rogue/dirt, @@ -20929,6 +21056,13 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"qrm" = ( +/obj/item/clothing/cloak/stabard/surcoat, +/obj/item/clothing/cloak/stabard/surcoat, +/obj/item/clothing/cloak/stabard/surcoat, +/obj/machinery/gear_painter/dye_bin, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "qro" = ( /obj/structure/spacevine, /obj/structure/spacevine, @@ -20937,6 +21071,12 @@ name = "Seawater" }, /area/rogue/under/cavewet) +"qrG" = ( +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "qrP" = ( /obj/structure/flora/rogueshroom/happyrandom, /turf/open/floor/rogue/dirt, @@ -21111,15 +21251,6 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) -"qxR" = ( -/obj/machinery/light/rogue/torchholder{ - dir = 4 - }, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "qyw" = ( /mob/living/simple_animal/hostile/retaliate/rogue/wolf, /turf/open/floor/rogue/dirt, @@ -21177,16 +21308,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"qBH" = ( -/obj/structure/mineral_door/wood/violet{ - lockid = "church"; - name = "Burial Grounds" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "qBY" = ( /obj/structure/bed/rogue/inn/wool, /obj/effect/landmark/start/shophand, @@ -21374,13 +21495,6 @@ /obj/effect/mist, /turf/open/water/bath, /area/rogue/indoors/town/bath) -"qJk" = ( -/obj/structure/closet/crate/coffin, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "qJn" = ( /obj/structure/flora/roguetree/happyrandom{ desc = "An old, beloved tree that even elves could love."; @@ -21426,6 +21540,16 @@ first_time_text = "Ravenloft Academy"; name = "Schoolgrounds" }) +"qKK" = ( +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "qKQ" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -21602,11 +21726,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"qRm" = ( -/obj/structure/closet/crate/chest, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/caves) "qRz" = ( /obj/item/natural/stone, /turf/open/floor/rogue/grass, @@ -21647,20 +21766,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"qTv" = ( -/obj/item/clothing/cloak/stabard, -/obj/item/clothing/cloak/stabard, -/obj/item/clothing/cloak/stabard, -/obj/item/clothing/suit/roguetown/armor/chainmail, -/obj/item/clothing/suit/roguetown/armor/chainmail, -/obj/item/clothing/neck/roguetown/chaincoif/iron, -/obj/item/clothing/neck/roguetown/chaincoif/iron, -/obj/item/clothing/neck/roguetown/chaincoif/iron, -/obj/item/clothing/neck/roguetown/chaincoif/iron, -/obj/item/clothing/suit/roguetown/armor/chainmail, -/obj/item/clothing/suit/roguetown/armor/chainmail, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/warehouse) "qTD" = ( /obj/structure/spacevine, /turf/closed/mineral/random/rogue, @@ -21889,16 +21994,6 @@ first_time_text = "Ravenloft Academy"; name = "Ravenloft Academy" }) -"qZo" = ( -/obj/structure/fluff/statue/gargoyle/moss/candles, -/obj/structure/fluff/psycross{ - name = "Divine Conduit" - }, -/turf/open/floor/grass, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "qZN" = ( /obj/structure/flora/roguegrass, /obj/structure/flora/roguegrass/fungus_bush, @@ -22078,6 +22173,22 @@ "riB" = ( /turf/open/floor/rogue/dirt/ambush, /area/rogue/under/cavewet/bogcaves) +"riH" = ( +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "riK" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -22306,13 +22417,6 @@ /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/dirt, /area/rogue/under/cavewet/bogcaves) -"rrk" = ( -/obj/structure/safeglowshroom, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "rrq" = ( /obj/structure/rack/rogue, /obj/item/clothing/suit/roguetown/shirt/belldress/red{ @@ -23303,6 +23407,10 @@ icon_state = "rockwd" }, /area/rogue/indoors/shelter/town) +"sfp" = ( +/obj/effect/mob_spawner/minotaur, +/turf/closed/wall/shroud, +/area/rogue/outdoors/caves) "sfu" = ( /obj/structure/spacevine, /turf/closed/wall/mineral/rogue/wooddark/slitted, @@ -23636,13 +23744,6 @@ /obj/structure/flora/roguegrass/thorn_bush, /turf/open/water/swamp, /area/rogue/outdoors/caves) -"swb" = ( -/obj/structure/bookcase, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "swA" = ( /obj/structure/bed/rogue/inn/wool, /turf/open/floor/rogue/twig, @@ -23690,6 +23791,17 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"syp" = ( +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/flora/grass/jungle/b, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "syE" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/rogue/herringbone, @@ -24159,6 +24271,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"sPq" = ( +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "sPz" = ( /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ @@ -24355,6 +24474,12 @@ /obj/effect/temp_visual/small_smoke, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) +"sZB" = ( +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tac" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/dirt/road, @@ -24925,6 +25050,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"trL" = ( +/obj/structure/table/church{ + icon_state = "churchtable_mid" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "trT" = ( /obj/machinery/light/rogue/torchholder/c, /obj/effect/landmark/start/innkeep, @@ -25057,14 +25191,6 @@ "tzK" = ( /turf/open/floor/rogue/greenstone, /area/rogue/indoors/shelter/mountains) -"tzZ" = ( -/obj/structure/closet/dirthole/grave, -/obj/structure/gravemarker, -/turf/open/floor/rogue/dirt, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "tAi" = ( /obj/structure/roguetent, /turf/open/floor/rogue/ruinedwood/spiral, @@ -25276,6 +25402,16 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"tKG" = ( +/obj/item/burial_shroud, +/obj/structure/rack/rogue, +/obj/machinery/light/rogue/wallfire/candle/blue/r, +/obj/item/rogueweapon/shovel, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tLa" = ( /obj/machinery/light/rogue/oven{ pixel_y = 32 @@ -25485,13 +25621,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"tRy" = ( -/obj/structure/safeglowshroom, -/turf/open/floor/grass, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "tRQ" = ( /obj/structure/flora/roguegrass, /obj/effect/spawner/roguemap/shroud, @@ -25538,6 +25667,13 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"tUh" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tUj" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -25644,13 +25780,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"tWw" = ( -/obj/effect/landmark/start/gravedigger, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "tXF" = ( /obj/effect/decal/border/ruinedwood/inverted{ dir = 8 @@ -25778,17 +25907,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"ucX" = ( -/obj/structure/closet/crate/chest, -/obj/item/rope/chain, -/obj/item/rope/chain, -/obj/item/rope, -/obj/item/rope, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "ucZ" = ( /turf/open/floor/rogue/grass, /area/rogue/outdoors/rtfield{ @@ -25827,21 +25945,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"udV" = ( -/obj/item/clothing/gloves/roguetown/chain/iron, -/obj/item/clothing/gloves/roguetown/chain/iron, -/obj/item/clothing/gloves/roguetown/chain/iron, -/obj/item/clothing/gloves/roguetown/chain/iron, -/obj/item/clothing/under/roguetown/chainlegs, -/obj/item/clothing/under/roguetown/chainlegs, -/obj/item/clothing/under/roguetown/chainlegs, -/obj/item/clothing/under/roguetown/chainlegs, -/obj/structure/rack/rogue, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "udW" = ( /obj/structure/fluff/railing/border{ dir = 8 @@ -26225,12 +26328,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"uuw" = ( -/obj/structure/flora/grass/jungle, -/obj/effect/mist, -/obj/structure/spawner/invisible/monster/minotaur, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/caves) "uuF" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -26243,13 +26340,6 @@ /obj/structure/ladder/earth, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/caves) -"uuU" = ( -/obj/structure/roguetent, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "uvi" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -26540,13 +26630,6 @@ /obj/structure/flora/roguetree/burnt, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) -"uDi" = ( -/obj/effect/wisp, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "uDp" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -26587,15 +26670,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"uFk" = ( -/obj/structure/bars/steel, -/turf/open/water/river{ - icon_state = "rockwd" - }, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "uFo" = ( /obj/structure/spacevine, /turf/open/water/swamp, @@ -26929,13 +27003,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"uSz" = ( -/obj/structure/spacevine, -/obj/machinery/light/rogue/torchholder, -/turf/open/water/river{ - icon_state = "rockwd" - }, -/area/rogue/outdoors/river) "uSC" = ( /mob/living/simple_animal/hostile/retaliate/rogue/spider, /obj/structure/spider/stickyweb{ @@ -27195,6 +27262,16 @@ /obj/item/clothing/cloak/apron/blacksmith, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"vdm" = ( +/mob/living/simple_animal/hostile/rogue/skeleton/bow{ + faction = list("undead", "noble"ssssss); + name = "Vint" + }, +/turf/open/floor/rogue/greenstone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "vdy" = ( /obj/structure/roguemachine/scomm/r, /turf/open/floor/rogue/blocks/stonered/tiny, @@ -27209,6 +27286,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"vdT" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa1" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ven" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/floor/rogue/grass, @@ -27270,16 +27356,6 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) -"vhA" = ( -/obj/machinery/light/rogue/torchholder{ - dir = 1; - pixel_y = 26 - }, -/turf/closed/wall/mineral/rogue/stone/moss, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "vil" = ( /obj/structure/fluff/railing/border, /turf/open/floor/rogue/cobble/mossy, @@ -27642,18 +27718,6 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) -"vzQ" = ( -/obj/structure/rack/rogue, -/obj/item/rogueweapon/sword/sabre, -/obj/item/rogueweapon/sword/sabre, -/obj/item/rogueweapon/huntingknife/idagger/steel, -/obj/item/rogueweapon/huntingknife/idagger/steel, -/obj/item/rogueweapon/huntingknife/idagger/steel, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "vAd" = ( /obj/structure/spawner/invisible/monster/mossback, /turf/open/water{ @@ -27888,6 +27952,13 @@ /obj/item/book/granter/spell/blackstone/invisibility, /turf/open/floor/rogue/grass, /area/rogue/outdoors/caves) +"vKW" = ( +/obj/structure/bars/cemetery, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "vLn" = ( /turf/closed/wall/mineral/rogue/roofwall/outercorner{ dir = 8 @@ -28201,16 +28272,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"vXN" = ( -/obj/structure/bars/passage{ - name = "Armory"; - redstone_id = "Advarmory" - }, -/turf/open/floor/rogue/blocks/bluestone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "vYA" = ( /obj/machinery/loom, /turf/open/floor/rogue/ruinedwood/spiral, @@ -28391,13 +28452,6 @@ "wjU" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/under/cave) -"wkA" = ( -/obj/structure/spacevine/dendor, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "wkB" = ( /turf/closed/wall/mineral/rogue/decostone, /area/rogue/outdoors/river) @@ -28546,38 +28600,10 @@ /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/shelter/bog) -"wqe" = ( -/obj/structure/fluff/statue/gargoyle/moss/candles, -/obj/structure/flora/grass/jungle/b, -/obj/structure/fluff/psycross{ - name = "Divine Conduit" - }, -/turf/open/floor/grass, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) -"wqg" = ( -/obj/structure/roguewindow/stained/silver{ - opacity = 0 - }, -/obj/structure/bars/steel, -/turf/open/floor/rogue/twig, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "wqn" = ( /obj/machinery/light/rogue/torchholder, /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors/shelter/town) -"wqN" = ( -/obj/structure/bars/cemetery, -/turf/closed/wall/shroud, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "wrl" = ( /obj/structure/flora/rogueshroom/happyrandom{ icon_state = "mush4" @@ -28595,6 +28621,14 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"wrw" = ( +/obj/structure/ladder, +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wsc" = ( /turf/closed/wall/mineral/rogue/decostone/mossy/blue, /area/rogue/indoors/town/church/chapel{ @@ -28820,6 +28854,21 @@ }, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/tavern) +"wAO" = ( +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/structure/rack/rogue, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wAP" = ( /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/dirt, @@ -28961,6 +29010,13 @@ /obj/structure/fermenting_barrel/beer, /turf/open/floor/rogue/carpet, /area/rogue/indoors/town) +"wHV" = ( +/obj/structure/bed/rogue/bedroll, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wIc" = ( /obj/structure/flora/newtree, /turf/open/floor/rogue/dirt/road, @@ -29001,12 +29057,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"wJs" = ( -/turf/open/floor/rogue/twig, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "wJA" = ( /obj/structure/fluff/walldeco/innsign{ icon_state = "medposter5" @@ -29322,13 +29372,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) -"wYQ" = ( -/obj/machinery/light/rogue/wallfire/candle/blue, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "wZa" = ( /obj/effect/wisp, /turf/open/floor/rogue/herringbone, @@ -29340,13 +29383,6 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) -"wZn" = ( -/obj/structure/bars/steel, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "wZF" = ( /obj/structure/flora/roguegrass/maneater/real{ aggroed = 1 @@ -29629,18 +29665,16 @@ /obj/structure/flora/newtree, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"xjT" = ( +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xkh" = ( /mob/living/simple_animal/hostile/retaliate/rogue/bigrat, /turf/open/floor/rogue/cobble, /area/rogue/under/cavewet/bogcaves) -"xko" = ( -/obj/structure/chair/bench{ - dir = 4 - }, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "xkr" = ( /obj/structure/table/wood{ dir = 1; @@ -29742,17 +29776,10 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) -"xnW" = ( -/obj/structure/closet/crate/roguecloset, -/obj/item/rope, -/obj/item/rope, -/obj/item/rope/chain, -/obj/item/rope/chain, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) +"xor" = ( +/obj/structure/feedinghole, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "xoL" = ( /obj/structure/fluff/railing/border{ dir = 8 @@ -29761,13 +29788,6 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) -"xoV" = ( -/obj/structure/bed/rogue/bedroll, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "xoX" = ( /obj/machinery/light/rogue/wallfire/candle/l, /turf/open/floor/rogue/carpet, @@ -29788,6 +29808,15 @@ icon_state = "rockwd" }, /area/rogue/outdoors/caves) +"xpu" = ( +/obj/structure/bars/steel, +/turf/open/water/river{ + icon_state = "rockwd" + }, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "xpF" = ( /obj/structure/table/wood, /turf/open/floor/rogue/blocks/stonered, @@ -29865,14 +29894,6 @@ }, /turf/open/floor/rogue/wood/nosmooth, /area/rogue/indoors/town) -"xsZ" = ( -/obj/effect/wisp, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "xto" = ( /obj/structure/table/wood{ dir = 5; @@ -30231,6 +30252,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"xFq" = ( +/obj/structure/bars/cemetery, +/turf/closed/wall/shroud, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xFY" = ( /obj/structure/flora/newtree, /turf/open/transparent/openspace, @@ -30245,15 +30273,6 @@ /obj/effect/decal/remains/human, /turf/open/floor/rogue/cobblerock, /area/rogue/under/cave) -"xHS" = ( -/obj/structure/chair/bench/church/smallbench{ - dir = 8 - }, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "xHT" = ( /obj/effect/spawner/roguemap/treeorbush, /obj/effect/spawner/roguemap/stump, @@ -30331,17 +30350,6 @@ }, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/town) -"xKJ" = ( -/obj/item/clothing/suit/roguetown/armor/leather/studded, -/obj/item/clothing/suit/roguetown/armor/leather/studded, -/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, -/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, -/obj/structure/rack/rogue, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "xKM" = ( /obj/structure/table/wood{ dir = 1; @@ -30528,16 +30536,6 @@ /obj/structure/glowshroom, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) -"xRS" = ( -/obj/structure/table/church{ - icon_state = "churchtable_end" - }, -/obj/item/rogueweapon/huntingknife/idagger/silver, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "xSa" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/spacevine/dendor, @@ -30592,12 +30590,6 @@ first_time_text = "Ravenloft Academy"; name = "Ravenloft Academy" }) -"xUo" = ( -/turf/closed/wall/mineral/rogue/stone/moss, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "xUU" = ( /obj/structure/table/church/m, /obj/structure/fluff/psycross{ @@ -30657,6 +30649,13 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"xWw" = ( +/obj/structure/spacevine/dendor, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xWI" = ( /obj/structure/fermenting_barrel/water, /turf/open/floor/rogue/cobblerock, @@ -30841,6 +30840,17 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"yfd" = ( +/obj/structure/closet/crate/roguecloset, +/obj/item/rope, +/obj/item/rope, +/obj/item/rope/chain, +/obj/item/rope/chain, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "yfi" = ( /obj/structure/table/wood{ dir = 8; @@ -30899,6 +30909,14 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"yhJ" = ( +/obj/effect/wisp, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "yhR" = ( /obj/structure/glowshroom, /turf/open/water/cleanshallow, @@ -30961,14 +30979,6 @@ /obj/machinery/light/rogue/wallfire/candle/r, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) -"yjm" = ( -/obj/effect/wisp, -/obj/structure/spacevine/dendor, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "yjw" = ( /obj/structure/flora/roguegrass/water, /obj/structure/flora/roguetree/stump/log, @@ -53343,7 +53353,7 @@ diM auK sVs tTg -fdl +vdm vxU nhM nhM @@ -81432,7 +81442,7 @@ rps ayy rps rps -uSz +atW rps vVw vVw @@ -82020,7 +82030,7 @@ lyF lyF prw prw -xDh +jYU xDh xDh lzV @@ -83227,10 +83237,10 @@ xDh xDh xDh nVt -xUo -eAg -xUo -xUo +sZB +iDC +sZB +sZB nVt nVt nVt @@ -83245,10 +83255,10 @@ prw bFf bFf vxU -lmb -hCp -pRc -mjc +orJ +qgp +qeA +eAD vxU rPi cDz @@ -83429,10 +83439,10 @@ xDh xDh xDh nVt -xUo -ihH -eju -xUo +sZB +mks +bOt +sZB nVt nVt nVt @@ -83447,10 +83457,10 @@ lzV rPi rPi vxU -hCp -hCp -hCp -hCp +qgp +qgp +qgp +qgp vxU rPi tkQ @@ -83631,10 +83641,10 @@ xDh xDh rPi nVt -xUo -ced +sZB +gIK kan -xUo +sZB nVt nVt nVt @@ -83649,10 +83659,10 @@ xDh prw rPi vxU -hCp -wZn -wZn -iCp +qgp +cNu +cNu +dHL vxU rPi tkQ @@ -83831,12 +83841,12 @@ cBP xDh xDh rPi -xUo -xUo -xUo +sZB +sZB +sZB kan kan -xUo +sZB nVt nVt nVt @@ -83851,10 +83861,10 @@ xDh xDh prw vxU -xoV -wZn -fWE -hCp +wHV +cNu +mAH +qgp vxU rPi tkQ @@ -84029,16 +84039,16 @@ tmk nVt oSM xDh -bYy +eAR xDh xDh rPi -xUo -xUo -eju +sZB +sZB +bOt kan -ihH -xUo +mks +sZB nVt nVt nVt @@ -84055,8 +84065,8 @@ xDh vxU vxU uxq -mjc -hCp +eAD +qgp vxU rPi tkQ @@ -84229,21 +84239,21 @@ nVt tmk xDh rPi -xUo -lOA -wqg -wqg -lOA -xUo -xUo -xUo -lOA -uuU -lOA -xUo -xUo -xUo -xUo +sZB +nmp +hio +hio +nmp +sZB +sZB +sZB +nmp +mba +nmp +sZB +sZB +sZB +sZB nVt nVt nVt @@ -84257,8 +84267,8 @@ xDh xDh lzV vxU -hCp -hCp +qgp +qgp vxU rPi tkQ @@ -84431,22 +84441,22 @@ nVt nVt xDh rPi -lOA -ggN -wJs -wJs -wJs -lOA -xUo -xUo +nmp +sPq +qrG +qrG +qrG +nmp +sZB +sZB fWg kan fWg kan -bJP -bJP -xUo -xUo +oum +oum +sZB +sZB nVt nVt rxm @@ -84459,8 +84469,8 @@ xDh xDh xDh gkJ -hCp -hCp +qgp +qgp vxU rPi tkQ @@ -84633,22 +84643,22 @@ rPi prw xDh oSM -wqg -gNQ +hio +dqW kan kan kan -ggN -lOA +sPq +nmp fWg kan kan -nlT +gHx kan kan kan wgl -xUo +sZB nVt rxm rxm @@ -84661,8 +84671,8 @@ xDh xDh xDh gkJ -hCp -hCp +qgp +qgp vxU cDz tkQ @@ -84835,22 +84845,22 @@ oSM xhl xDh xDh -wqg -gNQ +hio +dqW kan -hlx +bFR kan -wJs -iWr +qrG +ayP kan -tWw +ktL kan -oEy +gNI kan -tWw +ktL kan -gfS -xUo +trL +sZB nVt nVt nVt @@ -84863,8 +84873,8 @@ prw xDh xDh gkJ -hCp -hCp +qgp +qgp vxU bFf cDz @@ -85037,22 +85047,22 @@ oKL xDh xDh xDh -wqg -gNQ +hio +dqW kan kan kan -hrL -lOA +pWc +nmp kan kan kan -hbt +aMy kan kan kan -xRS -xUo +lLf +sZB nVt nVt nVt @@ -85065,9 +85075,9 @@ prw prw xDh gkJ -hCp -hCp -vhA +qgp +qgp +qfv tkQ ayy vVw @@ -85239,22 +85249,22 @@ xDh xDh xDh xcU -lOA -hrL -wJs -wJs -wJs -lOA -xUo -xUo +nmp +pWc +qrG +qrG +qrG +nmp +sZB +sZB jLy wUB kan kan -pUi -bJP -xUo -xUo +tKG +oum +sZB +sZB cgq nVt nVt @@ -85267,9 +85277,9 @@ bFf prw prw gkJ -hCp -hCp -uFk +qgp +qgp +xpu ayy rps cqD @@ -85441,22 +85451,22 @@ xhl xDh xDh xcU -xUo -lOA -wqg -wqg -lOA -xUo -xUo -xUo -xUo -lOA -qBH -qBH -lOA -xUo -xUo -xUo +sZB +nmp +hio +hio +nmp +sZB +sZB +sZB +sZB +nmp +pfb +pfb +nmp +sZB +sZB +sZB nVt nVt nVt @@ -85469,9 +85479,9 @@ bFf bFf prw vxU -hCp -hCp -uFk +qgp +qgp +xpu rps rps xbK @@ -85647,18 +85657,18 @@ xDh xDh xDh xDh -xUo -eAg -eAg +sZB +iDC +iDC eHD -tRy -ifC +dmy +qKK kan -oKt -oSy -ebw -cwI -xUo +cVO +vKW +otA +xjT +sZB nVt nVt rxm @@ -85671,9 +85681,9 @@ dwT vxU vxU bTu -hCp -hCp -uFk +qgp +qgp +xpu rps rps xbK @@ -85849,18 +85859,18 @@ xDh xDh xDh rPi -xUo -eAg -wkA -gHQ -knX -nFF +sZB +iDC +xWw +fFQ +hhP +riH kan kan -knX -ebw -qJk -xUo +hhP +otA +hqu +sZB nVt rxm vxU @@ -85872,9 +85882,9 @@ gfu gaZ riK vxU -qxR -hCp -hPh +iac +qgp +etP vxU rps rps @@ -86051,18 +86061,18 @@ kqH kqH rPi rPi -xUo +sZB eHD -cot -ebw -tzZ -ebw -oKt -oKt -oSy -cwI -knX -eAg +pFz +otA +nvL +otA +cVO +cVO +vKW +xjT +hhP +iDC nVt rxm iCo @@ -86074,9 +86084,9 @@ dYB dYB dYB pRH -hCp -hCp -lmb +qgp +qgp +orJ vxU prw rps @@ -86253,18 +86263,18 @@ kqH rPi rPi rPi -xUo -wkA -fiN -mZl -dAt -knX -uDi +sZB +xWw +bRi +oSq +tUh +hhP +pEs kan -oSy -oSy -oSy -xUo +vKW +vKW +vKW +sZB nVt rxm uxq @@ -86276,8 +86286,8 @@ qFr dYB dYB pRH -hCp -hCp +qgp +qgp vxU vxU prw @@ -86455,18 +86465,18 @@ nVt nVt nVt nVt -xUo -eAg -rrk -ctq -tzZ -dAt +sZB +iDC +dvC +ajF +nvL +tUh kan kan -oSy -ebw -cwI -xUo +vKW +otA +xjT +sZB nVt rxm ior @@ -86478,8 +86488,8 @@ afV dYB aIb gfu -hCp -hCp +qgp +qgp sWS vxU rPi @@ -86657,18 +86667,18 @@ nVt nVt nVt nVt -xUo -eAg +sZB +iDC eHD -cwI -knX -ebw +xjT +hhP +otA sfZ kan -knX -gMk -qJk -xUo +hhP +kno +hqu +sZB nVt rxm uxq @@ -86680,9 +86690,9 @@ qFr dYB dYB pRH -hCp -hCp -hCp +qgp +qgp +qgp vxU rPi rPi @@ -86859,18 +86869,18 @@ nVt nVt nVt nVt -xUo -eAg -ajl -cwI -tzZ -knX +sZB +iDC +jja +xjT +nvL +hhP sfZ -oKt -oSy -knX -ebw -xUo +cVO +vKW +hhP +otA +sZB rxm rxm tcT @@ -86882,9 +86892,9 @@ dYB dYB dYB pRH -oTv -hCp -xHS +jXl +qgp +ahf vxU bFf rPi @@ -87061,18 +87071,18 @@ nVt nVt nVt nVt -xUo -eAg -qZo -ebw -ebw -ebw +sZB +iDC +ces +otA +otA +otA kan -oKt -oSy -oSy -oSy -eAg +cVO +vKW +vKW +vKW +iDC rxm vxU vxU @@ -87263,26 +87273,26 @@ nVt nVt nVt nVt -xUo -yjm -cwI -mHs -kOm -knX -oKt +sZB +puD +xjT +vdT +cCV +hhP +cVO kan -oSy -cwI -eAg -eAg +vKW +xjT +iDC +iDC rxm gfu bCN jwm -udV +wAO gfu -wYQ -swb +lPg +dwm wJA vxU vxU @@ -87465,27 +87475,27 @@ cgq nVt nVt nVt -xUo +sZB eHD -ebw -qlF -knX -knX +otA +dlk +hhP +hhP kan kan -knX -ebw -qJk -xUo +hhP +otA +hqu +sZB rxm vxU -ggJ -aLD -aLD -vXN -hCp -hCp -swb +xor +ppv +ppv +nGA +qgp +qgp +dwm vxU nPq dYB @@ -87667,27 +87677,27 @@ nVt cgq nVt nVt -xUo -fSm -gHQ -ebw -tzZ -ctq +sZB +kwu +fFQ +otA +nvL +ajF kan -oKt -wqN -eAg -eAg -xUo +cVO +xFq +iDC +iDC +sZB rxm vxU -vzQ -aLD -aLD -vXN -hCp -hCp -hCp +avB +ppv +ppv +nGA +qgp +qgp +qgp gfu ekG dYB @@ -87869,27 +87879,27 @@ cgq nVt cgq nVt -xUo -bwR +sZB +pEK eHD -cwI -ctq -ebw +xjT +ajF +otA sfZ -oKt -oSy -oSy -wqN -xUo +cVO +vKW +vKW +xFq +sZB rxm vxU -xKJ -cql -aLD +kUu +gQG +ppv gfu -pKP -hCp -hCp +wrw +qgp +qgp bYK dYB dYB @@ -88071,27 +88081,27 @@ cgq nVt cgq nVt -xUo -xUo +sZB +sZB eHD -cot -tzZ -knX -xsZ +pFz +nvL +hhP +yhJ kan -oSy -eAg -eAg -xUo +vKW +iDC +iDC +sZB rxm vxU -pDC -cMq -qTv +qrm +pjI +hAi mgS -hCp -hCp -hCp +qgp +qgp +qgp gfu ekG pFl @@ -88274,26 +88284,26 @@ nVt cgq nVt nVt -xUo -wkA -fSm -cwI -ebw +sZB +xWw +kwu +xjT +otA kan -oKt -knX -eAg -cnh -xUo +cVO +hhP +iDC +fVg +sZB rxm gfu kgd coD may gfu -ucX -neW -lhp +frN +nmf +lgP vxU kvH kvH @@ -88476,16 +88486,16 @@ ifi ifi cgq cgq -xUo -xUo +sZB +sZB eHD -fiN -wqe -oGW -eAg -oSy -knX -cwI +bRi +syp +eLM +iDC +vKW +hhP +xjT nVt rxm vxU @@ -88679,15 +88689,15 @@ cgq cgq cgq cgq -xUo -xUo -xUo -xUo -biY -biY -xUo -xUo -xUo +sZB +sZB +sZB +sZB +hep +hep +sZB +sZB +sZB nVt rxm rxm @@ -89287,9 +89297,9 @@ rxm rxm rxm cVH -qRm -tmk +gYE tmk +aFt tmk wdl rxm @@ -90296,7 +90306,7 @@ rxm wdl tmk tmk -nqF +tmk tmk tmk cVH @@ -90495,7 +90505,7 @@ rxm rxm rxm rxm -tmk +cXr tmk tmk tmk @@ -91103,7 +91113,7 @@ rxm rxm rxm vYZ -tmk +aFz tmk tmk qWQ @@ -91913,7 +91923,7 @@ tmk tmk cVH tmk -nqF +tmk tmk tmk ifi @@ -92382,7 +92392,7 @@ vrx vrx vrx vrx -vrx +jmV nVt vrx nVt @@ -92582,7 +92592,7 @@ vrx vbT vrx nVt -jmV +vrx vrx jhB nVt @@ -92710,7 +92720,7 @@ nVt btg diU tmk -nqF +tmk tmk tmk tmk @@ -92977,7 +92987,7 @@ rxm rxm qXK uPU -hyR +vrx hfS hfS qXK @@ -93385,12 +93395,12 @@ hfS hfS qXK nVt -nVt +sfp vrx vrx rer vbT -uuw +oEi vbT vrx nVt @@ -93983,7 +93993,7 @@ nVt nVt vrx vrx -hyR +vrx vbT vrx hfS @@ -94194,7 +94204,7 @@ qXK qXK qXK vrx -hyR +vrx nVt vrx jhB @@ -94526,7 +94536,7 @@ xVg nVt btg tmk -nqF +tmk wdl tmk qIX @@ -105263,7 +105273,7 @@ miB miB oZS mVp -mVp +pEJ aYm aYm mVp @@ -118227,7 +118237,7 @@ miB eUJ kHM xyW -mVp +pEJ eUJ mVp miB @@ -119785,7 +119795,7 @@ eWu kvk mpx xis -hlx +bFR kan kan kan @@ -152334,7 +152344,7 @@ uhm uhm pFc efY -xnW +yfd hiA aZy sib @@ -156909,7 +156919,7 @@ fqz fqz fyB wLq -xko +aEX wLq fSQ fYf @@ -157919,7 +157929,7 @@ fqz fqz nPY kLn -gbX +iVn wLq fSQ oHi diff --git a/_maps/map_files/otherz/forest.dmm b/_maps/map_files/otherz/forest.dmm index 65bb50c0664..40339575409 100644 --- a/_maps/map_files/otherz/forest.dmm +++ b/_maps/map_files/otherz/forest.dmm @@ -1067,10 +1067,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"gv" = ( -/obj/structure/spawner/invisible/monster/minotaur, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/cave/minotaurcave) "gy" = ( /obj/structure/spider/stickyweb{ icon_state = "stickyweb2" @@ -1121,10 +1117,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"gH" = ( -/obj/structure/spawner/invisible/monster/minotaur, -/turf/open/floor/grass, -/area/rogue/indoors/cave/minotaurcave) "gN" = ( /obj/structure/flora/grass/jungle, /turf/open/floor/rogue/blocks, @@ -1909,10 +1901,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"ln" = ( -/obj/effect/mob_spawner/goblin, -/turf/open/floor/rogue/blocks, -/area/rogue/indoors/shelter/woods/overgrownfort) "lq" = ( /obj/structure/flora/roguegrass/fungus_bush, /turf/open/floor/rogue/dirt, @@ -2828,12 +2816,12 @@ /obj/structure/spacevine, /turf/open/water/river, /area/rogue/outdoors/river) -"qI" = ( -/obj/machinery/light/rogue/torchholder{ - pixel_y = 26 - }, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/shelter/woods/overgrownfort) +"qL" = ( +/obj/effect/mob_spawner/wilderness/hostile, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "qM" = ( /turf/open/floor/rogue/rooftop, /area/rogue/outdoors/woods{ @@ -5953,6 +5941,13 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) +"Jf" = ( +/obj/effect/wisp, +/obj/effect/mob_spawner/wilderness/hostile, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "Ji" = ( /obj/structure/flora/newtree, /obj/structure/flora/grass/jungle/b{ @@ -7441,6 +7436,10 @@ /mob/living/carbon/human/species/goblin/npc/hell, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) +"RM" = ( +/obj/structure/spawner/invisible/goblin, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/shelter/woods/overgrownfort) "RN" = ( /obj/structure/fluff/railing/border, /obj/structure/table/wood{ @@ -7820,6 +7819,7 @@ /obj/structure/rack/rogue, /obj/item/flashlight/flare/torch/lantern, /obj/item/flashlight/flare/torch/lantern, +/obj/effect/mob_spawner/goblin, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) "Us" = ( @@ -40888,7 +40888,7 @@ wO wO wO PJ -gv +pn pn jJ ut @@ -41294,7 +41294,7 @@ zU fZ fZ fZ -gv +pn IR wO wO @@ -42089,7 +42089,7 @@ fZ fZ fZ GU -gH +Dv bq Dv pn @@ -42485,7 +42485,7 @@ SS at pn pn -gv +pn pn zU fZ @@ -42765,7 +42765,7 @@ wO wO oA Dv -gH +Dv Dv oA DO @@ -54170,7 +54170,7 @@ Ja Ja Ja uB -uB +qL NI NI dp @@ -55725,7 +55725,7 @@ JP iu Ng Ng -Ng +uB Ja Ja Ja @@ -55839,7 +55839,7 @@ Ja Ja Ja Ja -Ja +uB mb mb EV @@ -55974,7 +55974,7 @@ Ja Ja Ja Ja -Ja +uB Mx Ng dF @@ -55990,7 +55990,7 @@ NI NI NI NI -Ng +uB Ja Ja Ja @@ -56372,7 +56372,7 @@ NI Ng NI dF -Ja +uB Ja Ja Ja @@ -56506,7 +56506,7 @@ NI NI dF dF -Ja +uB Ja Ja Ja @@ -56639,10 +56639,10 @@ NI NI NI NI -Ng -Ng -Ng -Ng +uB +uB +uB +uB NI IH Ng @@ -56787,7 +56787,7 @@ NI NI NI dF -mw +Jf Ng Ng NI @@ -58395,8 +58395,8 @@ Ng Ng Ng Ng -uB -uB +Ng +Ng Ng Ng dF @@ -58438,8 +58438,8 @@ Lk Vd zv bK -BJ -BJ +RX +RX BP db db @@ -58529,7 +58529,7 @@ Ng Ng NI NI -uB +Ng Ng Ng dF @@ -58570,9 +58570,9 @@ Cu AP AL bK -BJ -BJ -BJ +RX +RX +RX Vo RX aN @@ -58690,7 +58690,7 @@ tS BP BP Bi -ew +RM ew ew ew @@ -58703,8 +58703,8 @@ pI BP AL bK -BJ -BJ +RX +RX bK Wr Lm @@ -58836,8 +58836,8 @@ Cu AP AL El -BJ -BJ +RX +RX Gn BP BP @@ -58969,8 +58969,8 @@ pI bl gS bK -BJ -BJ +RX +RX Gn Ug rq @@ -59102,9 +59102,9 @@ Cu AP af Gn -BJ -WQ -BJ +RX +gW +RX WN FU sG @@ -59235,9 +59235,9 @@ xp BP oH Gn -BJ -BJ -WQ +RX +RX +gW WQ WX Bw @@ -59368,9 +59368,9 @@ sQ AP Wf bK -BJ -WQ -WQ +RX +gW +gW BJ fB ra @@ -59501,8 +59501,8 @@ BP Lk gS bK -BJ -WQ +RX +gW Gn Ug iI @@ -59634,8 +59634,8 @@ Kp BP AL El -BJ -BJ +RX +RX bK BP BP @@ -59758,7 +59758,7 @@ ew ew ew ew -ln +RX BP MT RX @@ -59767,8 +59767,8 @@ Kp OJ AL bK -BJ -BJ +RX +RX bK SF uB @@ -59900,8 +59900,8 @@ Ou BP bK bK -BJ -BJ +RX +RX Gn hi uB @@ -60032,9 +60032,9 @@ RX RX BP Vt -BJ -BJ -BJ +RX +RX +RX Gn hi uB @@ -60164,10 +60164,10 @@ RX RX RX BP -qI -BJ -BJ -BJ +oR +RX +RX +RX bK hi uB @@ -60297,10 +60297,10 @@ RX RX RX LN -BJ -BJ -BJ -BJ +RX +RX +RX +RX bK hi uB @@ -60430,10 +60430,10 @@ RX RX RX BP -qI -BJ -BJ -BJ +oR +RX +RX +RX bK hi uB @@ -60564,9 +60564,9 @@ NT BP BP jY -BJ -BJ -BJ +RX +RX +RX bK hi uB diff --git a/code/game/objects/structures/roguetown/mobspawner.dm b/code/game/objects/structures/roguetown/mobspawner.dm index 6cbc507c113..de90e028dfe 100644 --- a/code/game/objects/structures/roguetown/mobspawner.dm +++ b/code/game/objects/structures/roguetown/mobspawner.dm @@ -11,10 +11,10 @@ var/global/max_total_spawned_mobs = 100 // New global variable for the total lim var/spawn_interval = 3600 //6 minutes var/spawn_range = 10 //radius in which mobs can be spawned var/player_range = 15 //range at which a nearby player will pause the spawner - var/list/accepted_turfs = list(/turf/open/floor/rogue/dirt) //prevents mobs from being spawned on unwanted turfs outside your dungeon var/list/ambush_mobs = list(/mob/living/carbon/human/species/skeleton/npc/ambush = 20) var/list/adventurer_landmarks = list() // Store landmarks here - var/area/valid_area = /area/rogue/outdoors/bog //Useful for randomly generated maps, will delete spawners created outside this area. + var/area/valid_area = /area/rogue //Useful for randomly generated maps, will delete spawners created outside this area. + var/turf/accepted_turf = /turf/open/floor/rogue New() ..() // Call the parent constructor @@ -60,7 +60,7 @@ var/global/max_total_spawned_mobs = 100 // New global variable for the total lim return pick(valid_turfs) proc/is_valid_spawn_turf(turf/T) - if (istype(T, accepted_turfs)) + if (!(istype(T, accepted_turf))) return FALSE if (istype(T, /turf/closed)) return FALSE diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 76f08b1eb19..e87cc1e1061 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -333,13 +333,8 @@ max_spawned_mobs = 14 mobs_to_spawn = 7 spawn_interval = 3000 //5 minutes - spawn_range = 10 - player_range = 15 - valid_area = /area/rogue - accepted_turfs = list( - /turf/open/floor/rogue/cobblerock, - /turf/open/floor/rogue/ruinedwood/spiral, - /turf/open/floor/rogue/blocks) + spawn_range = 9 + player_range = 13 ambush_mobs = list( /mob/living/carbon/human/species/goblin/npc = 6, /mob/living/carbon/human/species/goblin/npc/hell = 1, @@ -350,14 +345,9 @@ /obj/effect/mob_spawner/skeleton max_spawned_mobs = 10 mobs_to_spawn = 5 - spawn_interval = 3600 //6 minutes + spawn_interval = 3600 spawn_range = 10 player_range = 15 - valid_area = /area/rogue - accepted_turfs = list( - /turf/open/floor/rogue/cobblerock, - /turf/open/water/swamp, - /turf/open/floor/rogue/dirt/road) ambush_mobs = list( /mob/living/simple_animal/hostile/rogue/skeleton/guard/shield = 40, /mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow = 30, @@ -365,3 +355,44 @@ /mob/living/simple_animal/hostile/rogue/skeleton/guard/crypt_guard_spear = 20, /mob/living/carbon/human/species/skeleton/npc/dungeon = 30, /mob/living/carbon/human/species/skeleton/npc/dungeon/boss = 5) + +/obj/effect/mob_spawner/minotaur + max_spawned_mobs = 8 + mobs_to_spawn = 4 + spawn_interval = 3600 + spawn_range = 10 + player_range = 15 + ambush_mobs = list( + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur = 20, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe = 5, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/female = 20, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe/female = 5) + +/obj/effect/mob_spawner/mossback + max_spawned_mobs = 8 + mobs_to_spawn = 4 + spawn_interval = 3000 + spawn_range = 10 + player_range = 15 + accepted_turf = /turf/open/water/cleanshallow + ambush_mobs = list(/mob/living/simple_animal/hostile/retaliate/rogue/mossback) + +/obj/effect/mob_spawner/wilderness + max_spawned_mobs = 6 + mobs_to_spawn = 3 + spawn_interval = 3000 + spawn_range = 15 + player_range = 20 + accepted_turf = /turf/open/floor/rogue/dirt + ambush_mobs = list(/mob/living/simple_animal/hostile/retaliate/rogue/saiga = 10, + /mob/living/simple_animal/hostile/retaliate/rogue/saigabuck = 15, + /mob/living/simple_animal/hostile/retaliate/rogue/goat = 10, + /mob/living/simple_animal/hostile/retaliate/rogue/goatmale = 15) + +/obj/effect/mob_spawner/wilderness/hostile + max_spawned_mobs = 8 + mobs_to_spawn = 4 + spawn_interval = 6000 + ambush_mobs = list(/mob/living/simple_animal/hostile/retaliate/rogue/wolf = 10, + /mob/living/simple_animal/hostile/retaliate/rogue/spider = 5, + /mob/living/simple_animal/hostile/retaliate/rogue/bigrat = 15) From f6cf6c8ca12b5b03fff254b36672b504e9d1851f Mon Sep 17 00:00:00 2001 From: Enite Date: Mon, 25 Nov 2024 10:38:34 -0500 Subject: [PATCH 032/192] Academy fixes/additions take two (#108) * Notes * Academy take two --------- Co-authored-by: Enite --- _maps/map_files/dreamhold/Dreamhold.dmm | 29 +++++++++++++++++-------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 0ca8398dfa9..d7ed1bb9ad3 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -4052,6 +4052,15 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/swamp, /area/rogue/outdoors/river) +"dfT" = ( +/obj/structure/roguemachine/vendor{ + keycontrol = "mage" + }, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/exposed/magiciantower{ + first_time_text = "Ravenloft Academy"; + name = "Schoolgrounds" + }) "dgg" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -4376,6 +4385,7 @@ /obj/structure/roguewindow/openclose{ dir = 4 }, +/obj/structure/bars/steel, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -13035,6 +13045,7 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, +/obj/structure/bars/steel, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/magiciantower{ first_time_text = "Ravenloft Academy"; @@ -115975,7 +115986,7 @@ viE viE viE viE -viE +dfT vZW xBi viE @@ -146674,7 +146685,7 @@ aZy aZy mYC egl -nLN +cTS rHo iqN eFM @@ -146688,7 +146699,7 @@ eFM eFM iqN rHo -rUO +hjD egl egl mYC @@ -147078,7 +147089,7 @@ aZy aZy mYC egl -nLN +cTS rHo wQO eFQ @@ -147092,7 +147103,7 @@ eFQ eFQ iqN rHo -rUO +hjD egl egl mYC @@ -148098,11 +148109,11 @@ egl egl egl egl -nLN +cTS lwf lwi lwf -rUO +hjD egl egl mYC @@ -148704,11 +148715,11 @@ egl egl egl egl -nLN +cTS lwf lwi lwf -rUO +hjD egl egl mYC From 1d474b729e22b964ada918bedfecb632f3caf060 Mon Sep 17 00:00:00 2001 From: Vide Noir <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:41:55 +0300 Subject: [PATCH 033/192] licensening (#109) * licensening * fix * Update README.md * Update modular_stonehedge/licensed-dreamkeep/LICENSE.md Co-authored-by: Sutures <101909198+noelle-lavenza@users.noreply.github.com> * oops * unnecessary * Create LICENSE.md --------- Co-authored-by: Sutures <101909198+noelle-lavenza@users.noreply.github.com> --- README.md | 63 +++++++++++++++++- code/datums/status_effects/rogue/debuff.dm | 4 +- .../items/rogueweapons/melee/knives.dm | 2 +- code/modules/clothing/rogueclothes/feet.dm | 6 ++ .../reagent_containers/powderspice.dm | 2 +- .../surgery/organs/feature_organs/genitals.dm | 12 ++-- .../{icons/CREDITS.txt => CREDITS.md} | 0 modular_helmsguard/Placeholder.txt | 1 - .../code/datums/Placeholder.txt | 1 - .../code/game/objects/items/war_horn.dm | 2 +- .../items/weapons/melee/Placeholder.txt | 1 - .../items/weapons/ranged/Placeholder.txt | 1 - .../code/game/objects/structures/catapult.dm | 6 +- .../code/game/objects/structures/ladders.dm | 2 +- .../objects/structures/spike barricade.dm | 2 +- .../game/objects/weapons/ranged/arquebus.dm | 6 +- .../game/objects/weapons/ranged/handgonne.dm | 2 +- .../code/modules/mobs/farm/horse.dm | 6 +- .../icons/areas/Placeholder.txt | 1 - modular_helmsguard/icons/mob/Placeholder.txt | 1 - .../icons/obj/effects/Placeholder.txt | 1 - .../icons/obj/flora/Placeholder.txt | 1 - .../obj/items/clothing/armor/Placeholder.txt | 1 - .../obj/items/clothing/belts/Placeholder.txt | 1 - .../obj/items/clothing/cloaks/Placeholder.txt | 1 - .../obj/items/clothing/feet/Placeholder.txt | 1 - .../obj/items/clothing/head/Placeholder.txt | 1 - .../obj/items/clothing/masks/Placeholder.txt | 1 - .../obj/items/clothing/mouth/Placeholder.txt | 1 - .../obj/items/clothing/neck/Placeholder.txt | 1 - .../obj/items/clothing/on_mob/Placeholder.txt | 1 - .../obj/items/clothing/pants/Placeholder.txt | 1 - .../obj/items/clothing/rings/Placeholder.txt | 1 - .../obj/items/clothing/shirts/Placeholder.txt | 1 - .../items/clothing/storage/Placeholder.txt | 1 - .../obj/items/clothing/wrists/Placeholder.txt | 1 - .../icons/obj/items/food/Placeholder.txt | 1 - .../licensed-eaglephntm/LICENSE.md | 5 ++ .../intents.dmi | Bin .../licensed-feralope/LICENSE.md | 5 ++ .../icons/Modular Icons.txt | 0 .../icons/mob/horse.dmi | Bin .../icons/obj/items/arquebus_items.dmi | Bin .../obj/items/clothing/Modular Icons.txt | 0 .../icons/obj/items/warhorns.dmi | Bin .../icons/obj/structure/cata_ammo.dmi | Bin .../icons/obj/structure/catapult.dmi | Bin .../icons/obj/structure/orc_banner.dmi | Bin .../icons/obj/structure/spawners.dmi | Bin .../icons/obj/structure/spike_barricades.dmi | Bin .../icons/roguetown/misc/helms_ladders.dmi | Bin .../icons/weapons/arquebus.dmi | Bin .../icons/weapons/handgonne.dmi | Bin modular_helmsguard/sound/Placeholder.txt | 1 - modular_stonehedge/CREDITS.md | 23 +++++++ modular_stonehedge/CREDITS.txt | 20 ------ .../code/datums/status_effects/debuffs.dm | 4 +- .../structures/dungeon/lewd_statues.dm | 2 +- .../licensed-death-rattler/LICENSE.md | 29 ++++++++ .../licensed-dreamkeep/LICENSE.md | 5 ++ .../licensed-dreamkeep/icons/armor/feet.dmi | Bin 0 -> 627 bytes .../icons/roguetown/clothing/feet.dmi | Bin 0 -> 627 bytes .../icons/roguetown/clothing/onmob/feet.dmi | Bin 0 -> 1367 bytes .../licensed-eaglephntm/LICENSE.md | 5 ++ .../icons/mob/screen_alert.dmi | Bin 0 -> 1103 bytes .../icons/obj/surgery.dmi | Bin .../icons/roguetown/items/produce.dmi | Bin 0 -> 326 bytes .../icons/roguetown/misc/tallstructure.dmi | Bin 0 -> 144265 bytes .../icons/roguetown/weapons/32.dmi | Bin .../licensed-feralope/LICENSE.md | 5 ++ 70 files changed, 170 insertions(+), 72 deletions(-) rename modular_helmsguard/{icons/CREDITS.txt => CREDITS.md} (100%) delete mode 100644 modular_helmsguard/Placeholder.txt delete mode 100644 modular_helmsguard/code/datums/Placeholder.txt delete mode 100644 modular_helmsguard/code/game/objects/items/weapons/melee/Placeholder.txt delete mode 100644 modular_helmsguard/code/game/objects/items/weapons/ranged/Placeholder.txt delete mode 100644 modular_helmsguard/icons/areas/Placeholder.txt delete mode 100644 modular_helmsguard/icons/mob/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/effects/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/flora/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/armor/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/belts/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/cloaks/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/feet/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/head/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/masks/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/mouth/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/neck/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/on_mob/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/pants/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/rings/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/shirts/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/storage/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/clothing/wrists/Placeholder.txt delete mode 100644 modular_helmsguard/icons/obj/items/food/Placeholder.txt create mode 100644 modular_helmsguard/licensed-eaglephntm/LICENSE.md rename modular_helmsguard/{icons => licensed-eaglephntm}/intents.dmi (100%) create mode 100644 modular_helmsguard/licensed-feralope/LICENSE.md rename modular_helmsguard/{ => licensed-feralope}/icons/Modular Icons.txt (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/mob/horse.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/obj/items/arquebus_items.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/obj/items/clothing/Modular Icons.txt (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/obj/items/warhorns.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/obj/structure/cata_ammo.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/obj/structure/catapult.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/obj/structure/orc_banner.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/obj/structure/spawners.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/obj/structure/spike_barricades.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/roguetown/misc/helms_ladders.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/weapons/arquebus.dmi (100%) rename modular_helmsguard/{ => licensed-feralope}/icons/weapons/handgonne.dmi (100%) delete mode 100644 modular_helmsguard/sound/Placeholder.txt create mode 100644 modular_stonehedge/CREDITS.md delete mode 100644 modular_stonehedge/CREDITS.txt create mode 100644 modular_stonehedge/licensed-death-rattler/LICENSE.md create mode 100644 modular_stonehedge/licensed-dreamkeep/LICENSE.md create mode 100644 modular_stonehedge/licensed-dreamkeep/icons/armor/feet.dmi create mode 100644 modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi create mode 100644 modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi create mode 100644 modular_stonehedge/licensed-eaglephntm/LICENSE.md create mode 100644 modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi rename modular_stonehedge/{ => licensed-eaglephntm}/icons/obj/surgery.dmi (100%) create mode 100644 modular_stonehedge/licensed-eaglephntm/icons/roguetown/items/produce.dmi create mode 100644 modular_stonehedge/licensed-eaglephntm/icons/roguetown/misc/tallstructure.dmi rename modular_stonehedge/{ => licensed-eaglephntm}/icons/roguetown/weapons/32.dmi (100%) create mode 100644 modular_stonehedge/licensed-feralope/LICENSE.md diff --git a/README.md b/README.md index 9f7fd627d31..dcab2673c1f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,61 @@ -## Discord -Come join our [discord](https://discord.gg/YTp2GTzwyv)! +

+ Dreamkeep Stats +

DREAMKEEP

+

M-RP / H-RP Medieval Fantasy

+

+ +

+ + GitHub Contributors + + + Issues + + + GitHub pull requests + +

+ +

+ + BYOND Build + +

+ +
+ +| Community links | +|----------------------------------| +| [Discord](https://discord.gg/vJDHxXbqvv) | + +
+ +# LICENSE + +## Dreamkeep + +All original code and assets of this repository are under the [GNU Affero General Public License v3.0](https://www.gnu.org/licenses/agpl-3.0.en.html) unless otherwise indicated. + +## Dreamkeep - Proprietary + +The following assets are under a custom license as per original author's wishes, assets authored by Dreamkeep indicate collaborative work among it's artists, and may be credited within files. + +| Reference | Author | License | +|----------------------------------------------|---------------|------------| +| [licensed-dreamkeep](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-dreamkeep) | Dreamkeep | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-dreamkeep/LICENSE.md)| +| [licensed-eaglephntm](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm) | EaglePhntm | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm/LICENSE.md)| +| [licensed-feralope](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope/LICENSE.md)| +| [licensed-feralope (helmsguard)](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope/LICENSE.md)| + +## TG + +All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). + +All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). +(Including tools unless their readme specifies otherwise.) + +The TGS DMAPI is licensed as a subproject under the MIT license. + +See the footer of [code/__DEFINES/tgs.dm](./code/__DEFINES/tgs.dm) and [code/modules/tgs/LICENSE](./code/modules/tgs/LICENSE) for the MIT license. + +All other assets including icons and sound are under the [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 84461a6b490..9a7d87f516b 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -70,7 +70,7 @@ /atom/movable/screen/alert/status_effect/debuff/stealthcd name = "Stealth Broken" desc = "I've either been found or recently dealt a sneak attack and can't sneak again for a short while" - icon = 'modular_stonehedge/icons/mob/screen_alert.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' icon_state = "stealthcd" /datum/status_effect/debuff/stealthcd/on_apply() @@ -356,7 +356,7 @@ /atom/movable/screen/alert/status_effect/debuff/bigboobs name = "Enchanted Endowment" //was gonna name it a curse but it isn't a technically one. desc = "They feel as heavy as gold and are massive... My back hurts." - icon = 'modular_stonehedge/icons/mob/screen_alert.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' icon_state = "bigboobs" /datum/status_effect/debuff/bigboobs/on_apply() diff --git a/code/game/objects/items/rogueweapons/melee/knives.dm b/code/game/objects/items/rogueweapons/melee/knives.dm index 3ec57301b59..7e3a9a2fcc3 100644 --- a/code/game/objects/items/rogueweapons/melee/knives.dm +++ b/code/game/objects/items/rogueweapons/melee/knives.dm @@ -338,6 +338,6 @@ desc = "This ominous, jeweled dagger was crafted by the assassin race of nite elves." force = 22 sellprice = 75 - icon = 'modular_stonehedge/icons/roguetown/weapons/32.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/roguetown/weapons/32.dmi' icon_state = "drowdagger" item_state = "drowdag" diff --git a/code/modules/clothing/rogueclothes/feet.dm b/code/modules/clothing/rogueclothes/feet.dm index 1cc273de7a1..d43222a48f9 100644 --- a/code/modules/clothing/rogueclothes/feet.dm +++ b/code/modules/clothing/rogueclothes/feet.dm @@ -268,6 +268,9 @@ name = "fur lined boots" desc = "Leather boots lined with fur." gender = PLURAL + icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi' + mob_overlay_icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi' + sleeved = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi' icon_state = "furlinedboots" item_state = "furlinedboots" sewrepair = TRUE @@ -277,6 +280,9 @@ name = "fur lined anklets" desc = "Leather anklets lined with fur, foot remains bare." gender = PLURAL + icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi' + mob_overlay_icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi' + sleeved = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi' icon_state = "furlinedanklets" item_state = "furlinedanklets" sewrepair = TRUE diff --git a/code/modules/reagents/reagent_containers/powderspice.dm b/code/modules/reagents/reagent_containers/powderspice.dm index 47e9c8ffbfa..442a398a6ff 100644 --- a/code/modules/reagents/reagent_containers/powderspice.dm +++ b/code/modules/reagents/reagent_containers/powderspice.dm @@ -235,7 +235,7 @@ /obj/item/reagent_containers/powder/gunpowder name = "firepowder" desc = "Not so useful in this state." - icon = 'modular_stonehedge/icons/roguetown/items/produce.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/roguetown/items/produce.dmi' icon_state = "gunpowder" possible_transfer_amounts = list() volume = 15 diff --git a/code/modules/surgery/organs/feature_organs/genitals.dm b/code/modules/surgery/organs/feature_organs/genitals.dm index e12d55f7e0c..c2718ab7897 100644 --- a/code/modules/surgery/organs/feature_organs/genitals.dm +++ b/code/modules/surgery/organs/feature_organs/genitals.dm @@ -92,7 +92,7 @@ /obj/item/organ/filling_organ/anus //absorbs faster than womb, less capacity. name = "anus" - icon = 'modular_stonehedge/icons/obj/surgery.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/obj/surgery.dmi' icon_state = "anus" dropshrink = 0.5 visible_organ = TRUE @@ -109,7 +109,7 @@ /obj/item/organ/filling_organ/vagina name = "vagina" - icon = 'modular_stonehedge/icons/obj/surgery.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/obj/surgery.dmi' icon_state = "vagina" dropshrink = 0.5 visible_organ = TRUE @@ -127,7 +127,7 @@ /obj/item/organ/filling_organ/breasts name = "breasts" - icon = 'modular_stonehedge/icons/obj/surgery.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/obj/surgery.dmi' icon_state = "breasts" dropshrink = 0.8 visible_organ = TRUE @@ -151,7 +151,7 @@ /obj/item/organ/belly name = "belly" - icon = 'modular_stonehedge/icons/obj/surgery.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/obj/surgery.dmi' icon_state = "belly" visible_organ = TRUE zone = BODY_ZONE_PRECISE_STOMACH @@ -162,7 +162,7 @@ /obj/item/organ/filling_organ/testicles name = "testicles" - icon = 'modular_stonehedge/icons/obj/surgery.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/obj/surgery.dmi' icon_state = "testicles" dropshrink = 0.5 visible_organ = TRUE @@ -190,7 +190,7 @@ /obj/item/organ/butt name = "butt" - icon = 'modular_stonehedge/icons/obj/surgery.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/obj/surgery.dmi' icon_state = "butt" dropshrink = 0.5 visible_organ = TRUE diff --git a/modular_helmsguard/icons/CREDITS.txt b/modular_helmsguard/CREDITS.md similarity index 100% rename from modular_helmsguard/icons/CREDITS.txt rename to modular_helmsguard/CREDITS.md diff --git a/modular_helmsguard/Placeholder.txt b/modular_helmsguard/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/code/datums/Placeholder.txt b/modular_helmsguard/code/datums/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/code/datums/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/code/game/objects/items/war_horn.dm b/modular_helmsguard/code/game/objects/items/war_horn.dm index d70010b67da..68d596a8bf0 100644 --- a/modular_helmsguard/code/game/objects/items/war_horn.dm +++ b/modular_helmsguard/code/game/objects/items/war_horn.dm @@ -2,7 +2,7 @@ /obj/item/war_horn name = "generic war horn" desc = "Used to coordiante troops in the field." - icon = 'modular_helmsguard/icons/obj/items/warhorns.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/obj/items/warhorns.dmi' icon_state = "humanhorn" slot_flags = ITEM_SLOT_HIP|ITEM_SLOT_NECK w_class = WEIGHT_CLASS_NORMAL diff --git a/modular_helmsguard/code/game/objects/items/weapons/melee/Placeholder.txt b/modular_helmsguard/code/game/objects/items/weapons/melee/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/code/game/objects/items/weapons/melee/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/code/game/objects/items/weapons/ranged/Placeholder.txt b/modular_helmsguard/code/game/objects/items/weapons/ranged/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/code/game/objects/items/weapons/ranged/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/code/game/objects/structures/catapult.dm b/modular_helmsguard/code/game/objects/structures/catapult.dm index ebde79b955a..3fa04cdf59c 100644 --- a/modular_helmsguard/code/game/objects/structures/catapult.dm +++ b/modular_helmsguard/code/game/objects/structures/catapult.dm @@ -2,7 +2,7 @@ /obj/structure/catapult name = "Siege Catapult" desc = "An ancient siege engine for hurling projectiles over long distances." - icon = 'modular_helmsguard/icons/obj/structure/catapult.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/obj/structure/catapult.dmi' icon_state = "catapult_ready" anchored = 1 density = 1 @@ -236,7 +236,7 @@ /obj/item/boulder name = "boulder" - icon = 'modular_helmsguard/icons/obj/structure/cata_ammo.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/obj/structure/cata_ammo.dmi' icon_state = "b-1" w_class = 5 var/launched = FALSE @@ -251,7 +251,7 @@ /*/obj/item/boulder/flying - icon = 'modular_helmsguard/icons/obj/structure/cata_ammo.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/obj/structure/cata_ammo.dmi' icon_state = "boulder"*/ diff --git a/modular_helmsguard/code/game/objects/structures/ladders.dm b/modular_helmsguard/code/game/objects/structures/ladders.dm index 9f19406a137..d331507b9af 100644 --- a/modular_helmsguard/code/game/objects/structures/ladders.dm +++ b/modular_helmsguard/code/game/objects/structures/ladders.dm @@ -1,3 +1,3 @@ // Basic ladder. By default links to the z-level above/below. /obj/structure/ladder - icon = 'modular_helmsguard/icons/roguetown/misc/helms_ladders.dmi' \ No newline at end of file + icon = 'modular_helmsguard/licensed-feralope/icons/roguetown/misc/helms_ladders.dmi' diff --git a/modular_helmsguard/code/game/objects/structures/spike barricade.dm b/modular_helmsguard/code/game/objects/structures/spike barricade.dm index 5e7385411a3..743e8ff2b36 100644 --- a/modular_helmsguard/code/game/objects/structures/spike barricade.dm +++ b/modular_helmsguard/code/game/objects/structures/spike barricade.dm @@ -2,7 +2,7 @@ /obj/structure/barricade/wood_spike name = "wooden barrier" desc = "A defensive barrier made of sharp wooden stakes," - icon = 'modular_helmsguard/icons/obj/structure/spike_barricades.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/obj/structure/spike_barricades.dmi' icon_state = "barricade" max_integrity = 250 proj_pass_rate = 80 diff --git a/modular_helmsguard/code/game/objects/weapons/ranged/arquebus.dm b/modular_helmsguard/code/game/objects/weapons/ranged/arquebus.dm index a25189adfd1..c91b56aebae 100644 --- a/modular_helmsguard/code/game/objects/weapons/ranged/arquebus.dm +++ b/modular_helmsguard/code/game/objects/weapons/ranged/arquebus.dm @@ -2,7 +2,7 @@ /obj/item/gun/ballistic/arquebus name = "arquebus rifle" desc = "A gunpowder weapon that shoots an armor piercing metal ball." - icon = 'modular_helmsguard/icons/weapons/arquebus.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/weapons/arquebus.dmi' icon_state = "arquebus" item_state = "arquebus" force = 10 @@ -551,7 +551,7 @@ /obj/item/ramrod name = "ramrod" - icon = 'modular_helmsguard/icons/obj/items/arquebus_items.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/obj/items/arquebus_items.dmi' desc = "A ramrod used for reloading a firearm." icon_state = "ramrod" item_state = "ramrod" @@ -561,7 +561,7 @@ /obj/item/powderflask name = "firepowder flask" - icon = 'modular_helmsguard/icons/obj/items/arquebus_items.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/obj/items/arquebus_items.dmi' desc = "A flask of gunpowder used for reloading a firearm." icon_state = "powderflask" item_state = "powderflask" diff --git a/modular_helmsguard/code/game/objects/weapons/ranged/handgonne.dm b/modular_helmsguard/code/game/objects/weapons/ranged/handgonne.dm index 2059c861841..6fa60ccf7fd 100644 --- a/modular_helmsguard/code/game/objects/weapons/ranged/handgonne.dm +++ b/modular_helmsguard/code/game/objects/weapons/ranged/handgonne.dm @@ -2,7 +2,7 @@ /obj/item/gun/ballistic/handgonne name = "handgonne" desc = "A gunpowder weapon that shoots an armor piercing metal ball." - icon = 'modular_helmsguard/icons/weapons/handgonne.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/weapons/handgonne.dmi' icon_state = "handgonne" item_state = "handgonne" force = 10 diff --git a/modular_helmsguard/code/modules/mobs/farm/horse.dm b/modular_helmsguard/code/modules/mobs/farm/horse.dm index 75a0e8a798b..ae9aa30b6b0 100644 --- a/modular_helmsguard/code/modules/mobs/farm/horse.dm +++ b/modular_helmsguard/code/modules/mobs/farm/horse.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/hostile/retaliate/rogue/horse - icon = 'modular_helmsguard/icons/mob/horse.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/mob/horse.dmi' name = "horse" desc = "" icon_state = "horsewhite" @@ -122,7 +122,7 @@ // FOAL /mob/living/simple_animal/hostile/retaliate/rogue/foal - icon = 'modular_helmsguard/icons/mob/horse.dmi' + icon = 'modular_helmsguard/licensed-feralope/icons/mob/horse.dmi' name = "foal" desc = "" icon_state = "foal" @@ -400,4 +400,4 @@ swingdelay = 0 candodge = TRUE canparry = TRUE - item_d_type = "blunt" \ No newline at end of file + item_d_type = "blunt" diff --git a/modular_helmsguard/icons/areas/Placeholder.txt b/modular_helmsguard/icons/areas/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/areas/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/mob/Placeholder.txt b/modular_helmsguard/icons/mob/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/mob/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/effects/Placeholder.txt b/modular_helmsguard/icons/obj/effects/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/effects/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/flora/Placeholder.txt b/modular_helmsguard/icons/obj/flora/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/flora/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/armor/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/armor/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/armor/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/belts/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/belts/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/belts/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/cloaks/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/cloaks/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/cloaks/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/feet/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/feet/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/feet/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/head/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/head/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/head/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/masks/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/masks/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/masks/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/mouth/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/mouth/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/mouth/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/neck/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/neck/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/neck/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/on_mob/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/on_mob/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/on_mob/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/pants/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/pants/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/pants/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/rings/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/rings/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/rings/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/shirts/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/shirts/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/shirts/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/storage/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/storage/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/storage/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/clothing/wrists/Placeholder.txt b/modular_helmsguard/icons/obj/items/clothing/wrists/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/clothing/wrists/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/icons/obj/items/food/Placeholder.txt b/modular_helmsguard/icons/obj/items/food/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/icons/obj/items/food/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_helmsguard/licensed-eaglephntm/LICENSE.md b/modular_helmsguard/licensed-eaglephntm/LICENSE.md new file mode 100644 index 00000000000..65b75c69c5d --- /dev/null +++ b/modular_helmsguard/licensed-eaglephntm/LICENSE.md @@ -0,0 +1,5 @@ +# LICENSE +All the items in this folder and its subdirectories are licensed by EaglePhntm (also known as Vide Noir. https://github.com/EaglePhntm). + +Redistribution, reproduction, or modification of these assets is prohibited without express permission from the licensors. These assets are for use solely within this project and may not be extracted or repurposed for other projects or commercial use. + diff --git a/modular_helmsguard/icons/intents.dmi b/modular_helmsguard/licensed-eaglephntm/intents.dmi similarity index 100% rename from modular_helmsguard/icons/intents.dmi rename to modular_helmsguard/licensed-eaglephntm/intents.dmi diff --git a/modular_helmsguard/licensed-feralope/LICENSE.md b/modular_helmsguard/licensed-feralope/LICENSE.md new file mode 100644 index 00000000000..967946a1f22 --- /dev/null +++ b/modular_helmsguard/licensed-feralope/LICENSE.md @@ -0,0 +1,5 @@ +# LICENSE +All the items in this folder and its subdirectories are licensed by Feralope (also known as Stoned Elf. https://github.com/Feralape) + +Redistribution, reproduction, or modification of these assets is prohibited without express permission from the licensors. These assets are for use solely within this project and may not be extracted or repurposed for other projects or commercial use. + diff --git a/modular_helmsguard/icons/Modular Icons.txt b/modular_helmsguard/licensed-feralope/icons/Modular Icons.txt similarity index 100% rename from modular_helmsguard/icons/Modular Icons.txt rename to modular_helmsguard/licensed-feralope/icons/Modular Icons.txt diff --git a/modular_helmsguard/icons/mob/horse.dmi b/modular_helmsguard/licensed-feralope/icons/mob/horse.dmi similarity index 100% rename from modular_helmsguard/icons/mob/horse.dmi rename to modular_helmsguard/licensed-feralope/icons/mob/horse.dmi diff --git a/modular_helmsguard/icons/obj/items/arquebus_items.dmi b/modular_helmsguard/licensed-feralope/icons/obj/items/arquebus_items.dmi similarity index 100% rename from modular_helmsguard/icons/obj/items/arquebus_items.dmi rename to modular_helmsguard/licensed-feralope/icons/obj/items/arquebus_items.dmi diff --git a/modular_helmsguard/icons/obj/items/clothing/Modular Icons.txt b/modular_helmsguard/licensed-feralope/icons/obj/items/clothing/Modular Icons.txt similarity index 100% rename from modular_helmsguard/icons/obj/items/clothing/Modular Icons.txt rename to modular_helmsguard/licensed-feralope/icons/obj/items/clothing/Modular Icons.txt diff --git a/modular_helmsguard/icons/obj/items/warhorns.dmi b/modular_helmsguard/licensed-feralope/icons/obj/items/warhorns.dmi similarity index 100% rename from modular_helmsguard/icons/obj/items/warhorns.dmi rename to modular_helmsguard/licensed-feralope/icons/obj/items/warhorns.dmi diff --git a/modular_helmsguard/icons/obj/structure/cata_ammo.dmi b/modular_helmsguard/licensed-feralope/icons/obj/structure/cata_ammo.dmi similarity index 100% rename from modular_helmsguard/icons/obj/structure/cata_ammo.dmi rename to modular_helmsguard/licensed-feralope/icons/obj/structure/cata_ammo.dmi diff --git a/modular_helmsguard/icons/obj/structure/catapult.dmi b/modular_helmsguard/licensed-feralope/icons/obj/structure/catapult.dmi similarity index 100% rename from modular_helmsguard/icons/obj/structure/catapult.dmi rename to modular_helmsguard/licensed-feralope/icons/obj/structure/catapult.dmi diff --git a/modular_helmsguard/icons/obj/structure/orc_banner.dmi b/modular_helmsguard/licensed-feralope/icons/obj/structure/orc_banner.dmi similarity index 100% rename from modular_helmsguard/icons/obj/structure/orc_banner.dmi rename to modular_helmsguard/licensed-feralope/icons/obj/structure/orc_banner.dmi diff --git a/modular_helmsguard/icons/obj/structure/spawners.dmi b/modular_helmsguard/licensed-feralope/icons/obj/structure/spawners.dmi similarity index 100% rename from modular_helmsguard/icons/obj/structure/spawners.dmi rename to modular_helmsguard/licensed-feralope/icons/obj/structure/spawners.dmi diff --git a/modular_helmsguard/icons/obj/structure/spike_barricades.dmi b/modular_helmsguard/licensed-feralope/icons/obj/structure/spike_barricades.dmi similarity index 100% rename from modular_helmsguard/icons/obj/structure/spike_barricades.dmi rename to modular_helmsguard/licensed-feralope/icons/obj/structure/spike_barricades.dmi diff --git a/modular_helmsguard/icons/roguetown/misc/helms_ladders.dmi b/modular_helmsguard/licensed-feralope/icons/roguetown/misc/helms_ladders.dmi similarity index 100% rename from modular_helmsguard/icons/roguetown/misc/helms_ladders.dmi rename to modular_helmsguard/licensed-feralope/icons/roguetown/misc/helms_ladders.dmi diff --git a/modular_helmsguard/icons/weapons/arquebus.dmi b/modular_helmsguard/licensed-feralope/icons/weapons/arquebus.dmi similarity index 100% rename from modular_helmsguard/icons/weapons/arquebus.dmi rename to modular_helmsguard/licensed-feralope/icons/weapons/arquebus.dmi diff --git a/modular_helmsguard/icons/weapons/handgonne.dmi b/modular_helmsguard/licensed-feralope/icons/weapons/handgonne.dmi similarity index 100% rename from modular_helmsguard/icons/weapons/handgonne.dmi rename to modular_helmsguard/licensed-feralope/icons/weapons/handgonne.dmi diff --git a/modular_helmsguard/sound/Placeholder.txt b/modular_helmsguard/sound/Placeholder.txt deleted file mode 100644 index 807d3761d28..00000000000 --- a/modular_helmsguard/sound/Placeholder.txt +++ /dev/null @@ -1 +0,0 @@ -Placeholder to create a folder. Delete me when I am no longer holding open a folder path. \ No newline at end of file diff --git a/modular_stonehedge/CREDITS.md b/modular_stonehedge/CREDITS.md new file mode 100644 index 00000000000..1fb452f2718 --- /dev/null +++ b/modular_stonehedge/CREDITS.md @@ -0,0 +1,23 @@ +This credits folder involve sprites(Dmi) or sound files(ogg) where proper credit can not be granted. + +bikini/bra and skirt variant modifications of roguetown sprites of armors by Vide Noir +Furlined boots and anklets by StoneDelf and Vide Noir +screen alert graphics by Vide Noir +graphics used in overhead effects are from DARKEST DUNGEON +genital sprites are from SPLURT +dwarven sink sprite modified from tg sprite, by Vide Noir +surgery.dmi organ sprites by Vide Noir +goblinbits.dmi recolored from splurt +weapons.dmi drowish dagger sprite by Vide Noir +gunpowder, lovebottle, glass sheet and sand sprites by Vide Noir +lewd statues by Vide Noir + +Sounds by: +Darkest Dungeon +Warhammer 40K +Metal Gear Solid + +Vide Noir https://github.com/EaglePhntm +StoneDelf https://github.com/Feralape + +last updated 24/11/2024 \ No newline at end of file diff --git a/modular_stonehedge/CREDITS.txt b/modular_stonehedge/CREDITS.txt deleted file mode 100644 index c194d5f47f0..00000000000 --- a/modular_stonehedge/CREDITS.txt +++ /dev/null @@ -1,20 +0,0 @@ -bikini/bra and skirt variants of armors by Vide Noir -Furlined boots and anklets by StoneDelf and Vide Noir -screen alert graphics by Vide Noir -graphics used in overhead effects are from DARKEST DUNGEON -genital sprites are from SPLURT -dwarven sink sprite modified from tg, by Vide Noir -surgery.dmi sprites by Vide Noir -goblinbits.dmi recolored from splurt by Vide Noir -drowish dagger sprite by Vide Noir -gunpowder, lovebottle and sand sprites by Vide Noir - -effect sounds by: -Darkest Dungeon -Warhammer 40K -Metal Gear Solid - -Vide Noir https://github.com/EaglePhntm -StoneDelf https://github.com/Feralape - -last updated 24/11/2024 \ No newline at end of file diff --git a/modular_stonehedge/code/datums/status_effects/debuffs.dm b/modular_stonehedge/code/datums/status_effects/debuffs.dm index 509266b0cb9..631d890473c 100644 --- a/modular_stonehedge/code/datums/status_effects/debuffs.dm +++ b/modular_stonehedge/code/datums/status_effects/debuffs.dm @@ -9,7 +9,7 @@ /atom/movable/screen/alert/status_effect/bloatone name = "Bloated" desc = "Bit full..." - icon = 'modular_stonehedge/icons/mob/screen_alert.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' icon_state = "bloat1" /datum/status_effect/debuff/bloattwo @@ -21,5 +21,5 @@ /atom/movable/screen/alert/status_effect/bloattwo name = "Bloated" desc = "So full..." - icon = 'modular_stonehedge/icons/mob/screen_alert.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' icon_state = "bloat2" diff --git a/modular_stonehedge/code/game/objects/structures/dungeon/lewd_statues.dm b/modular_stonehedge/code/game/objects/structures/dungeon/lewd_statues.dm index d67fde1325a..b934ea457c7 100644 --- a/modular_stonehedge/code/game/objects/structures/dungeon/lewd_statues.dm +++ b/modular_stonehedge/code/game/objects/structures/dungeon/lewd_statues.dm @@ -5,7 +5,7 @@ /obj/structure/fluff/statue/lewd name = "lewd statue" desc = "Who made those..?" - icon = 'modular_stonehedge/icons/roguetown/misc/tallstructure.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/roguetown/misc/tallstructure.dmi' icon_state = "lewd1" /obj/structure/fluff/statue/lewd/random/Initialize(mapload) diff --git a/modular_stonehedge/licensed-death-rattler/LICENSE.md b/modular_stonehedge/licensed-death-rattler/LICENSE.md new file mode 100644 index 00000000000..1c315580282 --- /dev/null +++ b/modular_stonehedge/licensed-death-rattler/LICENSE.md @@ -0,0 +1,29 @@ +# LICENSE +/* + Copyright (C) 2024 [Moribund/Luctus-Comptus] + + This file is part of Death-Rattler. + + Death-Rattler is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License (GPL) as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Death-Rattler is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License (GPL) for more details. + + You should have received a copy of the GNU General Public License (GPL) + along with Death-Rattler. If not, see http://www.gnu.org/licenses/. + + Additional Terms: + a) You may not use this file in another repository without explicit + written permission from the copyright holder. + b) Modification of this file is prohibited without explicit written + permission from the copyright holder. + c) This file may not be copied, duplicated, or redistributed without + explicit written permission from the copyright holder. + d) This file must include this copyright notice and license information + in any copies or substantial portions of the file. +*/ \ No newline at end of file diff --git a/modular_stonehedge/licensed-dreamkeep/LICENSE.md b/modular_stonehedge/licensed-dreamkeep/LICENSE.md new file mode 100644 index 00000000000..78c3f3e590e --- /dev/null +++ b/modular_stonehedge/licensed-dreamkeep/LICENSE.md @@ -0,0 +1,5 @@ +# LICENSE +All the items in this folder and its subdirectories are licensed by Dreamkeep as a collaborative work between its artists, additional credit may be given within the folder. + +Redistribution, reproduction, or modification of these assets is prohibited without express permission from the licensors. These assets are for use solely within this project and may not be extracted or repurposed for other projects or commercial use. + diff --git a/modular_stonehedge/licensed-dreamkeep/icons/armor/feet.dmi b/modular_stonehedge/licensed-dreamkeep/icons/armor/feet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..adca2d041453b720cf7401a0ea12b4ea7d9d15e3 GIT binary patch literal 627 zcmV-(0*w8MP)c;00DGTPE!Ct=GbNc004S=R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo` zEh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+t+Xg7GcPqIDL=oY zSc!`>C9|j)C~nBbnO2mTn+joLs7}nw&Pm0sURlA_&jsup0F=8dboBev!~g&RWl2Oq zR7i>KRBLa;APmF?mzihy|9^I8(ydKeE#m9cON1iMK0jh`?t>40L61-N%*#A1*aza^ zTo59mu*&nz_HW*kk646hi4QCs4G6P;2!{n80YbbRFha!Wg`Ug4DZ|pr@?}d*M zu6V170uc*pWCQUEZ>^o%@&!|Sltor}{3Ibs62wsi%Nbn`D?E~ncqBR(GZ5oZ|AIGU zRRsY9O-Z$^@~+ta-JquSVsOQ~QhQB0Q`FQp&42M@)0Yfe>Q&=3XswQZR>%*24Dhcd zwlPZC5NeFndhPv~W&YuZ@u{BtwUyr5OtF-tqi$p9A&Fcv-sre7Z>-yCkgUSqN|^$h z%7zSTN>2(z5Rgnx>{!}zNT63Jph=c?jHXe0+M70k*`*>FM+gzlCYHk_>K^ddzC^X3 zr4IpIBS8Y=BC+_+#`)O78SZJk&hrKz_)n+Z_tb-|@22yBclY2w!8iBZ5$Nzi>=FO~ N002ovPDHLkV1jx69j5>Q literal 0 HcmV?d00001 diff --git a/modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi b/modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..adca2d041453b720cf7401a0ea12b4ea7d9d15e3 GIT binary patch literal 627 zcmV-(0*w8MP)c;00DGTPE!Ct=GbNc004S=R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo` zEh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+t+Xg7GcPqIDL=oY zSc!`>C9|j)C~nBbnO2mTn+joLs7}nw&Pm0sURlA_&jsup0F=8dboBev!~g&RWl2Oq zR7i>KRBLa;APmF?mzihy|9^I8(ydKeE#m9cON1iMK0jh`?t>40L61-N%*#A1*aza^ zTo59mu*&nz_HW*kk646hi4QCs4G6P;2!{n80YbbRFha!Wg`Ug4DZ|pr@?}d*M zu6V170uc*pWCQUEZ>^o%@&!|Sltor}{3Ibs62wsi%Nbn`D?E~ncqBR(GZ5oZ|AIGU zRRsY9O-Z$^@~+ta-JquSVsOQ~QhQB0Q`FQp&42M@)0Yfe>Q&=3XswQZR>%*24Dhcd zwlPZC5NeFndhPv~W&YuZ@u{BtwUyr5OtF-tqi$p9A&Fcv-sre7Z>-yCkgUSqN|^$h z%7zSTN>2(z5Rgnx>{!}zNT63Jph=c?jHXe0+M70k*`*>FM+gzlCYHk_>K^ddzC^X3 zr4IpIBS8Y=BC+_+#`)O78SZJk&hrKz_)n+Z_tb-|@22yBclY2w!8iBZ5$Nzi>=FO~ N002ovPDHLkV1jx69j5>Q literal 0 HcmV?d00001 diff --git a/modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi b/modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a295f0e048c4f907cbcea52dc7dbcb916997c36c GIT binary patch literal 1367 zcmXw3c~H^`6#lWW7#eD|W~n9aRN8vbVd;cNnq=-Kn&H}bk?W|FnvjtR9^jQVGrh-VJ|@H(cLL9{>Qj z&nd3}0014|=uP1D%_=6aY<+n8pT?qjJf2J@69@zx4u`>D^z`)XG1+DT-|{=k)Z4+x z6#)-JA39=VZL{m=#B(S7j@ULgH@oezB9qBQMMc@!+11t6|I811tgC^D0hqJE@!9v$ z>)<09dyeQ8bvZKe0)cn|p8x>K759sL^uF|w{@2(}ys=o}ck!2sa4UuDmB2`?m$AO@vf|-1RBD@VM!s1M z)s@d3C^7Ffn!6*Z{{cJj2P|hFl#HF2D!+~Nn&m)}9y=$@6GkwPTPBSPf!CG78?Tp7 z#e7^lQEP{6Q5L6y`tLsMik|Bq1OV`ukCz8Fx#G+Ci#xPq#y|Ss%6kEw--BP$aaUhq zORCW5lIAec&`>8es}JmxBwNx;Jt?xaM^y zxhhoCHUNFJGPgy?@u*vk$r{8pG+y%g4N^ext;fBS5(8_~!dP%|UtN292LEr;6>zCj zymm`K-Gc2_W|JM$gLag#|D^fzhQ&g*wshrxqX1y(uvujf>a=kyt9R->cvp(DC}5%N zZpZ0>2p%4`gZ{=quGl+i8c3@}4c{`2{^)+(LT3J$WR_KbSrKg}da8B7M0EJm(^$@v zPUBsg5(!r2+Be3@#uanUfX46np;y-{T!1T*eWzhHE}wg2(* zl*>0Jg1C(3j2g1a1al$hPfBpdg0%%x@0&|id@(q^5~;81&;f6)uRlaf-GL=oCKVT* zF02I=qWX{x$W5v!k!iwCfF=L>ay64Gu1vZ(RvrWn>8oZi*Av*61vAebPO<)=?rN_EB@Y5;lAXo6DYkI;eMQNy1Vb=6w5eP=W_K55a Nz7HDXMfW_P`7bTDmyrMf literal 0 HcmV?d00001 diff --git a/modular_stonehedge/licensed-eaglephntm/LICENSE.md b/modular_stonehedge/licensed-eaglephntm/LICENSE.md new file mode 100644 index 00000000000..65b75c69c5d --- /dev/null +++ b/modular_stonehedge/licensed-eaglephntm/LICENSE.md @@ -0,0 +1,5 @@ +# LICENSE +All the items in this folder and its subdirectories are licensed by EaglePhntm (also known as Vide Noir. https://github.com/EaglePhntm). + +Redistribution, reproduction, or modification of these assets is prohibited without express permission from the licensors. These assets are for use solely within this project and may not be extracted or repurposed for other projects or commercial use. + diff --git a/modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi b/modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e45f135578b227e4fc74d0446316da15c6c94b58 GIT binary patch literal 1103 zcmV-V1hD&wP)i_@)4M{{n zR9Jex)juk*!O?S&P)=>GJ#g-oLcX-|Hot@vfJs(xbmfTegRjp zRPcEg0lAQe0#ZVpmw;j$a1;rE64rox11R1Gpe#Qi4dfdDHSqB+u+~Ao0Z@p?VYb7+ z0c(_{p2-l%HvqmoUcbU&un+=u-6+L?QcYba0D!786A=J)-C`*O6um*g2Qa_yuow_J zXeiZwqM-1VstEvqj%#04RXhiL`S#GZ$J3F2QxonV6maGNbXB+SV!&SC074Hqf-mX; zFHbMQ5Oluf{E3A&6u1M5bA@xznEoB$kOXiFt6&ux+dt=x@aYS@h}1mo0tUbXnt23j z9zzoV`;G+4^AJ4Xbf|4!S)o3hTmY{R6?TCG00O`PaObGGfoyJp{@Vq3AuG%St%3_Q z$K$*N3>e{f3_3WUzku_5+7iwxC?v2rpJ{=rSsFlqwlOx*nX}0Qc1mf$-b@TACvT5+ zD8Zfy9zX<@xt%lqhxfUORpwBQ0gl>ZonErc2XxHbN00#Wl8!aA@lMff>gnzJhaAiHwMHGC_jz>1Aq+NO%EuTd6WSxc?dV%13VrNGD3hxjzCWx z7{Lc}bNL5Qo`nz?8Q`UofLu=i&B2AoAp%;^(+~kmp57*b$xcHAJRek-Z~BAFGdQy> zF!ocfdx#HJcwzx=BeN%EU>Zyd0zh@e5oEk4Wnh@5N#`Sg7VwEvfO+_dj$I2((?H?A zhydCFPr4QCo)m!rYor|=f3Xmtr=KtXBLWRtkAb0LPHQ;}= zZe!KWDC*S#$O-)@4L9H U=jBOk1KP{r>FVdQ&MBb@0CQ`7uK)l5 literal 0 HcmV?d00001 diff --git a/modular_stonehedge/licensed-eaglephntm/icons/roguetown/misc/tallstructure.dmi b/modular_stonehedge/licensed-eaglephntm/icons/roguetown/misc/tallstructure.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f62ce4177ef4f5cf3374d5998458fb4dd2e2ce76 GIT binary patch literal 144265 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 Date: Mon, 25 Nov 2024 08:42:59 -0800 Subject: [PATCH 034/192] Devotion nuclear option (#105) --- code/controllers/subsystem/rogue/devotion.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/rogue/devotion.dm b/code/controllers/subsystem/rogue/devotion.dm index feb945118b7..faa5b1bb6de 100644 --- a/code/controllers/subsystem/rogue/devotion.dm +++ b/code/controllers/subsystem/rogue/devotion.dm @@ -180,7 +180,7 @@ return granted_spells = list() - var/list/spelllist = list(patron.t0, patron.t1) + var/list/spelllist = list(patron.t0, patron.t1, patron.t2, patron.t3, patron.t4) for(var/spell_type in spelllist) if(!spell_type || H.mind.has_spell(spell_type)) continue @@ -212,7 +212,7 @@ return granted_spells = list() - var/list/spelllist = list(patron.t0) + var/list/spelllist = list(patron.t0, patron.t1, patron.t2) for(var/spell_type in spelllist) if(!spell_type || H.mind.has_spell(spell_type)) continue From b7222a80d15fc186950936b1f7b3fad0d99ab539 Mon Sep 17 00:00:00 2001 From: Vide Noir <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:49:53 +0300 Subject: [PATCH 035/192] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index dcab2673c1f..0349a3f939e 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ The following assets are under a custom license as per original author's wishes, | [licensed-eaglephntm](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm) | EaglePhntm | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm/LICENSE.md)| | [licensed-feralope](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope/LICENSE.md)| | [licensed-feralope (helmsguard)](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope/LICENSE.md)| +| [licensed-death-rattler](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler) | Moribund/Luctus-Comptus | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler/LICENSE.md)| ## TG From d431621aeab4c19619c011f16cefde67d3410a61 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:57:13 +0300 Subject: [PATCH 036/192] also whats this doing here --- .gitignore | 1 + data/player_generated_books/Unknown.json | 1 - data/player_generated_books/_book_titles.json | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 data/player_generated_books/Unknown.json delete mode 100644 data/player_generated_books/_book_titles.json diff --git a/.gitignore b/.gitignore index f0150f26323..aa747e3e007 100644 --- a/.gitignore +++ b/.gitignore @@ -220,3 +220,4 @@ tools/MapAtmosFixer/MapAtmosFixer/bin/* /config/ezdb.txt tgui/src/images/syndicate.svg tgui/src/images/nanotrasen.svg +/data diff --git a/data/player_generated_books/Unknown.json b/data/player_generated_books/Unknown.json deleted file mode 100644 index 2a3a3ebfbb5..00000000000 --- a/data/player_generated_books/Unknown.json +++ /dev/null @@ -1 +0,0 @@ -{"book_title":"Unknown Title", "author":"Unknown Author", "author_ckey":"(test file)", "icon":"basic_book", "text":"[moisture in the air or water leaks have rendered the carefully written caligraphy of this book unreadable]"} diff --git a/data/player_generated_books/_book_titles.json b/data/player_generated_books/_book_titles.json deleted file mode 100644 index 90b970fd175..00000000000 --- a/data/player_generated_books/_book_titles.json +++ /dev/null @@ -1 +0,0 @@ -["Unknown"] From cc2020d601d5d0eff0f0612b83dfb9257a875a54 Mon Sep 17 00:00:00 2001 From: Luctus <117505981+Luctus-Comptus@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:06:00 -0600 Subject: [PATCH 037/192] Shouldn't have to do this (#111) * *sigh * thanks ratwood. * Update Death-Rattler.dm * Update LICENSE.md * Update LICENSE.md --------- Co-authored-by: Moribun <117505981+Moribun@users.noreply.github.com> --- .../Death-Rattler/code/Death-Rattler.dm | 158 ++++++++++++++++++ .../Death-Rattler/icon/smokable.dmi | Bin 0 -> 3341 bytes .../Death-Rattler/sound/capoff.ogg | Bin 0 -> 52532 bytes .../Death-Rattler/sound/chug.ogg | Bin 0 -> 17853 bytes .../Death-Rattler/sound/corkpop.ogg | Bin 0 -> 17032 bytes .../Death-Rattler/sound/inject.ogg | Bin 0 -> 53307 bytes .../licensed-death-rattler/LICENSE.md | 25 +-- roguetown.dme | 1 + 8 files changed, 163 insertions(+), 21 deletions(-) create mode 100644 modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm create mode 100644 modular_stonehedge/licensed-death-rattler/Death-Rattler/icon/smokable.dmi create mode 100644 modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/capoff.ogg create mode 100644 modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/chug.ogg create mode 100644 modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/corkpop.ogg create mode 100644 modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/inject.ogg diff --git a/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm b/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm new file mode 100644 index 00000000000..3d200809221 --- /dev/null +++ b/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm @@ -0,0 +1,158 @@ +// This code is part of Death-Rattler +// Copyright (C) 2024 Moribund/Luctus-Comptus +// Unauthorized use, modification, or distribution of this code is prohibited without copyright holders approval. See LICENSE.md + +// I hate doing this. basically if you are anyone but ratwood/gyran DM me first and you can use whatever the fuck your heart wants from this. not only did he brag about theft and how easy it is he tryed to pull this same shit. + + + + +/obj/item/storage/fancy/shhig + name = "Shhig Brand Zigs" + desc = "Dr. V's Shhig's; much like the image of serpents these zigs are synonymous with both healing and killing. Your life expectancy isnt very high anyway." + icon = 'modular_stonehedge/licensed-death-rattler/Death-Rattler/icon/smokable.dmi' + icon_state = "smokebox" + icon_type = "smoke" + item_state = "smokebox" + fancy_open = TRUE + w_class = WEIGHT_CLASS_TINY + throwforce = 0 + slot_flags = null + spawn_type = /obj/item/clothing/mask/cigarette/rollie/snek + +/obj/item/storage/fancy/shhig/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 5 + STR.set_holdable(list(/obj/item/clothing/mask/cigarette/rollie/snek)) + +/obj/item/storage/fancy/shhig/attack_self(mob_user) + return + +/obj/item/clothing/mask/cigarette/rollie/snek + list_reagents = list(/datum/reagent/drug/nicotine = 30, /datum/reagent/consumable/honey = 30, /datum/reagent/toxin/venom = 10) //honey will give heal. it is NOT great 55% chance per unit tick to heal 1brute,burn,tox. high end perfect rolls 30hp. unlikely. degrades into sugar (chance) which has a chance to degrade into nutrients. simulates appetite surpressant effect. + +/obj/item/reagent_containers/hypospray/medipen/sty/snekbt + name = "Snake Bite" + desc = "Dr. V's;.....vim....and- Ask yourself this; What am I doing? It is litterally a fucking glowing viscous sludge you are about to put into your vascular system..." + volume = 10 + amount_per_transfer_from_this = 10 + list_reagents = list(/datum/reagent/drug/snekbt = 5, /datum/reagent/toxin/venom = 5) + +/obj/item/reagent_containers/hypospray/medipen/sty/nourish + name = "NOURISH" + desc = "Dr. V's nutritional suppliment; normal people eat and drink, but true champions NOURISH." + volume = 135 + amount_per_transfer_from_this = 135 + list_reagents = list(/datum/reagent/consumable/honey = 30, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/water = 100) // as much water as a bucket so full hydrate. enough honey to IF good rng rolls get 30hp. 33% chance to decay into sugar, sugar has a 33% chance to decay into nutrients. so saturation varies. + +/datum/reagent/drug/snekbt + name = "Snake Bite" + description = "I'm not the one who's so far away..." + color = "#00FF00" + metabolization_rate = 0.1 + overdose_threshold = 6 + +/datum/reagent/drug/snekbt/on_mob_life(mob/living/carbon/M) + M.apply_status_effect(/datum/status_effect/buff/snekbt) + if(M.has_status_effect(/datum/status_effect/debuff/sleepytime)) + M.remove_status_effect(/datum/status_effect/debuff/sleepytime) + if(M.has_flaw(/datum/charflaw/addiction/junkie)) + M.sate_addiction() + ..() + + +/datum/reagent/drug/snekbt/on_mob_metabolize(mob/living/M) + ..() + M.update_body_parts_head_only() + M.overlay_fullscreen("snekbt", /atom/movable/screen/fullscreen/snekbt) + +/atom/movable/screen/fullscreen/snekbt + icon_state = "curse1" + plane = BLACKNESS_PLANE + layer = AREA_LAYER + blend_mode = 0 + alpha = 255 + show_when_dead = FALSE + +/datum/reagent/drug/snekbt/on_mob_end_metabolize(mob/living/M) + M.rogstam_add(-2500) + M.rogfat_add(2500) // crash you fucking junkie. + ..() + . = 1 + +/atom/movable/screen/fullscreen/bittensm/Initialize() + ..() + filters += filter(type="angular_blur",x=5,y=5,size=1) + +/datum/reagent/drug/snekbt/overdose_start(mob/living/M, can_overdose = TRUE) + if(HAS_TRAIT(M, TRAIT_CRACKHEAD))// boathian bullshit isnt going to help you here. its a toxin not a drug + can_overdose = TRUE + to_chat(M, span_danger("you really..... really shouldnt of done that...")) + M.ForceContractDisease(new /datum/disease/heart_failure(), FALSE, TRUE) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) + +/datum/reagent/drug/snekbt/overdose_process(mob/living/M) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + ADD_TRAIT(M, TRAIT_PARALYSIS_L_ARM, TRAIT_GENERIC) + ADD_TRAIT(M, TRAIT_PARALYSIS_L_LEG, TRAIT_GENERIC) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 5) + M.adjustOxyLoss(5*REM, 0) + ..() + +/datum/status_effect/buff/snekbt + id = "Snake Bite" + alert_type = /atom/movable/screen/alert/status_effect/buff/druqks + effectedstats = list("strength" = 2, "constitution" = 2, "speed" = -3) + duration = 31+13+22.6 SECONDS + +/datum/stressevent/snekbt + stressadd = -15 + desc = span_blue("How many will you take with you?...") + timer = 31+13+22.6 SECONDS + + +/datum/status_effect/buff/snekbt/on_apply() + . = ..() + if(owner?.client) + if(owner.client.screen && owner.client.screen.len) + var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in owner.client.screen + PM.backdrop(owner) + PM = locate(/atom/movable/screen/plane_master/game_world_fov_hidden) in owner.client.screen + PM.backdrop(owner) + PM = locate(/atom/movable/screen/plane_master/game_world_above) in owner.client.screen + PM.backdrop(owner) + owner.add_stress(/datum/stressevent/snekbt) + ADD_TRAIT(owner, TRAIT_PROSOPAGNOSIA, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_FAKEDEATH, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_NODISMEMBER, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_NOPAINSTUN, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_NOROGSTAM, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_SCHIZO_AMBIENCE, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_ANTIMAGIC, TRAIT_GENERIC) + +/datum/status_effect/buff/snekbt/on_remove() + if(owner?.client) + if(owner.client.screen && owner.client.screen.len) + var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in owner.client.screen + PM.backdrop(owner) + PM = locate(/atom/movable/screen/plane_master/game_world_fov_hidden) in owner.client.screen + PM.backdrop(owner) + PM = locate(/atom/movable/screen/plane_master/game_world_above) in owner.client.screen + PM.backdrop(owner) + owner.remove_stress(/datum/stressevent/snekbt) + owner.clear_fullscreen("snekbt") + owner.rogstam_add(-2500) + owner.rogfat_add(2500) // crash you fucking junkie. + owner.update_body_parts_head_only() + REMOVE_TRAIT(owner, TRAIT_PROSOPAGNOSIA, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_FAKEDEATH, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_NODISMEMBER, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_NOPAINSTUN, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_NOROGSTAM, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_SCHIZO_AMBIENCE, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, TRAIT_GENERIC) + . = ..() + . = 1 diff --git a/modular_stonehedge/licensed-death-rattler/Death-Rattler/icon/smokable.dmi b/modular_stonehedge/licensed-death-rattler/Death-Rattler/icon/smokable.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f38f7321268e1cc214c32a93e19306527bc2dd47 GIT binary patch literal 3341 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 aPC4>eJ3p^-q4sI_8^FlGOutgsHReCsR9esg literal 0 HcmV?d00001 diff --git a/modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/capoff.ogg b/modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/capoff.ogg new file mode 100644 index 0000000000000000000000000000000000000000..da37dfaeb30606c94bece797042b0f1a51f595c3 GIT binary patch literal 52532 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%0Dofd8)onZ3`9_v1em=s#Pi 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 D1fU9q literal 0 HcmV?d00001 diff --git a/modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/chug.ogg b/modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/chug.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f24656e0f318f2f157c0d601f25ac656bcea8cb6 GIT binary patch literal 17853 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

s1L=F}7mY5dL= zMjf&eZ63XZlp9p|ncq1#v1KK{g}>bY5Teo^w8r@aLw~h--JC4?BHS2t_}ryLKfmAB z>@zX%rZ4#5==q^pAYQPcHK;{e`3x!um2=9j>PXHwN{S}fA^3*Ft@&um_pfr zLDyJuNmFh#JlT1?Ifqb!kW0Ar7aqSqoqos2-H0Zz(UIS>%I5l38!T~c+vRY){bN1sI@k|}>q zOxkjZ{Vd?;a5~yevL1e3oVs7@b8u$YGwh$$fFn%p+^-I#IRW&szHcr=jb&t;f4+B# zr^b;e4CmRr;_gs8eI2kWc9NF4^k(l@U0u6d0}~muqhgeIY94|U5q%%@B@uK%$I{C- zwZ%1HVW(Q`r3Ti%_j{kCyGkBA@f2(D@SywdRZm0`vmIP7o@_csg|a0Wf0%NZ?|==4 z>$dMFo|Ggkg9B*xgOCjd&%2ECnW)2+Q}K?+F(E;X>XUVQECN;~IwO)gCY}Ds-;Nsd z#Os?ve!`q$%iV#69rymLF0c5GD*PTRA6tY{UI!4pI_uMMG}Jg{yH9Uq7HA(EckxPEyb?H87V zL!~93qS0^H>l(eF-`w7mE?c^yWoHC2kw&Gb2!BZ^YRy+w%fsLQMdIhuXKD}B>3ID! z(25?QGvU!cg^?uTb$GdY-Mw^5_?TtnluPU%x=lepa9*6vEy|#x$$n@6$Lzq`sa^_5 zWQrgFG)?q8%vUe?w(YBfBrM=n)HdZRz6IVTKcdV8A<0eoeopDeyc!Xyuy)bV$GHzwSn`$YnTPpu^ z1n&n><@fzD;&-usTkqL^qBWIE-%cONLL}IUyg8@#nLciz!Q?o4m=}TouVGTszLmkT zEhbTTzsSFMrM-=+AZdT)cF#ZGxngm+8u7J0Ag5YZtw9<@Q2^l0&Ca;U&XrjE4)*DZ zU}BKs!Fx1UmQCE=anNDn?0fgC+xv4C%JiBM1!m(ezeHDiFgN_wP>>m55WspY87a*B zGrefZ*WeDzIbh96&B}*2D(1jzhFQB>pzoSBK-C9Rm7y!G;WR?gj@QQtq7Gb6?!8rd z%?nYzC(ny;r}GjyZ18wu55Dda|JeA%GXFUEFmZLUm2=l3&Jrt{21if2)Tb9;SpjV|NX4=JMcZ7Tw<*+tNe2pA zKyX1{bk9f!#+Y#~@3n_Do|Za&c34Sx$tYsv*A5osUMCMBYNjYXa4V|q=SrM-1^Fc zQ|^J~OiBThrk_n}_IBi43GpzkIu-?KrhU$m#bshe{*OgzJlfb^foqbFiVCppKwgblmJamT4a#y6kN!{rhE zJV?COpc!OLupZWDu~)k+C_aUAxf})FJiTSi1=;+nd(zGsRdNy4T;7GXO(jVbJ{(SL zDOpO+N|wsmiz`LN(ZYgBo&RMD(#2jfRz3@wDk66)H@6;vy+meYvSp(efr%5ppHAb| z-1(l##KiT<%$>qa-Tr&_o0%W{iU+k(V!nTpZ#u@CosV25OKjP1i z=2~D_UYoOoasgLNkYbTOCILQzX%rR9_N1&%mB9MoX zmeI(|HzLiKm1C^1S<4c`7^*|M$HA;ffako{8-#^ev5Dj48b9n7B=i##M}Q5-<~M2RWx^=j3?q;ct+lA!3N@e)^0D=$SF&sDZ=n-=22oxOUV zdj4W3{)j2JG)ZRNwE|^5E7zIiEGJ!d&{T}j$JSkr%=Jg1{3>-ei40}j7nZ|CzCFL3 zJtW9!jEz)olhu7IWR$$#Ai=IhMNF@)&4~{vF<=WMLw&GRl>kZL5N0>y`1_~Ks>d}`DU75n%YQr@EsIlB5idCLi$bSE&y& zmJPztf`I^ES}Pk~<2nGlW80(eCM_yaUBrZ65?j*irnsl5BcoIov%Xw`4c+ zTFmDIQu`Q*NSnMGR;~&0s%Ogy(xInaM~nR+op|>7qgRG!KwRn8Sz4`q;2w*9PL0|c zx3Bkx4}%B84!a*oyPNoc(bXGkU+D^h(32knv$5IXqzuK8W$juTuaXpg1l51vS+q5S zVHf7$gg&ak>GM75|QnAzvkWeOG!<%WpC!-{#(FS)Z?AwilNw+Y@{LT!%SLM zfe!htn%6iscesLbS0;JCKj$vzdsV-tIT}Vvjk#Eao;hPzCC-q&Sh>RqOewV_lMaKY)4p$l%NxIXb}`~g zBpqCeiato$_62|BV{_~~CxcGzMfV0tne?xRopAIpSa@Kp5~pDLUH5xHhUwRtFWi&D z3ZeZ|8?N(QV`&tw2GN`%jzanA!A;AbwC3wB1au9_G?jpo(xGoidz{-$er%tAxJKbsFHI5qM__BB?qZ)C=x*DudT;P>RM;;qu0#LmXk zqv#JiEQ0j&Ntf*W`Q8a}wWl-JwPbLsGi#Mq!(*i9^2S63imF+%nh!om^MK(VsrX$q zCBrME$z8l}wEUQ)-OZwR$NlG(b5B>Lr;%v^x2%Luw}*?46Do#>RNfP1GhZ?B-D`^? zv#KhO8+1t62#;}=95=ey3yx1~t9rfs4p#UHMNRY$w&(7z49pwMMVhf(#bO36h|GWg zeA?3KL%NK;$-*kLEgL^CHccgVX%B+UGDN7KMPWrnWf z{igb}Wqhg2J~G$X$+9~kL2KI(Py6c~*z5H}sY6XM43et6W?6{+tZT44i$BNsi;{>Q zZ0OGzls#hPIBaOC`F#w97Nu!yilus&l<=;K1nFhXz^!at2K&_d{tIg4d=DGktJ~ki zSC79l`wZp|^R%tlC?Aiv4LAR>8Kp}5b(d#&-8lGTUSy}NS)9j^h<`U(8X6)E4 z)l2oN&m%F0KhA1bZsM}ZcemHUZnVgmb41vw=wVFy&gSTopKk8O%t{mfNxrR6dOD&e z{HxCKqsp+J6iV~YM_|nt3(`R>&==8LUo0G?3*_K+$VESMh^^S9))_XXNPsa{;x|eY z*1m zEQ2|A7`IYAr?Q-Z<@FFbB5gzDioM3Y8fB=|rA#VmiC_hk9Fs!H-{s-P3)# zmRG!u^%paZ7c+JbJ2hjFc5mMvZ|pTzJh2*FXm!SEJTx_0*<}cm`1$$@5I#=A?r5PZ zyVc8_N%K$KGjcKp9Ez;%{$9P|^M2%?ueVXj5+pR{0fB#J5yib6j$tYf%~_VFKV0@_ z!xfyCeg~GE`LJl78e%bf$RmYvZj~Xy2Lw_XgJabt_U2M^qD6<_H~nPTiyvPUBUdDh zp+xSz`c4{1&TT3XU%|sPsV$Lg!x*g5jilok^q}g~#fpiH>4n$V>j-=qf~vmEibIY! z&z8O+llBr;mPeEN9y@Gfdz&dOQDas!6%5{nl_;q+S4;AX)Imw}FVuiVMIh0{ir zy>)HqwYg`FcrWZB=)&gr-ESImQ+kX@oWiWiPpXgS(?v$AGS`<8U&>j=uQf**&Q(V! zZeEK~oB9Isbw3xQR&ud$bv!T`^zf@_fR=U>$*ZZwu5taWf#cduW_rZ2?s3Q0sU5w?Moc;S1Kx2jy`ORE{WnagMzwli^QUtP7r)m}f`>iI*A2b$ec zk+CHdQHiP6HfqerlV&^XLP_3;KZ}?C7(WH;wRsoIh*alff>riZi*h>IPF~E)$69vd zQc1{B#D@|F_HR5nuILPr=47jqoalb-8={n$!TM3Qscf2%-J+_|dwah{nG$Is9I2!i z)%P;+2WI!W5>mxIY40UL1?(3%N#Md*QDlp1odjTywZLkj zQg5MH(c>itfIy-UJbKv|Am1WG-*_ApBB2hT%51>Sc&O;ql>RBZcw5UZLji*>a$Pqv zb2)F+qLhdd#rq+w5C;`j$E}3o0~@U2_d=OvBr@5=5Mnd2sh{(#lT0}q-m~C()9IKsDTN+jN-CI5GgK?y>QY0jAzKm21PGqHt{xZ#>GwG(uxWW{X>nWh_&7*7D^4*`u znfrrOy$46Z%-U+{tEM?6kj?URxt7-z{;xIO3jsXRg`(3|8b9^7&7v$)WfZo~y?1kx zMI+9gHDiDNyxXXZ4XM#cabkvwqpoToL#^RyOIQ>D;Kyz|%_L`rmyaLCyLJml#w<{k z9{9K7C+4=i(jQe<+T9FQxhjOdD)LZX7`(ei(AV`8m~yNrTGZbw+C!%?4I&Z3OiyI{ z`Vu}WJtNQL%#5_FiPt#V;I!j`^WlBD01ZF;51UJWIXMM-gW9Z$#K>+EZPMvKbNzY; zW;%x6QTt;S+GGCq{@c|*fBc%7aePYgdAK&jyqWM_anAi^7wT$tdA74|nrk$1LdF&O z_*=-KJw84rz3A{*2>SxTnJ(TQe^Mh+olpoZ4Ml3K4E+t^magd)fSgomMwik0Q7f}s zA)U=ls#sI+8~#2Wmm3R*E@GZt-9!9fh?6?R1oHWauWI(({Igjbd|-q-CFTtD`?!3_ zr(e-rDs0^OS<54xd@L3%l&C!1C^qkUk1AlWA)1UT#Z>(IQE&BJ^4iwWzwBS`$!k$_ z653=e@${uHk!15|bMwkL^PsYbD#FvyE9PVDP%MU`L|eF2~X$cm0|7 z15%)qtgVEp?kWp;|KM@Of;kMca5c)^>Wy}XeqB6iTn)+IULR!v)y?I}s{`S6MKq;E z!?DMbJ?Y7gQqvJW>9qU8NdU2eWU3JZE)JxP1XsR_*9#S1@B1sEa2iQ?E^QSy3`uEM z*_dRjHw_E@!#XnZSu-EVt^E*bKWxjv+l(L6OMTLCmjHBMA|HJaj{E}`h!1N4`|LdDDB;CRxqSO!5TU)2dd=* z<1j08A<9SkfWt7Io`tS9A$B>c-Oq1!N!gN-$+XiyV<_U+ zz9Tm*Xs|&-oi&U+z5U#w9dJzAmtrv1S^6RQWb8|%xmjP zgf%9QU=b!iN9c9z^M}nP@4S=3YK4gKnFiyYohxxm$gD~(N_>KWUJ_#W$vb53u)XnP zJXS)SoicI3f)ZPLs4Da+k^P3X5Y(8odH+8AQ{mf3Lh01vT+E4{ymiDKbHa~ctXBly z&c(rXey}|RqxieuI&{e*yy)jD>Sp^t=~73h(L|B_73kqp?t;2=is7C z@S)u2b!~pBUK3?WDcu0F{~6w04igF*LgLMN_(q38oSNfQd6e$uL?ezHkDNPqfi_T2 ztU9izsnh>sVu}&~aYx|B&9M)U!@%JIg?_J<&+=sf3Jbm!E++2&Sa+nn)x&SrG8^Vc zF7QW4Y%J)T6rV9H*7u_wUQ$UabViWGkC$+-e9{{=Ei%SYnE>rYC+-kcK#Hg)4Y*kK zPqM|khG$D{_b&$Fy)j

J!PPnkCOUvZLRG0*IqBbl?F5c|{2`&XM@kG@dRMblE1 zzYfb+;5szSKp5A%;cIFS?r{%A+04)H+$sB1nPEo(&p@rg&Df_H*sZ@;pjADziSn{L z-BB9U7pOh(CfQ;Kee5+WD2st4j;0r$@!pP~hND_V^(RJPv=vV(%$=_zO;gS<+0QYDSV7CUdx)RmWbPqM#dGCSB%@OJh~}tdG{B#I7Bj3FATK|0 ze~+X!y4Er8JEcaeut5tcCPlq9-Kkpo8F_ z8WNQ}tTuJ-rk9j<#(}cMtP-Qo&5~O`EGhRE2ib)bfmDY2z)tVuH40l^ z&3+f>QFSzgp%*gVljumrky09>jw{VD!TCHc*LAOSsNE>6lx@e$y}DbeQR*bas$AL- zG>?4>Q-)aX=n)MR2^T*$1zBmEe5JlFj@MW&M#YA{jGHx8J48q9E}EI7<*}NPuri(_ zlA9P!WElZhW~rmM)+;PFRonl*k; zxa2)6<2I{r3I$s53m$LsP|FSYwPM=*=oN6kTSNqXw^W&w? zpF6^{93$Ajbp2tV{1QCj8N>SOt{0JNfmQWY%}2?}N&X#ftwTl0Q86NqD1+gktxHlQ zJVQ)bPS}b-J!}_bG}wN?E5g2;TzAz{#+3)58}>B-btxP$SYfgw21c#$HD#3eqP4t-eZb6OL!*o+9{tNgWB7p@qBBs$&M03-RSVXA*Sw%Skh)ll>jcF(P_c zS`oft<{5Ubpt%j@2B=-6r9#VV$)Neh=Llb)r+j~i@Wt!b5963F9i%X?HT*KI6!rFL!Vs0ebKYKmcxQnu`xWuYbzt-i4*`O+nVnlKzh}J{Kir`kDftX0*+I~kuy?SrmU)RL3u+UB zNCYg$R|#Xbqgnvye})X#GO{cr!bnPjl@vy~ry?_>d3hCbW!`&rw4ccwjpk^DnF;EE zVctIaZoP9_&Ah*B7jnE8T4lALnLDX5eE0ALI%n5EOM?SSnj=adiyg<=>@TlxI`rRn z9o=1uj9(upYmVYV3Iqj3^U5EOgbetTM8AxqXS<3$y!G)j^<_fciuSkq)pURUAnWAC zElT^TSlgC#iVojelZ40BVzJcw#VEF={|$jsdRCru2K)8flej@a7PoFE6a~xo=OWdh zz(ghL4EmUSh1aeKw$VyGR8cU*R#7INCN+9@F vm)e=)SKd6uml1T@Z8EC~RfhgkV9$wf?H6yL!!_YGb1bzykjY?zIWOpGhl0EJhd#7*A(cb335~qmy*EUNoLpp~Ty1#MzBZPIN_HX3+TU`zS)YQ>sT=0eISJRE#Pu!*3Q2I5PD0HAtCHibj}pZJ?> z0*6i=7aG}SxOitYWk4QQ3#lG@O@0Q8p+?t!YtVS(VWyjErT0JLKU0T3^^ahi5)npO3jNA-n>I-bl74`>SCNd2{=I-k`H zuaPF75lGunC)LrQ(PJgeYUSE*9k~EPEeW`aX6yBGEQIwX`gQ zWw`jTwd&yi6w&?~I4uCU)4p+~eWO7uqX8xUq6b!^`GEy+;4!cP{= z_!^iRQ00XJ*cmY2-;s&evO?ouWB?$Z2V+tg>kALozw)%oaIC6uJQHyL%KvX};?q3h z=fcqVuSTF9oeJZeO5^-1&pH9eGX*EC4qZL|*Wv%(*B5AC(m0dC|E(`*N5WJ8Z_Mj| zJ=p)hf&Z@~fDPU1zC$llYCMu!8X)2Y@Jd%hX*FnN@6C@jzjrB zSkOWR5;IhhfIL(%$rC~IA5kJykY|T211^LLY)Ss>8G@FW;GvGhmia{A&8-|kBaKsx z@}FA&or12+MDL&*I7dGEe~pPh(h3FuZ}O)?eS+9cT>=2mO{I$j08_mTM(9HSzYG7f zLtG#N7I?=9?Qo!m^*gjj+M!w?6=6~sTnq!94YV-h^XR@vXqvl#p$k7Opbh|teKoAg zFJux6?J^i5Y2{~xRq^aHcD!@!zMcy|Py4fN2DXekkMgHtI|ws}G6)~)uY7-oJ-GPW zParg`0v?cr1;`@J^)j}-a~L9v%QF6HMP`aeSra6mSnQnxb(ZWhiXpYE%ICt*Ta*?E z6#6eV1hNn9NEHuS8Z_teqBr{!#1^_Gu!a=W4HQPZ2fC>u$bI3k#+A1`KcoyRV3^*E* zoI6=b3Y^+vDfBl|h4F#yDq@ut?7cwrvP?S6k^^aZv zfYx8M3kJ90UrPLiTLT6_kF|J)8;Vpa?O$y%W)#!Q|DyoN(7*9afvWKtdI<9ZKGZKz z27!!fS^r|W-^%d}8x)p*Kx<`xYw(Pk6>(!FR3lK#3>Q4CmQn**+o}$iYXRUC9tp^U zCDnez&qRX8%413QykCkF1;;~Oaw}{}RO*mq4P@w3@!!lJ7m$ORe00tHvqLp6ZUarA z6nOM+_CJZnv-CgN|3?%X)H(a>q5Zc60k{M412Sy(%I0;_9RW55-v@fqAvT$H#t0%IE?n5@Qe9Kn6 zY>&~8{L+AxZBE~Tqn~KaAgZV_BZ^b>W?6%kbKVdDyn^8X>7W?y3fgS^SVTgST3i5% z8x=OxNT4f$={&iw1D@=Z-G$f(3g(~WAIl4lqhx^P!&W9>bfhiPPttc5fWu_ur z1r)jvTn#3sB0L3TYN!y((^5dm55a{R=QH-u1{9c}+9l(MI>$s348$M;vjP-CihouW zOQ_HDIaz~=O(uw@h^UZAQ5N4#O+T{K6ICqGbA}li)$NC5?yki%tMI@ zku8NtvY)7M(N!_u4HLR5N&sMRJOIGKBX9%V-+>=)*zU0KZ%6?!m9%w)bg$&Q_i8BE zIGQlx=0TF|fR?Udp^>3@8VvjH&nh@-cxq$`R?IvwJXzMe-WSgAzhbCNGBJBlLED9T ziohv!fQA4L&eW)xrS02y?(aWWDVF`E5N7K{pn1=J zL+Hrg;g++7tAcv$Nul-9VA{W8CGN@pLg&NzLVz>x!P#$5QY;h?yH}t_47Jh64^{3& zBoOn7(RS`Er;o00rL1Y#a7`yntIHj+K%n@gwLHdQEiq+~*u=~t->;nOduySc&6_N1 zV0Xv6(QTag!K$Q=WIX!FLwpz>*exMF3?#ETzL!>~rIrWJz94jvwC*w?UFNs{y}FVL z|M5QfDStp)^ylN_!;e-^C88IPf&|J$sBa&_{`l3O+#~S;>D`qzieEn=#KUy%vASd8 z<%Jg~jlk;<6QU86Qv1}6pVliT>)DbGgJfKB#Lt4zUzIq4?t0VeuEoycnr2_#=L&0! z1-$3G8FWVS;O5KL7gsxeQqpaGy0&f?ypLOB0~sA-Al$}FS#{=;x><_W-sADAoCU)8 z-$Z;6p{d8{m0xeR~^mQ`6t3`qo7YQ~+SkY$1wRx*LgB;AK zSZ*c;#MPA*-Kf24#}!0Cs1d7*JOc)ij9Lr$;DOC;YM%e$~O-JwnYDvM21~h>y3dt{<6RqJNrtcdKNMZboGm7C!d_ zskt-XbTRvQR!K7DJ8rEZ?PqI0y21N}gEg-BiQehfu&Zky;e@f0GXLv!iVZOz9x+4b zt0vKTqLsCkEGLWK?Grog%U3^F`~CS%jGcvq6<(Na1p)bc?&^P?7Tv3zgera}RF=^)Rj} z4HB%3-*i){39FV$=GLwUy)uu(1jd)hdsV&}d2q;oCqn^(af-1gD9;SqeuXAoasByo z?bkryi9U!d-W_(JA0iqNK@(~6(SOvZoy8b0^avRqAp_{#Q#wP=po&JYk1*sS%?V;e z95NTjNXoRxJf4{0cB7qF1A(F?@mc4q_XuxRgjQ86s;aNelax}?HuzT^3Z823-EHdl z#ZEC(t)1pZZf8E6-%=#gVbsvas)BqKjVxQ_BRjF@~8vM%T3Nd~UsL9+1kiKd4nroNF7| z+lwVI%lm;HXQqZlB|KAS+M@s2ugSmmv7pVizrOj9<*RXsm1O!9AtzB1@~nvKw127g zsEgw0FuQ)Sa#Tx65;GFqJMy@f4Dh`18@uJGugRL*P>B%0s$f#%y^B-yalo2{tKemJ z@H;gy$=C3q&7|=YaHCCXv~Fw*qL#Ld!0tB@zBjiA$9`?Dk3>c~3vfsloLiSghwKwi zPZON;4*^xVgDW4-YHm0de*4pR%+4!q%f;M(xcV74@X($qssri-c*9vyd$q2(m{66s zeFu#|-U@xh9ZLHOa_XAGlIVC@LTI3CrRyHPJ2xUq2fFxaNj&yoAt{XX$ntWucn4}_ zmFZ=ZR&N&Bh#}ITB5$wLgy2u%wjSOZ%XJAb&vx~j%^ zR5z|o&I7#f1$SDm9zW4mUz}`?yLWZ058Sv0-YjkKf4m9cv^|gBmIlBaetrMDVXNw)d7Xa)Vvt&#WIv#i>+__l^Wk7?cY7kYqS=qfDNgKjo2C~c zU%2MEXNJ)eiM4Nk$JLUFsMx$G`++e5{A*NZ?BjBqkR@cs|BhXEN8w+YiY7>f|Do=%stWN`*fmMIdGvu_}E zRf&1yujtaUi>84vAW)*de=y8jb)k&Z_JrdEj0Ofm=cp!(4_|gnrF4;OmvA(GN?2eO z%#x;)g%LQ35xsNhGAKfZFrL&f8(IOP`&k|scvMnJDmH|?(!rnWiiVcxl2kJANASxc zsWMrvMIyZeOfKK)G~NIBa&miB@+Px)CU~=VVf7{r$trKc@ZrbQgNuRE#<$`}o>sz= zji*Jo&Z4e>Rdw#wD#4=$U9mBy5t;3RP78A^qvQpMDnfV8X3Cb@zDI3~Aw9oK^A&c)qBdw`4^2Dj4B#R5|JgD8nUOFSP z&-9y)@6u^U&PW}UCXqYOU`*C&6FDD~6Hr)`vyP*nl#cQa0XSzwZsw343OB+**d%pXHS|<69Tb%Huxc*P|z#6EzbD=A$(c z3vT08b^*}{sjaSNjK)L(a{1Ur4dX55@&r^b^^grS&wl)PA(vt~%q3%RCn*tW36Q?c z_94MSkj7#B@)6!qrd2(G z;R=#RP2-g*wTE8y6Ma4NcT9Dnrc~&w!g>yR6t9^>AQv=q@C~sjg^d@^YgJ0xlE)3 zHs>7UjsEKB4pESEZsG$Qg62e6<30#Q>0eU@XudLv}=E1={dw7oJWwgpO@*1HElDxlC>ugqa z>MFlk;~e|pY52AERI=lY1N@qHq;J%uR~+dgdHbEUgX7uYsAm+Y(tdUCgmpmRmidk4 zoQ1eqT#Il(G%JW{hmpkD85?9ggb@U*7QvO|k!l&f_T zRDP3W3FG`Ja8g$yzCT}rhw6^Wx~Exh(+VF}ux!O;t}scq2uxNwtr+jQb4w=%)3o&R zPD5wdCO3WBw>uQsK-@hIw@;$wF{ehv##ZGW`|nZisgS|ig+NlG#$LV6n;~wI1Q**s za1_kh^{ONov+_*#lDScQoCRte--qE6u45=Yt8#azIe|}z5CQmii&+eC)km^x-noO+i#+_7qIo~^cNs`+&T=NzkgH7)m zb0b`AbH$9WCQ_0Hv5_N<_Y6u^NQQomu&cscocqMAeZy;P`l2MVQEy4_yu2S)_Q;N1-!xRo^0pCeEDYCf5bybH|JicXNyq-XE za!~KvWSzX4XIRj2&ntTDZmVFz9{09bTsr}%V18N_Au`mYQ1_-u0#oLerph@=5zVdp!!)~?xiDNlSW%)HuVCZ&SqHU&xyH_+GX|_tgNBakw@u;KS&!v10qxr7b{~RrqY{1j@BOk)@ZMpA2-V#y?q51S z9NzD_lD$X=I0p%uw?3vWG9~SK0se-)cFT#yBKHQTv;4E1T*?My?owKm8@;;kge{VB(^hM z`hLGS4B<7_klRWtP%r7x(*hGUno<&{Tx*)Oi9`jLI+)B##{lI0m>jYkVua0tUkFoO zT4$iV+W)`{BHz@43zEz@DDT1Af&T~#*60_tlCmo z$;X!BDJikXLAS0HRlmS@+S%NW*QQn^O%?Wjxdq!Z4=$@C7$RU(aX1uyU#{#0N7B)y z!UZ+IDP(#sHuW!Xe)!aqnf1Y(S56ZKF%BJU{vw25jhT+vF>=ZFAE_oQJrJ)y_BdC4 zYZ#dF#OCOd0H?_Dyxs}=!1o6-9G^Vb`I1Kx2C{vc8GZnVuBcr{$Eq&EFL=D+ z+o4NSNPovRqkZMg#IFKR*jyxcInP>d12UlPs9t!hpO1;BgEh?Fq98bQ49D{gL#sIw zBjVsUK?8|FfY5A0`>QUy03ScGf{pc8Ha_+Q5_B&R6hP7w&9bL-z5*X6HmqQ1)m8A{ zrj`T5rA_`zqWerRRjRTIZ`qbh5Y0bvRLEjN@7>F8A9J9$cx-CWt{NT)fgC zp&NWN0-&qn%F>r=a9UFUUm^mH;aA1XD|;R%g$e_*_e7tr?|5zT9sG3_k~9jit%VXV z5ot9u(|Z-?#jWG^utdqz3~}%V7m9=iJpxkLYawR^Exx?gBYuxn(a?WhWa2SPCKeSBxd znRNU|^=N{<8atuF;r{*@pC`ToZwZTOqeLkN4_=XqEeTTYw9@+g;bY9D3q<4&9W+W0$dE2otDk@e=89!?PljGzaY0W*VC4_Z`c|zvM=Du z!o&y2R*>JzC9w~*&74zqU7znNN7LIl5N+L^G{wDWVOeeMY;CevA@WASXJ3m5AzM@C zZSYCCfnlC!mbLpYUJIuyUJ<-ls~=9+x>UV{Zn$nX;}h&UDo5Nq z&rTl6%5z_x+te8w9tSKLq`z&8xZK#mt2xm}@2)U9)41S3pe@`klG3AK6eOI8p0=VA zWn??$LndvnXOklLjougA`K2WFyE(95`P#g+?;?>%7NV(aRW&jdD9&dQA}fe3Dj*I0 z1&uM5Hr-&r_uKxnt#9{w_mpq?|NY}^um7dEMggIQg zUV3L@uCwzh*0^fFO!)q>0ry1cNd-;TiLzK7SWnO84IX>j$^x8!s9WnTZZ(7U9qdc)V zzqv`l&;VcNFjsulhjaR*lLxkyulab&gBRI6HaXKgnc$oNok}h^f=DX9R_8lz%@}R8 z{5x^sJ-`t+=ayAG++Gb}&o<7SM5ATpvbi{15^6LDfhyjYv)w12qBNN>99x@AXTSR$ zH8-^ojlR=%9NF$^YV&YDur+<<+|+gEd4K)r*SFGZ{?6a;y0L1+F_)ybLQykT&!o8N z09^(y&D3fpI<4e`m`MDX+IQVsheQ6laYvEp$7Xa|4tw+j1{XPPxJvy~WPRTBi-i$7 zkZ+EG=eDq=VY4zmrg}|M#r!%>kF%i&y?!JYOH`|^$-Ahw-&U0RU3TrFY1%0YcSFLQ zR`%mEuV0&^yEW$>!AU)4G}<5k=~<|)$Egck(ctfXn}@TBJk}GnfRgWK6WSSsAx?<> z{k1X-)W4n`sJGMr__EiA)L>BQn-e-NR+mWA;gA-YbwJdit9$n5C%%yEi<0dPhk!b< zRc&3NCytDT0AlA8WM4AE>a@nb%6Ip!dK3?5Cjw9InN62>W^q48miz={(vw@$Zt4p( zlj{!NXCEFNz_qAq;JvK0pM?^Wx~-v|j}AyTX;Ri=+9ecR98WV9YN%7^ z?3Ri5hp_;b8TLJsk%%QIZ#DF&yrj+~#slH#rQo>d`6yO@k>10;;}2`0z@P*=Z&|;< zJ92v@t}}TTRG;v#px_ zz-52Ovf01qX0?6CWYdgu*qqa(yz^0g$JO}#r~93Cw+D_4fziuBBR+Rw#}_OoMgymi zqz}%g?j?7D$@3w~o^gCd#!68F)%5HA<1+5{ddWVC9@x!{RPK-cs*>w0A05OkxjucN z;)8ypfr{mOS_x3M8}VrL~pEB@?PD?--~?sWJG?5`j2MrJo%sZKx6 zeGBDg6Gv-C$T=bU|~CZo$@VymCa;^b&dYhw4%)BffYTqd2VHrY0(Z zaE~0!ueeWd?k!lltj{*FC^{mV0xWg8h8fMPYFP{ILFtA5xh${AJz9Dzjt0L^4||QJ zGmHednp6hpZdqK8P`ZjZR>zqTN{<+##lop9oOXz&)nCVq!RI#1HbVphtrE?odE95Y z%2KrI`@(G<)UsSKX~(|hnT3?0gZSC2L7NM8VbTT5C7@G9eusQhbu?^=Aa4bgUx*d} z>{nzoT8&AqOKl8d!TBD`#|_70mLBDHY+4%U_38&2-)yGuhe1HCk&`*6wPQG4OzbbV z1|t#}aRc%MT9C(_Hd8%6E|8R&A|Zi$BbZFcE(1e5l~)>(RO-0riv>tWG>8E*>PBkS zm?|c9$`euuQa(5fDROZN298qA($Xl!6f^*>dK=dV>7%cwzk3g42&J`<)sUL#?vXh) zvYNScglTwe*S)ZvAx2@vfhu@p%F4vX5SZ0PbtN)dxHpjbLqD5ySVNY*7C9F4Xx5(x zg^(6~5A@hi%ET`L;gx6~N!Pirp$*28(sSowO!tGd7boIvbFPWbyz2NiE{;ukq?%$0 zLej9PWJY7{9i_`(KVAUX)Ku_QG!kZMUN<~1hqrR5DyY8%9LOW9HK{p$F_j&bkza;fwUBq!`n`y4r z$iizlrM`^9k>wHZ@woGVMeLGP{{}t}5o;1Q>Bo001u!m+M9;kV&DFexKcA6X&Dm*i z)7*g9*}`Jd1kJgt4CdJJl47x|UKNB!%llK$Q+%Yiz(T_{QMSIzr>(7r^(*X_JrgYN zuf?m;#>6qJH($4Su+k{8HoO`-d~Y*cMKgV|(squTXV{djE2Ul4X(!PN4{l7t5N$1; zQNn976hW4n-Fdna5t2m27f`P|GUEi_+=F$wYjH%onTFxdDTJ>~g%Y%kQc)yrP$y|0Iwt*hMviJbH-Azj^BciR6p^gE~SzAGVjYb!1+yua)q z$E{)Q_L>{HIW^9K6_skGGSI^Wt>*^XIDq1t`P z%RHEh9d7R1WK=ISH`B@_=Hv38iOj;td|&i25%pN5~Q@xhdr2 zP%ev&xynFB?Fb|l$Bt6q+II|o-6}jH{+XoKTt8M~aT{1*$Td8Yg~uPAoblQ`zs_8W z$K)oNgAw>rdspBT0>a+$$7H#O8tR$!t0ly@-UDl57fZcz5meZ)MhT17M?NyP`9rWW zw;s$q539A)@?odrIsog^pk|K)1aWV5|6$=HMa!FLnmm-_j?V#Ci!M{X7Dji|Y|EYH z`cFfh;f#C5(|EL?vq93TA3}HK0Ydw4%~ZZgni3^Cmz`{=XtS~@TUH=rQN#xw%%gqi zTsK6fU3w9bs#qK@c~1ExCgfuEI!qyGFSFHGOdVW6Re+yuO>F-Xo4-(1S# z%AVXMUL^t9ipA)*7-XPy?Foh+3qkY>Q&e?@vH4ruTE|8)=GffV%VMJm^-V74bDa`q z$0FP!njX-cuRKDt$Az<}#*MToDmSM&dd{{l|K-$?@UWUiA z-&m*6%@}`l7oFev9D&ChVMX5ip=%cB>7DF&)CRT9zbuwfT#t(U5vjt(pJ1zt(@(dr+mkP^O0x#odj zabR!({(`-W2UAMXFGUF0U%AvNDEW*Z;m!rFAw`rbQK}*Z5(=r6I+r`IrQGtR-B*xf74f6) z@zs>z<`?;K#fAU!p7Nc=MFK7~@Dp?})P0!y{J^$U>0KTGVY+8k$M0^O+wi)@j;Qq! z`)O-rI`45#~9bY-z%sg8F%qsE^b`M&`YG@qIP2Mq^U3K{=B!~WJi?wz%@`n zW)3Vdhq;iSssXdBa3>f?vTJFP?Rr~-CWI-=+p9(3CPW6G9WW4V<@NH8hlggSCIbGq zghH}p54ay5^X^MGG0DCyuSGlzoC@j}>{toJKv_NX%QJVa6C3SDPnKBb`2Fu&5;Cx< zQ-axa#H0u#ii~goyrrE(ajlF|$e3c=OQ6QQ1MP5@aAics4;k2P?31xjGdJ9^yF$Us z9#}%^CHDQaK()=xOB0mzhA{^?A&z~m()Ytv}zNl20Nw{wc$ev zhT(GaJgLwe^6|&AsoJ?F3A0m(ud97KpIgytBCsL@+{dmh}Zmoo#MNtOM z_lh@$kD&u_eofyxVqaIArA^31$W176bQ(>mn%PYQSa4{Y{`F9N+w<&#~ z=g!Qw$yqM5D93@>Ef-Hr9_5w^%eLz1?RrWJNm`4aKDi9e(m6mDX9FK`G)j?rZ8o;r zSFY>?$No0SgnRTvt(}1RvY~;X)}76Jd`}s3FSU%a87+S`)o<$4A9v}C=85$L7&8@R z$@em%le03EM9giHEj0W?*Et)wpfU}FYkNU)`FeV7ZD!!`ur)!8-IL~X z3u#jI6*$jP30&n8DUlDNvJ+|u*YKs~nG3S??lPi;y___@{X+`!>71p$oT1nlO&KZ}zY++VUpFX4&i^jD6*|^jnxJ(F`W7$OAFu9KFvbfIHJSgoJ5OAA42)KXeg}ZMq!nmUFi?^73I@KXYD& zj_cp-OGa4E z0SE7-kx0pbf#b%OVO;x;v?GhZ%=F@oGxt(p7PutYUDiJUg{k2)u{q?G{AAivs{aH z71E6O8t%PQFsqm8U_J2GV=e_#v|TQ-Q@y(nP256pG07#u3CsYj3tVB7{&b{r(v~ja@WASnwN!C}rIpgL7 zjxxuaS3AZubN4+No3Ir!=h?)X_$Das4|3YJmvWC^Cfr+zhhwyu>A>)Q(=0h3W%(57 zqU;acOo@HdEa7#jji#UuV)yfAehDrLNS7S4UF2>unYJW7O!V` z*kLu@zy>j0nTCP; z)-fhxY!Wd0UiU+VSVxfUICozgC6|Ifh@HXEWGn$Uf%j(DQpLlwL;2x)ef(+JgKd^J z7qKsxgx=_31x9Jyn2D}oC`-y zBV8#P>+ktXXFP!?!0KoHBH0AjT2mmzl`i4)uwyLM#ZPpexcP?edKr)1LCXg5%5EEk zUBey!V92Zt#Bm4ft6GmZKHx79Lxn&BWEirGT%fSgV>pcKnvwo=j#D)sA7_>K z3eu`bB#C_6H~oq*;6C>cA41jFBt5gHrh}*7*D)>S9tJ%DIeQPIVIn4r}EORNbC5|bl44scom(}WiXptAYzY62T`NM0B z1w@}3YT|&F#-<3pFL}C>{8X@7lWB+z$5cE%>{X}LIo25qy>)P4wDqy6z8Pd7hzBgc z6j|}Ws#~S+XU8L2A^tjQ>CwSx@d-TIXR5!GpXdXF@*|(Q z)WQo^xWX2IOC=-i86fVRg1~<7JyazH9+xVL;W14Ei_^!D6}6P;S74PV*hQGNNZddm zW%zzaO;SDYg@M_!>j!GKxd6_w^Uq`$?ROo$j@cV`d$!&mvy?B(#LN^bP5hb4vdf!X z#B#43HyWeRNCxK>=voZ?*W2Sb#qFKz#+NKUO<;vy?vro@DlxeE;$dZ<5$h3?Q=C1F5=F>7 z*`ZcgdnL10K7?eluy9#|zHFCHlfhQ*Ber{J<2t`>`@Y`4B$O`PmbLmvtr}|Lc^|~C zXzIw;9L}&&LKfJDMF-TdfzG9hZkcZu*a)RKl^;lcX+BIc!p%hcp+*nOKc=$$s{`J{vFw=G_- zE`E!UiuHqjs@T{1tXe~f55~RBK2cgl5P6*$R8qe0I=ztBp5RzMBxinPad+oN2gg@F zvq+@6bp2f0FhHBzi`Qhk(g@;!*()OGtB)nt&obIIC_y;9G}&X!_NTBK-;6A{N=kz> zvh}#^*qI8M%K%gs-(F|i`)aq4U+W(=%4Sl`&j%nnV!BVx4%D`=bAgaiuk1wU z`^1YS_dpJpazR#M{V3i(;beUF+R_FyO!JE8<6#+p_0AQqA={lAzdz|A?WVT>N7_HH zKB`s3y{+2G;c+In=LN-t%u5w{rUA8H|RjQvHj_;8Sz z2q{s}_^Em0e2LC&3BwBb4^`yB;{qgHY4T0q5i-zuqhIUs%bO*S;?ixi4nWL9lg(q^ z9$lA*L)e9q?uGrX_I^|nnslw52RywSti4e0s=m}&DG6WrJ!$Cs{^^=;fM_#If5RA} z|74_d@ft5ZbK=@9SM(@%)l2U%dJm#79IQPx&d_pBuC7xYb@APhcs5F#mK?{LSV!(;J)K!uoUJlFzGv@xmE6O+&U;hib}24*TroVV9$N82<$6#l#r#n% z+TKFVC&-i(hlUik2Z ztMZNQg0Tai$JLGVh1;qm9+D>u=9}L=rgAFFJ>3lhPQ_iqV%kCrJOyM4Cy$?pT2^&H zQZs%0XgXO+syPeI_WSw^lom}}j-z9%XXU8wuFE@R%M%pi*9y#|EvqBa#3tlpa0Q>= z#bn31+rN&9b8ZWtX`723o%2=5$DE8ZDw%XA^Y$ppLMcLs2f9n6@yd*_j&9L5vd5XQPgpKrV2h=!TM@^2`ad!EFUa_~oiMnU)~MeZk;+rRbC#|&nAT*?0! zCSE#Il!HvJSnfPUZ+pV0D$hH~jSZt2!uxtQa<3sxHSdYysyD9Vj%srso8#QX+yY2$ z=iWRnbU%@WtPZSS9lX6dFM;a|u-8wb{W;1F^&k5Flz04&@7LK=nq>Gm{YuiD#4{hUrC(RN99g#d!X5_ z5>~Y3ZGB&#h8&esMoX4n%B5PnNqPzds56!(tYRlOwf{IDRZc-rp!0?jtn2oXA zcLE*9+_g<~qRQ_2XKD%_-p-6;Ep*J@32z0D-MoH!Ptl=Yp2fs_yxHCvb6*oz zvpZ2Y@Utvzr)XomY>)(W`QUHklJms9^zyaioUCR7i>qBg2Lwk7kA0Nd8E5cQdESPJ z$`05tfhA(EtU~x{fW$}8C}9GmrA6Q}oBv6pAIEK!bAZh4YG>+1S)ZxY3bbi8^D_qy z(08$f0n?Q)r6^tWgrMzhx|BM)qKVfA5D0w<4Yk^XQyo>vG$ literal 0 HcmV?d00001 diff --git a/modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/inject.ogg b/modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/inject.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5f44880131600d3f9cd2f70bd19312dbf9b9e09d GIT binary patch literal 53307 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

n6os6}K4fK!4d zW*5mUoVdpEO>dK{SY87M>sYx|n(A4J3qxefT1-N8UO06@TRr3BkW-ljSoscG6w$pYY;m9Eg*)3U#`Y(rC>wB2|KB)3(mt~wah2;!BT-=6Q3sK_m0&Fx#Y zk^SkqJ-Gk+^u#T7+1_gX8Z)lO18$)aEP{nqfaH=CEhIuhR43G1y)LT;R@yo3R?$Cs zyMJx)hgz+NE+PUG18?025bbIKQsRF#rfE%eycWxzS`f-9D z&u32CcJMMTuB)CZM|pqIEk&*={Ys-@LI{p`da+(X1nAN(*DgSR0YDLY0@YR#R8)5| z6~O}lzGWOB+FcmvDxIQNEv;d{j5)r2n}M!L(Ic&4ukd#veA~XL*@7Ni92Fp0%mXZo zIm_jotBL^t3d5`QM+fJFP9@)1ed%qIxAfJzFU#T7-~9F@wpyBBO26O#x6k?yYoD&I z>p|y2ARGvasG-#s0$>y+MCMTDP(}&*b8Tj)Ig`L#>*2u5kgZssidSRfgo2a zSB6N-QXS3NwV|&_OD3DpQ=<4_1!#9ZOgFf&+Lyu5AB`oH+4CUx{xUz;(DA`uhY~UM zHL)?Hf|3ASJXX*_P3#AHZ(a2F^{I8)cLxACC9?#Rp#jXXTvagw-p6}%en?gKEqRCQ z*?9t+_QDve&5nO_y+0N@vS&PdJ^9n}-qGsPs;))CYF8rN(j#~H&&{eEG6k1_84PSNFp8pnd?OENQ z-R}Pw#EF;MixiO95CFtHZ>zM;c~L7(@4RxAd-pYvqBsD@q*Z0t&vkX%u2Rb;Go2>O z6+!Is_3rNL*RRjr-I}CH(jz7=L0k-kXac-C-zXH^I&vZ61xPKW0{|1Cwa>fui7Oko z!hy;`SQCg9TPiA@o@tv>35iXRcqG7cAnyMdX}V^ z4?^?ecZ}2QD?kXD0eEY8?$}p47H#URgS(VUtU%`k(A6lPqaVT0o}77@zzKc; zzyQn&fPD#0ZZYdVabhjLNM?t9h_wV#i14dZ!(`jKu2-uLygFP0Olm+1B zWK388WsH&$?8+d}I&v^)=QHm-jUtT2M)Vr2JSjC!8uNrTkFM=kLQp6GS91Q^9e8=V z65#+)5(CHk8bYe}m7`)N%l*APJpjBsXdA%J14kgxy z;@J|ZrW5XsSIyO-Fxh*R$}I!S#{kSc&!87OFDbp)u6Uw-3Ml}V-^T0j>+j~yY*W>f zgeJO7;!rU$PMCN+kw6N>`IX|Rz79@VkN!dd)IMYpyZaDC?46&s^Rd~P7H9@w>l%9B zbyv+*w5Sw_pzTrtqcA36Tvw+}H|5MBwUQuK?sc1QAp75Jk)f$eE-C0JmsS zE0eFhcp2?UKfRr{-!JK_Zd3URJ!wnZ{U8!rX&TjS`9L8q&`FOT0NgszMKQOIYcP=A z-7aXDq6|QH%|yv%6Q>quez5qbgQCZv|_FazoulAJhe=S zGmn;_c)Z9zzW#b33MmD^Urx_6B`hhv)#_sP0@7;GASq;2w&1^uKVx4Yq5{0W^vuw; zkHKbwo0ILIRxmtp0N5$byB}#&SGBn9X7xNYz1_CkRJByr6UVPgRkc@bwQXE2<08(-TQXY1zs;PU) z@$qn+wEzI_8jkd|a8|C|%2nkY0FO%C>700_wGw%GJ<}#=VQ+8XXw=hmSh*{~=y7}TpJ0YGS*a5Z2X6o%k1 zT+>h9+nbKXD3E|ab{Nu0lPXmp0i|tmt`>lμ?jo63>DYIH19;9Fr&Pl^6;`R{9N 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 literal 0 HcmV?d00001 diff --git a/modular_stonehedge/licensed-death-rattler/LICENSE.md b/modular_stonehedge/licensed-death-rattler/LICENSE.md index 1c315580282..de4cd6f47c9 100644 --- a/modular_stonehedge/licensed-death-rattler/LICENSE.md +++ b/modular_stonehedge/licensed-death-rattler/LICENSE.md @@ -1,29 +1,12 @@ # LICENSE -/* + Copyright (C) 2024 [Moribund/Luctus-Comptus] This file is part of Death-Rattler. - Death-Rattler is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License (GPL) as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Death-Rattler is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License (GPL) for more details. - - You should have received a copy of the GNU General Public License (GPL) along with Death-Rattler. If not, see http://www.gnu.org/licenses/. Additional Terms: - a) You may not use this file in another repository without explicit - written permission from the copyright holder. - b) Modification of this file is prohibited without explicit written - permission from the copyright holder. - c) This file may not be copied, duplicated, or redistributed without - explicit written permission from the copyright holder. - d) This file must include this copyright notice and license information - in any copies or substantial portions of the file. -*/ \ No newline at end of file + a) You may not use this file in another repository as the same name. + b) credit must be given to creator. + c) This file may not be copied, duplicated, or redistributed under the same .dm name. diff --git a/roguetown.dme b/roguetown.dme index 6e615767a06..8516e21cdcb 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -3752,4 +3752,5 @@ #include "modular_stonehedge\code\lewdai\lewdai.dm" #include "modular_stonehedge\code\modules\datums\accents.dm" #include "modular_stonehedge\code\modules\mob\living\overhead_effects.dm" +#include "modular_stonehedge\licensed-death-rattler\Death-Rattler\code\Death-Rattler.dm" // END_INCLUDE From b4dfe1ca06aafb93da0b2fb8b1e512c732af5856 Mon Sep 17 00:00:00 2001 From: Sutures <101909198+noelle-lavenza@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:24:11 -0500 Subject: [PATCH 038/192] Apply code review changes to smoker code (#112) * Remove outdated smoker code * Apply changes from code review * Fix snakebite and nourish sometimes being unreasonably cheap --- .../reagents/reagent_containers/hypospray.dm | 2 +- .../roguetown/roguemachine/drugmachine.dm | 8 +- modular/Smoker/code/Smoker.dm | 149 ------------------ modular/Smoker/icon/smokable.dmi | Bin 3341 -> 0 bytes modular/Smoker/sound/capoff.ogg | Bin 52532 -> 0 bytes modular/Smoker/sound/chug.ogg | Bin 17853 -> 0 bytes modular/Smoker/sound/corkpop.ogg | Bin 17032 -> 0 bytes modular/Smoker/sound/inject.ogg | Bin 53307 -> 0 bytes .../Death-Rattler/code/Death-Rattler.dm | 72 +++------ .../licensed-death-rattler/LICENSE.md | 24 ++- roguetown.dme | 1 - 11 files changed, 48 insertions(+), 208 deletions(-) delete mode 100644 modular/Smoker/code/Smoker.dm delete mode 100644 modular/Smoker/icon/smokable.dmi delete mode 100644 modular/Smoker/sound/capoff.ogg delete mode 100644 modular/Smoker/sound/chug.ogg delete mode 100644 modular/Smoker/sound/corkpop.ogg delete mode 100644 modular/Smoker/sound/inject.ogg diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index dee15f58d4b..ba94b78679c 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -1,5 +1,5 @@ -/obj/item/reagent_containers/hypospray ////// I absolutely hate this stupid retarded shit why the fuck is TG garbage even in this stupid fucking indian built codebase. fuck you seth. fuck you. +/obj/item/reagent_containers/hypospray name = "hypospray" desc = "" icon = 'icons/roguetown/items/surgery.dmi' diff --git a/code/modules/roguetown/roguemachine/drugmachine.dm b/code/modules/roguetown/roguemachine/drugmachine.dm index 5b8a3ba1674..48384400114 100644 --- a/code/modules/roguetown/roguemachine/drugmachine.dm +++ b/code/modules/roguetown/roguemachine/drugmachine.dm @@ -229,16 +229,16 @@ held_items[/obj/item/reagent_containers/powder/ozium] = list("PRICE" = rand(6,15),"NAME" = "ozium") held_items[/obj/item/reagent_containers/powder/moondust] = list("PRICE" = rand(35,55),"NAME" = "moondust") held_items[/obj/item/clothing/mask/cigarette/rollie/cannabis] = list("PRICE" = rand(12,18),"NAME" = "swampweed zig") - held_items[/obj/item/storage/fancy/shhig] = list("PRICE" = rand(15,25),"NAME" = "box of ssssigs") + held_items[/obj/item/storage/fancy/shhig] = list("PRICE" = rand(15,25),"NAME" = "box of Shhig Brand Zigs") held_items[/obj/item/storage/box/matches] = list("PRICE" = rand(10,15),"NAME" = "tinderbox") held_items[/obj/item/reagent_containers/hypospray/medipen/sty/detox] = list("PRICE" = rand(15,20),"NAME" = "DETOX") - held_items[/obj/item/reagent_containers/hypospray/medipen/sty/snekbt] = list("PRICE" = rand(35),"NAME" = "SNAKEBITE") - held_items[/obj/item/reagent_containers/hypospray/medipen/sty/nourish] = list("PRICE" = rand(20),"NAME" = "NOURISH") + held_items[/obj/item/reagent_containers/hypospray/medipen/sty/snekbt] = list("PRICE" = rand(20,35),"NAME" = "SNAKEBITE") + held_items[/obj/item/reagent_containers/hypospray/medipen/sty/nourish] = list("PRICE" = rand(10,20),"NAME" = "NOURISH") held_items[/obj/item/storage/fancy/pilltinwake] = list("PRICE" = rand(25,30),"NAME" = "pep pills tin") held_items[/obj/item/reagent_containers/hypospray/medipen/sealbottle/purify] = list("PRICE" = rand(25,30),"NAME" = "PURIFY") held_items[/obj/item/storage/fancy/pilltinpink] = list("PRICE" = rand(25,35),"NAME" = "pink pill tin") held_items[/obj/item/natural/bundle/cloth/bandage/full] = list("PRICE" = rand(10,15),"NAME" = "roll of bandages") - held_items[/obj/item/survivalcapsule/tent] = list("PRICE" = rand(15,20),"NAME" = "Tent crystal") + held_items[/obj/item/survivalcapsule/tent] = list("PRICE" = rand(15,20),"NAME" = "tent crystal") held_items[/obj/item/survivalcapsule/smith] = list("PRICE" = rand(90,100),"NAME" = "Modest home crystal") held_items[/obj/item/survivalcapsule/wiz] = list("PRICE" = rand(600,800),"NAME" = "Luxury home crystal") held_items[/obj/item/reagent_containers/glass/alembic] = list("PRICE" = rand(30,40),"NAME" = "alembic") diff --git a/modular/Smoker/code/Smoker.dm b/modular/Smoker/code/Smoker.dm deleted file mode 100644 index 86c13462eb2..00000000000 --- a/modular/Smoker/code/Smoker.dm +++ /dev/null @@ -1,149 +0,0 @@ -/obj/item/storage/fancy/shhig - name = "Shhig Brand Zigs" - desc = "Dr. V's Shhig's; much like the image of serpents these zigs are synonymous with both healing and killing. Your life expectancy isnt very high anyway." - icon = 'modular/Smoker/icon/smokable.dmi' - icon_state = "smokebox" - icon_type = "smoke" - item_state = "smokebox" - fancy_open = TRUE - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - slot_flags = null - spawn_type = /obj/item/clothing/mask/cigarette/rollie/snek - -/obj/item/storage/fancy/shhig/ComponentInitialize() - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 5 - STR.set_holdable(list(/obj/item/clothing/mask/cigarette/rollie/snek)) - -/obj/item/storage/fancy/shhig/attack_self(mob_user) - return - -/obj/item/clothing/mask/cigarette/rollie/snek - list_reagents = list(/datum/reagent/drug/nicotine = 30, /datum/reagent/consumable/honey = 30, /datum/reagent/toxin/venom = 10) //honey will give heal. it is NOT great 55% chance per unit tick to heal 1brute,burn,tox. high end perfect rolls 30hp. unlikely. degrades into sugar (chance) which has a chance to degrade into nutrients. simulates appetite surpressant effect. - -/obj/item/reagent_containers/hypospray/medipen/sty/snekbt - name = "Snake Bite" - desc = "Dr. V's;.....vim....and- Ask yourself this; What am I doing? It is litterally a fucking glowing viscous sludge you are about to put into your vascular system..." - volume = 10 - amount_per_transfer_from_this = 10 - list_reagents = list(/datum/reagent/drug/snekbt = 5, /datum/reagent/toxin/venom = 5) - -/obj/item/reagent_containers/hypospray/medipen/sty/nourish - name = "NOURISH" - desc = "Dr. V's nutritional suppliment; normal people eat and drink, but true champions NOURISH." - volume = 135 - amount_per_transfer_from_this = 135 - list_reagents = list(/datum/reagent/consumable/honey = 30, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/water = 100) // as much water as a bucket so full hydrate. enough honey to IF good rng rolls get 30hp. 33% chance to decay into sugar, sugar has a 33% chance to decay into nutrients. so saturation varies. - -/datum/reagent/drug/snekbt - name = "Snake Bite" - description = "I'm not the one who's so far away..." - color = "#00FF00" - metabolization_rate = 0.1 - overdose_threshold = 6 - -/datum/reagent/drug/snekbt/on_mob_life(mob/living/carbon/M) - M.apply_status_effect(/datum/status_effect/buff/snekbt) - if(M.has_status_effect(/datum/status_effect/debuff/sleepytime)) - M.remove_status_effect(/datum/status_effect/debuff/sleepytime) - if(M.has_flaw(/datum/charflaw/addiction/junkie)) - M.sate_addiction() - ..() - - -/datum/reagent/drug/snekbt/on_mob_metabolize(mob/living/M) - ..() - M.update_body_parts_head_only() - M.overlay_fullscreen("snekbt", /atom/movable/screen/fullscreen/snekbt) - -/atom/movable/screen/fullscreen/snekbt - icon_state = "curse1" - plane = BLACKNESS_PLANE - layer = AREA_LAYER - blend_mode = 0 - alpha = 255 - show_when_dead = FALSE - -/datum/reagent/drug/snekbt/on_mob_end_metabolize(mob/living/M) - M.rogstam_add(-2500) - M.rogfat_add(2500) // crash you fucking junkie. - ..() - . = 1 - -/atom/movable/screen/fullscreen/bittensm/Initialize() - ..() - filters += filter(type="angular_blur",x=5,y=5,size=1) - -/datum/reagent/drug/snekbt/overdose_start(mob/living/M, can_overdose = TRUE) - if(HAS_TRAIT(M, TRAIT_CRACKHEAD))// boathian bullshit isnt going to help you here. its a toxin not a drug - can_overdose = TRUE - to_chat(M, span_danger("you really..... really shouldnt of done that...")) - M.ForceContractDisease(new /datum/disease/heart_failure(), FALSE, TRUE) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) - -/datum/reagent/drug/snekbt/overdose_process(mob/living/M) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) - ADD_TRAIT(M, TRAIT_PARALYSIS_L_ARM, TRAIT_GENERIC) - ADD_TRAIT(M, TRAIT_PARALYSIS_L_LEG, TRAIT_GENERIC) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 5) - M.adjustOxyLoss(5*REM, 0) - ..() - -/datum/status_effect/buff/snekbt - id = "Snake Bite" - alert_type = /atom/movable/screen/alert/status_effect/buff/druqks - effectedstats = list("strength" = 2, "constitution" = 2, "speed" = -3) - duration = 31+13+22.6 SECONDS - -/datum/stressevent/snekbt - stressadd = -15 - desc = span_blue("How many will you take with you?...") - timer = 31+13+22.6 SECONDS - - -/datum/status_effect/buff/snekbt/on_apply() - . = ..() - if(owner?.client) - if(owner.client.screen && owner.client.screen.len) - var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in owner.client.screen - PM.backdrop(owner) - PM = locate(/atom/movable/screen/plane_master/game_world_fov_hidden) in owner.client.screen - PM.backdrop(owner) - PM = locate(/atom/movable/screen/plane_master/game_world_above) in owner.client.screen - PM.backdrop(owner) - owner.add_stress(/datum/stressevent/snekbt) - ADD_TRAIT(owner, TRAIT_PROSOPAGNOSIA, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_FAKEDEATH, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_NODISMEMBER, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_NOPAINSTUN, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_NOROGSTAM, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_SCHIZO_AMBIENCE, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_ANTIMAGIC, TRAIT_GENERIC) - -/datum/status_effect/buff/snekbt/on_remove() - if(owner?.client) - if(owner.client.screen && owner.client.screen.len) - var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in owner.client.screen - PM.backdrop(owner) - PM = locate(/atom/movable/screen/plane_master/game_world_fov_hidden) in owner.client.screen - PM.backdrop(owner) - PM = locate(/atom/movable/screen/plane_master/game_world_above) in owner.client.screen - PM.backdrop(owner) - owner.remove_stress(/datum/stressevent/snekbt) - owner.clear_fullscreen("snekbt") - owner.rogstam_add(-2500) - owner.rogfat_add(2500) // crash you fucking junkie. - owner.update_body_parts_head_only() - REMOVE_TRAIT(owner, TRAIT_PROSOPAGNOSIA, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_FAKEDEATH, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_NODISMEMBER, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_NOPAINSTUN, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_NOROGSTAM, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_SCHIZO_AMBIENCE, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, TRAIT_GENERIC) - . = ..() - . = 1 diff --git a/modular/Smoker/icon/smokable.dmi b/modular/Smoker/icon/smokable.dmi deleted file mode 100644 index f38f7321268e1cc214c32a93e19306527bc2dd47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3341 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 aPC4>eJ3p^-q4sI_8^FlGOutgsHReCsR9esg diff --git a/modular/Smoker/sound/capoff.ogg b/modular/Smoker/sound/capoff.ogg deleted file mode 100644 index da37dfaeb30606c94bece797042b0f1a51f595c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52532 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%0Dofd8)onZ3`9_v1em=s#Pi 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 D1fU9q diff --git a/modular/Smoker/sound/chug.ogg b/modular/Smoker/sound/chug.ogg deleted file mode 100644 index f24656e0f318f2f157c0d601f25ac656bcea8cb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17853 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

s1L=F}7mY5dL= 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 diff --git a/modular/Smoker/sound/inject.ogg b/modular/Smoker/sound/inject.ogg deleted file mode 100644 index 5f44880131600d3f9cd2f70bd19312dbf9b9e09d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53307 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

n6os6}K4fK!4d zW*5mUoVdpEO>dK{SY87M>sYx|n(A4J3qxefT1-N8UO06@TRr3BkW-ljSoscG6w$pYY;m9Eg*)3U#`Y(rC>wB2|KB)3(mt~wah2;!BT-=6Q3sK_m0&Fx#Y zk^SkqJ-Gk+^u#T7+1_gX8Z)lO18$)aEP{nqfaH=CEhIuhR43G1y)LT;R@yo3R?$Cs zyMJx)hgz+NE+PUG18?025bbIKQsRF#rfE%eycWxzS`f-9D z&u32CcJMMTuB)CZM|pqIEk&*={Ys-@LI{p`da+(X1nAN(*DgSR0YDLY0@YR#R8)5| z6~O}lzGWOB+FcmvDxIQNEv;d{j5)r2n}M!L(Ic&4ukd#veA~XL*@7Ni92Fp0%mXZo zIm_jotBL^t3d5`QM+fJFP9@)1ed%qIxAfJzFU#T7-~9F@wpyBBO26O#x6k?yYoD&I z>p|y2ARGvasG-#s0$>y+MCMTDP(}&*b8Tj)Ig`L#>*2u5kgZssidSRfgo2a zSB6N-QXS3NwV|&_OD3DpQ=<4_1!#9ZOgFf&+Lyu5AB`oH+4CUx{xUz;(DA`uhY~UM zHL)?Hf|3ASJXX*_P3#AHZ(a2F^{I8)cLxACC9?#Rp#jXXTvagw-p6}%en?gKEqRCQ z*?9t+_QDve&5nO_y+0N@vS&PdJ^9n}-qGsPs;))CYF8rN(j#~H&&{eEG6k1_84PSNFp8pnd?OENQ z-R}Pw#EF;MixiO95CFtHZ>zM;c~L7(@4RxAd-pYvqBsD@q*Z0t&vkX%u2Rb;Go2>O z6+!Is_3rNL*RRjr-I}CH(jz7=L0k-kXac-C-zXH^I&vZ61xPKW0{|1Cwa>fui7Oko z!hy;`SQCg9TPiA@o@tv>35iXRcqG7cAnyMdX}V^ z4?^?ecZ}2QD?kXD0eEY8?$}p47H#URgS(VUtU%`k(A6lPqaVT0o}77@zzKc; zzyQn&fPD#0ZZYdVabhjLNM?t9h_wV#i14dZ!(`jKu2-uLygFP0Olm+1B zWK388WsH&$?8+d}I&v^)=QHm-jUtT2M)Vr2JSjC!8uNrTkFM=kLQp6GS91Q^9e8=V z65#+)5(CHk8bYe}m7`)N%l*APJpjBsXdA%J14kgxy z;@J|ZrW5XsSIyO-Fxh*R$}I!S#{kSc&!87OFDbp)u6Uw-3Ml}V-^T0j>+j~yY*W>f zgeJO7;!rU$PMCN+kw6N>`IX|Rz79@VkN!dd)IMYpyZaDC?46&s^Rd~P7H9@w>l%9B zbyv+*w5Sw_pzTrtqcA36Tvw+}H|5MBwUQuK?sc1QAp75Jk)f$eE-C0JmsS zE0eFhcp2?UKfRr{-!JK_Zd3URJ!wnZ{U8!rX&TjS`9L8q&`FOT0NgszMKQOIYcP=A z-7aXDq6|QH%|yv%6Q>quez5qbgQCZv|_FazoulAJhe=S zGmn;_c)Z9zzW#b33MmD^Urx_6B`hhv)#_sP0@7;GASq;2w&1^uKVx4Yq5{0W^vuw; zkHKbwo0ILIRxmtp0N5$byB}#&SGBn9X7xNYz1_CkRJByr6UVPgRkc@bwQXE2<08(-TQXY1zs;PU) z@$qn+wEzI_8jkd|a8|C|%2nkY0FO%C>700_wGw%GJ<}#=VQ+8XXw=hmSh*{~=y7}TpJ0YGS*a5Z2X6o%k1 zT+>h9+nbKXD3E|ab{Nu0lPXmp0i|tmt`>lμ?jo63>DYIH19;9Fr&Pl^6;`R{9N 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 diff --git a/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm b/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm index 3d200809221..2a1470993aa 100644 --- a/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm +++ b/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm @@ -1,14 +1,15 @@ // This code is part of Death-Rattler -// Copyright (C) 2024 Moribund/Luctus-Comptus -// Unauthorized use, modification, or distribution of this code is prohibited without copyright holders approval. See LICENSE.md +// Copyright (C) 2024 Moribund/Luctus-Comptus and Sutures/noelle-lavenza +// This code is subject to additional terms as described in modular_stonehenge/licensed-death-rattler/LICENSE.md -// I hate doing this. basically if you are anyone but ratwood/gyran DM me first and you can use whatever the fuck your heart wants from this. not only did he brag about theft and how easy it is he tryed to pull this same shit. +// I hate doing this. basically if you are anyone but ratwood/gyran DM me (Moribund) first and you can use whatever the fuck your heart wants from this. not only did he brag about theft and how easy it is he tryed to pull this same shit. /obj/item/storage/fancy/shhig - name = "Shhig Brand Zigs" + name = "\improper Shhig Brand Zigs" + gender = PLURAL desc = "Dr. V's Shhig's; much like the image of serpents these zigs are synonymous with both healing and killing. Your life expectancy isnt very high anyway." icon = 'modular_stonehedge/licensed-death-rattler/Death-Rattler/icon/smokable.dmi' icon_state = "smokebox" @@ -34,14 +35,20 @@ /obj/item/reagent_containers/hypospray/medipen/sty/snekbt name = "Snake Bite" - desc = "Dr. V's;.....vim....and- Ask yourself this; What am I doing? It is litterally a fucking glowing viscous sludge you are about to put into your vascular system..." + desc = "Dr. V's... vim... and... Ask yourself this: 'What am I doing?' It is a glowing viscous sludge you are about to put into your body. This can't be a good idea, can it?" + icon = 'modular_stonehedge/licensed-death-rattler/Death-Rattler/icon/smokable.dmi' + icon_state = "bite" + has_cap = FALSE // no icons volume = 10 amount_per_transfer_from_this = 10 list_reagents = list(/datum/reagent/drug/snekbt = 5, /datum/reagent/toxin/venom = 5) /obj/item/reagent_containers/hypospray/medipen/sty/nourish name = "NOURISH" - desc = "Dr. V's nutritional suppliment; normal people eat and drink, but true champions NOURISH." + desc = "Dr. V's nutritional supplement: normal people eat and drink, but true champions NOURISH." + icon = 'modular_stonehedge/licensed-death-rattler/Death-Rattler/icon/smokable.dmi' + icon_state = "nourish" + has_cap = FALSE // no icons volume = 135 amount_per_transfer_from_this = 135 list_reagents = list(/datum/reagent/consumable/honey = 30, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/water = 100) // as much water as a bucket so full hydrate. enough honey to IF good rng rolls get 30hp. 33% chance to decay into sugar, sugar has a 33% chance to decay into nutrients. so saturation varies. @@ -59,13 +66,7 @@ M.remove_status_effect(/datum/status_effect/debuff/sleepytime) if(M.has_flaw(/datum/charflaw/addiction/junkie)) M.sate_addiction() - ..() - - -/datum/reagent/drug/snekbt/on_mob_metabolize(mob/living/M) - ..() - M.update_body_parts_head_only() - M.overlay_fullscreen("snekbt", /atom/movable/screen/fullscreen/snekbt) + return ..() /atom/movable/screen/fullscreen/snekbt icon_state = "curse1" @@ -75,20 +76,14 @@ alpha = 255 show_when_dead = FALSE -/datum/reagent/drug/snekbt/on_mob_end_metabolize(mob/living/M) - M.rogstam_add(-2500) - M.rogfat_add(2500) // crash you fucking junkie. - ..() - . = 1 - -/atom/movable/screen/fullscreen/bittensm/Initialize() - ..() - filters += filter(type="angular_blur",x=5,y=5,size=1) +/atom/movable/screen/fullscreen/snekbt/Initialize() + . = ..() + add_filter("snakebt_blur", 2, list(type="angular_blur",x=5,y=5,size=1)) /datum/reagent/drug/snekbt/overdose_start(mob/living/M, can_overdose = TRUE) if(HAS_TRAIT(M, TRAIT_CRACKHEAD))// boathian bullshit isnt going to help you here. its a toxin not a drug can_overdose = TRUE - to_chat(M, span_danger("you really..... really shouldnt of done that...")) + to_chat(M, span_userdanger("You really, really shouldn't have done that!")) M.ForceContractDisease(new /datum/disease/heart_failure(), FALSE, TRUE) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) @@ -99,29 +94,24 @@ M.adjustOrganLoss(ORGAN_SLOT_HEART, 5) M.adjustOxyLoss(5*REM, 0) ..() + return TRUE /datum/status_effect/buff/snekbt id = "Snake Bite" alert_type = /atom/movable/screen/alert/status_effect/buff/druqks effectedstats = list("strength" = 2, "constitution" = 2, "speed" = -3) - duration = 31+13+22.6 SECONDS + duration = 27 SECONDS /datum/stressevent/snekbt stressadd = -15 - desc = span_blue("How many will you take with you?...") - timer = 31+13+22.6 SECONDS - + desc = span_blue("How many will you take with you...?") + timer = 27 SECONDS /datum/status_effect/buff/snekbt/on_apply() . = ..() - if(owner?.client) - if(owner.client.screen && owner.client.screen.len) - var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in owner.client.screen - PM.backdrop(owner) - PM = locate(/atom/movable/screen/plane_master/game_world_fov_hidden) in owner.client.screen - PM.backdrop(owner) - PM = locate(/atom/movable/screen/plane_master/game_world_above) in owner.client.screen - PM.backdrop(owner) + if(!.) // cancelled somehow + return + owner.overlay_fullscreen("snekbt", /atom/movable/screen/fullscreen/snekbt) owner.add_stress(/datum/stressevent/snekbt) ADD_TRAIT(owner, TRAIT_PROSOPAGNOSIA, TRAIT_GENERIC) ADD_TRAIT(owner, TRAIT_FAKEDEATH, TRAIT_GENERIC) @@ -133,19 +123,10 @@ ADD_TRAIT(owner, TRAIT_ANTIMAGIC, TRAIT_GENERIC) /datum/status_effect/buff/snekbt/on_remove() - if(owner?.client) - if(owner.client.screen && owner.client.screen.len) - var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in owner.client.screen - PM.backdrop(owner) - PM = locate(/atom/movable/screen/plane_master/game_world_fov_hidden) in owner.client.screen - PM.backdrop(owner) - PM = locate(/atom/movable/screen/plane_master/game_world_above) in owner.client.screen - PM.backdrop(owner) owner.remove_stress(/datum/stressevent/snekbt) owner.clear_fullscreen("snekbt") owner.rogstam_add(-2500) owner.rogfat_add(2500) // crash you fucking junkie. - owner.update_body_parts_head_only() REMOVE_TRAIT(owner, TRAIT_PROSOPAGNOSIA, TRAIT_GENERIC) REMOVE_TRAIT(owner, TRAIT_FAKEDEATH, TRAIT_GENERIC) REMOVE_TRAIT(owner, TRAIT_NODISMEMBER, TRAIT_GENERIC) @@ -154,5 +135,4 @@ REMOVE_TRAIT(owner, TRAIT_NOROGSTAM, TRAIT_GENERIC) REMOVE_TRAIT(owner, TRAIT_SCHIZO_AMBIENCE, TRAIT_GENERIC) REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, TRAIT_GENERIC) - . = ..() - . = 1 + ..() diff --git a/modular_stonehedge/licensed-death-rattler/LICENSE.md b/modular_stonehedge/licensed-death-rattler/LICENSE.md index de4cd6f47c9..193c59b2f9c 100644 --- a/modular_stonehedge/licensed-death-rattler/LICENSE.md +++ b/modular_stonehedge/licensed-death-rattler/LICENSE.md @@ -1,12 +1,22 @@ # LICENSE - Copyright (C) 2024 [Moribund/Luctus-Comptus] + Copyright (C) 2024 Moribund aka Luctus-Comptus and Sutures aka noelle-lavenza - This file is part of Death-Rattler. - - along with Death-Rattler. If not, see http://www.gnu.org/licenses/. + This file is part of Death-Rattler. All Dream Maker code files in + modular_stonehenge/licensed-death-rattler are subject to the following + additional terms. Additional Terms: - a) You may not use this file in another repository as the same name. - b) credit must be given to creator. - c) This file may not be copied, duplicated, or redistributed under the same .dm name. + a) Projects or derivative works using this code must not use the name + "Death-Rattler", "Death Rattler", and similar terms as any part of their + project or repository branding, documentation, etc. without the prior + permission of the copyright holder(s). + b) Projects or derivative works using this code may not claim association + or affiliation with, or the approval of, the copyright holders or + Death-Rattler without the prior permission of the copyright holder(s). + b) Projects or derivative works using this code must preserve the legal + notices and author attribution pertaining to this code, taking the form of + this license file as well as any attribution comments in Dream Maker code + files subject to these additional terms. + + These terms are subject to sections 7 and 10 of the AGPLv3 regarding 'additional terms'. diff --git a/roguetown.dme b/roguetown.dme index 8516e21cdcb..131492041cd 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -3682,7 +3682,6 @@ #include "modular\Neu_Food\code\raw\NeuFood_meat.dm" #include "modular\Neu_Food\code\raw\NeuFood_processed.dm" #include "modular\Neu_Food\code\raw\NeuFood_veggies.dm" -#include "modular\Smoker\code\Smoker.dm" #include "modular\ze_genesis_call\genesis_call.dm" #include "modular_hearthstone\_statpacks.dm" #include "modular_hearthstone\code\datums\loadout.dm" From 8759c8c6bc0931f5f77c0719dc0d933f77ecb438 Mon Sep 17 00:00:00 2001 From: Sutures <101909198+noelle-lavenza@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:34:40 -0500 Subject: [PATCH 039/192] Fixes missing sounds (#113) --- code/modules/reagents/reagent_containers/hypospray.dm | 4 ++-- code/modules/roguetown/roguecrafting/alchemy.dm | 8 ++++---- code/modules/spells/roguetown/acolyte/general.dm | 2 +- .../Death-Rattler/code/Death-Rattler.dm | 2 +- modular_stonehedge/licensed-death-rattler/LICENSE.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index ba94b78679c..215106b9187 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -21,7 +21,7 @@ if(has_cap) to_chat(user, span_warning("[src] has a cap on! You need to remove it first.")) return FALSE - playsound(src, 'modular/Smoker/sound/inject.ogg') + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/inject.ogg') inject(M, user) ///Handles all injection checks, injection and logging. @@ -143,7 +143,7 @@ has_cap = FALSE icon_state = "sty_nocap" // Update icon state to_chat(user, span_notice("You remove the cap from [src].")) - playsound(user, 'modular/Smoker/sound/capoff.ogg') + playsound(user, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/capoff.ogg') else to_chat(user, span_warning("[src] doesn't have a cap.")) return FALSE diff --git a/code/modules/roguetown/roguecrafting/alchemy.dm b/code/modules/roguetown/roguecrafting/alchemy.dm index a453da1fa06..80fe2362338 100644 --- a/code/modules/roguetown/roguecrafting/alchemy.dm +++ b/code/modules/roguetown/roguecrafting/alchemy.dm @@ -528,7 +528,7 @@ has_cap = FALSE icon_state = "[icon_state]_nocap" // Update icon state for no cap to_chat(user, span_notice("You thumb off the cork from [src].")) - playsound(src, 'modular/Smoker/sound/corkpop.ogg', 100, TRUE) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/corkpop.ogg', 100, TRUE) else to_chat(user, span_warning("[src] doesn't have a cork.")) @@ -551,7 +551,7 @@ reagents.maximum_volume = 0 // Makes them useless afterwards reagents.flags = NONE // Ensure reagents are deactivated update_icon() - playsound(src, 'modular/Smoker/sound/chug.ogg', 100, TRUE) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/chug.ogg', 100, TRUE) return TRUE /obj/item/reagent_containers/hypospray/medipen/sealbottle/attack(mob/user) @@ -579,7 +579,7 @@ has_cap = FALSE icon_state = "[icon_state]_nocap" // Update icon state for no cap to_chat(user, span_notice("You bite the cap off [src] and spit it out.")) - playsound(src, 'modular/Smoker/sound/capoff.ogg', 100, TRUE) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/capoff.ogg', 100, TRUE) else to_chat(user, span_warning("[src] doesn't have a cap.")) @@ -602,7 +602,7 @@ reagents.maximum_volume = 0 // Makes them useless afterwards reagents.flags = NONE // Ensure reagents are deactivated update_icon() - playsound(src, 'modular/Smoker/sound/inject.ogg', 100, TRUE) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/inject.ogg', 100, TRUE) return TRUE /obj/item/reagent_containers/hypospray/medipen/sty/attack(mob/user) diff --git a/code/modules/spells/roguetown/acolyte/general.dm b/code/modules/spells/roguetown/acolyte/general.dm index 5bed5d14bf1..198549a8903 100644 --- a/code/modules/spells/roguetown/acolyte/general.dm +++ b/code/modules/spells/roguetown/acolyte/general.dm @@ -210,7 +210,7 @@ name = "Stabalizing Syringe" overlay_state = "stable" range = 1 - sound = 'modular/Smoker/sound/inject.ogg' + sound = 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/inject.ogg' associated_skill = /datum/skill/misc/medicine antimagic_allowed = TRUE include_user = TRUE diff --git a/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm b/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm index 2a1470993aa..a4fb7216ec8 100644 --- a/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm +++ b/modular_stonehedge/licensed-death-rattler/Death-Rattler/code/Death-Rattler.dm @@ -1,6 +1,6 @@ // This code is part of Death-Rattler // Copyright (C) 2024 Moribund/Luctus-Comptus and Sutures/noelle-lavenza -// This code is subject to additional terms as described in modular_stonehenge/licensed-death-rattler/LICENSE.md +// This code is subject to additional terms as described in modular_stonehedge/licensed-death-rattler/LICENSE.md // I hate doing this. basically if you are anyone but ratwood/gyran DM me (Moribund) first and you can use whatever the fuck your heart wants from this. not only did he brag about theft and how easy it is he tryed to pull this same shit. diff --git a/modular_stonehedge/licensed-death-rattler/LICENSE.md b/modular_stonehedge/licensed-death-rattler/LICENSE.md index 193c59b2f9c..e315952ab4e 100644 --- a/modular_stonehedge/licensed-death-rattler/LICENSE.md +++ b/modular_stonehedge/licensed-death-rattler/LICENSE.md @@ -3,7 +3,7 @@ Copyright (C) 2024 Moribund aka Luctus-Comptus and Sutures aka noelle-lavenza This file is part of Death-Rattler. All Dream Maker code files in - modular_stonehenge/licensed-death-rattler are subject to the following + modular_stonehedge/licensed-death-rattler are subject to the following additional terms. Additional Terms: From dfa41710cab647f4b18a37ef7a09d00a3b49000f Mon Sep 17 00:00:00 2001 From: Luctus <117505981+Luctus-Comptus@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:02:35 -0600 Subject: [PATCH 040/192] Update seelie.dm (#114) Co-authored-by: Moribun <117505981+Moribun@users.noreply.github.com> --- .../human/species_types/roguetown/other/seelie.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm index 1fd7797c5cf..f7ccee5fc90 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm @@ -17,7 +17,7 @@ //gender = FEMALE species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,STUBBLE,OLDGREY) //Default shit that ever race gets - inherent_traits = list(TRAIT_NOMOBSWAP) //Use this to add custom Fae traits + inherent_traits = list(TRAIT_NOMOBSWAP, TRAIT_EASYDISMEMBER, TRAIT_CRITICAL_WEAKNESS) //Use this to add custom Fae traits default_features = MANDATORY_FEATURE_LIST use_skintones = 1 skinned_type = /obj/item/stack/sheet/animalhide/human @@ -44,12 +44,12 @@ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,0), \ ) specstats = list( - "perception" = 4, + "perception" = 1, "intelligence" = 2, "constitution" = -1, - "endurance" = 0, - "speed" = 7, - "fortune" = 2 + "strength" = -2, + "speed" = 2, // 7? are you absolutely fucking insane? + "fortune" = 1 ) enflamed_icon = "widefire" organs = list( From e9450cc9c77af378fd05440e28947617e82a71b1 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 02:52:29 +0300 Subject: [PATCH 041/192] aw shit --- code/__HELPERS/roundend.dm | 2 +- .../sex_actions/deviant/tailpegging_anal.dm | 15 +- .../deviant/tailpegging_vaginal.dm | 15 +- .../datums/sexcon/sex_actions/sex/anal_sex.dm | 9 +- .../sexcon/sex_actions/sex/vaginal_sex.dm | 13 +- code/datums/stress/negative_events.dm | 6 +- code/datums/stress/positive_events.dm | 10 +- code/game/gamemodes/objectives_rogue.dm | 4 +- code/game/objects/effects/glowshroom.dm | 11 +- .../objects/items/rogueweapons/intents.dm | 3 +- code/game/objects/structures/spawner.dm | 2 +- .../roguetown/villain/choosename.dm | 2 +- .../antagonists/roguetown/villain/zizocult.dm | 66 +++--- code/modules/events/rogue/_rogue.dm | 2 +- .../job_types/roguetown/garrison/veteran.dm | 2 +- .../roguetown/goblin/tribalshaman.dm | 6 +- code/modules/mob/living/carbon/rogfatstam.dm | 2 +- .../simple_animal/rogue/creacher/minotaur.dm | 32 ++- .../roguetown/roguejobs/fisher/leeches.dm | 2 +- .../spells/roguetown/acolyte/dendor.dm | 5 +- .../surgery/organs/feature_organs/genitals.dm | 1 - .../simple_animal/rogue/simple_skeleton.dm | 14 ++ .../simple_animal/rogue/friendly_npc.dm | 195 ++++++++++++++++++ roguetown.dme | 1 + 24 files changed, 321 insertions(+), 99 deletions(-) create mode 100644 modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 5e2d7964056..19ce9db1b15 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -324,7 +324,7 @@ end_reason = "The Werevolves formed an unholy clan, marauding StoneHedge until the end of its daes." if(C.cultascended) - end_reason = "ZIZOZIZOZIZOZIZO" + end_reason = "Levishth!" if(C.headrebdecree) end_reason = "The peasant rebels took control of the throne, hail the new community!" diff --git a/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm b/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm index f77b5a049b1..0b51fd17340 100644 --- a/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm +++ b/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm @@ -45,28 +45,23 @@ target.apply_damage(5, BRUTE, BPC) target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny tail into [target]'s butt!")) + user.visible_message(span_warning("[user] inserts their tiny tail into [target]'s butt!")) else user.visible_message(span_warning("[user] slides their tail into [target]'s butt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/tailpegging_anal/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s butt with their tail, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s butt with their tail.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) //Scream and body damage - target.apply_damage(10, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) - target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) + if(user.sexcon.force > SEX_FORCE_LOW) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) if(user.sexcon.considered_limp()) user.sexcon.perform_sex_action(target, 1.2, 4, FALSE) diff --git a/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm b/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm index e2d1a250f51..f3766e1c5e7 100644 --- a/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm +++ b/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm @@ -45,28 +45,23 @@ target.apply_damage(5, BRUTE, BPC) target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny tail into [target]'s cunt!")) + user.visible_message(span_warning("[user] inserts their tiny tail into [target]'s cunt!")) else user.visible_message(span_warning("[user] slides their tail into [target]'s cunt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/tailpegging_vaginal/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s cunt with their tail, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt with their tail.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) //Scream and body damage - target.apply_damage(10, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) - target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) + if(user.sexcon.force > SEX_FORCE_LOW) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) if(user.sexcon.considered_limp()) user.sexcon.perform_sex_action(target, 1.2, 4, FALSE) diff --git a/code/datums/sexcon/sex_actions/sex/anal_sex.dm b/code/datums/sexcon/sex_actions/sex/anal_sex.dm index a8bd59a1409..9c525a92699 100644 --- a/code/datums/sexcon/sex_actions/sex/anal_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/anal_sex.dm @@ -59,21 +59,14 @@ target.apply_damage(5, BRUTE, BPC) target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny cock into [target]'s butt!")) + user.visible_message(span_warning("[user] inserts their tiny cock into [target]'s butt!")) else user.visible_message(span_warning("[user] slides his cock into [target]'s butt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/anal_sex/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s ass, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s ass.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) user.sexcon.try_pelvis_crush(target) diff --git a/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm b/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm index 58c0f01e6dd..aa86a5165a2 100644 --- a/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm @@ -58,23 +58,16 @@ BPG.add_wound(/datum/wound/fracture/groin) target.apply_damage(5, BRUTE, BPC) target.apply_damage(5, BRUTE, BPG) - playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Non-Seelie action - user.visible_message(span_warning("[user] tries and fails to insert their tiny cock into [target]'s cunt.")) + user.visible_message(span_warning("[user] inserts their tiny cock into [target]'s cunt.")) else //Normal humen sized creatures or Seelie on Seelie (which would be normal) user.visible_message(span_warning("[user] slides their cock into [target]'s cunt!")) - playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) + playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/vaginal_sex/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s cunt, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) user.sexcon.try_pelvis_crush(target) diff --git a/code/datums/stress/negative_events.dm b/code/datums/stress/negative_events.dm index a8fb75fa909..9483f443c6f 100644 --- a/code/datums/stress/negative_events.dm +++ b/code/datums/stress/negative_events.dm @@ -118,9 +118,9 @@ desc = span_red("I fell. I'm a fool.") /datum/stressevent/hatezizo - timer = 99999 MINUTES - stressadd = 666 // :) - desc = "ZIZOZIZOZIZO" + timer = 30 MINUTES + stressadd = 10 // enough to instill mental breaks with any more stress of any source, and heart attack if too worse. + desc = "A NEW GOD is upon us!" /datum/stressevent/burntmeal timer = 2 MINUTES diff --git a/code/datums/stress/positive_events.dm b/code/datums/stress/positive_events.dm index 616b878766c..47ef07c9c8d 100644 --- a/code/datums/stress/positive_events.dm +++ b/code/datums/stress/positive_events.dm @@ -8,11 +8,6 @@ stressadd = -1 desc = span_red("It's raining.") -/datum/stressevent/lovezizo - timer = 99999 MINUTES - stressadd = -666 // :) - desc = "ZIZOZIZOZIZO" - /datum/stressevent/viewsinpunish timer = 5 MINUTES stressadd = -2 @@ -177,3 +172,8 @@ stressadd = -1 desc = span_green("A soothing fragrance envelops me.") timer = 10 MINUTES + +/datum/stressevent/zizodefeated + timer = 30 MINUTES + stressadd = -5 + desc = span_green("THE NEW DARK GOD HAS FALLEN!") diff --git a/code/game/gamemodes/objectives_rogue.dm b/code/game/gamemodes/objectives_rogue.dm index ad0fc2c6287..d028a51b3fb 100644 --- a/code/game/gamemodes/objectives_rogue.dm +++ b/code/game/gamemodes/objectives_rogue.dm @@ -15,7 +15,7 @@ if(C) explanation_text = "Feed [C.banditgoal] mammon to an idol of greed." else - explanation_text = "Pray to ZIZO." + explanation_text = "Pray to LEVISHTH." /datum/objective/delf @@ -35,7 +35,7 @@ if(C) explanation_text = "Feed [C.delfgoal] honeys to the mother." else - explanation_text = "Pray to ZIZO." + explanation_text = "Pray to LEVISHTH." /datum/objective/werewolf name = "conquer" diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 87e730eb5a2..d9621b24a38 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -133,10 +133,15 @@ qdel(src) /obj/structure/safeglowshroom/Destroy() - var/datum/reagents/R = new/datum/reagents(5) + var/datum/reagents/R = new/datum/reagents(30) R.my_atom = src - R.add_reagent(/datum/reagent/berrypoison, 5) + R.add_reagent(/datum/reagent/berrypoison, 30) var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 4, get_turf(src), FALSE) + smoke.set_up(R, 5, get_turf(src), FALSE) smoke.start() + explosion(loc, 1, 1, 1, 0, 0) //and gas release ig . = ..() + +//used by stupid spell +/obj/structure/glowshroom/proc/destroy() + qdel(src) diff --git a/code/game/objects/items/rogueweapons/intents.dm b/code/game/objects/items/rogueweapons/intents.dm index 9aaebd26486..8711f1f1a18 100644 --- a/code/game/objects/items/rogueweapons/intents.dm +++ b/code/game/objects/items/rogueweapons/intents.dm @@ -489,8 +489,7 @@ animname = "cut" blade_class = BCLASS_CHOP hitsound = "genslash" - penfactor = 230 - damfactor = 40 + penfactor = 80 candodge = TRUE canparry = TRUE miss_text = "slashes the air!" diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index e87cc1e1061..facb100e81a 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -115,7 +115,7 @@ /mob/living/simple_animal/hostile/retaliate/rogue/goblin/cave = 3, //archer /mob/living/simple_animal/hostile/retaliate/rogue/goblin = 3) //archer spawn_text = "climbs out of" - faction = list("orc") + faction = list("orcs") /obj/structure/spawner/ghost name = "bone pile" diff --git a/code/modules/antagonists/roguetown/villain/choosename.dm b/code/modules/antagonists/roguetown/villain/choosename.dm index b4f18e30d7e..c0ec141de12 100644 --- a/code/modules/antagonists/roguetown/villain/choosename.dm +++ b/code/modules/antagonists/roguetown/villain/choosename.dm @@ -10,7 +10,7 @@ j.current_positions-- mob_timers["mirrortime"] = world.time var/begin_time = world.time - var/new_name = input(src, "What should your [input] name be?", "HEARTHSTONE") + var/new_name = input(src, "What should your [input] name be?", "DREAMKEEP") if(world.time > begin_time + 60 SECONDS) to_chat(src, "You waited too long.") return diff --git a/code/modules/antagonists/roguetown/villain/zizocult.dm b/code/modules/antagonists/roguetown/villain/zizocult.dm index bbe547f8550..cb4c48a0739 100644 --- a/code/modules/antagonists/roguetown/villain/zizocult.dm +++ b/code/modules/antagonists/roguetown/villain/zizocult.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(ritualslist) antag_hud_name = "cultist" confess_lines = list( "DEATH TO THE SUCCESSORS!", - "PRAISE ZIZO!", + "PRAISE LEVISHTH!", "THE GODHEAD FAVORS ME!", ) var/islesser = TRUE @@ -176,7 +176,7 @@ GLOBAL_LIST_EMPTY(ritualslist) set category = "LEVISHTH" var/datum/game_mode/chaosmode/C = SSticker.mode - var/speak = input("What do you speak of?", "HEARTHSTONE") as text|null + var/speak = input("What do you speak of?", "DREAMKEEP") as text|null if(!speak) return whisper("O schlet'a ty'schkotot ty'skvoro...") @@ -252,7 +252,7 @@ GLOBAL_LIST_EMPTY(ritualslist) if(path.circle == sigil_type) rituals |= path.name - var/ritualnameinput = input(user, "Rituals", "HEARTHSTONE") as null|anything in rituals + var/ritualnameinput = input(user, "Rituals", "DREAMKEEP") as null|anything in rituals testing("ritualnameinput [ritualnameinput]") var/datum/ritual/pickritual @@ -406,7 +406,7 @@ GLOBAL_LIST_EMPTY(ritualslist) to_chat(src, span_danger("My hands aren't bloody enough.")) return - var/input = input("Sigil Type", "HEARTHSTONE") as null|anything in runes + var/input = input("Sigil Type", "DREAMKEEP") as null|anything in runes if(!input) return @@ -425,10 +425,10 @@ GLOBAL_LIST_EMPTY(ritualslist) var/mob/living/carbon/human/choice = input(src, "Whom do you no longer have use for?", "ROGUETOWN") as null|anything in possible if(choice) - var/alert = alert(src, "Are you sure?", "HEARTHSTONE", "Yes", "Cancel") + var/alert = alert(src, "Are you sure?", "DREAMKEEP", "Yes", "Cancel") if(alert == "Yes") visible_message(span_danger("[src] reaches out, ripping up [choice]'s soul!")) - to_chat(choice, span_userdanger("I HAVE FAILED MY LEADER! I HAVE FAILED ZIZO! NOTHING ELSE BUT DEATH REMAINS FOR ME NOW!")) + to_chat(choice, span_userdanger("I HAVE FAILED MY LEADER! I HAVE FAILED LEVISHTH! NOTHING ELSE BUT DEATH REMAINS FOR ME NOW!")) sleep(20) choice.gib() // Cooler than dusting. C.cultists -= choice.mind @@ -477,7 +477,7 @@ GLOBAL_LIST_EMPTY(ritualslist) to_chat(user.mind, span_danger("\"The veil is too strong to support more than ten cultists.\"")) return var/datum/antagonist/zizocultist/PR = user.mind.has_antag_datum(/datum/antagonist/zizocultist) - var/alert = alert(H, "YOU WILL BE SHOWN THE TRUTH. DO YOU RESIST? (Resisting: 1 TRI)", "HEARTHSTONE", "Yield", "Resist") + var/alert = alert(H, "YOU WILL BE SHOWN THE TRUTH. DO YOU RESIST? (Resisting: 1 TRI)", "DREAMKEEP", "Yield", "Resist") H.anchored = TRUE if(alert == "Yield") to_chat(H.mind, span_notice("I see the truth now! It all makes so much sense! They aren't HERETICS! They want the BEST FOR US!")) @@ -648,7 +648,7 @@ GLOBAL_LIST_EMPTY(ritualslist) /obj/item/pactofunity/attack_self(mob/user) . = ..() - var/alert = alert(user, "Rip up the pact of unity?", "HEARTHSTONE", "RIP", "Cancel") + var/alert = alert(user, "Rip up the pact of unity?", "DREAMKEEP", "RIP", "Cancel") if(alert == "RIP") user.playsound_local(user, 'sound/foley/cloth_rip.ogg', 50) to_chat(signed.mind, span_userdanger("I FAILED! MY LIFE DWINDLES!")) @@ -669,7 +669,7 @@ GLOBAL_LIST_EMPTY(ritualslist) return if(!H.stat) to_chat(user, span_info("I courteously offer \the [src] to [H].")) - if(alert(H, "Sign the pact with your blood?", "HEARTHSTONE", "Yes", "No") != "Yes") + if(alert(H, "Sign the pact with your blood?", "DREAMKEEP", "Yes", "No") != "Yes") return if(H.stat) return @@ -763,7 +763,7 @@ GLOBAL_LIST_EMPTY(ritualslist) for(var/obj/item/paper/P in C.contents) var/info = "" info = sanitize(P.info) - var/input = stripped_input(user, "To whom do we send this message?", "HEARTHSTONE") + var/input = stripped_input(user, "To whom do we send this message?", "DREAMKEEP") if(!input) return for(var/mob/living/carbon/human/HL in GLOB.human_list) @@ -908,8 +908,10 @@ GLOBAL_LIST_EMPTY(ritualslist) circle = "Fleshcrafting" center_requirement = /mob/living/carbon/human // cult leader - n_req = /mob/living/carbon/human // the ruler - s_req = /mob/living/carbon/human // virgin + n_req = /mob/living/carbon/human // virgin + s_req = /mob/living/carbon/human // anyone + e_req = /mob/living/carbon/human // anyone + w_req = /mob/living/carbon/human // anyone function = /proc/ascend @@ -919,25 +921,43 @@ GLOBAL_LIST_EMPTY(ritualslist) for(var/mob/living/carbon/human/H in C.contents) if(!iszizocultist(H)) return - for(var/mob/living/carbon/human/RULER in get_step(src, NORTH)) - if(RULER != SSticker.rulermob && RULER.stat != DEAD) - break - RULER.gib() - for(var/mob/living/carbon/human/VIRGIN in get_step(src, SOUTH)) + for(var/mob/living/carbon/human/VIRGIN in get_step(src, NORTH)) if(!VIRGIN.virginity && VIRGIN.stat != DEAD) break VIRGIN.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(src, EAST)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(src, SOUTH)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(src, WEST)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() CM.cultascended = TRUE addomen("ascend") - to_chat(user.mind, span_danger("I HAVE DONE IT! I HAVE REACHED A HIGHER FORM! SOON THERE WILL BE NO GODS. ONLY MASTERS!")) + to_chat(user.mind, span_danger("I HAVE DONE IT! Now I will die... BUT THE REFLECTION OF -ME- AS A NEW GOD WILL RISE!!!")) var/mob/living/trl = new /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended(C) + trl.name = "[user.real_name] the NEW GOD of ULTRAVIOLENCE" trl.ckey = H.ckey H.gib() - to_chat(world, "\n15 minutes remain.") for(var/mob/living/carbon/V in GLOB.human_list) - if(V.mind in CM.cultists) - V.add_stress(/datum/stressevent/lovezizo) - else + if(!V.mind in CM.cultists) + to_chat(V, span_danger("I CAN --FEEL-- SOMETHING -HORRIBLE- HAS AWAKENED...!!")) + V.do_freakout_scream() V.add_stress(/datum/stressevent/hatezizo) - CM.roundvoteend = TRUE + GLOB.todoverride = "night" + settod() + spawn(6000) + GLOB.todoverride = null + priority_announce("The Sun is torn from the sky!", "Terrible Omen", 'sound/misc/astratascream.ogg') + addomen(OMEN_SUNSTEAL) + for(var/mob/living/carbon/human/astrater in GLOB.human_list) + if(!istype(astrater.patron, /datum/patron/divine/astrata) || !length(astrater.mind?.antag_datums)) + continue + to_chat(astrater, span_userdanger("You feel the pain of [astrater.patron.name]!")) + astrater.emote_scream() break diff --git a/code/modules/events/rogue/_rogue.dm b/code/modules/events/rogue/_rogue.dm index 427582bba4b..3b67056693b 100644 --- a/code/modules/events/rogue/_rogue.dm +++ b/code/modules/events/rogue/_rogue.dm @@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(badomens, list()) if(OMEN_SKELETONSIEGE) used = "Unwelcome visitors!" if("ascend") - used = "Levishth will rise once again." + used = "A new god is born!" if(eventreason && used) priority_announce(used, "Bad Omen", 'sound/misc/evilevent.ogg') diff --git a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm index 14696e7e8bb..e868ea23b58 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm @@ -14,7 +14,7 @@ outfit = /datum/outfit/job/roguetown/veteran give_bank_account = 1500 - min_pq = 0 + min_pq = 15 max_pq = null cmode_music = 'sound/music/combat_guard.ogg' diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm index 9078fbffa2f..a3d0ccd6eff 100644 --- a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm +++ b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm @@ -53,6 +53,9 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 2, TRUE) //This does nothing, but maybe one day it will. + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/heal/shaman) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/revive/shaman) if(H.age == AGE_OLD) H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 1, TRUE) @@ -64,9 +67,6 @@ ADD_TRAIT(H, TRAIT_NASTY_EATER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_PERFECT_TRACKER, TRAIT_GENERIC) var/datum/devotion/C = new /datum/devotion(H, H.patron) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/heal/shaman) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/revive/shaman) C.grant_spells_priest(H) H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray) diff --git a/code/modules/mob/living/carbon/rogfatstam.dm b/code/modules/mob/living/carbon/rogfatstam.dm index c8c9650f5cd..504b0077ca1 100644 --- a/code/modules/mob/living/carbon/rogfatstam.dm +++ b/code/modules/mob/living/carbon/rogfatstam.dm @@ -109,7 +109,7 @@ heart_attacking = TRUE shake_camera(src, 1, 3) blur_eyes(10) - var/stuffy = list("ZIZO GRABS MY WEARY HEART!","ARGH! MY HEART BEATS NO MORE!","NO... MY HEART HAS BEAT IT'S LAST!","MY HEART HAS GIVEN UP!","MY HEART BETRAYS ME!","THE METRONOME OF MY LIFE STILLS!") + var/stuffy = list("LEVISHTH GRABS MY WEARY HEART!","ARGH! MY HEART BEATS NO MORE!","NO... MY HEART HAS BEAT IT'S LAST!","MY HEART HAS GIVEN UP!","MY HEART BETRAYS ME!","THE METRONOME OF MY LIFE STILLS!") to_chat(src, span_userdanger("[pick(stuffy)]")) emote("breathgasp", forced = TRUE) addtimer(CALLBACK(src, PROC_REF(adjustOxyLoss), 110), 30) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm b/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm index 1b7aa266725..8571dc6b0be 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm @@ -64,22 +64,25 @@ icon_living = "ascend" icon = 'icons/mob/32x64.dmi' base_intents = list(/datum/intent/unarmed/ascendedclaw) - melee_damage_lower = 250 - melee_damage_upper = 550 - health = 666666 - maxHealth = 666666 - STACON = 66 - STASTR = 66 - STASPD = 66 - STAEND = 66 + health = 750 + maxHealth = 750 + melee_damage_lower = 55 + melee_damage_upper = 80 + STACON = 20 + STASTR = 20 + STASPD = 20 + STAEND = 20 /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/examine(mob/user) . = ..() - . += "It is impossible to comprehend such a thing." + . += "MY MIND CAN NOT COMPREHEND!!!" + if(ishuman(user) && !iscultist(user)) + var/mob/living/carbon/human/userhuman = user + userhuman.freak_out(3) //may give you a heart attack if the initial mass stress is still on you. /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/Initialize() . = ..() - set_light(5,5, LIGHT_COLOR_RED) + set_light(5,5, LIGHT_COLOR_PURPLE) /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/get_sound(input) switch(input) @@ -96,6 +99,15 @@ /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/death(gibbed) . = ..() + var/datum/game_mode/chaosmode/CM = SSticker.mode + for(var/mob/living/carbon/V in GLOB.human_list) + if(V.mind in CM.cultists) + to_chat(V, span_danger("WE FAILED, THE NEW GOD HAS FALLEN!!! I CANT.. OH NO!!! THE DIVINE LIGHT RETURNS TO THIS AREA!!! ")) + V.gib() + else + to_chat(V, span_greenannounce("THE DIVINE LIGHT RETURNS TO US!!!")) + V.remove_stress(/datum/stressevent/hatezizo) + V.add_stress(/datum/stressevent/zizodefeated) gib() qdel(src) diff --git a/code/modules/roguetown/roguejobs/fisher/leeches.dm b/code/modules/roguetown/roguejobs/fisher/leeches.dm index c1f0c9f4b4b..37bb12c7f84 100644 --- a/code/modules/roguetown/roguejobs/fisher/leeches.dm +++ b/code/modules/roguetown/roguejobs/fisher/leeches.dm @@ -246,7 +246,7 @@ if(iscarbon(user)) var/mob/living/carbon/V = user if(prob(5)) - V.say(pick("PRAISE ZIZO!", "DEATH TO THE TEN...")) + V.say(pick("PRAISE LEVISHTH!", "DEATH TO THE TEN...")) V.add_stress(/datum/stressevent/leechcult) #undef MAX_LEECH_EVILNESS diff --git a/code/modules/spells/roguetown/acolyte/dendor.dm b/code/modules/spells/roguetown/acolyte/dendor.dm index 80ca37d62c4..7b41ead1dae 100644 --- a/code/modules/spells/roguetown/acolyte/dendor.dm +++ b/code/modules/spells/roguetown/acolyte/dendor.dm @@ -108,5 +108,6 @@ for(var/X in GLOB.cardinals) var/turf/TT = get_step(T, X) if(!isclosedturf(TT) && !locate(/obj/structure/glowshroom) in TT) - var/shroomie = new /obj/structure/glowshroom(TT) - addtimer(CALLBACK(shroomie, PROC_REF(qdel), shroomie), 15 SECONDS, TIMER_STOPPABLE) //clears after 15 secs cause this shit is cancer. + var/shroomtospawn = pick(/obj/structure/glowshroom, /obj/structure/safeglowshroom) //hey its fungal illumination not fungal zapping your ass away. + var/obj/structure/shroomie = new shroomtospawn(TT) + addtimer(CALLBACK(shroomie, /obj/structure/glowshroom/proc/destroy, shroomie), 5 SECONDS, TIMER_STOPPABLE) // Destroys after 5 secs diff --git a/code/modules/surgery/organs/feature_organs/genitals.dm b/code/modules/surgery/organs/feature_organs/genitals.dm index e12d55f7e0c..50cd767d78c 100644 --- a/code/modules/surgery/organs/feature_organs/genitals.dm +++ b/code/modules/surgery/organs/feature_organs/genitals.dm @@ -192,7 +192,6 @@ name = "butt" icon = 'modular_stonehedge/icons/obj/surgery.dmi' icon_state = "butt" - dropshrink = 0.5 visible_organ = TRUE zone = BODY_ZONE_PRECISE_STOMACH slot = ORGAN_SLOT_BUTT diff --git a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm index c759abb463b..5f0bc81b1b7 100644 --- a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm +++ b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm @@ -105,6 +105,20 @@ maxHealth = 100 health = 100 +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry + var/list/friendlyjobs = list("Guild Appraiser", "Guildmaster") + +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry/CanAttack(atom/the_target, ignore_lying) + if(ishuman(the_target)) + var/mob/living/carbon/human/madafaka = the_target + if(madafaka.job in friendlyjobs) + return FALSE + else + //funny screaming + if(prob(10)) + src.say(pick("I GOT YOU NOW MADAFFFAKA!!!", "I SEE A MADA-FFFFFFFFFFFFFAKAAAA HERE!!!!", "WHAT'CHU DOIN HERE MADAFFFFAKA!!!!", "ALERT!! MADAFFFFAKA SPOTTEEEEED!!!")) + . = ..() + /mob/living/simple_animal/hostile/rogue/skeleton/guard/crypt_guard name = "Crypt Guard" base_intents = list(/datum/intent/simple/spear) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm new file mode 100644 index 00000000000..a18ad59e92b --- /dev/null +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -0,0 +1,195 @@ +//based on hearthstone sea raiders. +//funny modifications By Vide noir. + +/mob/living/carbon/human/species/human/friendlynpc + aggressive=1 + mode = AI_IDLE + faction = list("Station") + bodyparts = list(/obj/item/bodypart/chest, /obj/item/bodypart/head, /obj/item/bodypart/l_arm, + /obj/item/bodypart/r_arm, /obj/item/bodypart/r_leg, /obj/item/bodypart/l_leg) + ambushable = FALSE + dodgetime = 30 + flee_in_pain = TRUE + possible_rmb_intents = list() + wander = TRUE + erpable = TRUE + var/list/friendlyfactions = list("Station", "neutral") + var/list/friendlyjobs + //quotes from skyrim cause we love skyrim. + var/list/calmmessages = list() + var/list/aggromessages = list() + +/mob/living/carbon/human/species/human/friendlynpc/should_target(mob/living/L) + if(L.stat != CONSCIOUS) + return FALSE + if(ishuman(L)) + var/mob/living/carbon/human/madafaka = L + if(friendlyfactions) + if(friendlyfactions) + if(madafaka.faction[1] in friendlyfactions && target != madafaka) + return FALSE + if(friendlyjobs) + if(madafaka.job in friendlyjobs && target != madafaka) + return FALSE + if(madafaka.Adjacent(src)) + if(prob(10)) + say(pick(calmmessages)) + . = ..() + +/mob/living/carbon/human/species/human/friendlynpc/townguard + calmmessages = list( + "Let me guess... someone stole your sweetroll.", + "I used to be an adventurer like you. Then I took an arrow in the knee...", + "Disrespect the law, and you disrespect me.", + "What do you need?", + "Trouble?", + "What is it?", + "No lollygaggin'.", + "My cousin's out fighting dragons, and what do I get? Guard duty.", + "Gotta keep my eyes open. Damn dragons could swoop down at any time.", + "Fear not. Come dragon or giant, we'll be ready.", + "Brigands I can handle, but this talk of dragons? World's gone mad, I say.", + "Everything's in order.", + "Staying safe I hope.", + "Everything all right?", + "Could sure use a warm bed right about now...", + "I'd be a lot warmer and a lot happier with a bellyful of mead...", + "I mostly deal with petty thievery and drunken brawls. Been too long since we've had a good bandit raid.", + "What is it? Dragons?", + "Watch the skies, traveler.", + "No matter what else happens, the guards will always be grateful for everything you've done.", + "I fear the night. Because the werewolves and vampires don't.", + "Just a few more hours and I can crawl under some furs...", + ) + aggromessages = list( + "Never should have come here!", + "Then let me speed your passage to Yamais' hands!", + "Then pay with your blood!", + "That can be arranged!", + "So be it!", + "You have sealed your fate!", + "You cannot escape the righteous!", + "Fool!", + "You will pay, with your blood!", + ) + +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute + +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute/after_creation() + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute) + + +/mob/living/carbon/human/species/human/friendlynpc/townguard/retaliate(mob/living/L) + var/newtarg = target + .=..() + if(target) + aggressive=1 + wander = TRUE + if(target != newtarg) + say(pick(aggromessages)) + linepoint(target) + +/mob/living/carbon/human/species/human/friendlynpc/townguard/Initialize() + . = ..() + set_species(/datum/species/elf) + spawn(10) + after_creation() + //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) + +/mob/living/carbon/human/species/human/friendlynpc/townguard/after_creation() + ..() + job = "Town Guardsman" + ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_NOHUNGER, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_HEAVYARMOR, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard) + var/obj/item/organ/eyes/organ_eyes = getorgan(/obj/item/organ/eyes) + if(organ_eyes) + organ_eyes.eye_color = pick("27becc", "35cc27", "000000") + update_hair() + update_body() + +/mob/living/carbon/human/species/human/friendlynpc/townguard/npc_idle() + if(m_intent == MOVE_INTENT_SNEAK) + return + if(world.time < next_idle) + return + next_idle = world.time + rand(30, 70) + if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && wander) + if(prob(20)) + var/turf/T = get_step(loc,pick(GLOB.cardinals)) + if(!istype(T, /turf/open/transparent/openspace)) + Move(T) + else + face_atom(get_step(src,pick(GLOB.cardinals))) + if(!wander && prob(10)) + face_atom(get_step(src,pick(GLOB.cardinals))) + +/mob/living/carbon/human/species/human/friendlynpc/townguard/handle_combat() + if(mode == AI_HUNT) + if(prob(50)) + emote("rage") + . = ..() + +/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/pre_equip(mob/living/carbon/human/H) + if(prob(50)) + wrists = /obj/item/clothing/wrists/roguetown/bracers + cloak = /obj/item/clothing/cloak/templar/dendor + gloves = /obj/item/clothing/gloves/roguetown/forestergauntlets + armor = /obj/item/clothing/suit/roguetown/armor/plate/half/foresterarmor + shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant + if(prob(50)) + shirt = /obj/item/clothing/suit/roguetown/shirt/tunic + pants = /obj/item/clothing/under/roguetown/tights + head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet + H.STASPD = 8 + H.STACON = 4 + H.STAEND = 15 + H.STAINT = 1 + H.STASTR = rand(11,16) + if(prob(50)) + r_hand = /obj/item/rogueweapon/sword + else + r_hand = /obj/item/rogueweapon/stoneaxe/battle + l_hand = /obj/item/rogueweapon/shield/wood + shoes = /obj/item/clothing/shoes/roguetown/boots/forestershoes + if(prob(30)) + neck = /obj/item/clothing/neck/roguetown/chaincoif + H.eye_color = pick("27becc", "35cc27", "000000") + H.hair_color = pick ("4f4f4f", "61310f", "faf6b9") + H.facial_hair_color = H.hair_color + if(H.gender == MALE) + H.name = pick( world.file2list("strings/rt/names/human/humnorm.txt") ) + H.real_name = H.name + else + H.name = pick( world.file2list("strings/rt/names/human/humnorf.txt") ) + H.real_name = H.name + +/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute/pre_equip(mob/living/carbon/human/H) + wrists = /obj/item/clothing/wrists/roguetown/bracers + cloak = /obj/item/clothing/cloak/templar/dendor + armor = /obj/item/clothing/suit/roguetown/armor/chainmail + shirt = /obj/item/clothing/suit/roguetown/shirt/tunic + pants = /obj/item/clothing/under/roguetown/chainlegs + head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings + if(prob(60)) + mask = /obj/item/clothing/mask/rogue/facemask + gloves = /obj/item/clothing/gloves/roguetown/chain + H.STASPD = 9 + H.STACON = 8 + H.STAEND = 15 + H.STAINT = 1 + H.STASTR = rand(15,18) + if(prob(50)) + r_hand = /obj/item/rogueweapon/halberd/bardiche + else + r_hand = /obj/item/rogueweapon/greatsword + shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron + neck = /obj/item/clothing/neck/roguetown/chaincoif + if(H.gender == MALE) + H.name = pick( world.file2list("strings/rt/names/human/humnorm.txt") ) + H.real_name = H.name + else + H.name = pick( world.file2list("strings/rt/names/human/humnorf.txt") ) + H.real_name = H.name diff --git a/roguetown.dme b/roguetown.dme index 6e615767a06..4061edaed6c 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -3752,4 +3752,5 @@ #include "modular_stonehedge\code\lewdai\lewdai.dm" #include "modular_stonehedge\code\modules\datums\accents.dm" #include "modular_stonehedge\code\modules\mob\living\overhead_effects.dm" +#include "modular_stonehedge\code\modules\mob\living\simple_animal\rogue\friendly_npc.dm" // END_INCLUDE From 9ffd5b421be09f8036c3fa42405fb43e99e5f457 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 04:50:35 +0300 Subject: [PATCH 042/192] a bunch of shit --- _maps/roguetest.json | 4 +- code/datums/dna.dm | 1 - .../carbon/human/species_types/furry/akula.dm | 10 +- .../human/species_types/furry/anthromorph.dm | 2 - .../species_types/furry/anthromorphbig.dm | 2 - .../species_types/furry/anthromorphsmall.dm | 2 - .../human/species_types/furry/demihuman.dm | 2 - .../human/species_types/furry/dracon.dm | 2 - .../human/species_types/furry/kobold.dm | 2 - .../human/species_types/furry/lizardfolk.dm | 2 - .../human/species_types/furry/lupian.dm | 2 - .../carbon/human/species_types/furry/moth.dm | 2 - .../human/species_types/furry/tabaxi.dm | 2 - .../human/species_types/furry/vulpkanin.dm | 2 - .../species_types/roguetown/dwarf/dwarfm.dm | 2 - .../human/species_types/roguetown/elf/elfd.dm | 2 - .../human/species_types/roguetown/elf/elfs.dm | 2 - .../species_types/roguetown/goblin/goblinp.dm | 2 - .../species_types/roguetown/human/humen.dm | 2 - .../species_types/roguetown/other/aasimar.dm | 2 - .../roguetown/other/brazillian.dm | 19 +-- .../species_types/roguetown/other/halfelf.dm | 2 - .../species_types/roguetown/other/halforc.dm | 2 - .../species_types/roguetown/other/seelie.dm | 10 +- .../species_types/roguetown/other/tiefling.dm | 2 - .../species_types/roguetown/other/werewolf.dm | 2 - .../simple_animal/rogue/creacher/mudcrab.dm | 2 +- .../simple_animal/rogue/friendly_npc.dm | 121 +++++++++++++++--- 28 files changed, 108 insertions(+), 101 deletions(-) diff --git a/_maps/roguetest.json b/_maps/roguetest.json index 6349acea045..c36b0b27046 100644 --- a/_maps/roguetest.json +++ b/_maps/roguetest.json @@ -1,7 +1,7 @@ { "map_name": "Roguetest", - "map_path": "map_files/Roguetest", - "map_file": "Roguetest.dmm", + "map_path": "map_files/roguetest", + "map_file": "roguetest.dmm", "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 30bc0b474b5..d8ab6a4e25b 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -310,7 +310,6 @@ update_body_parts(TRUE) update_mutations_overlay()// no lizard with human hulk overlay please. - /mob/proc/has_dna() return diff --git a/code/modules/mob/living/carbon/human/species_types/furry/akula.dm b/code/modules/mob/living/carbon/human/species_types/furry/akula.dm index ad42b12ea6a..715c9638132 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/akula.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/akula.dm @@ -30,15 +30,7 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list( - "strength" = 1, - "perception" = 0, - "intelligence" = -1, - "constitution" = 1, - "endurance" = 1, - "speed" = 1, - "fortune" = 1 - ) + race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" attack_verb = "slash" attack_sound = 'sound/blank.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm index 03171d4a44b..f25b0b053be 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm @@ -47,8 +47,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = -1, "constitution" = 0, "endurance" = 1, "speed" = -1, "fortune" = 0) - specstats_f = list("strength" = -1, "perception" = 0, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm index c66b5feabca..cb6141c0332 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm @@ -43,8 +43,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm index d726d7e24df..4be048d0191 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm @@ -43,8 +43,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = -3, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 2, "fortune" = 1) - specstats_f = list("strength" = -3, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 2, "fortune" = 1) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm index 55c8ce3b601..64a7e4c36c2 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm @@ -44,8 +44,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" bodypart_features = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm b/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm index aa6a412c28d..92ef77bd75f 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm @@ -30,8 +30,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = -2, "intelligence" = 1, "constitution" = 2, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 2, "perception" = -2, "intelligence" = 1, "constitution" = 2, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm index 5360b5df2da..53321a9f446 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm @@ -36,8 +36,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = -2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 0, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm b/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm index 390fe99edd5..eff22121a5c 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm @@ -32,8 +32,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = 0, "intelligence" = -1, "constitution" = 1, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 2, "perception" = 0, "intelligence" = -1, "constitution" = 1, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm index b1e992b79f8..08572c79c8b 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm @@ -42,8 +42,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = -2, "intelligence" = 0, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) //0 total - specstats_f = list("strength" = 2, "perception" = -2, "intelligence" = 0, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) //0 total race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/moth.dm b/code/modules/mob/living/carbon/human/species_types/furry/moth.dm index fd9b25a3a51..14a02c5081a 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/moth.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/moth.dm @@ -29,8 +29,6 @@ OFFSET_NECK_F = list(0,0), OFFSET_MOUTH_F = list(0,0), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1) ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = -1, "perception" = 1, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm index 9b4f98612c7..ce9c0163c4d 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm @@ -36,8 +36,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1) ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -1, "perception" = 1, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm index d478b782552..f950991c865 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm @@ -34,8 +34,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = -1, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 2) - specstats_f = list("strength" = -1, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 2) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm index e35417ff0d1..eeaab60e9e2 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = 1, "perception" = -2, "intelligence" = 0, "constitution" = 2, "endurance" = 2, "speed" = -3, "fortune" = 0) - specstats_f = list("strength" = 1, "perception" = -2, "intelligence" = 0, "constitution" = 2, "endurance" = 1, "speed" = -2, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" customizers = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm index 68d3ec141e5..b86461adb91 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm @@ -58,8 +58,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = -1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = -1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm index 42df77209cf..b38e9e2fd7e 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = -2, "perception" = 2, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 3, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 2, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 3, "fortune" = 0) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm index 6c966709f54..6d0caeeabbc 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,0), OFFSET_UNDIES_F = list(0,0), \ ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = -2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 0, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm index 4e5e65afd6d..98386fd0dfb 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm @@ -41,8 +41,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) - specstats_f = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" customizers = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm index f98bce0f654..71afffb2853 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm @@ -43,8 +43,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = -1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = -1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" customizers = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm index 97335315017..85cf493ee0c 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm @@ -28,24 +28,7 @@ mutant_bodyparts = list("tail_lizard", "snout", "frills", "spines", "body_markings") mutanttongue = /obj/item/organ/tongue/lizard mutanteyes = /obj/item/organ/eyes/night_vision/argonian - specstats = list( - "strength" = 0, - "perception" = 3, - "intelligence" = -3, - "constitution" = 0, - "endurance" = 1, - "speed" = 3, - "fortune" = -3, - ) - specstats_f = list( - "strength" = 0, - "perception" = 3, - "intelligence" = -3, - "constitution" = 0, - "endurance" = 1, - "speed" = 3, - "fortune" = -3, - ) + race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" /datum/species/lizard/brazil/on_species_gain(mob/living/carbon/C, datum/species/old_species) diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm index 9e8858eb65a..e8f589df256 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm @@ -44,8 +44,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = -1) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = -1) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm index a5c4244c657..2e7e4eef57a 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm @@ -42,8 +42,6 @@ OFFSET_FACE_F = list(0,1), OFFSET_BELT_F = list(0,1), OFFSET_BACK_F = list(0,1), \ OFFSET_NECK_F = list(0,1), OFFSET_MOUTH_F = list(0,1), OFFSET_PANTS_F = list(0,1), \ OFFSET_SHIRT_F = list(0,1), OFFSET_ARMOR_F = list(0,1), OFFSET_UNDIES_F = list(0,1)) - specstats = list("strength" = 2, "perception" = 1, "intelligence" = -1, "constitution" = 2, "endurance" = 2, "speed" = 0, "fortune" = -2) - specstats_f = list("strength" = 2, "perception" = 1, "intelligence" = -1, "constitution" = 2, "endurance" = 2, "speed" = 0, "fortune" = -2) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm index f7ccee5fc90..dd54f499f94 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm @@ -43,14 +43,8 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,0), \ ) - specstats = list( - "perception" = 1, - "intelligence" = 2, - "constitution" = -1, - "strength" = -2, - "speed" = 2, // 7? are you absolutely fucking insane? - "fortune" = 1 - ) + race_bonus = list(STAT_SPEED = 1) + enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm index ef06ac9683f..f1b5438d871 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm index b1cee320592..4e0c228f2bc 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm @@ -44,8 +44,6 @@ offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) soundpack_m = /datum/voicepack/werewolf soundpack_f = /datum/voicepack/werewolf - specstats = list("strength" = 8, "perception" = 7, "intelligence" = -6, "constitution" = 8, "endurance" = 8, "speed" = 3, "fortune" = 0) - specstats_f = list("strength" = 8, "perception" = 7, "intelligence" = -6, "constitution" = 8, "endurance" = 8, "speed" = 3, "fortune" = 0) race_bonus = list(STAT_STRENGTH = 8, STAT_PERCEPTION = 7, STAT_INTELLIGENCE = -6, STAT_CONSTITUTION = 8, STAT_ENDURANCE = 8, STAT_SPEED = 3) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm b/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm index 9e04c52634e..7533fa5e1b7 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm @@ -11,7 +11,7 @@ speak_chance = 1 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 4, /obj/item/natural/carapace = 2) - faction = list("crabs") + faction = list("neutral") food_type = list(/obj/item/reagent_containers/food/snacks) response_help_continuous = "pets" response_help_simple = "pet" diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index a18ad59e92b..36f53d4ebbd 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -1,42 +1,65 @@ //based on hearthstone sea raiders. -//funny modifications By Vide noir. +//By Vide noir. /mob/living/carbon/human/species/human/friendlynpc aggressive=1 + race = /datum/species/human/northern mode = AI_IDLE faction = list("Station") - bodyparts = list(/obj/item/bodypart/chest, /obj/item/bodypart/head, /obj/item/bodypart/l_arm, - /obj/item/bodypart/r_arm, /obj/item/bodypart/r_leg, /obj/item/bodypart/l_leg) ambushable = FALSE dodgetime = 30 flee_in_pain = TRUE possible_rmb_intents = list() - wander = TRUE erpable = TRUE + wander = TRUE + show_genitals = TRUE var/list/friendlyfactions = list("Station", "neutral") var/list/friendlyjobs //quotes from skyrim cause we love skyrim. var/list/calmmessages = list() var/list/aggromessages = list() + var/mob/living/lasthitter = null +//would be great if we could make them follow stone roads while idle. /mob/living/carbon/human/species/human/friendlynpc/should_target(mob/living/L) + if(L == src) + return FALSE if(L.stat != CONSCIOUS) return FALSE + if(L == lasthitter && L.alpha > 100) + return TRUE if(ishuman(L)) var/mob/living/carbon/human/madafaka = L + if(madafaka.Adjacent(src) && mode != AI_HUNT && madafaka.mind && madafaka.alpha > 100) + if(prob(10)) + face_atom(madafaka) + emote(pick("turns to [madafaka].", "faces [madafaka].")) + say(pick(calmmessages)) if(friendlyfactions) - if(friendlyfactions) - if(madafaka.faction[1] in friendlyfactions && target != madafaka) - return FALSE + if(madafaka.faction |= friendlyfactions && target != lasthitter) + return FALSE if(friendlyjobs) - if(madafaka.job in friendlyjobs && target != madafaka) + if(madafaka.job |= friendlyjobs && target != lasthitter) return FALSE - if(madafaka.Adjacent(src)) + . = ..() + +/mob/living/carbon/human/species/human/friendlynpc/Bump(atom/A) + . = ..() + if(ishuman(A)) + var/mob/living/carbon/human/L = A + if(lasthitter == L) + say("Wait, I know you..!") + if(L.alpha <= 100) + L.apply_status_effect(/datum/status_effect/debuff/stealthcd) + retaliate(L) + else + face_atom(L) + emote(pick("turns to [L].", "faces [L].")) if(prob(10)) say(pick(calmmessages)) - . = ..() /mob/living/carbon/human/species/human/friendlynpc/townguard + friendlyfactions = list("Station", "neutral") calmmessages = list( "Let me guess... someone stole your sweetroll.", "I used to be an adventurer like you. Then I took an arrow in the knee...", @@ -57,7 +80,6 @@ "I mostly deal with petty thievery and drunken brawls. Been too long since we've had a good bandit raid.", "What is it? Dragons?", "Watch the skies, traveler.", - "No matter what else happens, the guards will always be grateful for everything you've done.", "I fear the night. Because the werewolves and vampires don't.", "Just a few more hours and I can crawl under some furs...", ) @@ -72,6 +94,31 @@ "Fool!", "You will pay, with your blood!", ) + var/patrol = TRUE + var/lastpatroltime + +/mob/living/carbon/human/species/human/friendlynpc/townguard/npc_idle() + //im not smart enough to make a good patrol system but here. + if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && patrol) + if(prob(20)) + if(world.time > lastpatroltime + 10 SECONDS) //give em some time to reach and whatever + var/foundpatrolpoints + for(var/obj/effect/landmark/townpatrol/patrolpoint in orange(30,src)) + foundpatrolpoints += patrolpoint + if(foundpatrolpoints) + var/pickedpoint = get_closest_atom(/obj/effect/landmark/townpatrol, foundpatrolpoints, src) + if(pickedpoint) + walk2derpless(pickedpoint) + lastpatroltime = world.time + else + //make them randomly go to a distant tile thats not foilage, if there is no patrol landmark around + var/turf/open/T = oview(pick(7,13),src) //slightly more than half or full screen movement + if(!istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/floor/rogue/dirt) && !istype(T, /turf/open/floor/rogue/grass)) + Move(T) + . = ..() + +/obj/effect/landmark/townpatrol + name = "patrol-point" /mob/living/carbon/human/species/human/friendlynpc/townguard/brute @@ -81,6 +128,7 @@ /mob/living/carbon/human/species/human/friendlynpc/townguard/retaliate(mob/living/L) var/newtarg = target + lasthitter = target .=..() if(target) aggressive=1 @@ -90,8 +138,8 @@ linepoint(target) /mob/living/carbon/human/species/human/friendlynpc/townguard/Initialize() + gender = pick(MALE,FEMALE) . = ..() - set_species(/datum/species/elf) spawn(10) after_creation() //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) @@ -128,7 +176,7 @@ /mob/living/carbon/human/species/human/friendlynpc/townguard/handle_combat() if(mode == AI_HUNT) - if(prob(50)) + if(prob(20)) emote("rage") . = ..() @@ -140,19 +188,19 @@ armor = /obj/item/clothing/suit/roguetown/armor/plate/half/foresterarmor shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant if(prob(50)) - shirt = /obj/item/clothing/suit/roguetown/shirt/tunic + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail pants = /obj/item/clothing/under/roguetown/tights head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet H.STASPD = 8 H.STACON = 4 H.STAEND = 15 - H.STAINT = 1 + H.STAINT = 5 H.STASTR = rand(11,16) if(prob(50)) r_hand = /obj/item/rogueweapon/sword else - r_hand = /obj/item/rogueweapon/stoneaxe/battle - l_hand = /obj/item/rogueweapon/shield/wood + r_hand = /obj/item/rogueweapon/mace + l_hand = /obj/item/rogueweapon/shield/tower/metal shoes = /obj/item/clothing/shoes/roguetown/boots/forestershoes if(prob(30)) neck = /obj/item/clothing/neck/roguetown/chaincoif @@ -169,8 +217,8 @@ /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute/pre_equip(mob/living/carbon/human/H) wrists = /obj/item/clothing/wrists/roguetown/bracers cloak = /obj/item/clothing/cloak/templar/dendor - armor = /obj/item/clothing/suit/roguetown/armor/chainmail - shirt = /obj/item/clothing/suit/roguetown/shirt/tunic + armor = /obj/item/clothing/suit/roguetown/armor/plate/half + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail pants = /obj/item/clothing/under/roguetown/chainlegs head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings if(prob(60)) @@ -179,12 +227,45 @@ H.STASPD = 9 H.STACON = 8 H.STAEND = 15 - H.STAINT = 1 + H.STAINT = 5 H.STASTR = rand(15,18) if(prob(50)) r_hand = /obj/item/rogueweapon/halberd/bardiche else r_hand = /obj/item/rogueweapon/greatsword + l_hand = /obj/item/rogueweapon/shield/tower/metal + shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron + neck = /obj/item/clothing/neck/roguetown/chaincoif + if(H.gender == MALE) + H.name = pick( world.file2list("strings/rt/names/human/humnorm.txt") ) + H.real_name = H.name + else + H.name = pick( world.file2list("strings/rt/names/human/humnorf.txt") ) + H.real_name = H.name + +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry + patrol = FALSE + wander = FALSE + +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry/after_creation() + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/sentry) + +/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/sentry/pre_equip(mob/living/carbon/human/H) + wrists = /obj/item/clothing/wrists/roguetown/bracers + cloak = /obj/item/clothing/cloak/templar/dendor + armor = /obj/item/clothing/suit/roguetown/armor/plate/half + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail + pants = /obj/item/clothing/under/roguetown/chainlegs + head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings + if(prob(60)) + mask = /obj/item/clothing/mask/rogue/facemask + gloves = /obj/item/clothing/gloves/roguetown/chain + H.STASPD = 9 + H.STACON = 8 + H.STAEND = 15 + H.STAINT = 5 + H.STASTR = rand(15,18) + r_hand = /obj/item/rogueweapon/halberd shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron neck = /obj/item/clothing/neck/roguetown/chaincoif if(H.gender == MALE) From b0fd2cdb959ab4573e040edf9ee3330375847724 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 04:53:34 +0300 Subject: [PATCH 043/192] Update friendly_npc.dm --- .../living/simple_animal/rogue/friendly_npc.dm | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 36f53d4ebbd..e8995ac4a50 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -158,22 +158,6 @@ update_hair() update_body() -/mob/living/carbon/human/species/human/friendlynpc/townguard/npc_idle() - if(m_intent == MOVE_INTENT_SNEAK) - return - if(world.time < next_idle) - return - next_idle = world.time + rand(30, 70) - if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && wander) - if(prob(20)) - var/turf/T = get_step(loc,pick(GLOB.cardinals)) - if(!istype(T, /turf/open/transparent/openspace)) - Move(T) - else - face_atom(get_step(src,pick(GLOB.cardinals))) - if(!wander && prob(10)) - face_atom(get_step(src,pick(GLOB.cardinals))) - /mob/living/carbon/human/species/human/friendlynpc/townguard/handle_combat() if(mode == AI_HUNT) if(prob(20)) From 1c6e0d42a5eb10bb6f048f1a177137cd358c936a Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 05:03:08 +0300 Subject: [PATCH 044/192] a few more --- .../living/simple_animal/rogue/creacher/mudcrab.dm | 1 - .../living/simple_animal/rogue/simple_skeleton.dm | 4 ++-- .../mob/living/simple_animal/rogue/friendly_npc.dm | 12 ++++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm b/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm index 7533fa5e1b7..e4ad5714641 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm @@ -11,7 +11,6 @@ speak_chance = 1 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 4, /obj/item/natural/carapace = 2) - faction = list("neutral") food_type = list(/obj/item/reagent_containers/food/snacks) response_help_continuous = "pets" response_help_simple = "pet" diff --git a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm index 5f0bc81b1b7..77ecc306a4d 100644 --- a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm +++ b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm @@ -111,12 +111,12 @@ /mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry/CanAttack(atom/the_target, ignore_lying) if(ishuman(the_target)) var/mob/living/carbon/human/madafaka = the_target - if(madafaka.job in friendlyjobs) + if(madafaka.job |= friendlyjobs) return FALSE else //funny screaming if(prob(10)) - src.say(pick("I GOT YOU NOW MADAFFFAKA!!!", "I SEE A MADA-FFFFFFFFFFFFFAKAAAA HERE!!!!", "WHAT'CHU DOIN HERE MADAFFFFAKA!!!!", "ALERT!! MADAFFFFAKA SPOTTEEEEED!!!")) + src.say(pick("I GOT YOU NOW MADAFAKA!!!", "I SEE A MADA-FFFFFFFFFFFFFAKAAAA HERE!!!!", "WHAT'CHU DOIN HERE MADAFFFFAKA!!!!", "ALERT!! MADAFFFFAKA SPOTTEEEEED!!!")) . = ..() /mob/living/simple_animal/hostile/rogue/skeleton/guard/crypt_guard diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index e8995ac4a50..993bc7a31e8 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -1,5 +1,5 @@ -//based on hearthstone sea raiders. -//By Vide noir. +//By Vide Noir https://github.com/EaglePhntm. +//templated on hearthstone sea raiders. /mob/living/carbon/human/species/human/friendlynpc aggressive=1 @@ -13,7 +13,7 @@ erpable = TRUE wander = TRUE show_genitals = TRUE - var/list/friendlyfactions = list("Station", "neutral") + var/list/friendlyfactions = list("Station", "neutral", "rogueanimal") var/list/friendlyjobs //quotes from skyrim cause we love skyrim. var/list/calmmessages = list() @@ -43,10 +43,10 @@ return FALSE . = ..() -/mob/living/carbon/human/species/human/friendlynpc/Bump(atom/A) +/mob/living/carbon/human/species/human/friendlynpc/MobBump(mob/M) . = ..() - if(ishuman(A)) - var/mob/living/carbon/human/L = A + if(ishuman(M)) + var/mob/living/carbon/human/L = M if(lasthitter == L) say("Wait, I know you..!") if(L.alpha <= 100) From 5de3f1b19fe794a0470eb803b5294723f3153b6f Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Tue, 26 Nov 2024 02:57:37 -0800 Subject: [PATCH 045/192] Youngmaster (#118) * Youngmaster * Swordmaster * Better idea actually --- .../jobs/job_types/roguetown/church/grandmaster.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm index 19b84cc538a..36574378c9f 100644 --- a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm +++ b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm @@ -6,7 +6,7 @@ allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_CLERIC_PATRONS - allowed_ages = list(AGE_MIDDLEAGED, AGE_OLD) + allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED, AGE_OLD) outfit = /datum/outfit/job/roguetown/grandmaster min_pq = 5 max_pq = null @@ -22,7 +22,7 @@ ..() H.virginity = TRUE head = /obj/item/clothing/head/roguetown/helmet/heavy/bucket - neck = /obj/item/clothing/neck/roguetown/psicross/astrata + wrists = /obj/item/clothing/neck/roguetown/psicross/astrata cloak = /obj/item/clothing/cloak/templar/psydon switch(H.patron.name) if("Elysius") @@ -81,10 +81,10 @@ if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 4, TRUE) // actual ass, but worse. Good luck. + H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 5, TRUE) // Might be utterly disgusting. Good luck. H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) From 4fb2edeea1cd13bf0f48b3a869ee35c35d1ee712 Mon Sep 17 00:00:00 2001 From: Murderfox <47763263+Murderfoxen@users.noreply.github.com> Date: Tue, 26 Nov 2024 21:28:03 +1030 Subject: [PATCH 046/192] Making some light Magick (#117) * Making some light Magick This is a very small PR. It adds some light items of food to the guild kitchen, as well as some cheese to the mage academy basement. Beyond this the main aspect is changing the iron bars around the magic school to permanent magick forcefields on the windows! (looks much nicer. Tested it in game!) -- this was also given to the church windows. Because the luneites and magicians are quite good pals ICly! - Added some statues to the upper part of the lune church and also worked on the lower windows that had an issue being underwater. * Armory lever fix - Armory Lever HOTFIX --- _maps/map_files/dreamhold/Dreamhold.dmm | 268 +++++++++++++++++++----- 1 file changed, 217 insertions(+), 51 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index d7ed1bb9ad3..2a6c624b6d1 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -1978,6 +1978,10 @@ /area/rogue/under/cavewet/bogcaves) "bxo" = ( /obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this." + }, /turf/open/water/swamp/deep, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -2075,6 +2079,8 @@ }) "bCD" = ( /obj/structure/closet/crate/roguecloset, +/obj/item/reagent_containers/glass/bottle/rogue/paralysispot, +/obj/item/reagent_containers/glass/bottle/rogue/soporpot, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/library) "bCN" = ( @@ -3661,6 +3667,13 @@ /obj/item/book/granter/spell/spells5e/boomingblade5e, /obj/item/book/granter/spell/spells5e/chilltouch5e, /obj/item/book/granter/spell/spells5e/bladeward5e, +/obj/structure/trap/fire{ + icon_state = "ward-red" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this." + }, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/library) "cTJ" = ( @@ -3675,7 +3688,16 @@ }) "cTS" = ( /obj/structure/roguewindow/openclose, -/obj/structure/bars/steel, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -4074,6 +4096,16 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"dgn" = ( +/obj/structure/fluff/statue/gargoyle/moss, +/obj/structure/fluff/railing/border{ + dir = 8 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dgA" = ( /obj/item/natural/rock/cinnabar, /turf/open/floor/rogue/naturalstone, @@ -4200,6 +4232,9 @@ dir = 1; icon_state = "longtable" }, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, /turf/open/floor/rogue/blocks/stonered/tiny, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -4385,7 +4420,16 @@ /obj/structure/roguewindow/openclose{ dir = 4 }, -/obj/structure/bars/steel, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -6365,6 +6409,11 @@ /obj/structure/roguewindow/stained/silver{ opacity = 0 }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors/river) "ePk" = ( @@ -9240,7 +9289,11 @@ /obj/structure/roguewindow/stained/silver{ opacity = 0 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/twig, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -9288,7 +9341,16 @@ /obj/structure/roguewindow/openclose{ dir = 1 }, -/obj/structure/bars/steel, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -9889,6 +9951,8 @@ "hGM" = ( /obj/structure/closet/crate/roguecloset/dark, /obj/item/book/granter/spell/spells5e/mending5e, +/obj/item/reagent_containers/food/snacks/store/cheesewheel, +/obj/item/reagent_containers/food/snacks/rogue/cheddar/aged, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -11537,6 +11601,8 @@ /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, +/obj/item/reagent_containers/glass/bottle/rogue/swiftnesspot, +/obj/item/reagent_containers/glass/bottle/rogue/virilitypot, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/library) "iYe" = ( @@ -11993,6 +12059,25 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"jtN" = ( +/obj/structure/roguewindow/openclose{ + dir = 4 + }, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) "jud" = ( /obj/structure/flora/roguegrass/bush, /obj/structure/flora/grass/jungle/b, @@ -13045,7 +13130,16 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/magiciantower{ first_time_text = "Ravenloft Academy"; @@ -13204,6 +13298,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"kiG" = ( +/obj/structure/trap/fire{ + icon_state = "ward-red" + }, +/turf/open/water/swamp, +/area/rogue/outdoors/caves) "kjh" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -13369,6 +13469,9 @@ "kpm" = ( /obj/structure/closet/crate/chest, /obj/item/cooking/pan, +/obj/item/kitchen/rollingpin, +/obj/item/rogueweapon/huntingknife/stoneknife, +/obj/item/rogueweapon/huntingknife/stoneknife, /turf/open/floor/rogue/blocks/stonered/tiny, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -13829,6 +13932,8 @@ }) "kHF" = ( /obj/structure/closet/crate/chest, +/obj/item/reagent_containers/glass/bottle/rogue/fortitudepot, +/obj/item/reagent_containers/glass/bottle/rogue/luckpot, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/library) "kHH" = ( @@ -15551,6 +15656,11 @@ /obj/structure/roguewindow/stained/silver{ opacity = 0 }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/transparent/openspace, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -17089,8 +17199,10 @@ name = "Silver Dragon" }) "nmf" = ( -/obj/structure/winch{ - redstone_id = "Advarmory" +/obj/structure/lever/wall{ + dir = 4; + redstone_id = "Advarmory"; + name = "Armory" }, /turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ @@ -17742,12 +17854,11 @@ /turf/open/floor/rogue/blocks/green, /area/rogue/outdoors/river) "nLN" = ( -/obj/structure/roguewindow/openclose, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/magician{ - first_time_text = "Ravenloft Academy"; - name = "Ravenloft Academy" - }) +/obj/structure/trap/fire{ + icon_state = "ward-red" + }, +/turf/open/water/swamp/deep, +/area/rogue/outdoors/caves) "nLS" = ( /obj/structure/chair/bench/church/smallbench{ dir = 8 @@ -18551,6 +18662,10 @@ /area/rogue/outdoors/river) "oxl" = ( /obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this." + }, /turf/open/water/swamp, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -22691,6 +22806,12 @@ name = "Seawater" }, /area/rogue) +"rBs" = ( +/obj/structure/trap/fire{ + icon_state = "ward-red" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/caves) "rCh" = ( /obj/structure/closet/crate/roguecloset/inn/chest, /obj/item/storage/backpack/rogue/backpack/surgery, @@ -22842,6 +22963,8 @@ /obj/structure/table/wood{ icon_state = "tablewood1" }, +/obj/item/paper/scroll, +/obj/item/natural/feather, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/library) "rHx" = ( @@ -23167,10 +23290,20 @@ name = "far stonehedge" }) "rUO" = ( +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, /obj/structure/roguewindow/openclose{ - dir = 1 + dir = 4 }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; name = "Ravenloft Academy" @@ -23354,6 +23487,16 @@ /area/rogue/indoors/town/bath) "sdh" = ( /obj/structure/roguewindow, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -28283,6 +28426,16 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"vXN" = ( +/obj/structure/fluff/statue/gargoyle/moss, +/obj/structure/fluff/railing/border{ + dir = 4 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "vYA" = ( /obj/machinery/loom, /turf/open/floor/rogue/ruinedwood/spiral, @@ -29144,7 +29297,16 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -29632,6 +29794,11 @@ /obj/structure/roguewindow/stained/silver{ opacity = 0 }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -30502,14 +30669,13 @@ name = "Adventurers Guild" }) "xQn" = ( -/obj/structure/roguewindow/stained/silver{ - opacity = 0 +/obj/structure/table/wood{ + icon_state = "tablewood1" }, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) +/obj/item/natural/feather, +/obj/item/paper/scroll, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/town/library) "xQE" = ( /obj/structure/flora/ausbushes/stalkybush, /obj/structure/fluff/statue/femalestatue{ @@ -75789,12 +75955,12 @@ rxm rxm cgq foa -jrB +kiG jrB uCB reE reV -jrB +kiG aby cgq lyF @@ -75993,7 +76159,7 @@ cgq jrB uCB uCB -stf +nLN stf jrB jrB @@ -78003,7 +78169,7 @@ dRe stf stf stf -jrB +kiG uCB vYC ifi @@ -78203,17 +78369,17 @@ stf dRe ifa stf -stf +nLN jrB stf stf -ifi +rBs nVt nVt nVt nVt jrB -jrB +kiG nVt nVt nVt @@ -78609,14 +78775,14 @@ stf jrB stf jrB -ifi +rBs rxm nVt nVt nVt nVt nVt -jrB +kiG jrB nVt nVt @@ -78820,7 +78986,7 @@ nVt nVt rxm jrB -jrB +kiG jrB nVt nVt @@ -110733,11 +110899,11 @@ vLX vLX vLX vLX +jtN lVD +jtN lVD -lVD -lVD -lVD +rUO rvO vLX vLX @@ -119405,9 +119571,9 @@ tax sfZ kan icP -xQn +xis icP -xQn +xis tax wsc jLy @@ -120213,9 +120379,9 @@ cal kan sfZ icP -xQn +xis icP -xQn +xis cal icP jLy @@ -146698,7 +146864,7 @@ eFM eFM eFM iqN -rHo +xQn hjD egl egl @@ -146899,7 +147065,7 @@ sOt rlO eFQ uHl -iqN +eFQ tIR vLX egl @@ -147102,7 +147268,7 @@ oXq eFQ eFQ iqN -rHo +xQn hjD egl egl @@ -148099,11 +148265,11 @@ aZy aZy mYC egl -nLN +cTS lwf lwi lwf -rUO +hjD egl egl egl @@ -148705,11 +148871,11 @@ aZy aZy mYC egl -nLN +cTS lwf lwi lwf -rUO +hjD egl egl egl @@ -154352,9 +154518,9 @@ mPW kan wFA icP -mfc +dgn icP -mfc +dgn iYC icP rsg @@ -155160,9 +155326,9 @@ mPW rsg wFA icP -mfc +vXN icP -mfc +vXN ghn wsc sfZ From 437c4f79b455692c078f5897b8efcaa6ca24ecc2 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 20:00:46 +0300 Subject: [PATCH 047/192] fml --- code/controllers/subsystem/vote.dm | 2 +- code/datums/gods/_patron.dm | 2 +- code/game/gamemodes/roguetown/chaosmode.dm | 6 +++--- code/game/gamemodes/roguetown/roguetown.dm | 15 ++++++--------- code/game/objects/effects/landmarks.dm | 2 +- code/game/objects/items/rogueitems/books.dm | 2 +- code/game/objects/items/rogueitems/keys.dm | 2 +- code/game/objects/structures/fluff.dm | 2 +- code/modules/admin/verbs/pray.dm | 2 +- .../antagonists/roguetown/villain/vampirelord.dm | 2 +- code/modules/client/preferences.dm | 2 +- code/modules/clothing/rogueclothes/hats.dm | 2 +- code/modules/clothing/rogueclothes/wrists.dm | 15 +++++++-------- .../jobs/job_types/roguetown/church/priest.dm | 10 +++++----- code/modules/jobs/jobs.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 6 +++--- code/modules/roguetown/roguemachine/mail.dm | 2 +- code/modules/shuttle/supply.dm | 4 ++-- .../living/simple_animal/rogue/friendly_npc.dm | 14 +++++++------- 19 files changed, 45 insertions(+), 49 deletions(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 92e78c4e653..fe8e7f9d81d 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -184,7 +184,7 @@ SUBSYSTEM_DEF(vote) if(H.stat != DEAD) vote_power += 3 if(H.job) - var/list/list_of_powerful = list("Monarch", "Consort", "Prophet", "Steward", "Hand") + var/list/list_of_powerful = list("Monarch", "Consort", "Archpriest", "Guildmaster", "Guild Appraiser", "Hand") if(H.job in list_of_powerful) vote_power += 5 else diff --git a/code/datums/gods/_patron.dm b/code/datums/gods/_patron.dm index f73b9b39d35..da070e5c703 100644 --- a/code/datums/gods/_patron.dm +++ b/code/datums/gods/_patron.dm @@ -1,5 +1,5 @@ #define CLERIC_SPELLS "Priest" -#define PRIEST_SPELLS "Prophet" +#define PRIEST_SPELLS "Archpriest" GLOBAL_LIST_EMPTY(patronlist) GLOBAL_LIST_EMPTY(patrons_by_faith) diff --git a/code/game/gamemodes/roguetown/chaosmode.dm b/code/game/gamemodes/roguetown/chaosmode.dm index 44ecdac6d44..dbed3c04287 100644 --- a/code/game/gamemodes/roguetown/chaosmode.dm +++ b/code/game/gamemodes/roguetown/chaosmode.dm @@ -168,7 +168,7 @@ restricted_jobs = list("Monarch", "Queen", "Merchant", - "Prophet") + "Archpriest") var/num_bandits = 0 if(num_players() >= 10) num_bandits = CLAMP(round(num_players() / 2), 1, 5) @@ -270,7 +270,7 @@ restricted_jobs = list() /datum/game_mode/chaosmode/proc/pick_vampires() - restricted_jobs = list("Priest","Prophet","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") + restricted_jobs = list("Priest","Archpriest","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") /* var/num_vampires = rand(1,3) #ifdef TESTSERVER num_vampires = 100 @@ -297,7 +297,7 @@ restricted_jobs = list() /datum/game_mode/chaosmode/proc/pick_werewolves() - restricted_jobs = list("Priest","Prophet","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") + restricted_jobs = list("Priest","Archpriest","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") /* var/num_werewolves = rand(1,3) #ifdef TESTSERVER num_werewolves = 100 diff --git a/code/game/gamemodes/roguetown/roguetown.dm b/code/game/gamemodes/roguetown/roguetown.dm index a4ea4ddc3c0..12b7a35d508 100644 --- a/code/game/gamemodes/roguetown/roguetown.dm +++ b/code/game/gamemodes/roguetown/roguetown.dm @@ -183,13 +183,10 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E if(77 to 99) log_game("Major Antagonist: Extended") //gotta put something here. */ - if(0 to 25) - pick_cultist() - log_game("Major Antagonist: Cultists") - if(26 to 51) + if(0 to 50) pick_werewolves() log_game("Major Antagonist: Werewolves and Vampires") - if(52 to 99) + if(51 to 99) log_game("Major Antagonist: Extended") //gotta put something here. pick_bandits() log_game("Minor Antagonist: Bandit") @@ -214,7 +211,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E restricted_jobs = list("Monarch", "Consort", "Merchant Prince", - "Prophet", + "Archpriest", "Knight") var/num_bandits = 0 if(num_players() >= 10) @@ -414,7 +411,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E restricted_jobs = list( "Monarch", "Consort", - "Prophet", + "Archpriest", "Wytcher", "Hedgeknight", "Hedgemaster", @@ -450,7 +447,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E "Confessor", "Watchman", "Man at Arms", - "Prophet", + "Archpriest", "Watchmen Captain", "Magician", "Paladin", @@ -499,7 +496,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E "Confessor", "Watchman", "Man at Arms", - "Prophet", + "Archpriest", "Watchmen Captain", "Magician", "Paladin", diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index c67a2405f7b..603d42a0179 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -241,7 +241,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/priest - name = "Prophet" + name = "Archpriest" icon_state = "arrow" /obj/effect/landmark/start/cleric diff --git a/code/game/objects/items/rogueitems/books.dm b/code/game/objects/items/rogueitems/books.dm index 6a49b2e1774..867336a5917 100644 --- a/code/game/objects/items/rogueitems/books.dm +++ b/code/game/objects/items/rogueitems/books.dm @@ -203,7 +203,7 @@ user.say(m) /obj/item/book/rogue/bibble/attack(mob/living/M, mob/user) - if(user.mind && user.mind.assigned_role == "Prophet") + if(user.mind && user.mind.assigned_role == "Archpriest") if(!user.can_read(src)) to_chat(user, span_warning("I don't understand these scribbly black lines.")) return diff --git a/code/game/objects/items/rogueitems/keys.dm b/code/game/objects/items/rogueitems/keys.dm index 7861608037b..c580c449536 100644 --- a/code/game/objects/items/rogueitems/keys.dm +++ b/code/game/objects/items/rogueitems/keys.dm @@ -269,7 +269,7 @@ name = "priest's key" desc = "This is the master key of the church." icon_state = "cheesekey" - lockid = "Prophet" + lockid = "Archpriest" /obj/item/roguekey/tower name = "tower key" diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index d85afb1edc4..ba52d565d9e 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -1232,7 +1232,7 @@ /obj/structure/fluff/psycross/attackby(obj/item/W, mob/user, params) if(user.mind) - if(user.mind.assigned_role == "Prophet") + if(user.mind.assigned_role == "Archpriest") if(istype(W, /obj/item/reagent_containers/food/snacks/grown/apple)) if(!istype(get_area(user), /area/rogue/indoors/town/church/chapel)) to_chat(user, span_warning("I need to do this in the chapel.")) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 72d8c783874..45e73a0ee03 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -51,7 +51,7 @@ if(C.prefs.chat_toggles & CHAT_PRAYER) to_chat(C, msg) if(C.prefs.toggles & SOUND_PRAYERS) - if(usr.job == "Prophet") + if(usr.job == "Archpriest") SEND_SOUND(C, sound('sound/pray.ogg')) for(var/mob/M in GLOB.dead_mob_list) diff --git a/code/modules/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm index 080f1e67d37..ba1858f1123 100644 --- a/code/modules/antagonists/roguetown/villain/vampirelord.dm +++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm @@ -933,7 +933,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) /datum/objective/vampirelord/infiltrate/one/check_completion() var/datum/game_mode/chaosmode/C = SSticker.mode - var/list/churchjobs = list("Prophet", "Priestess", "Priest", "Priest", "Paladin", "Churchling", "Crusader", "Grandmaster", "Witcher") + var/list/churchjobs = list("Archpriest", "Archpriestess", "Cleric", "Wytcher Captain", "Paladin", "Churchling", "Crusader", "Grandmaster", "Wytcher") for(var/datum/mind/V in C.vampires) if(V.current.job in churchjobs) return TRUE diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c6f6c59f1b5..b14e189c9bd 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -781,7 +781,7 @@ GLOBAL_LIST_EMPTY(chosen_names) popup.open(FALSE) onclose(user, "capturekeypress", src) -/datum/preferences/proc/SetChoices(mob/user, limit = 15, list/splitJobs = list("Watchmen Captain", "Prophet", "Merchant Prince", "Archivist", "Nightmaster", "Towner", "Grenzelhoft Mercenary", "Low Life", "Prisoner", "Chieftain"), widthPerColumn = 295, height = 620) //295 620 +/datum/preferences/proc/SetChoices(mob/user, limit = 15, list/splitJobs = list("Watchmen Captain", "Archpriest", "Merchant Prince", "Archivist", "Nightmaster", "Towner", "Grenzelhoft Mercenary", "Low Life", "Prisoner", "Chieftain"), widthPerColumn = 295, height = 620) //295 620 if(!SSjob) return diff --git a/code/modules/clothing/rogueclothes/hats.dm b/code/modules/clothing/rogueclothes/hats.dm index 21a48c82d94..72b41128bd3 100644 --- a/code/modules/clothing/rogueclothes/hats.dm +++ b/code/modules/clothing/rogueclothes/hats.dm @@ -518,7 +518,7 @@ /obj/item/clothing/head/roguetown/priesthat name = "priest's hat" desc = "" - icon_state = "Prophet" + icon_state = "Archpriest" //dropshrink = 0 mob_overlay_icon = 'icons/roguetown/clothing/onmob/64x64/head.dmi' dynamic_hair_suffix = "+generic" diff --git a/code/modules/clothing/rogueclothes/wrists.dm b/code/modules/clothing/rogueclothes/wrists.dm index a104d186762..5a5d62f0c4b 100644 --- a/code/modules/clothing/rogueclothes/wrists.dm +++ b/code/modules/clothing/rogueclothes/wrists.dm @@ -106,7 +106,7 @@ /obj/item/clothing/wrists/roguetown/hiddenblade name = "leather bracers" - desc = "Leather bracers worn on the wrists... With a hidden blade within." + desc = "Leather bracers worn on the wrists... With a contraption within." body_parts_covered = ARMS icon_state = "lbracers" item_state = "lbracers" @@ -117,7 +117,7 @@ sewrepair = TRUE smeltresult = /obj/item/ingot/steel var/extended = FALSE - var/obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden/hid + var/obj/item/rogueweapon/huntingknife/idagger/steel/hidden/hid /obj/item/clothing/wrists/roguetown/hiddenblade/dropped(mob/user) . = ..() @@ -128,14 +128,14 @@ toggleblades(user) /obj/item/clothing/wrists/roguetown/hiddenblade/attackby(obj/A, mob/living/carbon/human/user, params) - if(src == user.get_item_by_slot(SLOT_WRISTS) && (istype(A, /obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden) || !A)) //blade or empty hand. + if(src == user.get_item_by_slot(SLOT_WRISTS) && (istype(A, /obj/item/rogueweapon/huntingknife/idagger/steel/hidden) || !A)) //blade or empty hand. toggleblades(user) - return ..() + . = ..() /obj/item/clothing/wrists/roguetown/hiddenblade/proc/toggleblades(mob/user) if(extended) - if(istype(user.get_active_held_item(), /obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden)) + if(istype(user.get_active_held_item(), /obj/item/rogueweapon/huntingknife/idagger/steel/hidden)) user.dropItemToGround(hid, TRUE) user.visible_message("A blade retracts into [user]'s bracer.", "My hidden blade retracts into my bracer.") extended = FALSE @@ -148,10 +148,9 @@ user.put_in_hands(hid, TRUE, FALSE, TRUE) user.visible_message("A blade ejects out from [user]'s bracer.", "My hidden blade ejects out of my bracer.") extended = TRUE - ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) - + //ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) -/obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden +/obj/item/rogueweapon/huntingknife/idagger/steel/hidden name = "hidden blade" desc = "" embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 0, "embedded_fall_chance" = 0) diff --git a/code/modules/jobs/job_types/roguetown/church/priest.dm b/code/modules/jobs/job_types/roguetown/church/priest.dm index d44cbfcdc69..5dd4f8f72e9 100644 --- a/code/modules/jobs/job_types/roguetown/church/priest.dm +++ b/code/modules/jobs/job_types/roguetown/church/priest.dm @@ -1,12 +1,12 @@ /datum/job/roguetown/priest - title = "Prophet" + title = "Archpriest" flag = PRIEST department_flag = CHURCHMEN faction = "Station" total_positions = 5 spawn_positions = 5 selection_color = JCOLOR_CHURCH - f_title = "Prophetess" + f_title = "Archpriestess" allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_DIVINE_PATRONS allowed_sexes = list(MALE, FEMALE) @@ -72,7 +72,7 @@ /mob/living/carbon/human/proc/coronate_lord() set name = "Coronate" - set category = "Prophet" + set category = "Archpriest" if(!mind) return if(!istype(get_area(src), /area/rogue/indoors/town/church/chapel)) @@ -118,7 +118,7 @@ /mob/living/carbon/human/proc/churchexcommunicate() set name = "Curse" - set category = "Prophet" + set category = "Archpriest" if(stat) return var/inputty = input("Curse someone... (curse them again to remove it)", "Sinner Name") as text|null @@ -150,7 +150,7 @@ /mob/living/carbon/human/proc/churchannouncement() set name = "Announcement" - set category = "Prophet" + set category = "Archpriest" if(!COOLDOWN_FINISHED(src, church_announcement)) to_chat(src, span_warning("I should wait...")) diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index 5e5908d577d..eb9e01bcc8e 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(garrison_positions, list( )) GLOBAL_LIST_INIT(church_positions, list( - "Prophet", + "Archpriest", "Wytcher Captain", "Confessor", "Gravesinger", diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 87769b97753..6ee4fb826c6 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -112,11 +112,11 @@ for(var/mob/living/carbon/human/HU in GLOB.player_list) if(!HU.stat && is_in_roguetown(HU)) HU.playsound_local(get_turf(HU), 'sound/music/lorddeath.ogg', 80, FALSE, pressure_affected = FALSE) - if("Prophet") + if("Archpriest") addomen(OMEN_NOPRIEST) // if(yeae) // if(mind) -// if((mind.assigned_role == "Lord") || (mind.assigned_role == "Prophet") || (mind.assigned_role == "Watchmen Captain") || (mind.assigned_role == "Merchant")) +// if((mind.assigned_role == "Lord") || (mind.assigned_role == "Archpriest") || (mind.assigned_role == "Watchmen Captain") || (mind.assigned_role == "Merchant")) // addomen(OMEN_NOBLEDEATH) if(!gibbed && yeae) @@ -158,7 +158,7 @@ switch(job) if("Monarch") removeomen(OMEN_NOLORD) - if("Prophet") + if("Archpriest") removeomen(OMEN_NOPRIEST) /mob/living/carbon/human/gib(no_brain, no_organs, no_bodyparts, safe_gib = FALSE) diff --git a/code/modules/roguetown/roguemachine/mail.dm b/code/modules/roguetown/roguemachine/mail.dm index a1eb092df8a..af8788694c2 100644 --- a/code/modules/roguetown/roguemachine/mail.dm +++ b/code/modules/roguetown/roguemachine/mail.dm @@ -117,7 +117,7 @@ GLOB.confessors += "[C.signed]" qdel(C) visible_message(span_warning("[user] sends something.")) - send_ooc_note("Confessions: [GLOB.confessors.len]/5", job = list("confessor", "Witcher", "Prophet")) + send_ooc_note("Confessions: [GLOB.confessors.len]/5", job = list("confessor", "Witcher", "Archpriest")) playsound(loc, 'sound/magic/hallelujah.ogg', 100, FALSE, -1) playsound(loc, 'sound/misc/disposalflush.ogg', 100, FALSE, -1) return diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 0e330beae9b..4ce22e981ae 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -223,7 +223,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( if(!AM.anchored || istype(AM, /obj/mecha)) if(istype(AM, /obj/item/paper/scroll/cargo)) var/obj/item/paper/scroll/cargo/C = AM - if(C.signedjob in list("Prophet", "Magician", "Merchant Prince", "Monarch", "Commander","Judge")) + if(C.signedjob in list("Archpriest", "Magician", "Merchant Prince", "Monarch", "Commander","Judge")) for(var/datum/supply_order/SO in C.orders) SSshuttle.shoppinglist += SO C.orders -= SO @@ -236,7 +236,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( continue if(istype(thing, /obj/item/paper/scroll/cargo)) var/obj/item/paper/scroll/cargo/C = AM - if(C.signedjob in list("Prophet", "Magician", "Merchant Prince", "Monarch", "Commander","Judge")) + if(C.signedjob in list("Archpriest", "Magician", "Merchant Prince", "Monarch", "Commander","Judge")) for(var/datum/supply_order/SO in C.orders) SSshuttle.shoppinglist += SO C.orders -= SO diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 993bc7a31e8..7ad3d2e91e7 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -3,7 +3,7 @@ /mob/living/carbon/human/species/human/friendlynpc aggressive=1 - race = /datum/species/human/northern + race = /datum/species/elf/wood mode = AI_IDLE faction = list("Station") ambushable = FALSE @@ -192,10 +192,10 @@ H.hair_color = pick ("4f4f4f", "61310f", "faf6b9") H.facial_hair_color = H.hair_color if(H.gender == MALE) - H.name = pick( world.file2list("strings/rt/names/human/humnorm.txt") ) + H.name = pick( world.file2list("strings/rt/names/elf/elfwm.txt") ) H.real_name = H.name else - H.name = pick( world.file2list("strings/rt/names/human/humnorf.txt") ) + H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) H.real_name = H.name /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute/pre_equip(mob/living/carbon/human/H) @@ -221,10 +221,10 @@ shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron neck = /obj/item/clothing/neck/roguetown/chaincoif if(H.gender == MALE) - H.name = pick( world.file2list("strings/rt/names/human/humnorm.txt") ) + H.name = pick( world.file2list("strings/rt/names/elf/elfwm.txt") ) H.real_name = H.name else - H.name = pick( world.file2list("strings/rt/names/human/humnorf.txt") ) + H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) H.real_name = H.name /mob/living/carbon/human/species/human/friendlynpc/townguard/sentry @@ -253,8 +253,8 @@ shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron neck = /obj/item/clothing/neck/roguetown/chaincoif if(H.gender == MALE) - H.name = pick( world.file2list("strings/rt/names/human/humnorm.txt") ) + H.name = pick( world.file2list("strings/rt/names/elf/elfwm.txt") ) H.real_name = H.name else - H.name = pick( world.file2list("strings/rt/names/human/humnorf.txt") ) + H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) H.real_name = H.name From c866d75db6ba38b16a9108dbccbb3e3cdcf92406 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 21:52:33 +0300 Subject: [PATCH 048/192] done ig --- .../controllers/subsystem/rogue/seelie_tab.dm | 2 -- .../species_types/roguetown/other/seelie.dm | 6 ++-- .../simple_animal/rogue/friendly_npc.dm | 33 ++++++++++++++----- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/code/controllers/subsystem/rogue/seelie_tab.dm b/code/controllers/subsystem/rogue/seelie_tab.dm index 7dc5db73d9e..840fb3bba78 100644 --- a/code/controllers/subsystem/rogue/seelie_tab.dm +++ b/code/controllers/subsystem/rogue/seelie_tab.dm @@ -23,8 +23,6 @@ if(TRUE) to_chat(src, span_warning("My aura is now one of misery")) User.aura = FALSE - src.log_message("[key_name(src)] has switched their aura to apply bad luck") if(FALSE) to_chat(src, span_warning("My aura is now one of blessing")) User.aura = TRUE - src.log_message("[key_name(src)] has switched their aura to apply good luck") diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm index dd54f499f94..2f0bf9713fa 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm @@ -17,7 +17,7 @@ //gender = FEMALE species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,STUBBLE,OLDGREY) //Default shit that ever race gets - inherent_traits = list(TRAIT_NOMOBSWAP, TRAIT_EASYDISMEMBER, TRAIT_CRITICAL_WEAKNESS) //Use this to add custom Fae traits + inherent_traits = list(TRAIT_NOMOBSWAP, TRAIT_EASYDISMEMBER, TRAIT_CRITICAL_WEAKNESS, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_ZJUMP, TRAIT_DODGEEXPERT) //Use this to add custom Fae traits default_features = MANDATORY_FEATURE_LIST use_skintones = 1 skinned_type = /obj/item/stack/sheet/animalhide/human @@ -98,7 +98,7 @@ C.transform = C.transform.Scale(0.5, 0.5) C.update_transform() C.pass_flags = PASSTABLE | PASSMOB - //C.movement_type = FLYING + C.movement_type = FLYING C.set_mob_offsets("pixie_hover", _x = 0, _y = 10) C.set_light(3, 1, "#d4fcac") @@ -117,7 +117,7 @@ C.update_transform() C.pass_flags = 0 C.reset_offsets("pixie_hover") - //C.movement_type = (C.movement_type | ~FLYING) + C.movement_type = (C.movement_type | ~FLYING) //C.Jitter(0) C.set_light(0, 0, null) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 7ad3d2e91e7..844428d0016 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -26,6 +26,17 @@ return FALSE if(L.stat != CONSCIOUS) return FALSE + if(L.lying && !L.get_active_held_item()) + if(ishuman(L)) + var/mob/living/carbon/human/badboi = L + if(badboi == lasthitter && Adjacent(badboi) && !badboi.handcuffed) + //untested but yeah. + say("I got you now, criminal scum.") + scom_announce("I caught the criminal scum [badboi.real_name] at [get_area(src)].") + var/obj/item/rope/ropey = new /obj/item/rope + ropey.apply_cuffs(badboi, src) + start_pulling(badboi) + return FALSE if(L == lasthitter && L.alpha > 100) return TRUE if(ishuman(L)) @@ -44,7 +55,6 @@ . = ..() /mob/living/carbon/human/species/human/friendlynpc/MobBump(mob/M) - . = ..() if(ishuman(M)) var/mob/living/carbon/human/L = M if(lasthitter == L) @@ -57,6 +67,7 @@ emote(pick("turns to [L].", "faces [L].")) if(prob(10)) say(pick(calmmessages)) + . = ..() /mob/living/carbon/human/species/human/friendlynpc/townguard friendlyfactions = list("Station", "neutral") @@ -97,7 +108,10 @@ var/patrol = TRUE var/lastpatroltime +//this does not work for some reason unfortunately +/* /mob/living/carbon/human/species/human/friendlynpc/townguard/npc_idle() + . = ..() //im not smart enough to make a good patrol system but here. if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && patrol) if(prob(20)) @@ -112,13 +126,13 @@ lastpatroltime = world.time else //make them randomly go to a distant tile thats not foilage, if there is no patrol landmark around - var/turf/open/T = oview(pick(7,13),src) //slightly more than half or full screen movement + var/turf/open/T = oview(pick(13,24),src) if(!istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/floor/rogue/dirt) && !istype(T, /turf/open/floor/rogue/grass)) - Move(T) - . = ..() + walk2derpless(T) /obj/effect/landmark/townpatrol name = "patrol-point" +*/ /mob/living/carbon/human/species/human/friendlynpc/townguard/brute @@ -133,7 +147,7 @@ if(target) aggressive=1 wander = TRUE - if(target != newtarg) + if(target == newtarg) say(pick(aggromessages)) linepoint(target) @@ -151,8 +165,10 @@ ADD_TRAIT(src, TRAIT_NOHUNGER, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_BOG_TREKKING, TRAIT_GENERIC) equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard) - var/obj/item/organ/eyes/organ_eyes = getorgan(/obj/item/organ/eyes) + var/obj/item/organ/eyes/organ_eyes = getorgan(/obj/item/organ/eyes/night_vision/full_darksight) //elf eyes if(organ_eyes) organ_eyes.eye_color = pick("27becc", "35cc27", "000000") update_hair() @@ -160,7 +176,7 @@ /mob/living/carbon/human/species/human/friendlynpc/townguard/handle_combat() if(mode == AI_HUNT) - if(prob(20)) + if(prob(10)) emote("rage") . = ..() @@ -184,7 +200,7 @@ r_hand = /obj/item/rogueweapon/sword else r_hand = /obj/item/rogueweapon/mace - l_hand = /obj/item/rogueweapon/shield/tower/metal + l_hand = /obj/item/rogueweapon/shield/tower shoes = /obj/item/clothing/shoes/roguetown/boots/forestershoes if(prob(30)) neck = /obj/item/clothing/neck/roguetown/chaincoif @@ -217,7 +233,6 @@ r_hand = /obj/item/rogueweapon/halberd/bardiche else r_hand = /obj/item/rogueweapon/greatsword - l_hand = /obj/item/rogueweapon/shield/tower/metal shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron neck = /obj/item/clothing/neck/roguetown/chaincoif if(H.gender == MALE) From 0dac85dfeec8bdc2c36b9c4a0f9a1cd0fb4668ee Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 22:00:36 +0300 Subject: [PATCH 049/192] Update role_preferences.dm --- code/__DEFINES/role_preferences.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index e6455c6737e..3251e18b383 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -72,12 +72,12 @@ GLOBAL_LIST_INIT(special_roles, list( )) GLOBAL_LIST_INIT(special_roles_rogue, list( - ROLE_MANIAC = /datum/antagonist/maniac, - ROLE_PREBEL = /datum/antagonist/prebel, +// ROLE_MANIAC = /datum/antagonist/maniac, +// ROLE_PREBEL = /datum/antagonist/prebel, ROLE_BANDIT = /datum/antagonist/bandit, - ROLE_ASPIRANT = /datum/antagonist/aspirant, +// ROLE_ASPIRANT = /datum/antagonist/aspirant, ROLE_WEREWOLF = /datum/antagonist/werewolf, - ROLE_ZIZOIDCULTIST = /datum/antagonist/zizocultist, +// ROLE_ZIZOIDCULTIST = /datum/antagonist/zizocultist, ROLE_NBEAST = /datum/antagonist/vampirelord, ROLE_LICH = /datum/antagonist/lich )) From c0cbb4acb17888362c36bd4b7acd53824e1d4c61 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 22:47:47 +0300 Subject: [PATCH 050/192] few things more --- code/game/objects/effects/glowshroom.dm | 7 +++++++ .../roguetown/roguecrafting/alchemy.dm | 14 +++++++++++++ code/modules/roguetown/roguecrafting/items.dm | 20 ------------------- .../roguetown/roguejobs/gravedigger/hole.dm | 2 ++ modular_stonehedge/ADDITIONAL TERMS.md | 13 ++++++++++++ 5 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 modular_stonehedge/ADDITIONAL TERMS.md diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index d9621b24a38..5f1e986a7f3 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -14,6 +14,13 @@ blade_dulling = DULLING_CUT resistance_flags = FLAMMABLE +/obj/structure/glowshroom/Initialize(mapload) + . = ..() + //50% chance on creation to be glowshroom instead of kneestinger + if(prob(50) && mapload) + new /obj/structure/safeglowshroom(src.loc) + qdel(src) + /obj/structure/glowshroom/fire_act(added, maxstacks) visible_message(span_warning("[src] catches fire!")) var/turf/T = get_turf(src) diff --git a/code/modules/roguetown/roguecrafting/alchemy.dm b/code/modules/roguetown/roguecrafting/alchemy.dm index 80fe2362338..f1d0bc0c712 100644 --- a/code/modules/roguetown/roguecrafting/alchemy.dm +++ b/code/modules/roguetown/roguecrafting/alchemy.dm @@ -207,6 +207,20 @@ craftdiff = 1 verbage_simple = "forge" +/datum/crafting_recipe/roguetown/alchemy/glassbottles2 + name = "3x glass bottles (Glass sheet)" + result = list(/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle) + reqs = list(/obj/item/ingot/glass) + craftdiff = 1 + verbage_simple = "forge" + +/datum/crafting_recipe/roguetown/alchemy/glasssyringe + name = "Glass syringe (x3)" + result = list(/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe) + reqs = list(/obj/item/ingot/glass) + craftdiff = 1 + verbage_simple = "forge" + /// transmutation /datum/crafting_recipe/roguetown/alchemy/distill diff --git a/code/modules/roguetown/roguecrafting/items.dm b/code/modules/roguetown/roguecrafting/items.dm index 137f6b569f8..b367377cfec 100644 --- a/code/modules/roguetown/roguecrafting/items.dm +++ b/code/modules/roguetown/roguecrafting/items.dm @@ -817,26 +817,6 @@ skillcraft = /datum/skill/magic/druidic craftdiff = 2 // druids & dendor clerics can craft -// --------- GLASS ----------- - -/datum/crafting_recipe/roguetown/glassbottle - name = "Glass bottle (x2)" - reqs = list(/obj/item/ingot/glass) - result = list(/obj/item/reagent_containers/glass/bottle/rogue,/obj/item/reagent_containers/glass/bottle/rogue) - skillcraft = /datum/skill/craft/smelting - structurecraft = /obj/machinery/light/rogue/smelter - always_availible = FALSE - craftdiff = 1 - -/datum/crafting_recipe/roguetown/glasssyringe - name = "Glass syringe (x3)" - reqs = list(/obj/item/ingot/glass) - result = list(/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe) - skillcraft = /datum/skill/craft/smelting - structurecraft = /obj/machinery/light/rogue/smelter - always_availible = FALSE - craftdiff = 2 //small and more detailed in workings i guess. - //gunmaking slop /datum/crafting_recipe/roguetown/firingpim name = "Firing pin" diff --git a/code/modules/roguetown/roguejobs/gravedigger/hole.dm b/code/modules/roguetown/roguejobs/gravedigger/hole.dm index c0cca587ee3..26af97a6c45 100644 --- a/code/modules/roguetown/roguejobs/gravedigger/hole.dm +++ b/code/modules/roguetown/roguejobs/gravedigger/hole.dm @@ -287,6 +287,8 @@ if(!(locate(/obj/item/natural/stone) in T)) if(prob(23)) new /obj/item/natural/stone(T) + if(prob(23)) + new /obj/item/rogueore/sand(T) return ..() /obj/structure/closet/dirthole/Destroy() diff --git a/modular_stonehedge/ADDITIONAL TERMS.md b/modular_stonehedge/ADDITIONAL TERMS.md new file mode 100644 index 00000000000..f5b83b852fa --- /dev/null +++ b/modular_stonehedge/ADDITIONAL TERMS.md @@ -0,0 +1,13 @@ +ADDITIONAL TERMS + +In accordance with Section 7. "Additional Terms" of the GNU Affero General Public License version 3.0 (hereafter referred to as "license"), whose contents are nominally available in StoneHedge/LICENSE.md or online at https://www.gnu.org/licenses/agpl-3.0.html#license-text, the Author(s) of all code (.dm) and map (.dmm) files within this directory and its subdirectories (henceforth referred to as "contents") permit all activities with regards to the contents that are permissible under this license, subject to the following additional terms, current as of 11/26/2024: + +1. Removal of this document from this directory or modification of its text by anyone other than its author (https://github.com/DerFlammenwerfer), or a person with permission granted by its author is strictly prohibited. + +2. The contents are provided as-is, and their Author(s) make no warranty or guarantees in regards to its functionality if modified, obtained separately from a copy of this repository, packaged separately from a copy of this repository, or redistributed separately from a copy of this repository. + +3. Each file within the contents, where possible or unless otherwise disclaimed, shall contain a list of its author(s) in comments at the beginning of the file, as well as a link to the StoneHedge repository on GitHub. In the case of .dmm files or .dmi files, an itemized list of file names and their respective authors must be included in the same directory as these terms. Modification of attribution lists to add attribution of files to additional authors is permitted, but removal of attributions are prohibited except where expressly requested by the authors whose attributions are to be removed. + +4. Failure to include the aforementioned attributions while obtaining, modifying, or conveying any or all of the contents, or misrepresentation of where the contents were obtained from will be considered a violation of these terms. + +5. By modifying, conveying, redistributing, or performing any other permissible activity with the contents under the aforementioned license, you agree to this and the above listed terms and acknowledge that, except where prohibited by the license or by law, violation of these additional terms will equate to a violation of the license and will result in immediate and automatic termination of the rights granted by the license in accordance with the terms of Section 8. "Termination" Additionally, when adding new files to the contents, you agree to subject those additions to these additional terms. \ No newline at end of file From 142bdcf76fb38f8225bdac0d2111e33d2d017775 Mon Sep 17 00:00:00 2001 From: Sutures <101909198+noelle-lavenza@users.noreply.github.com> Date: Tue, 26 Nov 2024 14:48:32 -0500 Subject: [PATCH 051/192] Fix thieves' cant, sign language, and eavesdropping (#122) * Fix eavesdropping on whispers * Make exclaiming while whispering increase the range * Fix thieves' cant and sign languages * Fix custom say verbs interfering with starred messages --- code/__DEFINES/language.dm | 1 + code/game/say.dm | 13 ++- code/modules/language/language.dm | 3 +- .../modules/language/roguetown/thievescant.dm | 3 +- .../mob/living/carbon/human/human_helpers.dm | 10 +-- code/modules/mob/living/carbon/say.dm | 3 +- code/modules/mob/living/say.dm | 83 ++++++++++--------- code/modules/mob/mob_helpers.dm | 2 +- code/modules/surgery/organs/tongue.dm | 3 + 9 files changed, 61 insertions(+), 60 deletions(-) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 79f9192f926..a083f68538e 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -3,5 +3,6 @@ #define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4 #define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8 #define SIGNLANG 16 +#define LANGUAGE_HIDE_NOT_UNDERSTOOD 32 #define LANGUAGE_KNOWN "language_known" #define LANGUAGE_SHADOWED "language_shadowed" diff --git a/code/game/say.dm b/code/game/say.dm index d5f4530f0b7..d0e3e574062 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -26,11 +26,12 @@ GLOBAL_LIST_INIT(freqtospan, list( spans |= speech_span if(!language) language = get_default_language() - send_speech(message, 7, src, , spans, message_language=language) - if(language.flags & SIGNLANG) + send_speech(message, 7, src, null, spans, message_language=language) + // fallback for non-mob atoms using sign language, somehow + var/datum/language/lang_datum = GLOB.language_datum_instances[language] + if(lang_datum.flags & SIGNLANG) //do emote from list - var/emote = pick(language.signlang_verb) - src.visible_message(span_emote("[emote]")) + visible_message(span_emote(pick(lang_datum.signlang_verb))) /atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, original_message) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) @@ -97,10 +98,6 @@ GLOBAL_LIST_INIT(freqtospan, list( if(istype(speaker, /mob/living)) var/mob/living/L = speaker namepart = "Unknown [(L.gender == FEMALE) ? "Woman" : "Man"]" - if(message_language.flags & SIGNLANG) - //do emote from list - var/emote = pick(message_language.signlang_verb) - L.emote(emote) else namepart = "Unknown" spanpart1 = "" diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index fd322b70627..0b7e493d309 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -11,8 +11,7 @@ var/ask_verb = "asks" // Used when sentence ends in a ? var/exclaim_verb = "exclaims" // Used when sentence ends in a ! var/whisper_verb = "whispers" // Optional. When not specified speech_verb + quietly/softly is used instead. - var/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags - var/signlang = FALSE + var/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has SIGNLANG flag var/key // Character used to speak in language // If key is null, then the language isn't real or learnable. var/flags // Various language flags. diff --git a/code/modules/language/roguetown/thievescant.dm b/code/modules/language/roguetown/thievescant.dm index 05caccd6979..2437b7ca2ab 100644 --- a/code/modules/language/roguetown/thievescant.dm +++ b/code/modules/language/roguetown/thievescant.dm @@ -5,11 +5,10 @@ ask_verb = "questioningly gestures" exclaim_verb = "angrily gestures" key = "t" - flags = LANGUAGE_HIDE_ICON_IF_UNDERSTOOD | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | SIGNLANG | NO_STUTTER + flags = LANGUAGE_HIDE_ICON_IF_UNDERSTOOD | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | SIGNLANG | LANGUAGE_HIDE_NOT_UNDERSTOOD | NO_STUTTER space_chance = 66 default_priority = 80 icon_state = "asse" - signlang = TRUE signlang_verb = list( "scrunches their nose", "smiles", diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 17e8f38ba54..0c36bea12c8 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -8,12 +8,10 @@ /mob/living/carbon/human/check_language_hear(language) if(!language) return - if(wear_neck) - if(istype(wear_neck, /obj/item/clothing/neck/roguetown/talkstone)) - return TRUE - if(!has_language(language)) - if(has_flaw(/datum/charflaw/paranoid)) - add_stress(/datum/stressevent/paratalk) + if(istype(wear_neck, /obj/item/clothing/neck/roguetown/talkstone)) + return TRUE + if(!has_language(language) && has_flaw(/datum/charflaw/paranoid)) + add_stress(/datum/stressevent/paratalk) /mob/living/carbon/human/canBeHandcuffed() diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index a4ff5e949fe..2734200d832 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -17,4 +17,5 @@ if(T) . = T.could_speak_in_language(dt) else - . = initial(dt.flags) & TONGUELESS_SPEECH + var/datum/language/language_datum = GLOB.language_datum_instances[dt] + . = language_datum.flags & (TONGUELESS_SPEECH | SIGNLANG) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index a0200580c00..03bd874ea14 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -168,11 +168,6 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(!language) language = get_default_language() - if(language.signlang) - var/mob/M = src - var/emote = pick(language.signlang_verb) - M.emote(emote) - //Detection of language needs to be before inherent channels, because //AIs use inherent channels for the holopad. Most inherent channels //ignore the language argument however. @@ -180,7 +175,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(saymode && !saymode.handle_message(src, message, language)) return - if(!can_speak_vocal(message)) + var/datum/language/language_datum = GLOB.language_datum_instances[language] + if(language_datum.flags & SIGNLANG) + emote(pick(language_datum.signlang_verb), intentional = TRUE) + else if(!can_speak_vocal(message)) // don't block sign languages // visible_message("[src] makes a muffled noise.") to_chat(src, span_warning("I can't talk.")) return @@ -278,11 +276,16 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/deaf_type if(speaker != src) if(!radio_freq) //These checks have to be seperate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf. - deaf_message = "[speaker] [speaker.verb_say] something but you cannot hear [speaker.p_them()]." + deaf_message = "[speaker] [speaker.verb_say] something but I cannot hear [speaker.p_them()]." deaf_type = 1 else - deaf_message = span_notice("I can't hear yourself!") - deaf_type = 2 // Since you should be able to hear myself without looking + deaf_message = span_notice("I can't hear myself!") + deaf_type = 2 // Since you should be able to hear yourself without looking + + if(message_language) + var/datum/language/heard_lang = GLOB.language_datum_instances[message_language] + if(heard_lang?.flags & LANGUAGE_HIDE_NOT_UNDERSTOOD && !has_language(message_language) && !check_language_hear(message_language)) + return // you don't notice a thing... // Create map text prior to modifying message for goonchat if(can_see_runechat(speaker) && can_hear()) @@ -294,41 +297,41 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode, original_message) var/static/list/eavesdropping_modes = list(MODE_WHISPER = TRUE, MODE_WHISPER_CRIT = TRUE) + var/is_eavesdroppable = eavesdropping_modes[message_mode] var/eavesdrop_range = 0 var/Zs_too = FALSE - if(eavesdropping_modes[message_mode]) + if(is_eavesdroppable) eavesdrop_range = EAVESDROP_EXTRA_RANGE - if(message_mode != MODE_WHISPER) - if(say_test(message) == "2") //CIT CHANGE - ditto + if(say_test(message) == "2") // shouting + if(!is_eavesdroppable) message_range += 10 Zs_too = TRUE + else // keep your damn voice down! + message_range += 1 + eavesdrop_range += 1 var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source) var/list/the_dead = list() -// var/list/yellareas //CIT CHANGE - adds the ability for yelling to penetrate walls and echo throughout areas - for(var/_M in GLOB.player_list) - var/mob/M = _M -// if(M.stat != DEAD) //not dead, not important -// if(yellareas) //CIT CHANGE - see above. makes yelling penetrate walls -// var/area/A = get_area(M) //CIT CHANGE - ditto -// if(istype(A) && A.ambientsounds != SPACE && (A in yellareas)) //CIT CHANGE - ditto -// listening |= M //CIT CHANGE - ditto -// continue - if(!client) //client is so that ghosts don't have to listen to mice - continue - if(!M) - continue - if(!M.client) - continue - if(get_dist(M, src) > message_range) //they're out of range of normal hearing - if(M.client.prefs) - if(eavesdropping_modes[message_mode] && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off - continue - if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off - continue - if(!is_in_zweb(src.z, M.z)) - continue - listening |= M - the_dead[M] = TRUE + // fun fact: roguetown broke this which broke eavesdropping on whispers lmao + if(client) //client is so that ghosts don't have to listen to mice + // check this beforehand to make it so simplemobs don't lag us at highpop + for(var/_M in GLOB.player_list) + var/mob/M = _M + if(M.stat != DEAD) //not dead, not important + continue + if(!M?.client) + continue + if(!M.client) + continue + if(get_dist(M, src) > message_range) //they're out of range of normal hearing + if(M.client.prefs) + if(is_eavesdroppable && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off + continue + if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off + continue + if(!is_in_zweb(src.z, M.z)) + continue + listening |= M + the_dead[M] = TRUE log_seen(src, null, listening, original_message, SEEN_LOG_SAY) @@ -336,7 +339,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/eavesrendered if(eavesdrop_range) eavesdropping = stars(message) - eavesrendered = compose_message(src, message_language, eavesdropping, , spans, message_mode) + eavesrendered = compose_message(src, message_language, eavesdropping, null, spans, message_mode) var/rendered = compose_message(src, message_language, message, , spans, message_mode) var/turf/self_turf = get_turf(src) @@ -348,9 +351,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(movable_turf.z != self_z) continue if(eavesdrop_range && get_dist(source, AM) > message_range && !(the_dead[AM])) - AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode, original_message) + AM.Hear(eavesrendered, src, message_language, eavesdropping, null, spans, message_mode, original_message) else - AM.Hear(rendered, src, message_language, message, , spans, message_mode, original_message) + AM.Hear(rendered, src, message_language, message, null, spans, message_mode, original_message) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) //speech bubble diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index fab7cb91b57..f774675b33f 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -90,7 +90,7 @@ if ((copytext_char(te, p, p + 1) == " " || prob(pr))) t = text("[][]", t, copytext_char(te, p, p + 1)) else - t = text("[]*", t) + t = text("[]*", t) // stopgap until the custom say verb character is changed if(n > MAX_BROADCAST_LEN) t += "..." //signals missing text return t diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index f734623d4e7..f895dc30661 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -46,6 +46,9 @@ M.RegisterSignal(M, COMSIG_MOB_SAY, TYPE_PROC_REF(/mob/living/carbon, handle_tongueless_speech)) /obj/item/organ/tongue/could_speak_in_language(datum/language/dt) + var/datum/language/language_datum = GLOB.language_datum_instances[dt] + if(language_datum.flags & (TONGUELESS_SPEECH | SIGNLANG)) + return TRUE return is_type_in_typecache(dt, languages_possible) /obj/item/organ/tongue/lizard From fe2c51710d75786bc015508603f2298b0220a69f Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 22:50:53 +0300 Subject: [PATCH 052/192] ok done --- README.md | 4 +++- .../{ADDITIONAL TERMS.md => ADDITIONAL-TERMS.md} | 0 2 files changed, 3 insertions(+), 1 deletion(-) rename modular_stonehedge/{ADDITIONAL TERMS.md => ADDITIONAL-TERMS.md} (100%) diff --git a/README.md b/README.md index 0349a3f939e..2a548f2caed 100644 --- a/README.md +++ b/README.md @@ -40,13 +40,15 @@ All original code and assets of this repository are under the [GNU Affero Genera The following assets are under a custom license as per original author's wishes, assets authored by Dreamkeep indicate collaborative work among it's artists, and may be credited within files. +[ADDITIONAL TERMS](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/ADDITIONAL-TERMS.md) + | Reference | Author | License | |----------------------------------------------|---------------|------------| | [licensed-dreamkeep](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-dreamkeep) | Dreamkeep | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-dreamkeep/LICENSE.md)| | [licensed-eaglephntm](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm) | EaglePhntm | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm/LICENSE.md)| | [licensed-feralope](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope/LICENSE.md)| | [licensed-feralope (helmsguard)](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope/LICENSE.md)| -| [licensed-death-rattler](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler) | Moribund/Luctus-Comptus | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler/LICENSE.md)| +| [licensed-death-rattler](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler) | Moribund/Luctus-Comptus | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-death-rattler/LICENSE.md)| ## TG diff --git a/modular_stonehedge/ADDITIONAL TERMS.md b/modular_stonehedge/ADDITIONAL-TERMS.md similarity index 100% rename from modular_stonehedge/ADDITIONAL TERMS.md rename to modular_stonehedge/ADDITIONAL-TERMS.md From db84bc73d58049602e6015090f45225ef6bb6025 Mon Sep 17 00:00:00 2001 From: Vide Noir <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 23:13:02 +0300 Subject: [PATCH 053/192] Alot of shit (#115) * also whats this doing here * aw shit * a bunch of shit * Update friendly_npc.dm * a few more * fml * done ig * Update role_preferences.dm * few things more * ok done --- .gitignore | 1 + README.md | 4 +- _maps/roguetest.json | 4 +- code/__DEFINES/role_preferences.dm | 8 +- code/__HELPERS/roundend.dm | 2 +- .../controllers/subsystem/rogue/seelie_tab.dm | 2 - code/controllers/subsystem/vote.dm | 2 +- code/datums/dna.dm | 1 - code/datums/gods/_patron.dm | 2 +- .../sex_actions/deviant/tailpegging_anal.dm | 15 +- .../deviant/tailpegging_vaginal.dm | 15 +- .../datums/sexcon/sex_actions/sex/anal_sex.dm | 9 +- .../sexcon/sex_actions/sex/vaginal_sex.dm | 13 +- code/datums/stress/negative_events.dm | 6 +- code/datums/stress/positive_events.dm | 10 +- code/game/gamemodes/objectives_rogue.dm | 4 +- code/game/gamemodes/roguetown/chaosmode.dm | 6 +- code/game/gamemodes/roguetown/roguetown.dm | 15 +- code/game/objects/effects/glowshroom.dm | 18 +- code/game/objects/effects/landmarks.dm | 2 +- code/game/objects/items/rogueitems/books.dm | 2 +- code/game/objects/items/rogueitems/keys.dm | 2 +- .../objects/items/rogueweapons/intents.dm | 3 +- code/game/objects/structures/fluff.dm | 2 +- code/game/objects/structures/spawner.dm | 2 +- code/modules/admin/verbs/pray.dm | 2 +- .../roguetown/villain/choosename.dm | 2 +- .../roguetown/villain/vampirelord.dm | 2 +- .../antagonists/roguetown/villain/zizocult.dm | 66 +++-- code/modules/client/preferences.dm | 2 +- code/modules/clothing/rogueclothes/hats.dm | 2 +- code/modules/clothing/rogueclothes/wrists.dm | 15 +- code/modules/events/rogue/_rogue.dm | 2 +- .../jobs/job_types/roguetown/church/priest.dm | 10 +- .../job_types/roguetown/garrison/veteran.dm | 2 +- .../roguetown/goblin/tribalshaman.dm | 6 +- code/modules/jobs/jobs.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 6 +- .../carbon/human/species_types/furry/akula.dm | 10 +- .../human/species_types/furry/anthromorph.dm | 2 - .../species_types/furry/anthromorphbig.dm | 2 - .../species_types/furry/anthromorphsmall.dm | 2 - .../human/species_types/furry/demihuman.dm | 2 - .../human/species_types/furry/dracon.dm | 2 - .../human/species_types/furry/kobold.dm | 2 - .../human/species_types/furry/lizardfolk.dm | 2 - .../human/species_types/furry/lupian.dm | 2 - .../carbon/human/species_types/furry/moth.dm | 2 - .../human/species_types/furry/tabaxi.dm | 2 - .../human/species_types/furry/vulpkanin.dm | 2 - .../species_types/roguetown/dwarf/dwarfm.dm | 2 - .../human/species_types/roguetown/elf/elfd.dm | 2 - .../human/species_types/roguetown/elf/elfs.dm | 2 - .../species_types/roguetown/goblin/goblinp.dm | 2 - .../species_types/roguetown/human/humen.dm | 2 - .../species_types/roguetown/other/aasimar.dm | 2 - .../roguetown/other/brazillian.dm | 19 +- .../species_types/roguetown/other/halfelf.dm | 2 - .../species_types/roguetown/other/halforc.dm | 2 - .../species_types/roguetown/other/seelie.dm | 16 +- .../species_types/roguetown/other/tiefling.dm | 2 - .../species_types/roguetown/other/werewolf.dm | 2 - code/modules/mob/living/carbon/rogfatstam.dm | 2 +- .../simple_animal/rogue/creacher/minotaur.dm | 32 +- .../simple_animal/rogue/creacher/mudcrab.dm | 1 - .../roguetown/roguecrafting/alchemy.dm | 14 + code/modules/roguetown/roguecrafting/items.dm | 20 -- .../roguetown/roguejobs/fisher/leeches.dm | 2 +- .../roguetown/roguejobs/gravedigger/hole.dm | 2 + code/modules/roguetown/roguemachine/mail.dm | 2 +- code/modules/shuttle/supply.dm | 4 +- .../spells/roguetown/acolyte/dendor.dm | 5 +- .../surgery/organs/feature_organs/genitals.dm | 1 - data/player_generated_books/Unknown.json | 1 - data/player_generated_books/_book_titles.json | 1 - .../simple_animal/rogue/simple_skeleton.dm | 14 + modular_stonehedge/ADDITIONAL-TERMS.md | 13 + .../simple_animal/rogue/friendly_npc.dm | 275 ++++++++++++++++++ roguetown.dme | 1 + 79 files changed, 492 insertions(+), 254 deletions(-) delete mode 100644 data/player_generated_books/Unknown.json delete mode 100644 data/player_generated_books/_book_titles.json create mode 100644 modular_stonehedge/ADDITIONAL-TERMS.md create mode 100644 modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm diff --git a/.gitignore b/.gitignore index f0150f26323..aa747e3e007 100644 --- a/.gitignore +++ b/.gitignore @@ -220,3 +220,4 @@ tools/MapAtmosFixer/MapAtmosFixer/bin/* /config/ezdb.txt tgui/src/images/syndicate.svg tgui/src/images/nanotrasen.svg +/data diff --git a/README.md b/README.md index 0349a3f939e..2a548f2caed 100644 --- a/README.md +++ b/README.md @@ -40,13 +40,15 @@ All original code and assets of this repository are under the [GNU Affero Genera The following assets are under a custom license as per original author's wishes, assets authored by Dreamkeep indicate collaborative work among it's artists, and may be credited within files. +[ADDITIONAL TERMS](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/ADDITIONAL-TERMS.md) + | Reference | Author | License | |----------------------------------------------|---------------|------------| | [licensed-dreamkeep](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-dreamkeep) | Dreamkeep | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-dreamkeep/LICENSE.md)| | [licensed-eaglephntm](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm) | EaglePhntm | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm/LICENSE.md)| | [licensed-feralope](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope/LICENSE.md)| | [licensed-feralope (helmsguard)](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope/LICENSE.md)| -| [licensed-death-rattler](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler) | Moribund/Luctus-Comptus | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler/LICENSE.md)| +| [licensed-death-rattler](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler) | Moribund/Luctus-Comptus | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-death-rattler/LICENSE.md)| ## TG diff --git a/_maps/roguetest.json b/_maps/roguetest.json index 6349acea045..c36b0b27046 100644 --- a/_maps/roguetest.json +++ b/_maps/roguetest.json @@ -1,7 +1,7 @@ { "map_name": "Roguetest", - "map_path": "map_files/Roguetest", - "map_file": "Roguetest.dmm", + "map_path": "map_files/roguetest", + "map_file": "roguetest.dmm", "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index e6455c6737e..3251e18b383 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -72,12 +72,12 @@ GLOBAL_LIST_INIT(special_roles, list( )) GLOBAL_LIST_INIT(special_roles_rogue, list( - ROLE_MANIAC = /datum/antagonist/maniac, - ROLE_PREBEL = /datum/antagonist/prebel, +// ROLE_MANIAC = /datum/antagonist/maniac, +// ROLE_PREBEL = /datum/antagonist/prebel, ROLE_BANDIT = /datum/antagonist/bandit, - ROLE_ASPIRANT = /datum/antagonist/aspirant, +// ROLE_ASPIRANT = /datum/antagonist/aspirant, ROLE_WEREWOLF = /datum/antagonist/werewolf, - ROLE_ZIZOIDCULTIST = /datum/antagonist/zizocultist, +// ROLE_ZIZOIDCULTIST = /datum/antagonist/zizocultist, ROLE_NBEAST = /datum/antagonist/vampirelord, ROLE_LICH = /datum/antagonist/lich )) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 5e2d7964056..19ce9db1b15 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -324,7 +324,7 @@ end_reason = "The Werevolves formed an unholy clan, marauding StoneHedge until the end of its daes." if(C.cultascended) - end_reason = "ZIZOZIZOZIZOZIZO" + end_reason = "Levishth!" if(C.headrebdecree) end_reason = "The peasant rebels took control of the throne, hail the new community!" diff --git a/code/controllers/subsystem/rogue/seelie_tab.dm b/code/controllers/subsystem/rogue/seelie_tab.dm index 7dc5db73d9e..840fb3bba78 100644 --- a/code/controllers/subsystem/rogue/seelie_tab.dm +++ b/code/controllers/subsystem/rogue/seelie_tab.dm @@ -23,8 +23,6 @@ if(TRUE) to_chat(src, span_warning("My aura is now one of misery")) User.aura = FALSE - src.log_message("[key_name(src)] has switched their aura to apply bad luck") if(FALSE) to_chat(src, span_warning("My aura is now one of blessing")) User.aura = TRUE - src.log_message("[key_name(src)] has switched their aura to apply good luck") diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 92e78c4e653..fe8e7f9d81d 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -184,7 +184,7 @@ SUBSYSTEM_DEF(vote) if(H.stat != DEAD) vote_power += 3 if(H.job) - var/list/list_of_powerful = list("Monarch", "Consort", "Prophet", "Steward", "Hand") + var/list/list_of_powerful = list("Monarch", "Consort", "Archpriest", "Guildmaster", "Guild Appraiser", "Hand") if(H.job in list_of_powerful) vote_power += 5 else diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 30bc0b474b5..d8ab6a4e25b 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -310,7 +310,6 @@ update_body_parts(TRUE) update_mutations_overlay()// no lizard with human hulk overlay please. - /mob/proc/has_dna() return diff --git a/code/datums/gods/_patron.dm b/code/datums/gods/_patron.dm index f73b9b39d35..da070e5c703 100644 --- a/code/datums/gods/_patron.dm +++ b/code/datums/gods/_patron.dm @@ -1,5 +1,5 @@ #define CLERIC_SPELLS "Priest" -#define PRIEST_SPELLS "Prophet" +#define PRIEST_SPELLS "Archpriest" GLOBAL_LIST_EMPTY(patronlist) GLOBAL_LIST_EMPTY(patrons_by_faith) diff --git a/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm b/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm index f77b5a049b1..0b51fd17340 100644 --- a/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm +++ b/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm @@ -45,28 +45,23 @@ target.apply_damage(5, BRUTE, BPC) target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny tail into [target]'s butt!")) + user.visible_message(span_warning("[user] inserts their tiny tail into [target]'s butt!")) else user.visible_message(span_warning("[user] slides their tail into [target]'s butt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/tailpegging_anal/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s butt with their tail, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s butt with their tail.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) //Scream and body damage - target.apply_damage(10, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) - target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) + if(user.sexcon.force > SEX_FORCE_LOW) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) if(user.sexcon.considered_limp()) user.sexcon.perform_sex_action(target, 1.2, 4, FALSE) diff --git a/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm b/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm index e2d1a250f51..f3766e1c5e7 100644 --- a/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm +++ b/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm @@ -45,28 +45,23 @@ target.apply_damage(5, BRUTE, BPC) target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny tail into [target]'s cunt!")) + user.visible_message(span_warning("[user] inserts their tiny tail into [target]'s cunt!")) else user.visible_message(span_warning("[user] slides their tail into [target]'s cunt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/tailpegging_vaginal/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s cunt with their tail, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt with their tail.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) //Scream and body damage - target.apply_damage(10, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) - target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) + if(user.sexcon.force > SEX_FORCE_LOW) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) if(user.sexcon.considered_limp()) user.sexcon.perform_sex_action(target, 1.2, 4, FALSE) diff --git a/code/datums/sexcon/sex_actions/sex/anal_sex.dm b/code/datums/sexcon/sex_actions/sex/anal_sex.dm index a8bd59a1409..9c525a92699 100644 --- a/code/datums/sexcon/sex_actions/sex/anal_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/anal_sex.dm @@ -59,21 +59,14 @@ target.apply_damage(5, BRUTE, BPC) target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny cock into [target]'s butt!")) + user.visible_message(span_warning("[user] inserts their tiny cock into [target]'s butt!")) else user.visible_message(span_warning("[user] slides his cock into [target]'s butt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/anal_sex/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s ass, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s ass.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) user.sexcon.try_pelvis_crush(target) diff --git a/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm b/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm index 58c0f01e6dd..aa86a5165a2 100644 --- a/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm @@ -58,23 +58,16 @@ BPG.add_wound(/datum/wound/fracture/groin) target.apply_damage(5, BRUTE, BPC) target.apply_damage(5, BRUTE, BPG) - playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Non-Seelie action - user.visible_message(span_warning("[user] tries and fails to insert their tiny cock into [target]'s cunt.")) + user.visible_message(span_warning("[user] inserts their tiny cock into [target]'s cunt.")) else //Normal humen sized creatures or Seelie on Seelie (which would be normal) user.visible_message(span_warning("[user] slides their cock into [target]'s cunt!")) - playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) + playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/vaginal_sex/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s cunt, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) user.sexcon.try_pelvis_crush(target) diff --git a/code/datums/stress/negative_events.dm b/code/datums/stress/negative_events.dm index a8fb75fa909..9483f443c6f 100644 --- a/code/datums/stress/negative_events.dm +++ b/code/datums/stress/negative_events.dm @@ -118,9 +118,9 @@ desc = span_red("I fell. I'm a fool.") /datum/stressevent/hatezizo - timer = 99999 MINUTES - stressadd = 666 // :) - desc = "ZIZOZIZOZIZO" + timer = 30 MINUTES + stressadd = 10 // enough to instill mental breaks with any more stress of any source, and heart attack if too worse. + desc = "A NEW GOD is upon us!" /datum/stressevent/burntmeal timer = 2 MINUTES diff --git a/code/datums/stress/positive_events.dm b/code/datums/stress/positive_events.dm index 616b878766c..47ef07c9c8d 100644 --- a/code/datums/stress/positive_events.dm +++ b/code/datums/stress/positive_events.dm @@ -8,11 +8,6 @@ stressadd = -1 desc = span_red("It's raining.") -/datum/stressevent/lovezizo - timer = 99999 MINUTES - stressadd = -666 // :) - desc = "ZIZOZIZOZIZO" - /datum/stressevent/viewsinpunish timer = 5 MINUTES stressadd = -2 @@ -177,3 +172,8 @@ stressadd = -1 desc = span_green("A soothing fragrance envelops me.") timer = 10 MINUTES + +/datum/stressevent/zizodefeated + timer = 30 MINUTES + stressadd = -5 + desc = span_green("THE NEW DARK GOD HAS FALLEN!") diff --git a/code/game/gamemodes/objectives_rogue.dm b/code/game/gamemodes/objectives_rogue.dm index ad0fc2c6287..d028a51b3fb 100644 --- a/code/game/gamemodes/objectives_rogue.dm +++ b/code/game/gamemodes/objectives_rogue.dm @@ -15,7 +15,7 @@ if(C) explanation_text = "Feed [C.banditgoal] mammon to an idol of greed." else - explanation_text = "Pray to ZIZO." + explanation_text = "Pray to LEVISHTH." /datum/objective/delf @@ -35,7 +35,7 @@ if(C) explanation_text = "Feed [C.delfgoal] honeys to the mother." else - explanation_text = "Pray to ZIZO." + explanation_text = "Pray to LEVISHTH." /datum/objective/werewolf name = "conquer" diff --git a/code/game/gamemodes/roguetown/chaosmode.dm b/code/game/gamemodes/roguetown/chaosmode.dm index 44ecdac6d44..dbed3c04287 100644 --- a/code/game/gamemodes/roguetown/chaosmode.dm +++ b/code/game/gamemodes/roguetown/chaosmode.dm @@ -168,7 +168,7 @@ restricted_jobs = list("Monarch", "Queen", "Merchant", - "Prophet") + "Archpriest") var/num_bandits = 0 if(num_players() >= 10) num_bandits = CLAMP(round(num_players() / 2), 1, 5) @@ -270,7 +270,7 @@ restricted_jobs = list() /datum/game_mode/chaosmode/proc/pick_vampires() - restricted_jobs = list("Priest","Prophet","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") + restricted_jobs = list("Priest","Archpriest","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") /* var/num_vampires = rand(1,3) #ifdef TESTSERVER num_vampires = 100 @@ -297,7 +297,7 @@ restricted_jobs = list() /datum/game_mode/chaosmode/proc/pick_werewolves() - restricted_jobs = list("Priest","Prophet","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") + restricted_jobs = list("Priest","Archpriest","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") /* var/num_werewolves = rand(1,3) #ifdef TESTSERVER num_werewolves = 100 diff --git a/code/game/gamemodes/roguetown/roguetown.dm b/code/game/gamemodes/roguetown/roguetown.dm index a4ea4ddc3c0..12b7a35d508 100644 --- a/code/game/gamemodes/roguetown/roguetown.dm +++ b/code/game/gamemodes/roguetown/roguetown.dm @@ -183,13 +183,10 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E if(77 to 99) log_game("Major Antagonist: Extended") //gotta put something here. */ - if(0 to 25) - pick_cultist() - log_game("Major Antagonist: Cultists") - if(26 to 51) + if(0 to 50) pick_werewolves() log_game("Major Antagonist: Werewolves and Vampires") - if(52 to 99) + if(51 to 99) log_game("Major Antagonist: Extended") //gotta put something here. pick_bandits() log_game("Minor Antagonist: Bandit") @@ -214,7 +211,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E restricted_jobs = list("Monarch", "Consort", "Merchant Prince", - "Prophet", + "Archpriest", "Knight") var/num_bandits = 0 if(num_players() >= 10) @@ -414,7 +411,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E restricted_jobs = list( "Monarch", "Consort", - "Prophet", + "Archpriest", "Wytcher", "Hedgeknight", "Hedgemaster", @@ -450,7 +447,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E "Confessor", "Watchman", "Man at Arms", - "Prophet", + "Archpriest", "Watchmen Captain", "Magician", "Paladin", @@ -499,7 +496,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E "Confessor", "Watchman", "Man at Arms", - "Prophet", + "Archpriest", "Watchmen Captain", "Magician", "Paladin", diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 87e730eb5a2..5f1e986a7f3 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -14,6 +14,13 @@ blade_dulling = DULLING_CUT resistance_flags = FLAMMABLE +/obj/structure/glowshroom/Initialize(mapload) + . = ..() + //50% chance on creation to be glowshroom instead of kneestinger + if(prob(50) && mapload) + new /obj/structure/safeglowshroom(src.loc) + qdel(src) + /obj/structure/glowshroom/fire_act(added, maxstacks) visible_message(span_warning("[src] catches fire!")) var/turf/T = get_turf(src) @@ -133,10 +140,15 @@ qdel(src) /obj/structure/safeglowshroom/Destroy() - var/datum/reagents/R = new/datum/reagents(5) + var/datum/reagents/R = new/datum/reagents(30) R.my_atom = src - R.add_reagent(/datum/reagent/berrypoison, 5) + R.add_reagent(/datum/reagent/berrypoison, 30) var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 4, get_turf(src), FALSE) + smoke.set_up(R, 5, get_turf(src), FALSE) smoke.start() + explosion(loc, 1, 1, 1, 0, 0) //and gas release ig . = ..() + +//used by stupid spell +/obj/structure/glowshroom/proc/destroy() + qdel(src) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index c67a2405f7b..603d42a0179 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -241,7 +241,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/priest - name = "Prophet" + name = "Archpriest" icon_state = "arrow" /obj/effect/landmark/start/cleric diff --git a/code/game/objects/items/rogueitems/books.dm b/code/game/objects/items/rogueitems/books.dm index 6a49b2e1774..867336a5917 100644 --- a/code/game/objects/items/rogueitems/books.dm +++ b/code/game/objects/items/rogueitems/books.dm @@ -203,7 +203,7 @@ user.say(m) /obj/item/book/rogue/bibble/attack(mob/living/M, mob/user) - if(user.mind && user.mind.assigned_role == "Prophet") + if(user.mind && user.mind.assigned_role == "Archpriest") if(!user.can_read(src)) to_chat(user, span_warning("I don't understand these scribbly black lines.")) return diff --git a/code/game/objects/items/rogueitems/keys.dm b/code/game/objects/items/rogueitems/keys.dm index 7861608037b..c580c449536 100644 --- a/code/game/objects/items/rogueitems/keys.dm +++ b/code/game/objects/items/rogueitems/keys.dm @@ -269,7 +269,7 @@ name = "priest's key" desc = "This is the master key of the church." icon_state = "cheesekey" - lockid = "Prophet" + lockid = "Archpriest" /obj/item/roguekey/tower name = "tower key" diff --git a/code/game/objects/items/rogueweapons/intents.dm b/code/game/objects/items/rogueweapons/intents.dm index 9aaebd26486..8711f1f1a18 100644 --- a/code/game/objects/items/rogueweapons/intents.dm +++ b/code/game/objects/items/rogueweapons/intents.dm @@ -489,8 +489,7 @@ animname = "cut" blade_class = BCLASS_CHOP hitsound = "genslash" - penfactor = 230 - damfactor = 40 + penfactor = 80 candodge = TRUE canparry = TRUE miss_text = "slashes the air!" diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index d85afb1edc4..ba52d565d9e 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -1232,7 +1232,7 @@ /obj/structure/fluff/psycross/attackby(obj/item/W, mob/user, params) if(user.mind) - if(user.mind.assigned_role == "Prophet") + if(user.mind.assigned_role == "Archpriest") if(istype(W, /obj/item/reagent_containers/food/snacks/grown/apple)) if(!istype(get_area(user), /area/rogue/indoors/town/church/chapel)) to_chat(user, span_warning("I need to do this in the chapel.")) diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index e87cc1e1061..facb100e81a 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -115,7 +115,7 @@ /mob/living/simple_animal/hostile/retaliate/rogue/goblin/cave = 3, //archer /mob/living/simple_animal/hostile/retaliate/rogue/goblin = 3) //archer spawn_text = "climbs out of" - faction = list("orc") + faction = list("orcs") /obj/structure/spawner/ghost name = "bone pile" diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 72d8c783874..45e73a0ee03 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -51,7 +51,7 @@ if(C.prefs.chat_toggles & CHAT_PRAYER) to_chat(C, msg) if(C.prefs.toggles & SOUND_PRAYERS) - if(usr.job == "Prophet") + if(usr.job == "Archpriest") SEND_SOUND(C, sound('sound/pray.ogg')) for(var/mob/M in GLOB.dead_mob_list) diff --git a/code/modules/antagonists/roguetown/villain/choosename.dm b/code/modules/antagonists/roguetown/villain/choosename.dm index b4f18e30d7e..c0ec141de12 100644 --- a/code/modules/antagonists/roguetown/villain/choosename.dm +++ b/code/modules/antagonists/roguetown/villain/choosename.dm @@ -10,7 +10,7 @@ j.current_positions-- mob_timers["mirrortime"] = world.time var/begin_time = world.time - var/new_name = input(src, "What should your [input] name be?", "HEARTHSTONE") + var/new_name = input(src, "What should your [input] name be?", "DREAMKEEP") if(world.time > begin_time + 60 SECONDS) to_chat(src, "You waited too long.") return diff --git a/code/modules/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm index 080f1e67d37..ba1858f1123 100644 --- a/code/modules/antagonists/roguetown/villain/vampirelord.dm +++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm @@ -933,7 +933,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) /datum/objective/vampirelord/infiltrate/one/check_completion() var/datum/game_mode/chaosmode/C = SSticker.mode - var/list/churchjobs = list("Prophet", "Priestess", "Priest", "Priest", "Paladin", "Churchling", "Crusader", "Grandmaster", "Witcher") + var/list/churchjobs = list("Archpriest", "Archpriestess", "Cleric", "Wytcher Captain", "Paladin", "Churchling", "Crusader", "Grandmaster", "Wytcher") for(var/datum/mind/V in C.vampires) if(V.current.job in churchjobs) return TRUE diff --git a/code/modules/antagonists/roguetown/villain/zizocult.dm b/code/modules/antagonists/roguetown/villain/zizocult.dm index bbe547f8550..cb4c48a0739 100644 --- a/code/modules/antagonists/roguetown/villain/zizocult.dm +++ b/code/modules/antagonists/roguetown/villain/zizocult.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(ritualslist) antag_hud_name = "cultist" confess_lines = list( "DEATH TO THE SUCCESSORS!", - "PRAISE ZIZO!", + "PRAISE LEVISHTH!", "THE GODHEAD FAVORS ME!", ) var/islesser = TRUE @@ -176,7 +176,7 @@ GLOBAL_LIST_EMPTY(ritualslist) set category = "LEVISHTH" var/datum/game_mode/chaosmode/C = SSticker.mode - var/speak = input("What do you speak of?", "HEARTHSTONE") as text|null + var/speak = input("What do you speak of?", "DREAMKEEP") as text|null if(!speak) return whisper("O schlet'a ty'schkotot ty'skvoro...") @@ -252,7 +252,7 @@ GLOBAL_LIST_EMPTY(ritualslist) if(path.circle == sigil_type) rituals |= path.name - var/ritualnameinput = input(user, "Rituals", "HEARTHSTONE") as null|anything in rituals + var/ritualnameinput = input(user, "Rituals", "DREAMKEEP") as null|anything in rituals testing("ritualnameinput [ritualnameinput]") var/datum/ritual/pickritual @@ -406,7 +406,7 @@ GLOBAL_LIST_EMPTY(ritualslist) to_chat(src, span_danger("My hands aren't bloody enough.")) return - var/input = input("Sigil Type", "HEARTHSTONE") as null|anything in runes + var/input = input("Sigil Type", "DREAMKEEP") as null|anything in runes if(!input) return @@ -425,10 +425,10 @@ GLOBAL_LIST_EMPTY(ritualslist) var/mob/living/carbon/human/choice = input(src, "Whom do you no longer have use for?", "ROGUETOWN") as null|anything in possible if(choice) - var/alert = alert(src, "Are you sure?", "HEARTHSTONE", "Yes", "Cancel") + var/alert = alert(src, "Are you sure?", "DREAMKEEP", "Yes", "Cancel") if(alert == "Yes") visible_message(span_danger("[src] reaches out, ripping up [choice]'s soul!")) - to_chat(choice, span_userdanger("I HAVE FAILED MY LEADER! I HAVE FAILED ZIZO! NOTHING ELSE BUT DEATH REMAINS FOR ME NOW!")) + to_chat(choice, span_userdanger("I HAVE FAILED MY LEADER! I HAVE FAILED LEVISHTH! NOTHING ELSE BUT DEATH REMAINS FOR ME NOW!")) sleep(20) choice.gib() // Cooler than dusting. C.cultists -= choice.mind @@ -477,7 +477,7 @@ GLOBAL_LIST_EMPTY(ritualslist) to_chat(user.mind, span_danger("\"The veil is too strong to support more than ten cultists.\"")) return var/datum/antagonist/zizocultist/PR = user.mind.has_antag_datum(/datum/antagonist/zizocultist) - var/alert = alert(H, "YOU WILL BE SHOWN THE TRUTH. DO YOU RESIST? (Resisting: 1 TRI)", "HEARTHSTONE", "Yield", "Resist") + var/alert = alert(H, "YOU WILL BE SHOWN THE TRUTH. DO YOU RESIST? (Resisting: 1 TRI)", "DREAMKEEP", "Yield", "Resist") H.anchored = TRUE if(alert == "Yield") to_chat(H.mind, span_notice("I see the truth now! It all makes so much sense! They aren't HERETICS! They want the BEST FOR US!")) @@ -648,7 +648,7 @@ GLOBAL_LIST_EMPTY(ritualslist) /obj/item/pactofunity/attack_self(mob/user) . = ..() - var/alert = alert(user, "Rip up the pact of unity?", "HEARTHSTONE", "RIP", "Cancel") + var/alert = alert(user, "Rip up the pact of unity?", "DREAMKEEP", "RIP", "Cancel") if(alert == "RIP") user.playsound_local(user, 'sound/foley/cloth_rip.ogg', 50) to_chat(signed.mind, span_userdanger("I FAILED! MY LIFE DWINDLES!")) @@ -669,7 +669,7 @@ GLOBAL_LIST_EMPTY(ritualslist) return if(!H.stat) to_chat(user, span_info("I courteously offer \the [src] to [H].")) - if(alert(H, "Sign the pact with your blood?", "HEARTHSTONE", "Yes", "No") != "Yes") + if(alert(H, "Sign the pact with your blood?", "DREAMKEEP", "Yes", "No") != "Yes") return if(H.stat) return @@ -763,7 +763,7 @@ GLOBAL_LIST_EMPTY(ritualslist) for(var/obj/item/paper/P in C.contents) var/info = "" info = sanitize(P.info) - var/input = stripped_input(user, "To whom do we send this message?", "HEARTHSTONE") + var/input = stripped_input(user, "To whom do we send this message?", "DREAMKEEP") if(!input) return for(var/mob/living/carbon/human/HL in GLOB.human_list) @@ -908,8 +908,10 @@ GLOBAL_LIST_EMPTY(ritualslist) circle = "Fleshcrafting" center_requirement = /mob/living/carbon/human // cult leader - n_req = /mob/living/carbon/human // the ruler - s_req = /mob/living/carbon/human // virgin + n_req = /mob/living/carbon/human // virgin + s_req = /mob/living/carbon/human // anyone + e_req = /mob/living/carbon/human // anyone + w_req = /mob/living/carbon/human // anyone function = /proc/ascend @@ -919,25 +921,43 @@ GLOBAL_LIST_EMPTY(ritualslist) for(var/mob/living/carbon/human/H in C.contents) if(!iszizocultist(H)) return - for(var/mob/living/carbon/human/RULER in get_step(src, NORTH)) - if(RULER != SSticker.rulermob && RULER.stat != DEAD) - break - RULER.gib() - for(var/mob/living/carbon/human/VIRGIN in get_step(src, SOUTH)) + for(var/mob/living/carbon/human/VIRGIN in get_step(src, NORTH)) if(!VIRGIN.virginity && VIRGIN.stat != DEAD) break VIRGIN.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(src, EAST)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(src, SOUTH)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(src, WEST)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() CM.cultascended = TRUE addomen("ascend") - to_chat(user.mind, span_danger("I HAVE DONE IT! I HAVE REACHED A HIGHER FORM! SOON THERE WILL BE NO GODS. ONLY MASTERS!")) + to_chat(user.mind, span_danger("I HAVE DONE IT! Now I will die... BUT THE REFLECTION OF -ME- AS A NEW GOD WILL RISE!!!")) var/mob/living/trl = new /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended(C) + trl.name = "[user.real_name] the NEW GOD of ULTRAVIOLENCE" trl.ckey = H.ckey H.gib() - to_chat(world, "\n15 minutes remain.") for(var/mob/living/carbon/V in GLOB.human_list) - if(V.mind in CM.cultists) - V.add_stress(/datum/stressevent/lovezizo) - else + if(!V.mind in CM.cultists) + to_chat(V, span_danger("I CAN --FEEL-- SOMETHING -HORRIBLE- HAS AWAKENED...!!")) + V.do_freakout_scream() V.add_stress(/datum/stressevent/hatezizo) - CM.roundvoteend = TRUE + GLOB.todoverride = "night" + settod() + spawn(6000) + GLOB.todoverride = null + priority_announce("The Sun is torn from the sky!", "Terrible Omen", 'sound/misc/astratascream.ogg') + addomen(OMEN_SUNSTEAL) + for(var/mob/living/carbon/human/astrater in GLOB.human_list) + if(!istype(astrater.patron, /datum/patron/divine/astrata) || !length(astrater.mind?.antag_datums)) + continue + to_chat(astrater, span_userdanger("You feel the pain of [astrater.patron.name]!")) + astrater.emote_scream() break diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c6f6c59f1b5..b14e189c9bd 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -781,7 +781,7 @@ GLOBAL_LIST_EMPTY(chosen_names) popup.open(FALSE) onclose(user, "capturekeypress", src) -/datum/preferences/proc/SetChoices(mob/user, limit = 15, list/splitJobs = list("Watchmen Captain", "Prophet", "Merchant Prince", "Archivist", "Nightmaster", "Towner", "Grenzelhoft Mercenary", "Low Life", "Prisoner", "Chieftain"), widthPerColumn = 295, height = 620) //295 620 +/datum/preferences/proc/SetChoices(mob/user, limit = 15, list/splitJobs = list("Watchmen Captain", "Archpriest", "Merchant Prince", "Archivist", "Nightmaster", "Towner", "Grenzelhoft Mercenary", "Low Life", "Prisoner", "Chieftain"), widthPerColumn = 295, height = 620) //295 620 if(!SSjob) return diff --git a/code/modules/clothing/rogueclothes/hats.dm b/code/modules/clothing/rogueclothes/hats.dm index 21a48c82d94..72b41128bd3 100644 --- a/code/modules/clothing/rogueclothes/hats.dm +++ b/code/modules/clothing/rogueclothes/hats.dm @@ -518,7 +518,7 @@ /obj/item/clothing/head/roguetown/priesthat name = "priest's hat" desc = "" - icon_state = "Prophet" + icon_state = "Archpriest" //dropshrink = 0 mob_overlay_icon = 'icons/roguetown/clothing/onmob/64x64/head.dmi' dynamic_hair_suffix = "+generic" diff --git a/code/modules/clothing/rogueclothes/wrists.dm b/code/modules/clothing/rogueclothes/wrists.dm index a104d186762..5a5d62f0c4b 100644 --- a/code/modules/clothing/rogueclothes/wrists.dm +++ b/code/modules/clothing/rogueclothes/wrists.dm @@ -106,7 +106,7 @@ /obj/item/clothing/wrists/roguetown/hiddenblade name = "leather bracers" - desc = "Leather bracers worn on the wrists... With a hidden blade within." + desc = "Leather bracers worn on the wrists... With a contraption within." body_parts_covered = ARMS icon_state = "lbracers" item_state = "lbracers" @@ -117,7 +117,7 @@ sewrepair = TRUE smeltresult = /obj/item/ingot/steel var/extended = FALSE - var/obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden/hid + var/obj/item/rogueweapon/huntingknife/idagger/steel/hidden/hid /obj/item/clothing/wrists/roguetown/hiddenblade/dropped(mob/user) . = ..() @@ -128,14 +128,14 @@ toggleblades(user) /obj/item/clothing/wrists/roguetown/hiddenblade/attackby(obj/A, mob/living/carbon/human/user, params) - if(src == user.get_item_by_slot(SLOT_WRISTS) && (istype(A, /obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden) || !A)) //blade or empty hand. + if(src == user.get_item_by_slot(SLOT_WRISTS) && (istype(A, /obj/item/rogueweapon/huntingknife/idagger/steel/hidden) || !A)) //blade or empty hand. toggleblades(user) - return ..() + . = ..() /obj/item/clothing/wrists/roguetown/hiddenblade/proc/toggleblades(mob/user) if(extended) - if(istype(user.get_active_held_item(), /obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden)) + if(istype(user.get_active_held_item(), /obj/item/rogueweapon/huntingknife/idagger/steel/hidden)) user.dropItemToGround(hid, TRUE) user.visible_message("A blade retracts into [user]'s bracer.", "My hidden blade retracts into my bracer.") extended = FALSE @@ -148,10 +148,9 @@ user.put_in_hands(hid, TRUE, FALSE, TRUE) user.visible_message("A blade ejects out from [user]'s bracer.", "My hidden blade ejects out of my bracer.") extended = TRUE - ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) - + //ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) -/obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden +/obj/item/rogueweapon/huntingknife/idagger/steel/hidden name = "hidden blade" desc = "" embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 0, "embedded_fall_chance" = 0) diff --git a/code/modules/events/rogue/_rogue.dm b/code/modules/events/rogue/_rogue.dm index 427582bba4b..3b67056693b 100644 --- a/code/modules/events/rogue/_rogue.dm +++ b/code/modules/events/rogue/_rogue.dm @@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(badomens, list()) if(OMEN_SKELETONSIEGE) used = "Unwelcome visitors!" if("ascend") - used = "Levishth will rise once again." + used = "A new god is born!" if(eventreason && used) priority_announce(used, "Bad Omen", 'sound/misc/evilevent.ogg') diff --git a/code/modules/jobs/job_types/roguetown/church/priest.dm b/code/modules/jobs/job_types/roguetown/church/priest.dm index d44cbfcdc69..5dd4f8f72e9 100644 --- a/code/modules/jobs/job_types/roguetown/church/priest.dm +++ b/code/modules/jobs/job_types/roguetown/church/priest.dm @@ -1,12 +1,12 @@ /datum/job/roguetown/priest - title = "Prophet" + title = "Archpriest" flag = PRIEST department_flag = CHURCHMEN faction = "Station" total_positions = 5 spawn_positions = 5 selection_color = JCOLOR_CHURCH - f_title = "Prophetess" + f_title = "Archpriestess" allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_DIVINE_PATRONS allowed_sexes = list(MALE, FEMALE) @@ -72,7 +72,7 @@ /mob/living/carbon/human/proc/coronate_lord() set name = "Coronate" - set category = "Prophet" + set category = "Archpriest" if(!mind) return if(!istype(get_area(src), /area/rogue/indoors/town/church/chapel)) @@ -118,7 +118,7 @@ /mob/living/carbon/human/proc/churchexcommunicate() set name = "Curse" - set category = "Prophet" + set category = "Archpriest" if(stat) return var/inputty = input("Curse someone... (curse them again to remove it)", "Sinner Name") as text|null @@ -150,7 +150,7 @@ /mob/living/carbon/human/proc/churchannouncement() set name = "Announcement" - set category = "Prophet" + set category = "Archpriest" if(!COOLDOWN_FINISHED(src, church_announcement)) to_chat(src, span_warning("I should wait...")) diff --git a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm index 14696e7e8bb..e868ea23b58 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm @@ -14,7 +14,7 @@ outfit = /datum/outfit/job/roguetown/veteran give_bank_account = 1500 - min_pq = 0 + min_pq = 15 max_pq = null cmode_music = 'sound/music/combat_guard.ogg' diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm index 9078fbffa2f..a3d0ccd6eff 100644 --- a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm +++ b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm @@ -53,6 +53,9 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 2, TRUE) //This does nothing, but maybe one day it will. + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/heal/shaman) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/revive/shaman) if(H.age == AGE_OLD) H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 1, TRUE) @@ -64,9 +67,6 @@ ADD_TRAIT(H, TRAIT_NASTY_EATER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_PERFECT_TRACKER, TRAIT_GENERIC) var/datum/devotion/C = new /datum/devotion(H, H.patron) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/heal/shaman) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/revive/shaman) C.grant_spells_priest(H) H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray) diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index 5e5908d577d..eb9e01bcc8e 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(garrison_positions, list( )) GLOBAL_LIST_INIT(church_positions, list( - "Prophet", + "Archpriest", "Wytcher Captain", "Confessor", "Gravesinger", diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 87769b97753..6ee4fb826c6 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -112,11 +112,11 @@ for(var/mob/living/carbon/human/HU in GLOB.player_list) if(!HU.stat && is_in_roguetown(HU)) HU.playsound_local(get_turf(HU), 'sound/music/lorddeath.ogg', 80, FALSE, pressure_affected = FALSE) - if("Prophet") + if("Archpriest") addomen(OMEN_NOPRIEST) // if(yeae) // if(mind) -// if((mind.assigned_role == "Lord") || (mind.assigned_role == "Prophet") || (mind.assigned_role == "Watchmen Captain") || (mind.assigned_role == "Merchant")) +// if((mind.assigned_role == "Lord") || (mind.assigned_role == "Archpriest") || (mind.assigned_role == "Watchmen Captain") || (mind.assigned_role == "Merchant")) // addomen(OMEN_NOBLEDEATH) if(!gibbed && yeae) @@ -158,7 +158,7 @@ switch(job) if("Monarch") removeomen(OMEN_NOLORD) - if("Prophet") + if("Archpriest") removeomen(OMEN_NOPRIEST) /mob/living/carbon/human/gib(no_brain, no_organs, no_bodyparts, safe_gib = FALSE) diff --git a/code/modules/mob/living/carbon/human/species_types/furry/akula.dm b/code/modules/mob/living/carbon/human/species_types/furry/akula.dm index ad42b12ea6a..715c9638132 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/akula.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/akula.dm @@ -30,15 +30,7 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list( - "strength" = 1, - "perception" = 0, - "intelligence" = -1, - "constitution" = 1, - "endurance" = 1, - "speed" = 1, - "fortune" = 1 - ) + race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" attack_verb = "slash" attack_sound = 'sound/blank.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm index 03171d4a44b..f25b0b053be 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm @@ -47,8 +47,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = -1, "constitution" = 0, "endurance" = 1, "speed" = -1, "fortune" = 0) - specstats_f = list("strength" = -1, "perception" = 0, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm index c66b5feabca..cb6141c0332 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm @@ -43,8 +43,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm index d726d7e24df..4be048d0191 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm @@ -43,8 +43,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = -3, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 2, "fortune" = 1) - specstats_f = list("strength" = -3, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 2, "fortune" = 1) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm index 55c8ce3b601..64a7e4c36c2 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm @@ -44,8 +44,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" bodypart_features = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm b/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm index aa6a412c28d..92ef77bd75f 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm @@ -30,8 +30,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = -2, "intelligence" = 1, "constitution" = 2, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 2, "perception" = -2, "intelligence" = 1, "constitution" = 2, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm index 5360b5df2da..53321a9f446 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm @@ -36,8 +36,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = -2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 0, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm b/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm index 390fe99edd5..eff22121a5c 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm @@ -32,8 +32,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = 0, "intelligence" = -1, "constitution" = 1, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 2, "perception" = 0, "intelligence" = -1, "constitution" = 1, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm index b1e992b79f8..08572c79c8b 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm @@ -42,8 +42,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = -2, "intelligence" = 0, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) //0 total - specstats_f = list("strength" = 2, "perception" = -2, "intelligence" = 0, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) //0 total race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/moth.dm b/code/modules/mob/living/carbon/human/species_types/furry/moth.dm index fd9b25a3a51..14a02c5081a 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/moth.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/moth.dm @@ -29,8 +29,6 @@ OFFSET_NECK_F = list(0,0), OFFSET_MOUTH_F = list(0,0), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1) ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = -1, "perception" = 1, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm index 9b4f98612c7..ce9c0163c4d 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm @@ -36,8 +36,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1) ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -1, "perception" = 1, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm index d478b782552..f950991c865 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm @@ -34,8 +34,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = -1, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 2) - specstats_f = list("strength" = -1, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 2) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm index e35417ff0d1..eeaab60e9e2 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = 1, "perception" = -2, "intelligence" = 0, "constitution" = 2, "endurance" = 2, "speed" = -3, "fortune" = 0) - specstats_f = list("strength" = 1, "perception" = -2, "intelligence" = 0, "constitution" = 2, "endurance" = 1, "speed" = -2, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" customizers = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm index 68d3ec141e5..b86461adb91 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm @@ -58,8 +58,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = -1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = -1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm index 42df77209cf..b38e9e2fd7e 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = -2, "perception" = 2, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 3, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 2, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 3, "fortune" = 0) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm index 6c966709f54..6d0caeeabbc 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,0), OFFSET_UNDIES_F = list(0,0), \ ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = -2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 0, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm index 4e5e65afd6d..98386fd0dfb 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm @@ -41,8 +41,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) - specstats_f = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" customizers = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm index f98bce0f654..71afffb2853 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm @@ -43,8 +43,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = -1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = -1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" customizers = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm index 97335315017..85cf493ee0c 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm @@ -28,24 +28,7 @@ mutant_bodyparts = list("tail_lizard", "snout", "frills", "spines", "body_markings") mutanttongue = /obj/item/organ/tongue/lizard mutanteyes = /obj/item/organ/eyes/night_vision/argonian - specstats = list( - "strength" = 0, - "perception" = 3, - "intelligence" = -3, - "constitution" = 0, - "endurance" = 1, - "speed" = 3, - "fortune" = -3, - ) - specstats_f = list( - "strength" = 0, - "perception" = 3, - "intelligence" = -3, - "constitution" = 0, - "endurance" = 1, - "speed" = 3, - "fortune" = -3, - ) + race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" /datum/species/lizard/brazil/on_species_gain(mob/living/carbon/C, datum/species/old_species) diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm index 9e8858eb65a..e8f589df256 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm @@ -44,8 +44,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = -1) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = -1) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm index a5c4244c657..2e7e4eef57a 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm @@ -42,8 +42,6 @@ OFFSET_FACE_F = list(0,1), OFFSET_BELT_F = list(0,1), OFFSET_BACK_F = list(0,1), \ OFFSET_NECK_F = list(0,1), OFFSET_MOUTH_F = list(0,1), OFFSET_PANTS_F = list(0,1), \ OFFSET_SHIRT_F = list(0,1), OFFSET_ARMOR_F = list(0,1), OFFSET_UNDIES_F = list(0,1)) - specstats = list("strength" = 2, "perception" = 1, "intelligence" = -1, "constitution" = 2, "endurance" = 2, "speed" = 0, "fortune" = -2) - specstats_f = list("strength" = 2, "perception" = 1, "intelligence" = -1, "constitution" = 2, "endurance" = 2, "speed" = 0, "fortune" = -2) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm index f7ccee5fc90..2f0bf9713fa 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm @@ -17,7 +17,7 @@ //gender = FEMALE species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,STUBBLE,OLDGREY) //Default shit that ever race gets - inherent_traits = list(TRAIT_NOMOBSWAP, TRAIT_EASYDISMEMBER, TRAIT_CRITICAL_WEAKNESS) //Use this to add custom Fae traits + inherent_traits = list(TRAIT_NOMOBSWAP, TRAIT_EASYDISMEMBER, TRAIT_CRITICAL_WEAKNESS, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_ZJUMP, TRAIT_DODGEEXPERT) //Use this to add custom Fae traits default_features = MANDATORY_FEATURE_LIST use_skintones = 1 skinned_type = /obj/item/stack/sheet/animalhide/human @@ -43,14 +43,8 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,0), \ ) - specstats = list( - "perception" = 1, - "intelligence" = 2, - "constitution" = -1, - "strength" = -2, - "speed" = 2, // 7? are you absolutely fucking insane? - "fortune" = 1 - ) + race_bonus = list(STAT_SPEED = 1) + enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, @@ -104,7 +98,7 @@ C.transform = C.transform.Scale(0.5, 0.5) C.update_transform() C.pass_flags = PASSTABLE | PASSMOB - //C.movement_type = FLYING + C.movement_type = FLYING C.set_mob_offsets("pixie_hover", _x = 0, _y = 10) C.set_light(3, 1, "#d4fcac") @@ -123,7 +117,7 @@ C.update_transform() C.pass_flags = 0 C.reset_offsets("pixie_hover") - //C.movement_type = (C.movement_type | ~FLYING) + C.movement_type = (C.movement_type | ~FLYING) //C.Jitter(0) C.set_light(0, 0, null) diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm index ef06ac9683f..f1b5438d871 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm index b1cee320592..4e0c228f2bc 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm @@ -44,8 +44,6 @@ offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) soundpack_m = /datum/voicepack/werewolf soundpack_f = /datum/voicepack/werewolf - specstats = list("strength" = 8, "perception" = 7, "intelligence" = -6, "constitution" = 8, "endurance" = 8, "speed" = 3, "fortune" = 0) - specstats_f = list("strength" = 8, "perception" = 7, "intelligence" = -6, "constitution" = 8, "endurance" = 8, "speed" = 3, "fortune" = 0) race_bonus = list(STAT_STRENGTH = 8, STAT_PERCEPTION = 7, STAT_INTELLIGENCE = -6, STAT_CONSTITUTION = 8, STAT_ENDURANCE = 8, STAT_SPEED = 3) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/rogfatstam.dm b/code/modules/mob/living/carbon/rogfatstam.dm index c8c9650f5cd..504b0077ca1 100644 --- a/code/modules/mob/living/carbon/rogfatstam.dm +++ b/code/modules/mob/living/carbon/rogfatstam.dm @@ -109,7 +109,7 @@ heart_attacking = TRUE shake_camera(src, 1, 3) blur_eyes(10) - var/stuffy = list("ZIZO GRABS MY WEARY HEART!","ARGH! MY HEART BEATS NO MORE!","NO... MY HEART HAS BEAT IT'S LAST!","MY HEART HAS GIVEN UP!","MY HEART BETRAYS ME!","THE METRONOME OF MY LIFE STILLS!") + var/stuffy = list("LEVISHTH GRABS MY WEARY HEART!","ARGH! MY HEART BEATS NO MORE!","NO... MY HEART HAS BEAT IT'S LAST!","MY HEART HAS GIVEN UP!","MY HEART BETRAYS ME!","THE METRONOME OF MY LIFE STILLS!") to_chat(src, span_userdanger("[pick(stuffy)]")) emote("breathgasp", forced = TRUE) addtimer(CALLBACK(src, PROC_REF(adjustOxyLoss), 110), 30) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm b/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm index 1b7aa266725..8571dc6b0be 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm @@ -64,22 +64,25 @@ icon_living = "ascend" icon = 'icons/mob/32x64.dmi' base_intents = list(/datum/intent/unarmed/ascendedclaw) - melee_damage_lower = 250 - melee_damage_upper = 550 - health = 666666 - maxHealth = 666666 - STACON = 66 - STASTR = 66 - STASPD = 66 - STAEND = 66 + health = 750 + maxHealth = 750 + melee_damage_lower = 55 + melee_damage_upper = 80 + STACON = 20 + STASTR = 20 + STASPD = 20 + STAEND = 20 /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/examine(mob/user) . = ..() - . += "It is impossible to comprehend such a thing." + . += "MY MIND CAN NOT COMPREHEND!!!" + if(ishuman(user) && !iscultist(user)) + var/mob/living/carbon/human/userhuman = user + userhuman.freak_out(3) //may give you a heart attack if the initial mass stress is still on you. /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/Initialize() . = ..() - set_light(5,5, LIGHT_COLOR_RED) + set_light(5,5, LIGHT_COLOR_PURPLE) /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/get_sound(input) switch(input) @@ -96,6 +99,15 @@ /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/death(gibbed) . = ..() + var/datum/game_mode/chaosmode/CM = SSticker.mode + for(var/mob/living/carbon/V in GLOB.human_list) + if(V.mind in CM.cultists) + to_chat(V, span_danger("WE FAILED, THE NEW GOD HAS FALLEN!!! I CANT.. OH NO!!! THE DIVINE LIGHT RETURNS TO THIS AREA!!! ")) + V.gib() + else + to_chat(V, span_greenannounce("THE DIVINE LIGHT RETURNS TO US!!!")) + V.remove_stress(/datum/stressevent/hatezizo) + V.add_stress(/datum/stressevent/zizodefeated) gib() qdel(src) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm b/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm index 9e04c52634e..e4ad5714641 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm @@ -11,7 +11,6 @@ speak_chance = 1 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 4, /obj/item/natural/carapace = 2) - faction = list("crabs") food_type = list(/obj/item/reagent_containers/food/snacks) response_help_continuous = "pets" response_help_simple = "pet" diff --git a/code/modules/roguetown/roguecrafting/alchemy.dm b/code/modules/roguetown/roguecrafting/alchemy.dm index 80fe2362338..f1d0bc0c712 100644 --- a/code/modules/roguetown/roguecrafting/alchemy.dm +++ b/code/modules/roguetown/roguecrafting/alchemy.dm @@ -207,6 +207,20 @@ craftdiff = 1 verbage_simple = "forge" +/datum/crafting_recipe/roguetown/alchemy/glassbottles2 + name = "3x glass bottles (Glass sheet)" + result = list(/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle) + reqs = list(/obj/item/ingot/glass) + craftdiff = 1 + verbage_simple = "forge" + +/datum/crafting_recipe/roguetown/alchemy/glasssyringe + name = "Glass syringe (x3)" + result = list(/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe) + reqs = list(/obj/item/ingot/glass) + craftdiff = 1 + verbage_simple = "forge" + /// transmutation /datum/crafting_recipe/roguetown/alchemy/distill diff --git a/code/modules/roguetown/roguecrafting/items.dm b/code/modules/roguetown/roguecrafting/items.dm index 137f6b569f8..b367377cfec 100644 --- a/code/modules/roguetown/roguecrafting/items.dm +++ b/code/modules/roguetown/roguecrafting/items.dm @@ -817,26 +817,6 @@ skillcraft = /datum/skill/magic/druidic craftdiff = 2 // druids & dendor clerics can craft -// --------- GLASS ----------- - -/datum/crafting_recipe/roguetown/glassbottle - name = "Glass bottle (x2)" - reqs = list(/obj/item/ingot/glass) - result = list(/obj/item/reagent_containers/glass/bottle/rogue,/obj/item/reagent_containers/glass/bottle/rogue) - skillcraft = /datum/skill/craft/smelting - structurecraft = /obj/machinery/light/rogue/smelter - always_availible = FALSE - craftdiff = 1 - -/datum/crafting_recipe/roguetown/glasssyringe - name = "Glass syringe (x3)" - reqs = list(/obj/item/ingot/glass) - result = list(/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe) - skillcraft = /datum/skill/craft/smelting - structurecraft = /obj/machinery/light/rogue/smelter - always_availible = FALSE - craftdiff = 2 //small and more detailed in workings i guess. - //gunmaking slop /datum/crafting_recipe/roguetown/firingpim name = "Firing pin" diff --git a/code/modules/roguetown/roguejobs/fisher/leeches.dm b/code/modules/roguetown/roguejobs/fisher/leeches.dm index c1f0c9f4b4b..37bb12c7f84 100644 --- a/code/modules/roguetown/roguejobs/fisher/leeches.dm +++ b/code/modules/roguetown/roguejobs/fisher/leeches.dm @@ -246,7 +246,7 @@ if(iscarbon(user)) var/mob/living/carbon/V = user if(prob(5)) - V.say(pick("PRAISE ZIZO!", "DEATH TO THE TEN...")) + V.say(pick("PRAISE LEVISHTH!", "DEATH TO THE TEN...")) V.add_stress(/datum/stressevent/leechcult) #undef MAX_LEECH_EVILNESS diff --git a/code/modules/roguetown/roguejobs/gravedigger/hole.dm b/code/modules/roguetown/roguejobs/gravedigger/hole.dm index c0cca587ee3..26af97a6c45 100644 --- a/code/modules/roguetown/roguejobs/gravedigger/hole.dm +++ b/code/modules/roguetown/roguejobs/gravedigger/hole.dm @@ -287,6 +287,8 @@ if(!(locate(/obj/item/natural/stone) in T)) if(prob(23)) new /obj/item/natural/stone(T) + if(prob(23)) + new /obj/item/rogueore/sand(T) return ..() /obj/structure/closet/dirthole/Destroy() diff --git a/code/modules/roguetown/roguemachine/mail.dm b/code/modules/roguetown/roguemachine/mail.dm index a1eb092df8a..af8788694c2 100644 --- a/code/modules/roguetown/roguemachine/mail.dm +++ b/code/modules/roguetown/roguemachine/mail.dm @@ -117,7 +117,7 @@ GLOB.confessors += "[C.signed]" qdel(C) visible_message(span_warning("[user] sends something.")) - send_ooc_note("Confessions: [GLOB.confessors.len]/5", job = list("confessor", "Witcher", "Prophet")) + send_ooc_note("Confessions: [GLOB.confessors.len]/5", job = list("confessor", "Witcher", "Archpriest")) playsound(loc, 'sound/magic/hallelujah.ogg', 100, FALSE, -1) playsound(loc, 'sound/misc/disposalflush.ogg', 100, FALSE, -1) return diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 0e330beae9b..4ce22e981ae 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -223,7 +223,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( if(!AM.anchored || istype(AM, /obj/mecha)) if(istype(AM, /obj/item/paper/scroll/cargo)) var/obj/item/paper/scroll/cargo/C = AM - if(C.signedjob in list("Prophet", "Magician", "Merchant Prince", "Monarch", "Commander","Judge")) + if(C.signedjob in list("Archpriest", "Magician", "Merchant Prince", "Monarch", "Commander","Judge")) for(var/datum/supply_order/SO in C.orders) SSshuttle.shoppinglist += SO C.orders -= SO @@ -236,7 +236,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( continue if(istype(thing, /obj/item/paper/scroll/cargo)) var/obj/item/paper/scroll/cargo/C = AM - if(C.signedjob in list("Prophet", "Magician", "Merchant Prince", "Monarch", "Commander","Judge")) + if(C.signedjob in list("Archpriest", "Magician", "Merchant Prince", "Monarch", "Commander","Judge")) for(var/datum/supply_order/SO in C.orders) SSshuttle.shoppinglist += SO C.orders -= SO diff --git a/code/modules/spells/roguetown/acolyte/dendor.dm b/code/modules/spells/roguetown/acolyte/dendor.dm index 80ca37d62c4..7b41ead1dae 100644 --- a/code/modules/spells/roguetown/acolyte/dendor.dm +++ b/code/modules/spells/roguetown/acolyte/dendor.dm @@ -108,5 +108,6 @@ for(var/X in GLOB.cardinals) var/turf/TT = get_step(T, X) if(!isclosedturf(TT) && !locate(/obj/structure/glowshroom) in TT) - var/shroomie = new /obj/structure/glowshroom(TT) - addtimer(CALLBACK(shroomie, PROC_REF(qdel), shroomie), 15 SECONDS, TIMER_STOPPABLE) //clears after 15 secs cause this shit is cancer. + var/shroomtospawn = pick(/obj/structure/glowshroom, /obj/structure/safeglowshroom) //hey its fungal illumination not fungal zapping your ass away. + var/obj/structure/shroomie = new shroomtospawn(TT) + addtimer(CALLBACK(shroomie, /obj/structure/glowshroom/proc/destroy, shroomie), 5 SECONDS, TIMER_STOPPABLE) // Destroys after 5 secs diff --git a/code/modules/surgery/organs/feature_organs/genitals.dm b/code/modules/surgery/organs/feature_organs/genitals.dm index c2718ab7897..3c3e7838bc3 100644 --- a/code/modules/surgery/organs/feature_organs/genitals.dm +++ b/code/modules/surgery/organs/feature_organs/genitals.dm @@ -192,7 +192,6 @@ name = "butt" icon = 'modular_stonehedge/licensed-eaglephntm/icons/obj/surgery.dmi' icon_state = "butt" - dropshrink = 0.5 visible_organ = TRUE zone = BODY_ZONE_PRECISE_STOMACH slot = ORGAN_SLOT_BUTT diff --git a/data/player_generated_books/Unknown.json b/data/player_generated_books/Unknown.json deleted file mode 100644 index 2a3a3ebfbb5..00000000000 --- a/data/player_generated_books/Unknown.json +++ /dev/null @@ -1 +0,0 @@ -{"book_title":"Unknown Title", "author":"Unknown Author", "author_ckey":"(test file)", "icon":"basic_book", "text":"[moisture in the air or water leaks have rendered the carefully written caligraphy of this book unreadable]"} diff --git a/data/player_generated_books/_book_titles.json b/data/player_generated_books/_book_titles.json deleted file mode 100644 index 90b970fd175..00000000000 --- a/data/player_generated_books/_book_titles.json +++ /dev/null @@ -1 +0,0 @@ -["Unknown"] diff --git a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm index c759abb463b..77ecc306a4d 100644 --- a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm +++ b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm @@ -105,6 +105,20 @@ maxHealth = 100 health = 100 +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry + var/list/friendlyjobs = list("Guild Appraiser", "Guildmaster") + +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry/CanAttack(atom/the_target, ignore_lying) + if(ishuman(the_target)) + var/mob/living/carbon/human/madafaka = the_target + if(madafaka.job |= friendlyjobs) + return FALSE + else + //funny screaming + if(prob(10)) + src.say(pick("I GOT YOU NOW MADAFAKA!!!", "I SEE A MADA-FFFFFFFFFFFFFAKAAAA HERE!!!!", "WHAT'CHU DOIN HERE MADAFFFFAKA!!!!", "ALERT!! MADAFFFFAKA SPOTTEEEEED!!!")) + . = ..() + /mob/living/simple_animal/hostile/rogue/skeleton/guard/crypt_guard name = "Crypt Guard" base_intents = list(/datum/intent/simple/spear) diff --git a/modular_stonehedge/ADDITIONAL-TERMS.md b/modular_stonehedge/ADDITIONAL-TERMS.md new file mode 100644 index 00000000000..f5b83b852fa --- /dev/null +++ b/modular_stonehedge/ADDITIONAL-TERMS.md @@ -0,0 +1,13 @@ +ADDITIONAL TERMS + +In accordance with Section 7. "Additional Terms" of the GNU Affero General Public License version 3.0 (hereafter referred to as "license"), whose contents are nominally available in StoneHedge/LICENSE.md or online at https://www.gnu.org/licenses/agpl-3.0.html#license-text, the Author(s) of all code (.dm) and map (.dmm) files within this directory and its subdirectories (henceforth referred to as "contents") permit all activities with regards to the contents that are permissible under this license, subject to the following additional terms, current as of 11/26/2024: + +1. Removal of this document from this directory or modification of its text by anyone other than its author (https://github.com/DerFlammenwerfer), or a person with permission granted by its author is strictly prohibited. + +2. The contents are provided as-is, and their Author(s) make no warranty or guarantees in regards to its functionality if modified, obtained separately from a copy of this repository, packaged separately from a copy of this repository, or redistributed separately from a copy of this repository. + +3. Each file within the contents, where possible or unless otherwise disclaimed, shall contain a list of its author(s) in comments at the beginning of the file, as well as a link to the StoneHedge repository on GitHub. In the case of .dmm files or .dmi files, an itemized list of file names and their respective authors must be included in the same directory as these terms. Modification of attribution lists to add attribution of files to additional authors is permitted, but removal of attributions are prohibited except where expressly requested by the authors whose attributions are to be removed. + +4. Failure to include the aforementioned attributions while obtaining, modifying, or conveying any or all of the contents, or misrepresentation of where the contents were obtained from will be considered a violation of these terms. + +5. By modifying, conveying, redistributing, or performing any other permissible activity with the contents under the aforementioned license, you agree to this and the above listed terms and acknowledge that, except where prohibited by the license or by law, violation of these additional terms will equate to a violation of the license and will result in immediate and automatic termination of the rights granted by the license in accordance with the terms of Section 8. "Termination" Additionally, when adding new files to the contents, you agree to subject those additions to these additional terms. \ No newline at end of file diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm new file mode 100644 index 00000000000..844428d0016 --- /dev/null +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -0,0 +1,275 @@ +//By Vide Noir https://github.com/EaglePhntm. +//templated on hearthstone sea raiders. + +/mob/living/carbon/human/species/human/friendlynpc + aggressive=1 + race = /datum/species/elf/wood + mode = AI_IDLE + faction = list("Station") + ambushable = FALSE + dodgetime = 30 + flee_in_pain = TRUE + possible_rmb_intents = list() + erpable = TRUE + wander = TRUE + show_genitals = TRUE + var/list/friendlyfactions = list("Station", "neutral", "rogueanimal") + var/list/friendlyjobs + //quotes from skyrim cause we love skyrim. + var/list/calmmessages = list() + var/list/aggromessages = list() + var/mob/living/lasthitter = null + +//would be great if we could make them follow stone roads while idle. +/mob/living/carbon/human/species/human/friendlynpc/should_target(mob/living/L) + if(L == src) + return FALSE + if(L.stat != CONSCIOUS) + return FALSE + if(L.lying && !L.get_active_held_item()) + if(ishuman(L)) + var/mob/living/carbon/human/badboi = L + if(badboi == lasthitter && Adjacent(badboi) && !badboi.handcuffed) + //untested but yeah. + say("I got you now, criminal scum.") + scom_announce("I caught the criminal scum [badboi.real_name] at [get_area(src)].") + var/obj/item/rope/ropey = new /obj/item/rope + ropey.apply_cuffs(badboi, src) + start_pulling(badboi) + return FALSE + if(L == lasthitter && L.alpha > 100) + return TRUE + if(ishuman(L)) + var/mob/living/carbon/human/madafaka = L + if(madafaka.Adjacent(src) && mode != AI_HUNT && madafaka.mind && madafaka.alpha > 100) + if(prob(10)) + face_atom(madafaka) + emote(pick("turns to [madafaka].", "faces [madafaka].")) + say(pick(calmmessages)) + if(friendlyfactions) + if(madafaka.faction |= friendlyfactions && target != lasthitter) + return FALSE + if(friendlyjobs) + if(madafaka.job |= friendlyjobs && target != lasthitter) + return FALSE + . = ..() + +/mob/living/carbon/human/species/human/friendlynpc/MobBump(mob/M) + if(ishuman(M)) + var/mob/living/carbon/human/L = M + if(lasthitter == L) + say("Wait, I know you..!") + if(L.alpha <= 100) + L.apply_status_effect(/datum/status_effect/debuff/stealthcd) + retaliate(L) + else + face_atom(L) + emote(pick("turns to [L].", "faces [L].")) + if(prob(10)) + say(pick(calmmessages)) + . = ..() + +/mob/living/carbon/human/species/human/friendlynpc/townguard + friendlyfactions = list("Station", "neutral") + calmmessages = list( + "Let me guess... someone stole your sweetroll.", + "I used to be an adventurer like you. Then I took an arrow in the knee...", + "Disrespect the law, and you disrespect me.", + "What do you need?", + "Trouble?", + "What is it?", + "No lollygaggin'.", + "My cousin's out fighting dragons, and what do I get? Guard duty.", + "Gotta keep my eyes open. Damn dragons could swoop down at any time.", + "Fear not. Come dragon or giant, we'll be ready.", + "Brigands I can handle, but this talk of dragons? World's gone mad, I say.", + "Everything's in order.", + "Staying safe I hope.", + "Everything all right?", + "Could sure use a warm bed right about now...", + "I'd be a lot warmer and a lot happier with a bellyful of mead...", + "I mostly deal with petty thievery and drunken brawls. Been too long since we've had a good bandit raid.", + "What is it? Dragons?", + "Watch the skies, traveler.", + "I fear the night. Because the werewolves and vampires don't.", + "Just a few more hours and I can crawl under some furs...", + ) + aggromessages = list( + "Never should have come here!", + "Then let me speed your passage to Yamais' hands!", + "Then pay with your blood!", + "That can be arranged!", + "So be it!", + "You have sealed your fate!", + "You cannot escape the righteous!", + "Fool!", + "You will pay, with your blood!", + ) + var/patrol = TRUE + var/lastpatroltime + +//this does not work for some reason unfortunately +/* +/mob/living/carbon/human/species/human/friendlynpc/townguard/npc_idle() + . = ..() + //im not smart enough to make a good patrol system but here. + if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && patrol) + if(prob(20)) + if(world.time > lastpatroltime + 10 SECONDS) //give em some time to reach and whatever + var/foundpatrolpoints + for(var/obj/effect/landmark/townpatrol/patrolpoint in orange(30,src)) + foundpatrolpoints += patrolpoint + if(foundpatrolpoints) + var/pickedpoint = get_closest_atom(/obj/effect/landmark/townpatrol, foundpatrolpoints, src) + if(pickedpoint) + walk2derpless(pickedpoint) + lastpatroltime = world.time + else + //make them randomly go to a distant tile thats not foilage, if there is no patrol landmark around + var/turf/open/T = oview(pick(13,24),src) + if(!istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/floor/rogue/dirt) && !istype(T, /turf/open/floor/rogue/grass)) + walk2derpless(T) + +/obj/effect/landmark/townpatrol + name = "patrol-point" +*/ + +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute + +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute/after_creation() + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute) + + +/mob/living/carbon/human/species/human/friendlynpc/townguard/retaliate(mob/living/L) + var/newtarg = target + lasthitter = target + .=..() + if(target) + aggressive=1 + wander = TRUE + if(target == newtarg) + say(pick(aggromessages)) + linepoint(target) + +/mob/living/carbon/human/species/human/friendlynpc/townguard/Initialize() + gender = pick(MALE,FEMALE) + . = ..() + spawn(10) + after_creation() + //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) + +/mob/living/carbon/human/species/human/friendlynpc/townguard/after_creation() + ..() + job = "Town Guardsman" + ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_NOHUNGER, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_HEAVYARMOR, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_BOG_TREKKING, TRAIT_GENERIC) + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard) + var/obj/item/organ/eyes/organ_eyes = getorgan(/obj/item/organ/eyes/night_vision/full_darksight) //elf eyes + if(organ_eyes) + organ_eyes.eye_color = pick("27becc", "35cc27", "000000") + update_hair() + update_body() + +/mob/living/carbon/human/species/human/friendlynpc/townguard/handle_combat() + if(mode == AI_HUNT) + if(prob(10)) + emote("rage") + . = ..() + +/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/pre_equip(mob/living/carbon/human/H) + if(prob(50)) + wrists = /obj/item/clothing/wrists/roguetown/bracers + cloak = /obj/item/clothing/cloak/templar/dendor + gloves = /obj/item/clothing/gloves/roguetown/forestergauntlets + armor = /obj/item/clothing/suit/roguetown/armor/plate/half/foresterarmor + shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant + if(prob(50)) + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail + pants = /obj/item/clothing/under/roguetown/tights + head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet + H.STASPD = 8 + H.STACON = 4 + H.STAEND = 15 + H.STAINT = 5 + H.STASTR = rand(11,16) + if(prob(50)) + r_hand = /obj/item/rogueweapon/sword + else + r_hand = /obj/item/rogueweapon/mace + l_hand = /obj/item/rogueweapon/shield/tower + shoes = /obj/item/clothing/shoes/roguetown/boots/forestershoes + if(prob(30)) + neck = /obj/item/clothing/neck/roguetown/chaincoif + H.eye_color = pick("27becc", "35cc27", "000000") + H.hair_color = pick ("4f4f4f", "61310f", "faf6b9") + H.facial_hair_color = H.hair_color + if(H.gender == MALE) + H.name = pick( world.file2list("strings/rt/names/elf/elfwm.txt") ) + H.real_name = H.name + else + H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) + H.real_name = H.name + +/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute/pre_equip(mob/living/carbon/human/H) + wrists = /obj/item/clothing/wrists/roguetown/bracers + cloak = /obj/item/clothing/cloak/templar/dendor + armor = /obj/item/clothing/suit/roguetown/armor/plate/half + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail + pants = /obj/item/clothing/under/roguetown/chainlegs + head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings + if(prob(60)) + mask = /obj/item/clothing/mask/rogue/facemask + gloves = /obj/item/clothing/gloves/roguetown/chain + H.STASPD = 9 + H.STACON = 8 + H.STAEND = 15 + H.STAINT = 5 + H.STASTR = rand(15,18) + if(prob(50)) + r_hand = /obj/item/rogueweapon/halberd/bardiche + else + r_hand = /obj/item/rogueweapon/greatsword + shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron + neck = /obj/item/clothing/neck/roguetown/chaincoif + if(H.gender == MALE) + H.name = pick( world.file2list("strings/rt/names/elf/elfwm.txt") ) + H.real_name = H.name + else + H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) + H.real_name = H.name + +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry + patrol = FALSE + wander = FALSE + +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry/after_creation() + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/sentry) + +/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/sentry/pre_equip(mob/living/carbon/human/H) + wrists = /obj/item/clothing/wrists/roguetown/bracers + cloak = /obj/item/clothing/cloak/templar/dendor + armor = /obj/item/clothing/suit/roguetown/armor/plate/half + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail + pants = /obj/item/clothing/under/roguetown/chainlegs + head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings + if(prob(60)) + mask = /obj/item/clothing/mask/rogue/facemask + gloves = /obj/item/clothing/gloves/roguetown/chain + H.STASPD = 9 + H.STACON = 8 + H.STAEND = 15 + H.STAINT = 5 + H.STASTR = rand(15,18) + r_hand = /obj/item/rogueweapon/halberd + shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron + neck = /obj/item/clothing/neck/roguetown/chaincoif + if(H.gender == MALE) + H.name = pick( world.file2list("strings/rt/names/elf/elfwm.txt") ) + H.real_name = H.name + else + H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) + H.real_name = H.name diff --git a/roguetown.dme b/roguetown.dme index 131492041cd..ae5141286dc 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -3751,5 +3751,6 @@ #include "modular_stonehedge\code\lewdai\lewdai.dm" #include "modular_stonehedge\code\modules\datums\accents.dm" #include "modular_stonehedge\code\modules\mob\living\overhead_effects.dm" +#include "modular_stonehedge\code\modules\mob\living\simple_animal\rogue\friendly_npc.dm" #include "modular_stonehedge\licensed-death-rattler\Death-Rattler\code\Death-Rattler.dm" // END_INCLUDE From eea424e462a59a3b033c631c914a6c54c9125a4b Mon Sep 17 00:00:00 2001 From: Vide Noir <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 23:26:27 +0300 Subject: [PATCH 054/192] Adds town guards to map (#123) * also whats this doing here * aw shit * a bunch of shit * Update friendly_npc.dm * a few more * fml * done ig * Update role_preferences.dm * few things more * ok done * sentries --- _maps/map_files/dreamhold/Dreamhold.dmm | 191 ++++++++++++++++++++---- 1 file changed, 165 insertions(+), 26 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 2a6c624b6d1..40fbfcbd4f8 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -647,6 +647,10 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"azG" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/outdoors/river) "azR" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -2905,6 +2909,7 @@ dir = 1 }, /obj/machinery/light/rogue/wallfire/candle/r, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) "cns" = ( @@ -2980,6 +2985,12 @@ }, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) +"cpy" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "cqm" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -5206,6 +5217,13 @@ "dVE" = ( /turf/closed/wall/shroud, /area/rogue/indoors/shelter/bog) +"dVP" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/twig/platform, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "dWh" = ( /obj/structure/flora/newbranch/connector{ icon_state = "center-leaf1" @@ -6049,6 +6067,10 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"eCw" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/indoors/shelter/bog) "eCy" = ( /obj/structure/flora/roguegrass/bush{ icon_state = "bush2" @@ -9099,6 +9121,7 @@ /obj/machinery/light/rogue/lanternpost{ dir = 1 }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null @@ -9120,6 +9143,7 @@ }) "hau" = ( /obj/machinery/light/rogue/wallfire/candle/blue, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -10122,6 +10146,10 @@ /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/twig, /area/rogue/indoors/shelter/rtfield) +"hOu" = ( +/obj/item/storage/backpack/rogue/backpack/surgery, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/shelter/bog) "hOZ" = ( /obj/structure/flora/grass/jungle{ icon_state = "grassa2" @@ -10438,6 +10466,7 @@ /obj/machinery/light/rogue/torchholder{ dir = 4 }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -14077,6 +14106,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"kOv" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kOC" = ( /obj/structure/spacevine, /turf/closed/wall/mineral/rogue/stone/moss, @@ -14492,6 +14528,13 @@ "lfk" = ( /obj/machinery/light/rogue/lanternpost, /turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) +"lfB" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -15032,6 +15075,13 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"lCr" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "lCH" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -15560,6 +15610,18 @@ /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) +"maS" = ( +/obj/structure/fluff/railing/wood{ + dir = 1; + layer = 2.7; + pixel_x = 2; + pixel_y = 7 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/ruinedwood/herringbone, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "mba" = ( /obj/structure/roguetent, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -16625,6 +16687,12 @@ /obj/machinery/light/rogue/campfire/densefire, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) +"mOd" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "mOu" = ( /obj/effect/decal/border/ruinedwood{ dir = 8 @@ -17613,6 +17681,13 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"nBi" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "nBZ" = ( /obj/structure/chair/wood/rogue{ dir = 8 @@ -18254,6 +18329,16 @@ /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/exposed/tavern) +"nYE" = ( +/obj/structure/fluff/railing/wood{ + dir = 1; + layer = 2.7; + pixel_x = 2; + pixel_y = 7 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/twig, +/area/rogue/outdoors/river) "nYV" = ( /obj/structure/flora/newleaf{ icon_state = "center-leaf2" @@ -20061,6 +20146,19 @@ }, /turf/open/floor/rogue/tile, /area/rogue/indoors/shelter/town) +"pEC" = ( +/obj/structure/fluff/railing/wood{ + dir = 1; + layer = 2.7; + pixel_x = 1; + pixel_y = 7 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/twig/platform, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "pEJ" = ( /obj/effect/mob_spawner/wilderness, /turf/open/floor/rogue/grass, @@ -20188,6 +20286,12 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"pIz" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "pJt" = ( /obj/structure/flora/grass/jungle/b, /obj/machinery/light/rogue/wallfire/candle/blue/l, @@ -21323,6 +21427,16 @@ }, /turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town) +"qwx" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/tavern{ + first_time_text = "The Sylver Dragonne.."; + name = "Silver Dragon" + }) "qwU" = ( /mob/living/carbon/human/species/skeleton/npc/dungeon/ambush, /turf/open/floor/rogue/naturalstone, @@ -24067,6 +24181,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"sCW" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "sDr" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/outdoors/woods{ @@ -26444,6 +26564,13 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"usY" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "utn" = ( /obj/structure/rack/rogue, /obj/item/clothing/suit/roguetown/shirt/shortshirt, @@ -27417,10 +27544,7 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "vdm" = ( -/mob/living/simple_animal/hostile/rogue/skeleton/bow{ - faction = list("undead", "noble"ssssss); - name = "Vint" - }, +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry, /turf/open/floor/rogue/greenstone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -27790,6 +27914,14 @@ icon_state = "rockwd" }, /area/rogue/outdoors/river) +"vwj" = ( +/obj/structure/flora/roguegrass, +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "vwm" = ( /obj/item/natural/stone, /turf/open/floor/rogue/dirt, @@ -28937,6 +29069,12 @@ /obj/item/bedsheet/rogue/double_pelt, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) +"wxI" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "wxO" = ( /obj/structure/rack/rogue/shelf, /obj/structure/table/wood{ @@ -30499,6 +30637,7 @@ }) "xKH" = ( /obj/machinery/light/rogue/wallfire/candle/blue, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -110484,9 +110623,9 @@ fbr kqH kqH ucF -qzW -jQX +pEC jQX +dVP bqG mYC mYC @@ -113514,7 +113653,7 @@ qJZ qJZ qMs haD -ycO +lfB ycO ycO haD @@ -116356,7 +116495,7 @@ nEK beK beK beK -beK +lCr vjX lfk beK @@ -119582,7 +119721,7 @@ sfZ ycO qJZ vmN -qJZ +nBi beK beK beK @@ -126603,7 +126742,7 @@ oCe oCe gWL qGx -fqz +cpy fqz fqz dKA @@ -126815,7 +126954,7 @@ sjb nZO kIc bGw -pbG +azG pbG pbG waZ @@ -127319,7 +127458,7 @@ tyj oCe hcX kuV -iRs +hOu iRs iRs iRs @@ -127421,7 +127560,7 @@ rps rps reQ rps -rth +nYE buM buM vwh @@ -127457,7 +127596,7 @@ tac nFT lvM ycO -ijB +kOv pTW qJZ qJZ @@ -127858,7 +127997,7 @@ nze ufX voH ijB -slN +vwj ycO nWn qMs @@ -129055,7 +129194,7 @@ pFL uxu uxu uxu -hGY +pIz pwR oea pwR @@ -129845,10 +129984,10 @@ bjQ hif fqz aJC -yls +mOd qoW jCl -xBY +sCW xBY xBY eYD @@ -129867,7 +130006,7 @@ qhI pwR oea pwR -nFS +usY rLF nFS beK @@ -156892,7 +157031,7 @@ nPY dKA fqz fqz -sPO +wxI sPO wLq sPO @@ -158102,7 +158241,7 @@ nPY ulr cMY fqz -fqz +cpy fqz nPY kLn @@ -159732,7 +159871,7 @@ enU tJb tJb tJb -dmS +qwx tJb tJb tJb @@ -161331,7 +161470,7 @@ xBY xBY qCV qCV -fqz +cpy fqz fqz fqz @@ -162063,7 +162202,7 @@ sib sib hKD eQy -qmG +eCw qmG vEo wSW @@ -162547,7 +162686,7 @@ bcc bcc bcc bcc -jCG +maS vMS vMS vMS @@ -165684,7 +165823,7 @@ snY cSc ijB rzN -beK +lCr hcX rjd oPy From 7777fe2d11aae1fa4e117338ff851dcb71c8c99c Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 23:27:31 +0300 Subject: [PATCH 055/192] sentries --- _maps/map_files/dreamhold/Dreamhold.dmm | 191 ++++++++++++++++++++---- 1 file changed, 165 insertions(+), 26 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 2a6c624b6d1..40fbfcbd4f8 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -647,6 +647,10 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"azG" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/outdoors/river) "azR" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -2905,6 +2909,7 @@ dir = 1 }, /obj/machinery/light/rogue/wallfire/candle/r, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) "cns" = ( @@ -2980,6 +2985,12 @@ }, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) +"cpy" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "cqm" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -5206,6 +5217,13 @@ "dVE" = ( /turf/closed/wall/shroud, /area/rogue/indoors/shelter/bog) +"dVP" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/twig/platform, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "dWh" = ( /obj/structure/flora/newbranch/connector{ icon_state = "center-leaf1" @@ -6049,6 +6067,10 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"eCw" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/indoors/shelter/bog) "eCy" = ( /obj/structure/flora/roguegrass/bush{ icon_state = "bush2" @@ -9099,6 +9121,7 @@ /obj/machinery/light/rogue/lanternpost{ dir = 1 }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null @@ -9120,6 +9143,7 @@ }) "hau" = ( /obj/machinery/light/rogue/wallfire/candle/blue, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -10122,6 +10146,10 @@ /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/twig, /area/rogue/indoors/shelter/rtfield) +"hOu" = ( +/obj/item/storage/backpack/rogue/backpack/surgery, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/shelter/bog) "hOZ" = ( /obj/structure/flora/grass/jungle{ icon_state = "grassa2" @@ -10438,6 +10466,7 @@ /obj/machinery/light/rogue/torchholder{ dir = 4 }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -14077,6 +14106,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"kOv" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kOC" = ( /obj/structure/spacevine, /turf/closed/wall/mineral/rogue/stone/moss, @@ -14492,6 +14528,13 @@ "lfk" = ( /obj/machinery/light/rogue/lanternpost, /turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) +"lfB" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -15032,6 +15075,13 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"lCr" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "lCH" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -15560,6 +15610,18 @@ /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) +"maS" = ( +/obj/structure/fluff/railing/wood{ + dir = 1; + layer = 2.7; + pixel_x = 2; + pixel_y = 7 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/ruinedwood/herringbone, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "mba" = ( /obj/structure/roguetent, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -16625,6 +16687,12 @@ /obj/machinery/light/rogue/campfire/densefire, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) +"mOd" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "mOu" = ( /obj/effect/decal/border/ruinedwood{ dir = 8 @@ -17613,6 +17681,13 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"nBi" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "nBZ" = ( /obj/structure/chair/wood/rogue{ dir = 8 @@ -18254,6 +18329,16 @@ /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/exposed/tavern) +"nYE" = ( +/obj/structure/fluff/railing/wood{ + dir = 1; + layer = 2.7; + pixel_x = 2; + pixel_y = 7 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/twig, +/area/rogue/outdoors/river) "nYV" = ( /obj/structure/flora/newleaf{ icon_state = "center-leaf2" @@ -20061,6 +20146,19 @@ }, /turf/open/floor/rogue/tile, /area/rogue/indoors/shelter/town) +"pEC" = ( +/obj/structure/fluff/railing/wood{ + dir = 1; + layer = 2.7; + pixel_x = 1; + pixel_y = 7 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/twig/platform, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "pEJ" = ( /obj/effect/mob_spawner/wilderness, /turf/open/floor/rogue/grass, @@ -20188,6 +20286,12 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"pIz" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "pJt" = ( /obj/structure/flora/grass/jungle/b, /obj/machinery/light/rogue/wallfire/candle/blue/l, @@ -21323,6 +21427,16 @@ }, /turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town) +"qwx" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/tavern{ + first_time_text = "The Sylver Dragonne.."; + name = "Silver Dragon" + }) "qwU" = ( /mob/living/carbon/human/species/skeleton/npc/dungeon/ambush, /turf/open/floor/rogue/naturalstone, @@ -24067,6 +24181,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"sCW" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "sDr" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/outdoors/woods{ @@ -26444,6 +26564,13 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"usY" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "utn" = ( /obj/structure/rack/rogue, /obj/item/clothing/suit/roguetown/shirt/shortshirt, @@ -27417,10 +27544,7 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "vdm" = ( -/mob/living/simple_animal/hostile/rogue/skeleton/bow{ - faction = list("undead", "noble"ssssss); - name = "Vint" - }, +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry, /turf/open/floor/rogue/greenstone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -27790,6 +27914,14 @@ icon_state = "rockwd" }, /area/rogue/outdoors/river) +"vwj" = ( +/obj/structure/flora/roguegrass, +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "vwm" = ( /obj/item/natural/stone, /turf/open/floor/rogue/dirt, @@ -28937,6 +29069,12 @@ /obj/item/bedsheet/rogue/double_pelt, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) +"wxI" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "wxO" = ( /obj/structure/rack/rogue/shelf, /obj/structure/table/wood{ @@ -30499,6 +30637,7 @@ }) "xKH" = ( /obj/machinery/light/rogue/wallfire/candle/blue, +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -110484,9 +110623,9 @@ fbr kqH kqH ucF -qzW -jQX +pEC jQX +dVP bqG mYC mYC @@ -113514,7 +113653,7 @@ qJZ qJZ qMs haD -ycO +lfB ycO ycO haD @@ -116356,7 +116495,7 @@ nEK beK beK beK -beK +lCr vjX lfk beK @@ -119582,7 +119721,7 @@ sfZ ycO qJZ vmN -qJZ +nBi beK beK beK @@ -126603,7 +126742,7 @@ oCe oCe gWL qGx -fqz +cpy fqz fqz dKA @@ -126815,7 +126954,7 @@ sjb nZO kIc bGw -pbG +azG pbG pbG waZ @@ -127319,7 +127458,7 @@ tyj oCe hcX kuV -iRs +hOu iRs iRs iRs @@ -127421,7 +127560,7 @@ rps rps reQ rps -rth +nYE buM buM vwh @@ -127457,7 +127596,7 @@ tac nFT lvM ycO -ijB +kOv pTW qJZ qJZ @@ -127858,7 +127997,7 @@ nze ufX voH ijB -slN +vwj ycO nWn qMs @@ -129055,7 +129194,7 @@ pFL uxu uxu uxu -hGY +pIz pwR oea pwR @@ -129845,10 +129984,10 @@ bjQ hif fqz aJC -yls +mOd qoW jCl -xBY +sCW xBY xBY eYD @@ -129867,7 +130006,7 @@ qhI pwR oea pwR -nFS +usY rLF nFS beK @@ -156892,7 +157031,7 @@ nPY dKA fqz fqz -sPO +wxI sPO wLq sPO @@ -158102,7 +158241,7 @@ nPY ulr cMY fqz -fqz +cpy fqz nPY kLn @@ -159732,7 +159871,7 @@ enU tJb tJb tJb -dmS +qwx tJb tJb tJb @@ -161331,7 +161470,7 @@ xBY xBY qCV qCV -fqz +cpy fqz fqz fqz @@ -162063,7 +162202,7 @@ sib sib hKD eQy -qmG +eCw qmG vEo wSW @@ -162547,7 +162686,7 @@ bcc bcc bcc bcc -jCG +maS vMS vMS vMS @@ -165684,7 +165823,7 @@ snY cSc ijB rzN -beK +lCr hcX rjd oPy From 50c82e6506ad865b4c7d829ad1c3a7c9c49510f7 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 23:34:21 +0300 Subject: [PATCH 056/192] glass bottle recipes for smithing --- .../roguejobs/blacksmith/anvil_recipes/tools.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm index c1c470e8fec..08bb0840d57 100644 --- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm +++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm @@ -323,3 +323,19 @@ req_bar = /obj/item/ingot/iron created_item = /obj/item/reagent_containers/glass/alembic i_type = "Tools" + +/datum/anvil_recipe/tools/glassbottles + name = "5x glass bottles" //more efficent cuz u smith em ig + created_item = /obj/item/reagent_containers/glass/bottle + additional_items = list(/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle) + reqs_bar = /obj/item/ingot/glass + craftdiff = 1 + i_type = "General" + +/datum/anvil_recipe/tools/glasssyringes + name = "5x glass syringes" //more efficent cuz u smith em ig + created_item = /obj/item/reagent_containers/syringe + additional_items = list(/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe) + reqs_bar = /obj/item/ingot/glass + craftdiff = 2 + i_type = "General" From 5e270e26ed0c70f8ba6301be83c0689a6176e7ee Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Tue, 26 Nov 2024 23:37:34 +0300 Subject: [PATCH 057/192] Update tools.dm --- .../roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm index 08bb0840d57..df27e4217a5 100644 --- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm +++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm @@ -328,7 +328,7 @@ name = "5x glass bottles" //more efficent cuz u smith em ig created_item = /obj/item/reagent_containers/glass/bottle additional_items = list(/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle) - reqs_bar = /obj/item/ingot/glass + req_bar = /obj/item/ingot/glass craftdiff = 1 i_type = "General" @@ -336,6 +336,6 @@ name = "5x glass syringes" //more efficent cuz u smith em ig created_item = /obj/item/reagent_containers/syringe additional_items = list(/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe) - reqs_bar = /obj/item/ingot/glass + req_bar = /obj/item/ingot/glass craftdiff = 2 i_type = "General" From f6fe5ab0e1847fe9892798a25fa5d66bd9b95008 Mon Sep 17 00:00:00 2001 From: DerFlammenwerfer <7h3ph4nt0m@gmail.com> Date: Tue, 26 Nov 2024 16:45:25 -0500 Subject: [PATCH 058/192] Engoodening of hedgeknight (#120) * Adds hedgeknight version of stunmace * Minhur's Curse makes electrocution work on the shock immune * Update special.dm * Update special.dm * Hedgeknight engoodening * Update laws_of_the_land.json * Update laws_of_the_land.json * Update bogmaster.dm * Update code/game/objects/items/rogueweapons/melee/special.dm Co-authored-by: Sutures <101909198+noelle-lavenza@users.noreply.github.com> * Update code/game/objects/items/rogueweapons/melee/special.dm Co-authored-by: Sutures <101909198+noelle-lavenza@users.noreply.github.com> * Update special.dm * Update special.dm * Update special.dm * Update bogguard.dm * Update bogmaster.dm * Wild Eater no longer protects from poison berries -- Now protects from Organ poison * Update traits.dm --------- Co-authored-by: Sutures <101909198+noelle-lavenza@users.noreply.github.com> --- code/__DEFINES/traits.dm | 2 +- .../items/rogueweapons/melee/special.dm | 60 ++++++++++++++++ .../job_types/roguetown/garrison/bogguard.dm | 48 +++++++------ .../job_types/roguetown/garrison/bogmaster.dm | 20 +++--- code/modules/mob/living/living_defense.dm | 2 +- .../roguetown/roguejobs/alchemist/reagents.dm | 4 +- strings/laws_of_the_land.json | 71 +++---------------- 7 files changed, 110 insertions(+), 97 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b8505b67dc3..e9510ea0d24 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -27,7 +27,7 @@ #define TRAIT_CYCLOPS_RIGHT "Cyclops (Right)" //poked right eye #define TRAIT_RETARD_ANATOMY "Inhumen Anatomy" //can't wear hats and shoes #define TRAIT_NASTY_EATER "Inhumen Digestion" //can eat rotten food, organs, poison berries, and drink murky water -#define TRAIT_WILD_EATER "Beastly Digestion" //can eat raw and rotten food and drink murky water +HS EDIT:Poison berries too +#define TRAIT_WILD_EATER "Beastly Digestion" //can eat raw and rotten food and drink murky water +DK EDIT:organs too, no longer protects from berry poison #define TRAIT_NOFALLDAMAGE1 "Minor fall damage immunity" #define TRAIT_MISSING_NOSE "Missing Nose" //halved stamina regeneration #define TRAIT_DISFIGURED "Disfigured" diff --git a/code/game/objects/items/rogueweapons/melee/special.dm b/code/game/objects/items/rogueweapons/melee/special.dm index 2830b75f9a9..b02339efacf 100644 --- a/code/game/objects/items/rogueweapons/melee/special.dm +++ b/code/game/objects/items/rogueweapons/melee/special.dm @@ -146,6 +146,21 @@ if(istype(I)) I.afterchange() +/obj/item/rogueweapon/mace/stunmace/hedgeknight/funny_attack_effects(mob/living/target, mob/living/user, nodmg) + . = ..() + if(on) + target.electrocute_act(15, src) + target.Paralyze(10 SECONDS)//STR maxxers cannot be reliably chained, so electrocution may be used as an alternative. + charge -= 25 + if(charge <= 0) + on = FALSE + charge = 0 + update_icon() + if(user.a_intent) + var/datum/intent/I = user.a_intent + if(istype(I)) + I.afterchange() + /obj/item/rogueweapon/mace/stunmace/update_icon() if(on) icon_state = "stunmace1" @@ -198,6 +213,51 @@ update_icon() playsound(src, pick('sound/items/stunmace_toggle (1).ogg','sound/items/stunmace_toggle (2).ogg','sound/items/stunmace_toggle (3).ogg'), 100, TRUE) +/obj/item/rogueweapon/mace/stunmace/hedgeknight + force = 15 + force_wielded = 15 + name = "hedgeknight stunmace" + icon_state = "stunmace0" + desc = "Upon closer inspection, this mace has kneestingers growing all throughout it, rather than being powered by a battery. Only the Hedgeknights themselves bear the fortitude to hold it." + gripped_intents = null + w_class = WEIGHT_CLASS_NORMAL + possible_item_intents = list(/datum/intent/mace/strike/stunner, /datum/intent/mace/smash/stunner) + wbalance = 0 + minstr = 5 + wdefense = 0 + charge = 1000 + on = FALSE + +/obj/item/rogueweapon/mace/stunmace/hedgeknight/pickup(mob/user) + . = ..() + var/mob/living/carbon/human/H = user + if(!HAS_TRAIT(H, TRAIT_SHOCKIMMUNE) || HAS_TRAIT(H, TRAIT_RAVOX_CURSE)) + to_chat(H, span_danger("As you grasp the hedgeknight mace, you touch its kneestingers and feel a powerful and excruciating shock radiate through your body!")) + H.electrocute_act(30, src) + H.Paralyze(10 SECONDS, ignore_canstun = TRUE) + +/obj/item/rogueweapon/mace/stunmace/hedgeknight/process() + var/mob/living/user = loc + if(istype(user)) + if(!HAS_TRAIT(user, TRAIT_SHOCKIMMUNE) || HAS_TRAIT(user, TRAIT_RAVOX_CURSE)) + to_chat(user, span_danger("As you grasp the hedgeknight mace, you touch its kneestingers and feel a powerful and excruciating shock radiate through your body!")) + user.Paralyze(10 SECONDS, ignore_canstun = TRUE) + if(on) + charge-- + else + if(charge < 1000) + charge += 25 + if(charge <= 0) + on = FALSE + charge = 0 + update_icon() + if(istype(user)) + if(user.a_intent) + var/datum/intent/I = user.a_intent + if(istype(I)) + I.afterchange() + playsound(src, pick('sound/items/stunmace_toggle (1).ogg','sound/items/stunmace_toggle (2).ogg','sound/items/stunmace_toggle (3).ogg'), 100, TRUE) + /obj/item/rogueweapon/katar slot_flags = ITEM_SLOT_HIP force = 16 diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm index be21a865a02..3772d3f19d7 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm @@ -3,18 +3,18 @@ flag = BOGGUARD department_flag = GARRISON faction = "Station" - total_positions = 10 - spawn_positions = 10 + total_positions = 6 + spawn_positions = 6 selection_color = JCOLOR_SOLDIER allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED, AGE_OLD) - tutorial = " You decided to protect the dream dales oneday, and you joined the hedgecademy within the rangers keep. Learning from the best you can muster, you're a certified monster hunter as much as you are a ranger and guard. Keeping these woodlands safe is your duty." + tutorial = "The origins of your order are as ancient as the land upon which Stonehedge is built. The first Hedge Knights were rangers, once devoted to Sylvarn but finding that the wilderness was often harsh and lacking for justice. Hedge Knights these days are employed by the Adventurers' Guild to protect the town from violators of the Five Laws, whether they be adventurers, bandits, peasants, or night creatures. Do not abandon the town or abuse the powers and trust vested in you, or they will surely be taken away." display_order = JDO_TOWNGUARD whitelist_req = FALSE outfit = /datum/outfit/job/roguetown/bogguardsman give_bank_account = 60 - min_pq = 5 + min_pq = 15 max_pq = null cmode_music = 'sound/music/combat_bog.ogg' @@ -34,46 +34,49 @@ /datum/outfit/job/roguetown/bogguardsman/pre_equip(mob/living/carbon/human/H) . = ..() - head = /obj/item/clothing/head/roguetown/helmet/leather - armor = /obj/item/clothing/suit/roguetown/armor/gambeson + head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet + armor = /obj/item/clothing/suit/roguetown/armor/plate/half/foresterarmor cloak = /obj/item/clothing/cloak/raincloak/green neck = /obj/item/clothing/neck/roguetown/bervor - gloves = /obj/item/clothing/gloves/roguetown/leather - wrists = /obj/item/clothing/wrists/roguetown/bracers/leather - shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt/bog - pants = /obj/item/clothing/under/roguetown/trou/leather - shoes = /obj/item/clothing/shoes/roguetown/boots/leather - beltl = /obj/item/flashlight/flare/torch/lantern + gloves = /obj/item/clothing/gloves/roguetown/forestergauntlets + wrists = /obj/item/clothing/wrists/roguetown/bracers + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail + pants = /obj/item/clothing/under/roguetown/chainlegs + shoes = /obj/item/clothing/shoes/roguetown/boots/forestershoes + beltl = /obj/item/quiver/arrows belt = /obj/item/storage/belt/rogue/leather - beltr = /obj/item/rogueweapon/sword/silver/sabre/elf + beltr = /obj/item/rogueweapon/mace/stunmace/hedgeknight backr = /obj/item/storage/backpack/rogue/satchel backl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow wrists = /obj/item/clothing/wrists/roguetown/bracers/leather id = /obj/item/scomstone - backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel = 1, /obj/item/signal_horn = 1) + backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver = 1, /obj/item/signal_horn = 1) if(H.mind) assign_skills(H) H.verbs |= /mob/proc/haltyell ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_DARKVISION, TRAIT_GENERIC) -/*Design philosophy: "Jack of all tades, master of.. few" - Peasent, so bow, axe, and polearm skill. Knows most combat skills, but other than those not great with them. -Also given some non-combat skills that a peasent would have, just to support themselves, but not anything to replace soilsons with.*/ +/*Design philosophy: Protectors of Stonehedge, whose holy maces are the bane of any who violate the Guild's few laws. While they are not as physically strong as more conventional warriors, they are swift and their endurance is second to none.*/ /datum/outfit/job/roguetown/bogguardsman/proc/assign_skills(mob/living/carbon/human/H) H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/labor/butchering, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 3, TRUE) @@ -84,8 +87,7 @@ Also given some non-combat skills that a peasent would have, just to support the H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change. - H.change_stat("strength", 3) - H.change_stat("perception", 2) - H.change_stat("constitution", 2) - H.change_stat("endurance", 2) - H.change_stat("speed", 1) + H.change_stat("perception", 4) + H.change_stat("constitution", 4) + H.change_stat("endurance", 4) + H.change_stat("speed", 2) diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm index 10b56a16caf..7df84357ae2 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm @@ -17,7 +17,7 @@ outfit = /datum/outfit/job/roguetown/bogmaster give_bank_account = 2500 - min_pq = 10 + min_pq = 15 max_pq = null cmode_music = 'sound/music/combat_bog.ogg' @@ -46,7 +46,7 @@ gloves = /obj/item/clothing/gloves/roguetown/chain shoes = /obj/item/clothing/shoes/roguetown/boots/leather beltl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow - beltr = /obj/item/rogueweapon/sword/silver/sabre/elf + beltr = /obj/item/rogueweapon/mace/stunmace/hedgeknight belt = /obj/item/storage/belt/rogue/leather backr = /obj/item/storage/backpack/rogue/satchel backl = /obj/item/quiver/Parrows @@ -54,7 +54,7 @@ if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 4, TRUE) @@ -64,7 +64,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 3, TRUE) @@ -72,15 +72,19 @@ H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3, TRUE) //Peasent levy, so some skill H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, pick(1,2,2), TRUE) //Peasent levy, so some skill - H.change_stat("strength", 3) - H.change_stat("constitution", 2) - H.change_stat("perception", 2) - H.change_stat("endurance", 2) + H.change_stat("constitution", 4) + H.change_stat("perception", 4) + H.change_stat("endurance", 4) + H.change_stat("speed", 2) H.dna.species.soundpack_m = new /datum/voicepack/male/knight() H.verbs |= /mob/proc/haltyell ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_DARKVISION, TRAIT_GENERIC) /obj/effect/proc_holder/spell/self/convertrole/bog name = "Recruit Hedgeknight" diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index fa480c02380..4f42e0b8918 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -523,7 +523,7 @@ shock_damage *= siemens_coeff if((flags & SHOCK_TESLA) && (flags_1 & TESLA_IGNORE_1)) return FALSE - if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) + if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE) && !HAS_TRAIT(src, TRAIT_RAVOX_CURSE))//Minhur's ire will make even a Hedgeknight vulnerable to the justice of their fellows return FALSE if(shock_damage < 1) return FALSE diff --git a/code/modules/roguetown/roguejobs/alchemist/reagents.dm b/code/modules/roguetown/roguejobs/alchemist/reagents.dm index 73f6ebb498a..7a260ea94ab 100644 --- a/code/modules/roguetown/roguejobs/alchemist/reagents.dm +++ b/code/modules/roguetown/roguejobs/alchemist/reagents.dm @@ -287,7 +287,7 @@ metabolization_rate = 0.1 /datum/reagent/berrypoison/on_mob_life(mob/living/carbon/M) - if(!HAS_TRAIT(M, TRAIT_NASTY_EATER || TRAIT_WILD_EATER)) + if(!HAS_TRAIT(M, TRAIT_NASTY_EATER)) M.add_nausea(9) M.adjustToxLoss(3, 0) return ..() @@ -300,7 +300,7 @@ metabolization_rate = 0.1 /datum/reagent/organpoison/on_mob_life(mob/living/carbon/M) - if(!HAS_TRAIT(M, TRAIT_NASTY_EATER) && !HAS_TRAIT(M, TRAIT_ORGAN_EATER)) + if(!HAS_TRAIT(M, TRAIT_NASTY_EATER) && !HAS_TRAIT(M, TRAIT_ORGAN_EATER) && !HAS_TRAIT(M, TRAIT_WILD_EATER)) M.add_nausea(9) M.adjustToxLoss(3, 0) return ..() diff --git a/strings/laws_of_the_land.json b/strings/laws_of_the_land.json index 5f32f143800..341db8fcb90 100644 --- a/strings/laws_of_the_land.json +++ b/strings/laws_of_the_land.json @@ -1,68 +1,15 @@ { "lawsets": { - "ten_commandments": { - "name": "The Ten Commandments", + "five_laws": { + "name": "The Laws of Stonehedge", "laws": [ - "Thou shalt have no other gods before me.", - "Thou shalt not make unto thee any graven image, or any likeness of any thing that is in heaven above, or that is in the earth beneath, or that is in the water under the earth.", - "Thou shalt not take the name of the Lord thy God in vain; for the Lord will not hold him guiltless that taketh his name in vain.", - "Remember the sabbath day, to keep it holy. Six days shalt thou labour, and do all thy work: But the seventh day is the sabbath of the Lord thy God: in it thou shalt not do any work, thou, nor thy son, nor thy daughter, thy manservant, nor thy maidservant, nor thy cattle, nor thy stranger that is within thy gates.", - "Honour thy father and thy mother: that thy days may be long upon the land which the Lord thy God giveth thee.", - "Honour thy father and thy mother: that thy days may be long upon the land which the Lord thy God giveth thee.", - "Thou shalt not commit adultery.", - "Thou shalt not steal.", - "Thou shalt not bear false witness against thy neighbour.", - "Thou shalt not covet thy neighbour's house, thou shalt not covet thy neighbour's wife, nor his manservant, nor his maidservant, nor his ox, nor his ass, nor any thing that is thy neighbors." - ], - "weight": 3 - }, - "code of hammurabi": { - "name": "Code of Hamurabi", - "laws": [ - "If a man put out the eye of another man, his eye shall be put out.", - "If any one is committing a robbery and is caught, then he shall be put to death.", - "If a man has betrothed a bride to his son and his son has known her, and if afterwards he (the father) lies in her bosom, and they seize him, this man shall be put to death; the woman shall go free.", - "If a builder builds a house for a man and does not make its construction firm, and the house which he has built collapses and causes the death of the owner of the house, that builder shall be put to death.", - "If any one take over a field to till it as a renter, he shall pay the corn rent of the field to its owner.", - "If any one place his property with another for safekeeping, and there at the place of safekeeping the property be lost, the owner of the house shall make restitution to the owner for the property that was lost.", - "If any one take a male or female slave of the court, or a male or female slave of a freed man, outside the city gates, he shall be put to death.", - "If a son strike his father, his hands shall be hewn off.", - "If any one be too lazy to maintain his dam and does not strengthen it, and a break be made in his dam and the water flood the plantation, the man in whose dam the break has been made shall replace the grain which he has caused to be ruined.", - "If any one steal cattle or sheep, or an ass, or a pig or a goat, if it belong to a god or to the court, the thief shall pay thirtyfold; if they belonged to a freed man of the king he shall pay tenfold; if the thief has nothing with which to pay he shall be put to death." - ], - "weight": 1 - }, - "asimov": { - "name": "The Three Laws of Aasimar", - "laws": [ - "A peasant may not injure a noble or, through inaction, allow a noble to come to harm.", - "A peasant must obey the orders given it by nobles except where such orders would conflict with the First Law.", - "A peasant must protect their own existence as long as such protection does not conflict with the First or Second Law." - ], - "weight": 2 - }, - "bill_of_rights": { - "name": "Bill of Rights", - "laws": [ - "Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances.", - "A well regulated Militia, being necessary to the security of a free State, the right of the people to keep and bear Arms, shall not be infringed.", - "No Soldier shall, in time of peace be quartered in any house, without the consent of the Owner, nor in time of war, but in a manner to be prescribed by law.", - "The right of the people to be secure in their persons, houses, papers, and effects,[a] against unreasonable searches and seizures, shall not be violated, and no Warrants shall issue, but upon probable cause, supported by Oath or affirmation, and particularly describing the place to be searched, and the persons or things to be seized.", - "No person shall be held to answer for a capital, or otherwise infamous crime, unless on a presentment or indictment of a Grand Jury, except in cases arising in the land or naval forces, or in the Militia, when in actual service in time of War or public danger; nor shall any person be subject for the same offence to be twice put in jeopardy of life or limb; nor shall be compelled in any criminal case to be a witness against himself, nor be deprived of life, liberty, or property, without due process of law; nor shall private property be taken for public use, without just compensation.", - "In all criminal prosecutions, the accused shall enjoy the right to a speedy and public trial, by an impartial jury of the State and district wherein the crime shall have been committed, which district shall have been previously ascertained by law, and to be informed of the nature and cause of the accusation; to be confronted with the witnesses against him; to have compulsory process for obtaining witnesses in his favor, and to have the Assistance of Counsel for his defence.", - "In Suits at common law, where the value in controversy shall exceed twenty dollars, the right of trial by jury shall be preserved, and no fact tried by a jury, shall be otherwise re-examined in any Court of the United States, than according to the rules of the common law.", - "Excessive bail shall not be required, nor excessive fines imposed, nor cruel and unusual punishments inflicted.", - "The enumeration in the Constitution, of certain rights, shall not be construed to deny or disparage others retained by the people.", - "The powers not delegated to the United States by the Constitution, nor prohibited by it to the States, are reserved to the States respectively, or to the people." - ], - "weight": 1 - }, - "human_supremacy": { - "name": "Humen Supremacy", - "laws": [ - "Thou shalt not be inhumen. All that is inhumen is lesser.", - "Thou shalt not associate with lesser beings, humens that do so forsake their humenity.", - "Lesser beings must be exterminated." + "Settle your scores outside of town. Self defense and sparring are permitted by this law, but any combat between adventurers in Stonehedge that takes place outside of the training field may result in the arrest of all participants. The aggressor(s) shall then be imprisoned for one dae.", + "Keep your spells and appendages to yourself. Outside of providing medical assistance, removal of another's personal effects without permission will be punished with imprisonment of 1 dae OR a fine equal to the value of stolen or destroyed property, if it is not recovered.", + "To falsely apprehend or imprison a resident of Stonehedge or a member of the Guild in good standing will be punished with imprisonment of two daes. Those found to be Outlaws with no reported crimes may be fined no more than 25 mammon.", + "To force oneself upon a person sexually within the borders of Stonehedge or in view of its walls will be punished with two daes imprisonment and surgical removal of reproductive organs.", + "To unjustly take the life of another person or obstruct their revival is punishable by summary execution. To interfere with a lawful execution or the dignified burial of the executed is to invite the same punishment.", + "Hedge Knights and the Hedgemaster shall keep accurate records of any arrests including the name(s) of the apprehended, the crimes for which they are accused, any evidence collected, and any sentence carried out.", + "Evidence in the form of eyewitness testimony may only be admitted in the form of sworn affidavit, written upon paper and signed by its author. False testimony shall result in serving out the same punishment as the accused." ], "weight": 1 } From fae75535d1d55c9faba97d77758ab83f855746ff Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Wed, 27 Nov 2024 00:59:44 +0300 Subject: [PATCH 059/192] friendly faction additions --- .../code/modules/mob/living/simple_animal/rogue/friendly_npc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 844428d0016..0a645687e90 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -13,7 +13,7 @@ erpable = TRUE wander = TRUE show_genitals = TRUE - var/list/friendlyfactions = list("Station", "neutral", "rogueanimal") + var/list/friendlyfactions = list("Station", "neutral", "rogueanimal", "saiga", "chickens", "goats", "cows", "turtles", "rats", "crabs", "horse") var/list/friendlyjobs //quotes from skyrim cause we love skyrim. var/list/calmmessages = list() From 22c44462d1fdb1e3344cb88286676881175122c1 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Wed, 27 Nov 2024 02:51:06 +0300 Subject: [PATCH 060/192] Update sexcon_defines.dm --- code/__DEFINES/sexcon_defines.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/sexcon_defines.dm b/code/__DEFINES/sexcon_defines.dm index b63b78e6f3e..8fd6a90c0c0 100644 --- a/code/__DEFINES/sexcon_defines.dm +++ b/code/__DEFINES/sexcon_defines.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_INIT(sex_actions, build_sex_actions()) #define SEX_ACTION(sex_action_type) GLOB.sex_actions[sex_action_type] #define MAX_AROUSAL 225 -#define PASSIVE_EJAC_THRESHOLD 208 +#define PASSIVE_EJAC_THRESHOLD 200 #define ACTIVE_EJAC_THRESHOLD 200 #define AROUSAL_HARD_ON_THRESHOLD 20 #define CHARGE_RECHARGE_RATE (CHARGE_FOR_CLIMAX / (5 MINUTES)) From e2cbca1b1d30b39f90de165989c3e13959964e24 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Wed, 27 Nov 2024 04:58:51 +0300 Subject: [PATCH 061/192] damn --- code/datums/sexcon/sexcon.dm | 1 + .../simple_animal/rogue/friendly_npc.dm | 54 +++++++++++++++---- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index 54fd413a53b..7b71283fd08 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -238,6 +238,7 @@ var/cum_to_take = CLAMP((testes.reagents.maximum_volume/2), 1, testes.reagents.total_volume) testes.reagents.remove_reagent(testes.reagent_to_make, cum_to_take) user.add_stress(/datum/stressevent/cumok) + after_ejaculation() return if(!issimple(target) && testes) if(oral) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 0a645687e90..f8584d0726b 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -19,6 +19,7 @@ var/list/calmmessages = list() var/list/aggromessages = list() var/mob/living/lasthitter = null + var/punish_attacking = FALSE //would be great if we could make them follow stone roads while idle. /mob/living/carbon/human/species/human/friendlynpc/should_target(mob/living/L) @@ -150,6 +151,34 @@ if(target == newtarg) say(pick(aggromessages)) linepoint(target) + if(target.mind && Adjacent(target)) + //i really REALLY want to punish players who try to strip those guys for loot + if(prob(20) && !target.IsOffBalanced()) + emote("feints an attack at [target]!") + target.OffBalance(30) + else if(prob(10)) + emote("bashes [target]!") + playsound(src,"punch_hard",100,TRUE) + target.Knockdown(30) + target.throw_at(target, pick(1,2), 1, src, FALSE, TRUE) + else if(prob(5) && target.get_active_held_item()) + var/obj/item/activeitem = target.get_active_held_item() + if(!HAS_TRAIT(activeitem, TRAIT_NODROP)) + emote("disarms [target]!") + playsound(src,"bladedmedium",100,TRUE) + target.OffBalance(15) + target.throw_at(activeitem, get_step_away(activeitem, target, 3), 1, target, TRUE, FALSE) + if(punish_attacking) + var/bounty_exists = FALSE + for(var/datum/bounty/b in GLOB.head_bounties) + if(b.target == target.real_name) + bounty_exists = TRUE + if(bounty_exists) + add_bounty(L.real_name, 500, FALSE, "Attacking a town guardsman.", "Town of Stonehedge") + var/bounty_announcement = "[target] is accused of attacking a town guardsman, wanted with a bounty of 500 mammons." + say(bounty_announcement) + scom_announce(bounty_announcement) + to_chat(L, span_notice("I got a bounty on my head now!")) /mob/living/carbon/human/species/human/friendlynpc/townguard/Initialize() gender = pick(MALE,FEMALE) @@ -192,10 +221,11 @@ pants = /obj/item/clothing/under/roguetown/tights head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet H.STASPD = 8 - H.STACON = 4 + H.STAPER = 10 + H.STACON = 14 H.STAEND = 15 - H.STAINT = 5 - H.STASTR = rand(11,16) + H.STAINT = 12 + H.STASTR = rand(13,16) if(prob(50)) r_hand = /obj/item/rogueweapon/sword else @@ -225,10 +255,11 @@ mask = /obj/item/clothing/mask/rogue/facemask gloves = /obj/item/clothing/gloves/roguetown/chain H.STASPD = 9 - H.STACON = 8 - H.STAEND = 15 - H.STAINT = 5 - H.STASTR = rand(15,18) + H.STAPER = 10 + H.STACON = 16 + H.STAEND = 16 + H.STAINT = 14 + H.STASTR = rand(14,16) if(prob(50)) r_hand = /obj/item/rogueweapon/halberd/bardiche else @@ -260,10 +291,11 @@ mask = /obj/item/clothing/mask/rogue/facemask gloves = /obj/item/clothing/gloves/roguetown/chain H.STASPD = 9 - H.STACON = 8 - H.STAEND = 15 - H.STAINT = 5 - H.STASTR = rand(15,18) + H.STAPER = 10 + H.STACON = 16 + H.STAEND = 16 + H.STAINT = 14 + H.STASTR = rand(14,16) r_hand = /obj/item/rogueweapon/halberd shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron neck = /obj/item/clothing/neck/roguetown/chaincoif From e51bf1bc4fc5010da0412f9ad746dc17a188201a Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Wed, 27 Nov 2024 03:35:35 -0800 Subject: [PATCH 062/192] Viiritri torsion magic (#126) * Torsion... * Torsion spell --- code/datums/gods/patrons/divine_pantheon.dm | 1 + code/modules/spells/roguetown/acolyte/eora.dm | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/code/datums/gods/patrons/divine_pantheon.dm b/code/datums/gods/patrons/divine_pantheon.dm index 4b4434f6f4a..8533a642cde 100644 --- a/code/datums/gods/patrons/divine_pantheon.dm +++ b/code/datums/gods/patrons/divine_pantheon.dm @@ -151,6 +151,7 @@ t1 = /obj/effect/proc_holder/spell/invoked/bud t2 = /obj/effect/proc_holder/spell/invoked/eoracurse t3 = /obj/effect/proc_holder/spell/invoked/enrapture + t4 = /obj/effect/proc_holder/spell/invoked/torsion confess_lines = list( "VIIRITRI BRINGS US TOGETHER!", "HER BEAUTY IS EVEN IN THIS TORMENT!", diff --git a/code/modules/spells/roguetown/acolyte/eora.dm b/code/modules/spells/roguetown/acolyte/eora.dm index 9d962504c33..aebc272e1b2 100644 --- a/code/modules/spells/roguetown/acolyte/eora.dm +++ b/code/modules/spells/roguetown/acolyte/eora.dm @@ -103,3 +103,56 @@ timer = 5 MINUTES stressadd = -5 desc = "I feel.. h-hot.. g-getting hard to.. think.." + +/obj/effect/proc_holder/spell/invoked/torsion + name = "Torsion" + overlay_state = "raiseskele" // Menacing skull icon warning you to not cast this for funsies. + releasedrain = 60 + chargetime = 30 // Longer windup than most spells, on par with resurrection's. This is really annoying to get hit by, using it in a fight should be hard. + range = 7 + warnie = "sydwarning" + movement_interrupt = FALSE + chargedloop = null + sound = 'sound/magic/whiteflame.ogg' + associated_skill = /datum/skill/magic/holy + antimagic_allowed = TRUE + charge_max = 45 SECONDS // 50% more than lightning bolt. Less lethal upfront stun, but annoying lingering wound. This spell does nothing if used on the same target again before they heal. + miracle = TRUE + devotion_cost = 100 // Highest cost tier of divine spells. + +/obj/effect/proc_holder/spell/invoked/torsion/cast(list/targets, mob/living/user) // The actual CBT code is stolen entirely from the admin CBT punishment command. + var/mob/living/target = targets[1] + if(!ishuman(target)) + return FALSE + var/mob/living/carbon/human/humie = target + var/obj/item/bodypart/affecting = humie.get_bodypart(BODY_ZONE_CHEST) + if(!affecting) + return FALSE // I don't know when a human would not have a chest, but this was in the admin command and I'm sure whoever dev'd that ran into an issue otherwise. + if(target.gender != MALE) // This uses body type instead of actual genitals, but so does the wound itself. I shudder to think of what would get torsioned in people with no genitals... + user.say("Viiritri, twist their ovaries!") + else + user.say("Viiritri, twist their balls!") + target.visible_message(span_warning("The air churns strangely around [target]!"), span_danger("I feel a deep sense of dread...")) + affecting.add_wound(/datum/wound/cbt) // This has its own flavor text, so above flavor text is less explicit about the torsion. + return TRUE + +/obj/effect/proc_holder/spell/invoked/torsion/arcane // If some maniac wants to make this available through scrolls, it can't be a miracle. + name = "Telekinetic Torsion" + miracle = FALSE + devotion_cost = 0 + associated_skill = /datum/skill/magic/arcane + invocation = "Twist and fall!" + invocation_type = "shout" + cost = 4 // Same cost as Fireball. Definitely stronger than lightning bolt. + +/obj/effect/proc_holder/spell/invoked/torsion/arcane/cast(list/targets, mob/living/user) // Separate effect because we aren't asking Eora for help, we're doing it ourselves. + var/mob/living/target = targets[1] + if(!ishuman(target)) + return FALSE + var/mob/living/carbon/human/humie = target + var/obj/item/bodypart/affecting = humie.get_bodypart(BODY_ZONE_CHEST) + if(!affecting) + return FALSE + target.visible_message(span_warning("The air churns strangely around [target]!"), span_danger("I feel a deep sense of dread...")) + affecting.add_wound(/datum/wound/cbt) + return TRUE From a68aed4e1130bfd273c4f295fb6ad41281bb4de6 Mon Sep 17 00:00:00 2001 From: Luctus <117505981+Luctus-Comptus@users.noreply.github.com> Date: Wed, 27 Nov 2024 06:20:22 -0600 Subject: [PATCH 063/192] various bug fixs, nerf and reworks. and a map oversight. (#127) *had to lower speedster down to one. people are stat stacking to get 20's in speed. * fixed broken furnace in pod home *added drug machine in house. *fixed broken spell give to guildmaster for cleric *fixed torch spam for spawn adventurer *removed no bloodloss and no stamina crystals from lootpool *fixed cleric issue with devotion spells and class selector issue for guildmaster *added more appropriate heal to zizo cleric. *swaped stats for hedgebeast and kobold to be fortune +1 to give some level of diversity and to maybe motivate SOMEONE to mine. Co-authored-by: Moribun <117505981+Moribun@users.noreply.github.com> --- _maps/templates/shelter_2.dmm | 34 +++--- code/controllers/subsystem/rogue/devotion.dm | 4 +- code/datums/gods/patrons/inhumen_pantheon.dm | 2 +- .../structures/crates_lockers/roguetown.dm | 2 - .../roguetown/adventurer/adventurer.dm | 1 + .../adventurer/types/combat/ranger.dm | 2 +- .../adventurer/types/combat/rogue.dm | 9 +- .../mining/lavaland/necropolis_chests.dm | 3 - .../species_types/furry/anthromorphsmall.dm | 2 +- .../human/species_types/furry/kobold.dm | 2 +- .../spells/roguetown/spells5e/cantrips5e.dm | 18 ++- modular_hearthstone/statpacks/agile.dm | 2 +- .../code/datums/traits/unspecial.dm | 6 +- .../game/objects/items/class_selectors.dm | 104 +++++++++++++++++- .../dungeon/loot_generators/dungeon_chest.dm | 2 - 15 files changed, 146 insertions(+), 47 deletions(-) diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm index b8d034cfc04..233ba1ec74a 100644 --- a/_maps/templates/shelter_2.dmm +++ b/_maps/templates/shelter_2.dmm @@ -19,25 +19,22 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors) "d" = ( -/turf/closed/wall/mineral/rogue/decowood, +/turf/closed/wall/mineral/rogue/pipe, /area/rogue/indoors) "e" = ( /obj/item/roguebin/water, /obj/machinery/light/rogue/wallfire/candle/l, -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "f" = ( /obj/machinery/anvil/crafted, /obj/item/rogueweapon/tongs, /obj/item/rogueweapon/hammer/claw, -/turf/open/floor/rogue/hexstone, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "g" = ( /obj/machinery/light/rogue/forge, -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "i" = ( /obj/structure/fluff/grindwheel, @@ -45,13 +42,11 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors) "l" = ( -/obj/machinery/light/rogue/smelter/improved, -/turf/open/floor/rogue/hexstone, +/obj/machinery/light/rogue/smelter/great, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "m" = ( -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "o" = ( /obj/structure/lever/wall{ @@ -66,11 +61,6 @@ "p" = ( /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors) -"q" = ( -/turf/closed/wall/mineral/rogue/wooddark{ - icon_state = "wooddark-k" - }, -/area/rogue/indoors) "r" = ( /turf/open/floor/rogue/hexstone, /area/rogue/indoors) @@ -82,12 +72,14 @@ "t" = ( /obj/structure/chair/stool/rogue, /obj/structure/roguemachine/atm, +/obj/structure/roguemachine/drugmachine{ + pixel_x = -32 + }, /turf/open/floor/rogue/hexstone, /area/rogue/indoors) "u" = ( /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, /area/rogue/indoors) "v" = ( /obj/structure/roguemachine/stockpile, @@ -154,7 +146,7 @@ d (2,1,1) = {" d e -w +m p t y @@ -163,11 +155,11 @@ d (3,1,1) = {" d f -r +m l u z -q +d "} (4,1,1) = {" d diff --git a/code/controllers/subsystem/rogue/devotion.dm b/code/controllers/subsystem/rogue/devotion.dm index faa5b1bb6de..95d0c74c889 100644 --- a/code/controllers/subsystem/rogue/devotion.dm +++ b/code/controllers/subsystem/rogue/devotion.dm @@ -189,6 +189,7 @@ LAZYADD(granted_spells, newspell) level = CLERIC_T1 max_progression = CLERIC_REQ_4 + max_devotion = CLERIC_REQ_4 passive_devotion_gain = 1 passive_progression_gain = 1 update_devotion(100, CLERIC_REQ_4, silent = TRUE) @@ -220,7 +221,8 @@ H.mind.AddSpell(newspell) LAZYADD(granted_spells, newspell) level = CLERIC_T0 - max_progression = CLERIC_REQ_2 + max_progression = CLERIC_REQ_4 + max_devotion = CLERIC_REQ_4 passive_devotion_gain = 1 passive_progression_gain = 1 update_devotion(100, CLERIC_REQ_4, silent = TRUE) diff --git a/code/datums/gods/patrons/inhumen_pantheon.dm b/code/datums/gods/patrons/inhumen_pantheon.dm index 1aaf531e2f2..d9c634bf36b 100644 --- a/code/datums/gods/patrons/inhumen_pantheon.dm +++ b/code/datums/gods/patrons/inhumen_pantheon.dm @@ -16,7 +16,7 @@ mob_traits = list(TRAIT_NASTY_EATER, TRAIT_SNEK, TRAIT_ZOMBIE_IMMUNE) //had to add zombie immune so as not to double dip when making the infection immune t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen t1 = /obj/effect/proc_holder/spell/invoked/invisibility - t2 = /obj/effect/proc_holder/spell/targeted/soulspeak + t2 = /obj/effect/proc_holder/spell/invoked/eldritchhealing/any t3 = /obj/effect/proc_holder/spell/invoked/projectile/sickness t4 = /obj/effect/proc_holder/spell/invoked/revive_inhumen confess_lines = list( diff --git a/code/game/objects/structures/crates_lockers/roguetown.dm b/code/game/objects/structures/crates_lockers/roguetown.dm index d4fa8f9d448..e591ff0c86e 100644 --- a/code/game/objects/structures/crates_lockers/roguetown.dm +++ b/code/game/objects/structures/crates_lockers/roguetown.dm @@ -61,8 +61,6 @@ new I(src) /obj/structure/closet/crate/chest/gold/lootbox/trait/PopulateContents() var/list/loot = list(/obj/item/rogueweapon/huntingknife/idagger/silver=33, - /obj/item/book/granter/trait/war/undying=13, - /obj/item/book/granter/trait/war/relentless=13, /obj/item/book/granter/trait/mobility/bogtrek=33, /obj/item/book/granter/trait/defense/mediumarmor=40, /obj/item/book/granter/trait/defense/heavyarmor=40, diff --git a/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm b/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm index 0b1a329a64e..59742f2eff7 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm @@ -30,6 +30,7 @@ GLOBAL_VAR_INIT(adventurer_hugbox_duration_still, 3 MINUTES) advjob_examine = TRUE always_show_on_latechoices = TRUE job_reopens_slots_on_death = TRUE + grant_lit_torch = FALSE /datum/job/roguetown/adventurer/after_spawn(mob/living/L, mob/M, latejoin = TRUE) ..() diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm index 4df83b8aa6b..06d1d7a001b 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm @@ -90,7 +90,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 2, TRUE) //Hearthstone change. H.change_stat("perception", 2) H.change_stat("endurance", 1) - H.change_stat("speed", 3) + H.change_stat("speed", 2) ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) if(!HAS_TRAIT(H, TRAIT_NIGHT_VISION)) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm index 4f45906334c..9ecaf07c8b7 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm @@ -88,9 +88,8 @@ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC) - H.change_stat("strength", -1) H.change_stat("perception", 2) - H.change_stat("speed", 4) + H.change_stat("speed", 2) H.change_stat("intelligence", 2) //Assassin, nearly same as rogue but not versatile in weapon skills yet specialized in knives. @@ -132,8 +131,8 @@ ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //they are killers ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) - H.change_stat("perception", 1) - H.change_stat("speed", 4) + H.change_stat("perception", 2) + H.change_stat("speed", 2) H.change_stat("intelligence", 2) H.visible_message(span_info("I honed my skills as an assassin through the years. My bracers have a hidden blade, and my boots have a bottle of berry poison.")) backpack_contents = list(/obj/item/lockpickring/mundane, /obj/item/rogueweapon/huntingknife/idagger/steel) @@ -268,7 +267,7 @@ ADD_TRAIT(H, TRAIT_SOUL_EXAMINE, TRAIT_GENERIC) //can determine if someone has their soul. H.change_stat("perception", 2) H.change_stat("constitution", 1) - H.change_stat("speed", 3) + H.change_stat("speed", 2) H.change_stat("intelligence", 2) H.visible_message(span_info("I am a conduit between the living and the dead, half in, half out, a phantom that hears the whispers of the departed and uses them for my personal gain.")) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 25dc8388a97..3b17193169f 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -756,7 +756,6 @@ // var/loot = rand(1,7) var/list/loot = list(/obj/item/book/granter/trait/defense/heavyarmor=35, /obj/item/book/granter/trait/defense/mediumarmor=12, - /obj/item/book/granter/trait/war/undying=8, /obj/item/riddleofsteel = 45) if(prob(50)) var/I = pickweight(loot) @@ -1561,13 +1560,11 @@ /obj/structure/closet/crate/necropolis/sif/PopulateContents() var/list/loot = list(/obj/item/rogueweapon/sword/sword_of_the_forsaken=40, /obj/item/clothing/neck/roguetown/necklace_of_the_forsaken=40, - /obj/item/book/granter/trait/war/relentless=10, /obj/item/book/granter/spell/spells5e/frostbite5e = 40, /obj/item/book/granter/spell/spells5e/createbonfire5e = 30, /obj/item/book/granter/spell/spells5e/acidsplash5e = 40,) var/list/loot2 = list(/obj/item/rogueweapon/sword/sword_of_the_forsaken=20, /obj/item/clothing/neck/roguetown/necklace_of_the_forsaken=20, - /obj/item/book/granter/trait/war/relentless=5, /obj/item/book/granter/spell/spells5e/frostbite5e = 20, /obj/item/book/granter/spell/spells5e/createbonfire5e = 15, /obj/item/book/granter/spell/spells5e/acidsplash5e = 20, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm index 4be048d0191..d8f625a734e 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm @@ -43,7 +43,7 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - race_bonus = list(STAT_ENDURANCE = 1) + race_bonus = list(STAT_FORTUNE = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm index 53321a9f446..9567f527ac0 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm @@ -36,7 +36,7 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - race_bonus = list(STAT_INTELLIGENCE = 1) + race_bonus = list(STAT_FORTUNE = 1) enflamed_icon = "widefire" attack_verb = "slash" attack_sound = 'sound/blank.ogg' diff --git a/code/modules/spells/roguetown/spells5e/cantrips5e.dm b/code/modules/spells/roguetown/spells5e/cantrips5e.dm index 9e8b0f1c042..7f8158a85b6 100644 --- a/code/modules/spells/roguetown/spells5e/cantrips5e.dm +++ b/code/modules/spells/roguetown/spells5e/cantrips5e.dm @@ -135,7 +135,6 @@ warnie = "spellwarning" no_early_release = TRUE movement_interrupt = FALSE - antimagic_allowed = FALSE //can you use it if you are antimagicked? charging_slowdown = 3 chargedloop = /datum/looping_sound/invokegen associated_skill = /datum/skill/magic/arcane //can be arcane, druidic, blood, holy @@ -177,6 +176,9 @@ target.update_vision_cone() . = ..() +/obj/effect/proc_holder/spell/self/bladeward5e/test + antimagic_allowed = TRUE + //============================================== // BOOMING BLADE //============================================== @@ -411,7 +413,7 @@ warnie = "spellwarning" no_early_release = TRUE movement_interrupt = FALSE - antimagic_allowed = FALSE //can you use it if you are antimagicked? + antimagic_allowed = FALSE charging_slowdown = 3 chargedloop = /datum/looping_sound/invokegen associated_skill = /datum/skill/magic/arcane //can be arcane, druidic, blood, holy @@ -426,7 +428,7 @@ summon_type = list( /obj/machinery/light/rogue/campfire/createbonfire5e ) - summon_lifespan = 600 + summon_lifespan = 15 MINUTES summon_amt = 1 action_icon_state = "the_traps" @@ -445,6 +447,9 @@ can_damage = TRUE max_integrity = 30 +/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e/test + antimagic_allowed = TRUE + //============================================== // DANCING LIGHTS //============================================== @@ -639,6 +644,9 @@ to_chat(user, span_warning("I wasn't able to find a mind to weave here.")) revert_cast() +/obj/effect/proc_holder/spell/targeted/encodethoughts5e/test + antimagic_allowed = TRUE + //============================================== // FIRE BOLT //============================================== @@ -1364,6 +1372,7 @@ warnie = "spellwarning" movement_interrupt = FALSE no_early_release = FALSE + antimagic_allowed = FALSE chargedloop = null sound = 'sound/magic/whiteflame.ogg' chargedloop = /datum/looping_sound/invokegen @@ -1405,6 +1414,9 @@ to_chat(user, "I couldn't find a good place for this!") revert_cast() +/obj/effect/proc_holder/spell/invoked/poisonspray5e/test + antimagic_allowed = TRUE + //============================================== // Primal Savagery //============================================== diff --git a/modular_hearthstone/statpacks/agile.dm b/modular_hearthstone/statpacks/agile.dm index 3b266499f4f..af893bc1a11 100644 --- a/modular_hearthstone/statpacks/agile.dm +++ b/modular_hearthstone/statpacks/agile.dm @@ -1,7 +1,7 @@ // Statpacks focusing on Ranger/Rogue archetypes. /datum/statpack/agile/swift name = "Swift" - desc = "With the wind in your hair and trouble at your back, your speed has oft been your salvation." + desc = "With the wind in your hair and trouble at your back, your speed has often been your salvation." stat_array = list(STAT_STRENGTH = -1, STAT_PERCEPTION = -1, STAT_CONSTITUTION = -1, STAT_ENDURANCE = 1, STAT_SPEED = 2) /datum/statpack/agile/hardy diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 0693d517932..52716433243 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -346,14 +346,14 @@ /datum/quirk/swift name = "Speedster" desc = "I am very athletic and fast. I can also dodge anything as long as I am not weighted down by medium or heavier armor." - value = 5 + value = 4 /datum/quirk/swift/on_spawn() var/mob/living/carbon/human/H = quirk_holder ADD_TRAIT(H, TRAIT_DODGEEXPERT, QUIRK_TRAIT) ADD_TRAIT(H, TRAIT_GOODRUNNER, QUIRK_TRAIT) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 5, TRUE) - H.change_stat("speed", 3) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) + H.change_stat("speed", 1) /datum/quirk/gourmand name = "Gourmand" diff --git a/modular_stonehedge/code/game/objects/items/class_selectors.dm b/modular_stonehedge/code/game/objects/items/class_selectors.dm index 1cd2d908cf4..1fc0ae2fe1b 100644 --- a/modular_stonehedge/code/game/objects/items/class_selectors.dm +++ b/modular_stonehedge/code/game/objects/items/class_selectors.dm @@ -5,10 +5,16 @@ desc = "Activate to remember." icon = 'icons/obj/library.dmi' icon_state ="book1" + embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 0, "embedded_fall_chance" = 0) var/datum/job/roguetown/intended_job var/inventory_items = list() var/classes = list() +/obj/item/class_selector/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_NOEMBED, TRAIT_GENERIC) + //guildmaster /obj/item/class_selector/veteran/attack_self(mob/living/carbon/human/H) . = ..() @@ -117,10 +123,10 @@ dressup(H, inventory_items) if("Cleric") inventory_items = list( - /obj/item/clothing/neck/roguetown/bervor, /obj/item/clothing/suit/roguetown/armor/plate/scale, - /obj/item/clothing/suit/roguetown/armor/gambeson, + /obj/item/clothing/suit/roguetown/armor/chainmail, /obj/item/clothing/under/roguetown/chainlegs, + /obj/item/clothing/gloves/roguetown/chain, /obj/item/clothing/shoes/roguetown/boots/armor, /obj/item/storage/belt/rogue/leather/black, /obj/item/rogueweapon/mace/steel, @@ -185,3 +191,97 @@ H.pickup_and_wear(spawneditem) qdel(src) +/obj/item/class_selector/test/attack_self(mob/living/carbon/human/H) //test purposes not selectable. + . = ..() + classes = list("test") + var/classchoice = input("Choose your past", "Available archetypes") as anything in classes + switch(classchoice) + if("test") + inventory_items = list( + /obj/item/clothing/head/roguetown/helmet/footmanhelmet, + /obj/item/clothing/suit/roguetown/armor/plate/scale, + /obj/item/clothing/suit/roguetown/armor/chainmail, + /obj/item/clothing/under/roguetown/chainlegs, + /obj/item/clothing/shoes/roguetown/boots/armor, + /obj/item/storage/belt/rogue/leather/black, + /obj/item/rogueweapon/mace/pipe, + /obj/item/clothing/ring/lantern, + /obj/item/storage/belt/rogue/pouch/coins/rich, + /obj/item/storage/backpack/rogue/backpack/rucksack, + /obj/item/clothing/gloves/roguetown/chain, + /obj/item/clothing/wrists/roguetown/hiddenblade, + /obj/item/rogueweapon/huntingknife/skin, + /obj/item/lockpickring/mundane, + /obj/item/reagent_containers/glass/cup/silver. + ) + var/datum/devotion/C = new /datum/devotion(H, H.patron) + switch(H.patron?.type) + if(/datum/patron/divine/astrata) + inventory_items += /obj/item/clothing/neck/roguetown/psicross/astrata + if(/datum/patron/inhumen/zizo) + inventory_items += /obj/item/clothing/neck/roguetown/psicross/silver + if(/datum/patron/divine/noc) + inventory_items += /obj/item/clothing/neck/roguetown/psicross/noc + if(/datum/patron/divine/dendor) + inventory_items += /obj/item/clothing/neck/roguetown/psicross/dendor + H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 2, TRUE) // enough to craft druid mask, at least + if(/datum/patron/divine/necra) + inventory_items += /obj/item/clothing/neck/roguetown/psicross/necra + if(/datum/patron/divine/pestra) + inventory_items += /obj/item/clothing/neck/roguetown/psicross/pestra + if(/datum/patron/divine/eora) //Eora content from Stonekeep + inventory_items += /obj/item/clothing/neck/roguetown/psicross/eora + if(H.patron?.type == /datum/patron/divine/noc) + C.grant_spells_devout_noc(H) + else + C.grant_spells_devout(H) + if(H.mind) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 5, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 5, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 5, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 5, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 5, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/craft/engineering, 1, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/labor/butchering, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/lockpicking, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/stealing, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 3, TRUE) + H.change_stat("strength", 3) + H.change_stat("constitution", 3) + H.change_stat("endurance", 3) + H.change_stat("intelligence", 3) + H.change_stat("speed", 3) + H.change_stat("fortune", 3) + ADD_TRAIT(H, TRAIT_ANTIMAGIC, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_NOMOOD, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_NOPAIN, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_POISONBITE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_STRONGBITE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_BLOODLOSS_IMMUNE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_TOXIMMUNE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_EMPATH, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_MEDICAL_HUD, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_ARTIFICER, TRAIT_GENERIC) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/churn) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/bladeward5e/test) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e/test) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/encodethoughts5e/test) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/poisonspray5e/test) + H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray) + dressup(H, inventory_items) diff --git a/modular_stonehedge/code/game/objects/structures/dungeon/loot_generators/dungeon_chest.dm b/modular_stonehedge/code/game/objects/structures/dungeon/loot_generators/dungeon_chest.dm index 119fb805825..8e516e5b899 100644 --- a/modular_stonehedge/code/game/objects/structures/dungeon/loot_generators/dungeon_chest.dm +++ b/modular_stonehedge/code/game/objects/structures/dungeon/loot_generators/dungeon_chest.dm @@ -357,8 +357,6 @@ if("trait") loot = list( /obj/item/rogueweapon/huntingknife/idagger/silver=33, - /obj/item/book/granter/trait/war/undying=13, - /obj/item/book/granter/trait/war/relentless=13, /obj/item/book/granter/trait/mobility/bogtrek=33, /obj/item/book/granter/trait/defense/mediumarmor=40, /obj/item/book/granter/trait/defense/heavyarmor=40, From 3d5a89862fa456e94bbdc0b108a64818838c0a4e Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Wed, 27 Nov 2024 18:51:51 +0300 Subject: [PATCH 064/192] fml --- code/modules/mob/living/carbon/human/npc/_npc.dm | 4 ++-- modular_stonehedge/code/lewdai/lewdai.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/npc/_npc.dm b/code/modules/mob/living/carbon/human/npc/_npc.dm index 0bae2b419fd..48631d4a51f 100644 --- a/code/modules/mob/living/carbon/human/npc/_npc.dm +++ b/code/modules/mob/living/carbon/human/npc/_npc.dm @@ -227,12 +227,12 @@ last_special = world.time + CLICK_CD_BREAKOUT cuff_resist(I) -/mob/living/carbon/human/proc/should_target(mob/living/L) +/mob/living/carbon/human/proc/should_target(mob/living/L, ignore_lying = TRUE) if(!L) return FALSE //those are here for proc dependancy. - if(L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. + if(!ignore_lying && L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. if(prob(4) && L.has_quirk(/datum/quirk/monsterhunter) && erpable) //tiny chance to trigger abuss. fuckcd = 0 return FALSE diff --git a/modular_stonehedge/code/lewdai/lewdai.dm b/modular_stonehedge/code/lewdai/lewdai.dm index 1f7b4b54e8c..a72bde01db7 100644 --- a/modular_stonehedge/code/lewdai/lewdai.dm +++ b/modular_stonehedge/code/lewdai/lewdai.dm @@ -266,7 +266,7 @@ if(sexcon.current_action && fuckcd > 0) return for(var/mob/living/carbon/human/fucktarg in around) - if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg)) + if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg, FALSE)) foundfuckmeat += fucktarg L = fucktarg STOP_PROCESSING(SShumannpc,src) From 7a2668e4ad2a8c4d6d522e838deed54fd162b462 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Wed, 27 Nov 2024 18:52:03 +0300 Subject: [PATCH 065/192] fml --- code/modules/mob/living/carbon/human/npc/_npc.dm | 4 ++-- modular_stonehedge/code/lewdai/lewdai.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/npc/_npc.dm b/code/modules/mob/living/carbon/human/npc/_npc.dm index 0bae2b419fd..48631d4a51f 100644 --- a/code/modules/mob/living/carbon/human/npc/_npc.dm +++ b/code/modules/mob/living/carbon/human/npc/_npc.dm @@ -227,12 +227,12 @@ last_special = world.time + CLICK_CD_BREAKOUT cuff_resist(I) -/mob/living/carbon/human/proc/should_target(mob/living/L) +/mob/living/carbon/human/proc/should_target(mob/living/L, ignore_lying = TRUE) if(!L) return FALSE //those are here for proc dependancy. - if(L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. + if(!ignore_lying && L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. if(prob(4) && L.has_quirk(/datum/quirk/monsterhunter) && erpable) //tiny chance to trigger abuss. fuckcd = 0 return FALSE diff --git a/modular_stonehedge/code/lewdai/lewdai.dm b/modular_stonehedge/code/lewdai/lewdai.dm index 1f7b4b54e8c..a72bde01db7 100644 --- a/modular_stonehedge/code/lewdai/lewdai.dm +++ b/modular_stonehedge/code/lewdai/lewdai.dm @@ -266,7 +266,7 @@ if(sexcon.current_action && fuckcd > 0) return for(var/mob/living/carbon/human/fucktarg in around) - if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg)) + if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg, FALSE)) foundfuckmeat += fucktarg L = fucktarg STOP_PROCESSING(SShumannpc,src) From 656fbc87105e574208c46277817fb929858b39d5 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Wed, 27 Nov 2024 18:54:44 +0300 Subject: [PATCH 066/192] fix compilussy --- code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm | 1 - modular_stonehedge/code/datums/traits/unspecial.dm | 1 - 2 files changed, 2 deletions(-) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm b/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm index 59742f2eff7..0b1a329a64e 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm @@ -30,7 +30,6 @@ GLOBAL_VAR_INIT(adventurer_hugbox_duration_still, 3 MINUTES) advjob_examine = TRUE always_show_on_latechoices = TRUE job_reopens_slots_on_death = TRUE - grant_lit_torch = FALSE /datum/job/roguetown/adventurer/after_spawn(mob/living/L, mob/M, latejoin = TRUE) ..() diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 52716433243..790ec9fbca0 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -503,7 +503,6 @@ var/mob/living/carbon/human/H = quirk_holder var/turf/location = get_spawn_turf_for_job("Pilgrim") H.forceMove(location) - grant_lit_torch(H) /datum/quirk/atrophy name = "Atrophy" From 6de185f304fa3fb8cc2980c7cffdce37775b9b5f Mon Sep 17 00:00:00 2001 From: Cupa <5896309+Cupax3@users.noreply.github.com> Date: Wed, 27 Nov 2024 18:49:10 +0100 Subject: [PATCH 067/192] Add: Qdel maturity SQL query (#129) Stops DBCore from complaining about undeleted queries --- .../code/modules/maturity-prompt/code/maturity_subsystem.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm b/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm index 6dc43758da4..f6a3b41dc51 100644 --- a/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm +++ b/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm @@ -122,7 +122,9 @@ SUBSYSTEM_DEF(maturity_guard) // There should be only one, we're querying by the primary key; if it returns more than one row something is very wrong var/result = query_age_from_db.NextRow() if(result) + qdel(query_age_from_db) return query_age_from_db.item + qdel(query_age_from_db) return FALSE @@ -146,8 +148,10 @@ SUBSYSTEM_DEF(maturity_guard) ) if(!add_age_to_db.warn_execute()) + qdel(add_age_to_db) return FALSE + qdel(add_age_to_db) return TRUE // Logic inspired by S.P.L.U.R.T age_gate From 008f0301d2d7a1372d47fdb22a98dca18e01be71 Mon Sep 17 00:00:00 2001 From: Sutures <101909198+noelle-lavenza@users.noreply.github.com> Date: Wed, 27 Nov 2024 16:57:16 -0500 Subject: [PATCH 068/192] Add pocket sand (#130) --- .../roguetown/roguejobs/miner/rogueores.dm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/code/modules/roguetown/roguejobs/miner/rogueores.dm b/code/modules/roguetown/roguejobs/miner/rogueores.dm index ac3ec1cab0b..7ba4a869381 100644 --- a/code/modules/roguetown/roguejobs/miner/rogueores.dm +++ b/code/modules/roguetown/roguejobs/miner/rogueores.dm @@ -74,6 +74,25 @@ icon_state = "oresand" smeltresult = /obj/item/ingot/glass sellprice = 4 + +// pocket sand!! +// copied from /obj/item/stack/ore/glass/throw_impact +/obj/item/rogueore/sand/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + if(..() || !ishuman(hit_atom)) + return + // 20% chance if thrown by an explosion or something, otherwise thrower must have targeted head + if((isnull(throwingdatum?.target_zone) && prob(80)) || ran_zone(throwingdatum?.target_zone) != BODY_ZONE_HEAD) + return + var/mob/living/carbon/human/humie = hit_atom + if(humie.is_eyes_covered()) + humie.visible_message(span_danger("[humie]'s eye protection blocks the sand!"), span_warning("My eye protection blocks the sand!")) + return + humie.adjust_blurriness(6) + humie.adjustStaminaLoss(15)//the pain from my eyes burning does stamina damage + humie.confused += 5 + to_chat(humie, span_danger("\The [src] gets into my eyes! The pain, it burns!")) + qdel(src) + /obj/item/rogueore/cinnabar name = "cinnabar" desc = "Red gems that contain the essence of quicksilver." From 51b29e726e3a0a1ec81c53b6c67aeaba632e3108 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 01:04:08 +0300 Subject: [PATCH 069/192] i wanna kms --- .../sex_actions/npc/npc_anal_ride_sex.dm | 8 ++- .../sexcon/sex_actions/npc/npc_anal_sex.dm | 8 ++- .../sexcon/sex_actions/npc/npc_cunnilingus.dm | 8 ++- .../sexcon/sex_actions/npc/npc_facesitting.dm | 8 ++- .../sexcon/sex_actions/npc/npc_rimming.dm | 8 ++- .../sexcon/sex_actions/npc/npc_throat_sex.dm | 8 ++- .../sex_actions/npc/npc_vaginal_ride_sex.dm | 8 ++- .../sexcon/sex_actions/npc/npc_vaginal_sex.dm | 10 +++- code/datums/sexcon/sexcon.dm | 2 +- code/datums/status_effects/rogue/debuff.dm | 3 + code/game/objects/effects/glowshroom.dm | 9 ++- .../items/rogueweapons/melee/special.dm | 11 ++-- .../job_types/roguetown/garrison/bogguard.dm | 18 +++--- .../job_types/roguetown/garrison/bogmaster.dm | 18 +++--- .../mob/living/carbon/human/npc/_npc.dm | 4 +- .../living/simple_animal/hostile/hostile.dm | 8 +-- .../hostile/megafauna/megafauna.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../code/game/objects/items/signal_horn.dm | 4 +- .../simple_animal/rogue/simple_skeleton.dm | 2 +- .../code/game/objects/items/war_horn.dm | 3 + .../code/datums/traits/unspecial.dm | 2 +- modular_stonehedge/code/lewdai/lewdai.dm | 57 ++++++++++--------- 23 files changed, 125 insertions(+), 86 deletions(-) diff --git a/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm index 8b52926de1f..15258737321 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm @@ -41,8 +41,12 @@ /datum/sex_action/npc_anal_ride_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_anal_ride_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm index 595b5269610..36c014221e9 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm @@ -37,8 +37,12 @@ /datum/sex_action/npc_anal_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_anal_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm b/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm index c5ff5633e52..d1c26217587 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm @@ -27,8 +27,12 @@ /datum/sex_action/npc_cunnilingus/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] stops licking [target]'s cunt ...")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_cunnilingus/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm b/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm index 447fb3b51d6..983772b4827 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm @@ -31,8 +31,12 @@ /datum/sex_action/npc_facesitting/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target]'s face.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_facesitting/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_rimming.dm b/code/datums/sexcon/sex_actions/npc/npc_rimming.dm index c1c9371432b..91f7bd2bff0 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_rimming.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_rimming.dm @@ -25,8 +25,12 @@ /datum/sex_action/npc_rimming/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] stops rimming [target]'s butt ...")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_rimming/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm index 9a51fd862ac..4e18972bd29 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm @@ -35,8 +35,12 @@ /datum/sex_action/npc_throat_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] pulls their cock out of [target]'s throat.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_throat_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm index 438e2a73b19..b0871c07c71 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm @@ -41,8 +41,12 @@ /datum/sex_action/npc_vaginal_ride_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_vaginal_ride_sex/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm index 45b266e1940..59350671c0c 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm @@ -18,6 +18,8 @@ /datum/sex_action/npc_vaginal_sex/on_perform(mob/living/user, mob/living/target) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt.")) + + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(user.sexcon.check_active_ejaculation()) @@ -36,8 +38,12 @@ /datum/sex_action/npc_vaginal_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] pulls his cock out of [target]'s cunt.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_vaginal_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index 7b71283fd08..4186ff720ff 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -910,7 +910,7 @@ /datum/sex_controller/proc/try_pelvis_crush(mob/living/carbon/human/target) if(istype(user.rmb_intent, /datum/rmb_intent/strong)) if(!target.has_wound(/datum/wound/fracture/groin)) - if(prob(10)){ + if(prob(5)){ var/obj/item/bodypart/groin = target.get_bodypart(check_zone(BODY_ZONE_PRECISE_GROIN)) groin.add_wound(/datum/wound/fracture) } diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 9a7d87f516b..94d6b4f1803 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -353,6 +353,9 @@ var/initialball var/initialbreasts +/datum/status_effect/debuff/bigboobs/permanent + duration = -1 //used for quirk + /atom/movable/screen/alert/status_effect/debuff/bigboobs name = "Enchanted Endowment" //was gonna name it a curse but it isn't a technically one. desc = "They feel as heavy as gold and are massive... My back hurts." diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 5f1e986a7f3..ffc3433a306 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -59,7 +59,7 @@ if(isliving(user) && W && user.z == z) if(W.flags_1 & CONDUCT_1) var/mob/living/L = user - if(L.electrocute_act(5, src)) // The kneestingers will let you pass if you worship dendor, but they won't take your stupid ass hitting them. + if(L.electrocute_act(15, src)) // The kneestingers will let you pass if you worship dendor, but they won't take your stupid ass hitting them. L.emote("painscream") L.consider_ambush() if(L.throwing) @@ -140,13 +140,12 @@ qdel(src) /obj/structure/safeglowshroom/Destroy() - var/datum/reagents/R = new/datum/reagents(30) + var/datum/reagents/R = new/datum/reagents(25) R.my_atom = src - R.add_reagent(/datum/reagent/berrypoison, 30) + R.add_reagent(/datum/reagent/berrypoison, 25) var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 5, get_turf(src), FALSE) + smoke.set_up(R, 6, get_turf(src), FALSE) smoke.start() - explosion(loc, 1, 1, 1, 0, 0) //and gas release ig . = ..() //used by stupid spell diff --git a/code/game/objects/items/rogueweapons/melee/special.dm b/code/game/objects/items/rogueweapons/melee/special.dm index b02339efacf..f9379e61df9 100644 --- a/code/game/objects/items/rogueweapons/melee/special.dm +++ b/code/game/objects/items/rogueweapons/melee/special.dm @@ -225,7 +225,7 @@ wbalance = 0 minstr = 5 wdefense = 0 - charge = 1000 + charge = 300 on = FALSE /obj/item/rogueweapon/mace/stunmace/hedgeknight/pickup(mob/user) @@ -233,20 +233,19 @@ var/mob/living/carbon/human/H = user if(!HAS_TRAIT(H, TRAIT_SHOCKIMMUNE) || HAS_TRAIT(H, TRAIT_RAVOX_CURSE)) to_chat(H, span_danger("As you grasp the hedgeknight mace, you touch its kneestingers and feel a powerful and excruciating shock radiate through your body!")) - H.electrocute_act(30, src) - H.Paralyze(10 SECONDS, ignore_canstun = TRUE) + H.electrocute_act(15, src) //nobody likes this, its been proven at tgmc but i guess its too late now /obj/item/rogueweapon/mace/stunmace/hedgeknight/process() var/mob/living/user = loc if(istype(user)) if(!HAS_TRAIT(user, TRAIT_SHOCKIMMUNE) || HAS_TRAIT(user, TRAIT_RAVOX_CURSE)) to_chat(user, span_danger("As you grasp the hedgeknight mace, you touch its kneestingers and feel a powerful and excruciating shock radiate through your body!")) - user.Paralyze(10 SECONDS, ignore_canstun = TRUE) + user.electrocute_act(15, src) if(on) charge-- else - if(charge < 1000) - charge += 25 + if(charge < 300) + charge += 10 if(charge <= 0) on = FALSE charge = 0 diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm index 3772d3f19d7..168f7eb6ca8 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm @@ -23,20 +23,20 @@ . = ..() if(ishuman(L)) var/mob/living/carbon/human/H = L - if(istype(H.cloak, /obj/item/clothing/cloak/stabard/bog)) + if(istype(H.cloak, /obj/item/clothing/cloak/templar/dendor)) var/obj/item/clothing/S = H.cloak var/index = findtext(H.real_name, " ") if(index) index = copytext(H.real_name, 1,index) if(!index) index = H.real_name - S.name = "bogman tabard ([index])" + S.name = "Hedgeknight tabard ([index])" /datum/outfit/job/roguetown/bogguardsman/pre_equip(mob/living/carbon/human/H) . = ..() head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet armor = /obj/item/clothing/suit/roguetown/armor/plate/half/foresterarmor - cloak = /obj/item/clothing/cloak/raincloak/green + cloak = /obj/item/clothing/cloak/templar/dendor neck = /obj/item/clothing/neck/roguetown/bervor gloves = /obj/item/clothing/gloves/roguetown/forestergauntlets wrists = /obj/item/clothing/wrists/roguetown/bracers @@ -48,23 +48,21 @@ beltr = /obj/item/rogueweapon/mace/stunmace/hedgeknight backr = /obj/item/storage/backpack/rogue/satchel backl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow - wrists = /obj/item/clothing/wrists/roguetown/bracers/leather id = /obj/item/scomstone backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver = 1, /obj/item/signal_horn = 1) if(H.mind) assign_skills(H) H.verbs |= /mob/proc/haltyell ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_DARKVISION, TRAIT_GENERIC) -/*Design philosophy: Protectors of Stonehedge, whose holy maces are the bane of any who violate the Guild's few laws. While they are not as physically strong as more conventional warriors, they are swift and their endurance is second to none.*/ +/*Design philosophy: Protectors of Stonehedge, whose holy maces are the bane of any who violate the Guild's few laws. +While they are not as physically strong as more conventional warriors, they are swift and their endurance is second to none.*/ /datum/outfit/job/roguetown/bogguardsman/proc/assign_skills(mob/living/carbon/human/H) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE) @@ -87,7 +85,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change. - H.change_stat("perception", 4) + H.change_stat("perception", 2) H.change_stat("constitution", 4) H.change_stat("endurance", 4) H.change_stat("speed", 2) diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm index 7df84357ae2..34cc8e882f2 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm @@ -25,20 +25,20 @@ . = ..() if(ishuman(L)) var/mob/living/carbon/human/H = L - if(istype(H.cloak, /obj/item/clothing/cloak/stabard/bog)) + if(istype(H.cloak, /obj/item/clothing/cloak/templar/dendor)) var/obj/item/clothing/S = H.cloak var/index = findtext(H.real_name, " ") if(index) index = copytext(H.real_name, 1,index) if(!index) index = H.real_name - S.name = "bog master tabard ([index])" + S.name = "Hedgemaster tabard ([index])" /datum/outfit/job/roguetown/bogmaster/pre_equip(mob/living/carbon/human/H) . = ..() - head = /obj/item/clothing/head/roguetown/helmet/leather + head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings pants = /obj/item/clothing/under/roguetown/chainlegs - cloak = /obj/item/clothing/cloak/raincloak/green + cloak = /obj/item/clothing/cloak/templar/dendor shirt = /obj/item/clothing/suit/roguetown/armor/chainmail armor = /obj/item/clothing/suit/roguetown/armor/plate/half neck = /obj/item/clothing/neck/roguetown/bervor @@ -66,25 +66,23 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change. H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3, TRUE) //Peasent levy, so some skill - H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, pick(1,2,2), TRUE) //Peasent levy, so some skill + H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, 2, TRUE) //Peasent levy, so some skill H.change_stat("constitution", 4) - H.change_stat("perception", 4) + H.change_stat("perception", 3) H.change_stat("endurance", 4) H.change_stat("speed", 2) H.dna.species.soundpack_m = new /datum/voicepack/male/knight() H.verbs |= /mob/proc/haltyell ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_DARKVISION, TRAIT_GENERIC) /obj/effect/proc_holder/spell/self/convertrole/bog name = "Recruit Hedgeknight" diff --git a/code/modules/mob/living/carbon/human/npc/_npc.dm b/code/modules/mob/living/carbon/human/npc/_npc.dm index 48631d4a51f..19f3a38c41b 100644 --- a/code/modules/mob/living/carbon/human/npc/_npc.dm +++ b/code/modules/mob/living/carbon/human/npc/_npc.dm @@ -227,12 +227,12 @@ last_special = world.time + CLICK_CD_BREAKOUT cuff_resist(I) -/mob/living/carbon/human/proc/should_target(mob/living/L, ignore_lying = TRUE) +/mob/living/carbon/human/proc/should_target(mob/living/L, attack_lying = FALSE) if(!L) return FALSE //those are here for proc dependancy. - if(!ignore_lying && L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. + if(!attack_lying && L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. if(prob(4) && L.has_quirk(/datum/quirk/monsterhunter) && erpable) //tiny chance to trigger abuss. fuckcd = 0 return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index b2c7ddf2792..98c1eb2580a 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -228,7 +228,7 @@ return chosen_target // Please do not add one-off mob AIs here, but override this function for your mob -/mob/living/simple_animal/hostile/CanAttack(atom/the_target, ignore_lying = TRUE)//Can we actually attack a possible target? +/mob/living/simple_animal/hostile/CanAttack(atom/the_target, attack_lying = FALSE)//Can we actually attack a possible target? if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids return FALSE @@ -239,12 +239,12 @@ if(M.name in friends) return FALSE - if(ignore_laying) //used for bosses etc. - ignore_lying = FALSE + if(attack_laying) //used for bosses etc. + attack_lying = TRUE if(ishuman(the_target)) var/mob/living/carbon/human/th = the_target - if(ignore_lying && th.lying && !th.get_active_held_item()) //if is laying and holding nothing, and not in cmode. Ignore. + if(!attack_lying && th.lying && !th.get_active_held_item()) //if is laying and holding nothing, and not in cmode. Ignore. if(prob(4) && th.has_quirk(/datum/quirk/monsterhunter) && erpable) //tiny chance to trigger abuss. fuckcd = 0 return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 19f62f5a11c..c7553b09d97 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -29,7 +29,7 @@ layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - ignore_laying = TRUE // rip them apart. + attack_laying = TRUE // rip them apart. var/list/crusher_loot var/achievement_type var/crusher_achievement_type diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 615122e8761..271f7f00a7d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -250,7 +250,7 @@ GLOBAL_VAR_INIT(farm_animals, FALSE) /mob/living/simple_animal/hostile var/retreating - var/ignore_laying = FALSE + var/attack_laying = FALSE /mob/living/simple_animal/hostile/updatehealth() ..() diff --git a/modular_hearthstone/code/game/objects/items/signal_horn.dm b/modular_hearthstone/code/game/objects/items/signal_horn.dm index 8bb19ce154f..bf2664295f1 100644 --- a/modular_hearthstone/code/game/objects/items/signal_horn.dm +++ b/modular_hearthstone/code/game/objects/items/signal_horn.dm @@ -15,7 +15,7 @@ /obj/item/signal_horn/proc/sound_horn(mob/living/user) user.visible_message(span_warning("[user] sounds the alarm!")) switch(user.job) - if("Bog Guard", "Bog Master") + if("Hedge Knight", "Hedgemaster") playsound(src, 'modular_hearthstone/sound/items/bogguardhorn.ogg', 100, TRUE) if("Town Sheriff", "Watchman") playsound(src, 'modular_hearthstone/sound/items/watchhorn.ogg', 100, TRUE) @@ -81,4 +81,4 @@ to_chat(player, span_warning("I hear the horn of the Royal Guard somewhere[disttext][dirtext]!")) else player.playsound_local(get_turf(player), 'modular_hearthstone/sound/items/signalhorn.ogg', 35, FALSE, pressure_affected = FALSE) - to_chat(player, span_warning("I hear the signal horn somewhere[disttext][dirtext]!")) \ No newline at end of file + to_chat(player, span_warning("I hear the signal horn somewhere[disttext][dirtext]!")) diff --git a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm index 77ecc306a4d..4769ad4a197 100644 --- a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm +++ b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm @@ -108,7 +108,7 @@ /mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry var/list/friendlyjobs = list("Guild Appraiser", "Guildmaster") -/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry/CanAttack(atom/the_target, ignore_lying) +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry/CanAttack(atom/the_target, attack_lying) if(ishuman(the_target)) var/mob/living/carbon/human/madafaka = the_target if(madafaka.job |= friendlyjobs) diff --git a/modular_helmsguard/code/game/objects/items/war_horn.dm b/modular_helmsguard/code/game/objects/items/war_horn.dm index 68d596a8bf0..b32f244ef2f 100644 --- a/modular_helmsguard/code/game/objects/items/war_horn.dm +++ b/modular_helmsguard/code/game/objects/items/war_horn.dm @@ -31,6 +31,9 @@ farholdsound = 'modular_helmsguard/sound/items/horns/h_hold_distant.ogg' farchargesound = 'modular_helmsguard/sound/items/horns/h_charge_distant.ogg' +/obj/item/war_horn/human/elf + name = "elven war horn" + /obj/item/war_horn/orc name = "Orcish war horn" icon_state = "orchorn" diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 790ec9fbca0..cd26ce16468 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -592,4 +592,4 @@ /datum/quirk/pacifist/on_spawn() var/mob/living/carbon/human/H = quirk_holder - ADD_TRAIT(H, TRAIT_ENDOWMENT, QUIRK_TRAIT) + H.apply_status_effect(/datum/status_effect/debuff/bigboobs/permanent) diff --git a/modular_stonehedge/code/lewdai/lewdai.dm b/modular_stonehedge/code/lewdai/lewdai.dm index a72bde01db7..385e717f0fc 100644 --- a/modular_stonehedge/code/lewdai/lewdai.dm +++ b/modular_stonehedge/code/lewdai/lewdai.dm @@ -49,7 +49,7 @@ for(var/mob/living/carbon/human/fucktarg in around) if(!src.aggressive && fucktarg.cmode) //skip if the target has cmode on and the mob is not aggressive. continue - if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && CanAttack(fucktarg, FALSE)) + if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && CanAttack(fucktarg, TRUE)) chasesfuck = TRUE if(src.gender == MALE) src.visible_message(span_boldwarning("[src] has his eyes on [fucktarg], cock throbbing!")) @@ -108,13 +108,15 @@ L.SetKnockdown(60) if(!L.lying) L.emote("gasp") - if(!L.cmode && L.wear_pants) //pants off if not in cmode - src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) - var/obj/item/clothing/thepants = L.wear_pants - L.dropItemToGround(thepants) - thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) - else if(L.cmode && L.wear_pants) - src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) + if(L.wear_pants) + if(L.wear_pants.flags_inv & HIDECROTCH && !L.wear_pants.genitalaccess) + if(!L.cmode) //pants off if not in cmode + src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) + var/obj/item/clothing/thepants = L.wear_pants + L.dropItemToGround(thepants) + thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) + else if(L.cmode) + src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) enemies = list() target = null approaching_target = FALSE @@ -137,19 +139,19 @@ log_admin("[src] is trying to init sex on [L]") var/current_action = /datum/sex_action/npc_rimming if(src.gender == FEMALE && L.gender == MALE) - switch(rand(2)) + switch(rand(1,2)) if(2) //anal current_action = /datum/sex_action/npc_anal_ride_sex if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_ride_sex if(src.gender == MALE && L.gender == MALE) - switch(rand(2)) + switch(rand(1,2)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal current_action = /datum/sex_action/npc_anal_sex if(src.gender == MALE && L.gender == FEMALE) - switch(rand(3)) + switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal @@ -157,7 +159,7 @@ if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_sex if(src.gender == FEMALE && L.gender == FEMALE) - switch(rand(3)) + switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_facesitting if(2) //anal @@ -232,7 +234,7 @@ for(var/mob/living/carbon/human/fucktarg in around) if(!src.aggressive && fucktarg.cmode) //skip if the target has cmode on and the mob is not aggressive. continue - if(fucktarg.has_quirk(/datum/quirk/monsterhunter)) //normally checks !sexcon.beingfucked but carbon mobs arent directly on top of the mob to fuck so its probably fine to get ganged. + if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg, TRUE)) //normally checks !sexcon.beingfucked but carbon mobs arent directly on top of the mob to fuck so its probably fine to get ganged. chasesfuck = TRUE if(lewd_talk) if(src.gender == MALE) @@ -266,7 +268,7 @@ if(sexcon.current_action && fuckcd > 0) return for(var/mob/living/carbon/human/fucktarg in around) - if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg, FALSE)) + if(fucktarg.has_quirk(/datum/quirk/monsterhunter)) foundfuckmeat += fucktarg L = fucktarg STOP_PROCESSING(SShumannpc,src) @@ -285,20 +287,23 @@ L.SetKnockdown(60) if(!L.lying) //i guess if already targeted but got up somehow. L.emote("gasp") - if(!L.cmode && L.wear_pants) //pants off if not in cmode - src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) - var/obj/item/clothing/thepants = L.wear_pants - L.dropItemToGround(thepants) - thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) - else if(L.cmode && L.wear_pants) - src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) + if(L.wear_pants) + if(L.wear_pants.flags_inv & HIDECROTCH && !L.wear_pants.genitalaccess) + if(!L.cmode) //pants off if not in cmode + src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) + var/obj/item/clothing/thepants = L.wear_pants + L.dropItemToGround(thepants) + thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) + else if(L.cmode) + src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) if(aggressive) sexcon.force = SEX_FORCE_MAX else sexcon.force = SEX_FORCE_MID if(!Adjacent(L)) //are we at the same tile? walk2derpless(Adjacent(L)) //get next to them since it looks like shit tweaks out. - start_pulling(L) + if(!pulling) + start_pulling(L) src.visible_message(span_danger("[src] starts to breed [L]!")) if(sexcon.force == SEX_FORCE_MAX) src.visible_message(span_danger("[src] pins [L] down for a savage fucking!")) @@ -310,19 +315,19 @@ log_admin("[src] is trying to init sex on [L]") var/current_action = /datum/sex_action/npc_rimming if(src.gender == FEMALE && L.gender == MALE) - switch(rand(2)) + switch(rand(1,2)) if(1) //anal current_action = /datum/sex_action/npc_anal_ride_sex if(2) //vaginal current_action = /datum/sex_action/npc_vaginal_ride_sex if(src.gender == MALE && L.gender == MALE) - switch(rand(2)) + switch(rand(1,2)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal current_action = /datum/sex_action/npc_anal_sex if(src.gender == MALE && L.gender == FEMALE) - switch(rand(3)) + switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal @@ -330,7 +335,7 @@ if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_sex if(src.gender == FEMALE && L.gender == FEMALE) - switch(rand(3)) + switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_facesitting if(2) //anal From b799c48b2f024bd28e06443ac7ad7188180f9b34 Mon Sep 17 00:00:00 2001 From: Ghostcoffeee <66063955+Ghostcoffeee@users.noreply.github.com> Date: Thu, 28 Nov 2024 03:11:39 +0200 Subject: [PATCH 070/192] Un-armors warlocks, nerfs trickster rogues, allows the codebase to compile (#128) * ExtraFixes * HexbladeFemDrip --- .../roguetown/adventurer/types/_advclass.dm | 4 + .../adventurer/types/combat/cleric.dm | 4 +- .../adventurer/types/combat/rogue.dm | 2 + .../adventurer/types/combat/warlock.dm | 78 +++++++------------ .../modules/roguetown/roguecrafting/sewing.dm | 2 + .../code/datums/traits/unspecial.dm | 6 +- 6 files changed, 44 insertions(+), 52 deletions(-) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm index c6219e8374d..72f2476748b 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm @@ -39,9 +39,13 @@ //sleep(1) //testing("[H] spawn troch") + +/* // This is what put the torch in adventurers' hands, causing the spam var/obj/item/flashlight/flare/torch/T = new() T.spark_act() H.put_in_hands(T, forced = TRUE) +*/ + //framework for being able to list spells instead of individually input them var/list/skills var/list/roundstart_experience diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm index 29d8cd96995..4d1c1bcddf5 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm @@ -153,7 +153,7 @@ cloak = /obj/item/clothing/cloak/raincloak/furcloak shoes = /obj/item/clothing/shoes/roguetown/boots // HEARTHSTONE ADD: cloistered devout custom outfits - else if (classchoice == "Cloistered Devout") + else if (classchoice == "Temple Devout") // do the generic stuff first then replace it w/ patron specific things... if it exists // for reference, cloistered devouts are lightly armored/unarmored but get patron-specific stuff (if applicable) and a devo regen head = /obj/item/clothing/head/roguetown/roguehood/black @@ -201,7 +201,7 @@ // HEARTHSTONE ADDITION END var/datum/devotion/C = new /datum/devotion(H, H.patron) // HEARTHSTONE ADDITION: cloistered devout devo regen & tier buff - if (classchoice == "Cloistered Devout") + if (classchoice == "Temple Devout") if(H.patron?.type == /datum/patron/divine/noc) C.grant_spells_devout_noc(H) else diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm index 9ecaf07c8b7..fd2621d23a0 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm @@ -226,8 +226,10 @@ H.change_stat("intelligence", 3) H.visible_message(span_info("I’m not just a thief. I'm a master of illusion and deception. One moment, I'm a harmless vagabond. The next, I'm a blur of motion, leaving my pursuers bewildered and outwitted.")) H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) + /* if(H.mind) H.mind.adjust_spellpoints(3) + */ // Brings them down to arcanist bard levels of spell-points. Lets not have them be better spellcasters than warlocks H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/fetch) H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/rogue_knock) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm index a155d9f4400..a3685ce6c9e 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm @@ -70,7 +70,8 @@ "love", //ring of soulbinding "friendship", //Pact of the Chain "power", //empowered eldritch blast - "purpose" //Pact of the Star Chain + "purpose", //Pact of the Star Chain + "revenge" //give curse ) var/boonchoice = input("What did you sell your faith for?", "Available boons") as anything in boons @@ -128,6 +129,7 @@ head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet armor = /obj/item/clothing/suit/roguetown/shirt/robe/mage + shoes = /obj/item/clothing/shoes/roguetown/sandals r_hand = /obj/item/rogueweapon/woodstaff beltr = /obj/item/storage/belt/rogue/pouch/coins/poor belt = /obj/item/storage/belt/rogue/leather/rope @@ -149,18 +151,21 @@ H.visible_message(span_info("I made a deal with an archseelie from the wild.")) /datum/outfit/job/roguetown/adventurer/warlock/proc/celestialpatron(mob/living/carbon/human/H, patronchoice) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE) - armor = /obj/item/clothing/suit/roguetown/armor/chainmail - shirt = /obj/item/clothing/suit/roguetown/armor/gambeson + // armor = /obj/item/clothing/suit/roguetown/armor/chainmail + if(H.gender == MALE) + shirt = /obj/item/clothing/suit/roguetown/armor/gambeson + else + shirt = /obj/item/clothing/suit/roguetown/armor/armordress wrists = /obj/item/clothing/wrists/roguetown/bracers/leather - pants = /obj/item/clothing/under/roguetown/trou/leather - shoes = /obj/item/clothing/shoes/roguetown/boots/leather + pants = /obj/item/clothing/under/roguetown/tights/random + shoes = /obj/item/clothing/shoes/roguetown/simpleshoes beltr = /obj/item/storage/belt/rogue/pouch/coins/poor belt = /obj/item/storage/belt/rogue/leather - beltl = /obj/item/rogueweapon/mace + r_hand = /obj/item/rogueweapon/spear backpack_contents = list(/obj/item/rogueweapon/huntingknife) //caster stats (must be 5 stat point total) @@ -190,7 +195,7 @@ head = /obj/item/clothing/head/roguetown/fisherhat shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor cloak = /obj/item/clothing/cloak/raincloak/yellow - gloves = /obj/item/clothing/gloves/roguetown/plate/zybantinegauntlets + // gloves = /obj/item/clothing/gloves/roguetown/plate/zybantinegauntlets // No plate gloves for you wrists = /obj/item/rope r_hand = /obj/item/rogueweapon/pitchfork beltr = /obj/item/storage/belt/rogue/pouch/coins/poor @@ -314,20 +319,10 @@ gloves = /obj/item/clothing/gloves/roguetown/leather belt = /obj/item/storage/belt/rogue/leather shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/random - if(prob(70)) - armor = /obj/item/clothing/suit/roguetown/armor/chainmail/hauberk - else if(prob(50)) - armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron - else - armor = /obj/item/clothing/suit/roguetown/armor/plate/scale - if(prob(20)) - mask = /obj/item/clothing/mask/rogue/facemask - else if(prob(60)) - head = /obj/item/clothing/head/roguetown/helmet/leather - else if(prob(20)) - head = /obj/item/clothing/head/roguetown/helmet/skullcap - else - head = /obj/item/clothing/head/roguetown/helmet/kettle + if(H.gender == MALE) + shirt = /obj/item/clothing/suit/roguetown/armor/gambeson + else + shirt = /obj/item/clothing/suit/roguetown/armor/armordress // Armor downgrade from hauberk to gambeson beltl = /obj/item/rogueweapon/huntingknife beltr = /obj/item/storage/belt/rogue/pouch/coins/poor @@ -349,40 +344,27 @@ H.visible_message(span_info("I made a deal with a sentient weapon.")) /datum/outfit/job/roguetown/adventurer/warlock/proc/undeadpatron(mob/living/carbon/human/H, patronchoice) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE) H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE) H.mind.adjust_skillrank(/datum/skill/misc/stealing, 3, TRUE) H.mind.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - if(prob(20)) - head = /obj/item/clothing/head/roguetown/knitcap - else - head = null - if(prob(10)) - cloak = /obj/item/clothing/cloak/raincloak/brown - else - cloak = null - if(prob(10)) - gloves = /obj/item/clothing/gloves/roguetown/fingerless - else - gloves = /obj/item/clothing/gloves/roguetown/brigandinegauntlets - armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron - pants = /obj/item/clothing/under/roguetown/tights/vagrant - if(prob(50)) - pants = /obj/item/clothing/under/roguetown/tights/vagrant/l - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant - if(prob(50)) - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant/l - wrists = /obj/item/clothing/wrists/roguetown/bracers + cloak = /obj/item/clothing/cloak/raincloak/brown + gloves = /obj/item/clothing/gloves/roguetown/angle + armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron + pants = /obj/item/clothing/under/roguetown/tights/random + shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/random + wrists = /obj/item/clothing/wrists/roguetown/vambraces neck = /obj/item/clothing/neck/roguetown/gorget - shoes = /obj/item/clothing/shoes/roguetown/boots/armor + shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron + head = /obj/item/clothing/head/roguetown/helmet/ironpothelmet beltr = /obj/item/storage/belt/rogue/pouch/coins/poor belt = /obj/item/storage/belt/rogue/leather - beltl = /obj/item/rogueweapon/mace - backl = /obj/item/rogueweapon/sword/iron/short - + beltl = /obj/item/rogueweapon/sword/iron/short + backl = /obj/item/rogueweapon/shield/tower + // They're the tank subclass, so I'm keeping their armor in. If it's a problem, it's pretty easy to comment it out and give them hauberks instead //tank stats (must be 5 stat point total) H.change_stat("strength", 1) H.change_stat("endurance", 2) @@ -392,7 +374,7 @@ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/infestation5e) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/chilltouch5e) // decay-themed magic and a skeletal hand to attack people with - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + // ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) // Unnecessary with the heavy armor trait ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC) diff --git a/code/modules/roguetown/roguecrafting/sewing.dm b/code/modules/roguetown/roguecrafting/sewing.dm index be27866069f..faff539a692 100644 --- a/code/modules/roguetown/roguecrafting/sewing.dm +++ b/code/modules/roguetown/roguecrafting/sewing.dm @@ -570,6 +570,7 @@ craftdiff = 3 sellprice = 12 +/* // These are plate-level gloves and boots, and have their own smithing recipe. /datum/crafting_recipe/roguetown/sewing/zybantinegauntlets name = "zybantine gauntlets" result = list(/obj/item/clothing/gloves/roguetown/plate/zybantinegauntlets) @@ -583,6 +584,7 @@ reqs = list(/obj/item/natural/cloth = 3, /obj/item/natural/fibers = 1) craftdiff = 4 +*/ /datum/crafting_recipe/roguetown/sewing/stockdress name = "dress" diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 790ec9fbca0..9cd008d54d3 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -36,6 +36,7 @@ var/mob/living/carbon/human/H = quirk_holder ADD_TRAIT(H, TRAIT_NOHUNGER, QUIRK_TRAIT) ADD_TRAIT(H, TRAIT_NOBREATH, QUIRK_TRAIT) + ADD_TRAIT(H, TRAIT_NOSLEEP, QUIRK_TRAIT) H.change_stat("endurance", 1) /datum/quirk/deadened @@ -289,6 +290,7 @@ H.grant_language(/datum/language/orcish) H.grant_language(/datum/language/beast) H.grant_language(/datum/language/draconic) + H.grant_language(/datum/language/faexin) /datum/quirk/civilizedbarbarian name = "Tavern Brawler" @@ -585,11 +587,11 @@ ADD_TRAIT(H, TRAIT_PACIFISM, QUIRK_TRAIT) -/datum/quirk/pacifist +/datum/quirk/endowed name = "Endowment Curse" desc = "I was cursed with endowment... This makes life hard." value = -2 -/datum/quirk/pacifist/on_spawn() +/datum/quirk/endowed/on_spawn() var/mob/living/carbon/human/H = quirk_holder ADD_TRAIT(H, TRAIT_ENDOWMENT, QUIRK_TRAIT) From 507575c6dcfdcd015efadd8384b68c019ae55e6e Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 04:13:43 +0300 Subject: [PATCH 071/192] im tired --- _maps/map_files/dreamhold/Dreamhold.dmm | 46 ++--- .../mob/living/carbon/human/npc/_npc.dm | 8 +- code/modules/mob/mob.dm | 14 ++ .../surgery/bodyparts/bodypart_examine.dm | 22 +-- .../simple_animal/rogue/friendly_npc.dm | 162 +++++++++++++----- 5 files changed, 173 insertions(+), 79 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 40fbfcbd4f8..5dfb3620f84 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -648,7 +648,7 @@ name = "far stonehedge" }) "azG" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/river) "azR" = ( @@ -2909,7 +2909,7 @@ dir = 1 }, /obj/machinery/light/rogue/wallfire/candle/r, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) "cns" = ( @@ -2986,7 +2986,7 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) "cpy" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -5218,7 +5218,7 @@ /turf/closed/wall/shroud, /area/rogue/indoors/shelter/bog) "dVP" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/twig/platform, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -6068,7 +6068,7 @@ name = "far stonehedge" }) "eCw" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/indoors/shelter/bog) "eCy" = ( @@ -9121,7 +9121,7 @@ /obj/machinery/light/rogue/lanternpost{ dir = 1 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null @@ -9143,7 +9143,7 @@ }) "hau" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -10466,7 +10466,7 @@ /obj/machinery/light/rogue/torchholder{ dir = 4 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -14107,7 +14107,7 @@ name = "Silver Dragon" }) "kOv" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -14533,7 +14533,7 @@ name = "far stonehedge" }) "lfB" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -15076,7 +15076,7 @@ first_time_text = "Stonehedge" }) "lCr" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -15617,7 +15617,7 @@ pixel_x = 2; pixel_y = 7 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -16688,7 +16688,7 @@ /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) "mOd" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -17682,7 +17682,7 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "nBi" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -18336,7 +18336,7 @@ pixel_x = 2; pixel_y = 7 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/twig, /area/rogue/outdoors/river) "nYV" = ( @@ -20153,7 +20153,7 @@ pixel_x = 1; pixel_y = 7 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/twig/platform, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -20287,7 +20287,7 @@ name = "Silver Dragon" }) "pIz" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -21431,7 +21431,7 @@ /obj/machinery/light/rogue/torchholder{ dir = 4 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/tavern{ first_time_text = "The Sylver Dragonne.."; @@ -24182,7 +24182,7 @@ first_time_text = "The Twilight Woods" }) "sCW" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -26565,7 +26565,7 @@ name = "Shores of the Emerald Coast" }) "usY" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -27916,7 +27916,7 @@ /area/rogue/outdoors/river) "vwj" = ( /obj/structure/flora/roguegrass, -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -29070,7 +29070,7 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) "wxI" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -30637,7 +30637,7 @@ }) "xKH" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" diff --git a/code/modules/mob/living/carbon/human/npc/_npc.dm b/code/modules/mob/living/carbon/human/npc/_npc.dm index 19f3a38c41b..c4d7e1c16c5 100644 --- a/code/modules/mob/living/carbon/human/npc/_npc.dm +++ b/code/modules/mob/living/carbon/human/npc/_npc.dm @@ -237,10 +237,10 @@ fuckcd = 0 return FALSE - var/mob/living/carbon/lcarbon = L - if(istype(lcarbon, /mob/living/carbon)) //leave alone if handcuffed. - if(lcarbon.handcuffed) - if(prob(8) && lcarbon.has_quirk(/datum/quirk/monsterhunter) && erpable) //small chance to trigger abuss. + if(ishuman(L)) //leave alone if handcuffed. + var/mob/living/carbon/human/lhuman = L + if(lhuman.handcuffed) + if(prob(8) && lhuman.has_quirk(/datum/quirk/monsterhunter) && erpable) //small chance to trigger abuss. fuckcd = 0 return FALSE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3e89b032356..1cb983c0e67 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1378,3 +1378,17 @@ GLOBAL_VAR_INIT(mobids, 1) return FALSE else return TRUE + +/proc/find_match_in_list(list/list_A, list/list_B, exact_match) + var/list/match_list + if(!list_A || !list_B) + return + if(exact_match) + match_list = list_A&list_B //only items in both lists + var/length = LAZYLEN(match_list) + if(length) + return (length == LAZYLEN(list_A)) //if they're not the same len(gth) or we don't have a len, then this isn't an exact match. + else + match_list = list_A&list_B + return LAZYLEN(match_list) + return FALSE diff --git a/code/modules/surgery/bodyparts/bodypart_examine.dm b/code/modules/surgery/bodyparts/bodypart_examine.dm index 9ac652d4e09..33f4b9c7f08 100644 --- a/code/modules/surgery/bodyparts/bodypart_examine.dm +++ b/code/modules/surgery/bodyparts/bodypart_examine.dm @@ -127,25 +127,25 @@ salami = TRUE penisAdd = 1 var/mob/living/carbon/human/ownerussy = owner - if(ownerussy.has_penis() || salami) - var/obj/item/organ/penis/ownerussypenis = ownerussy.getorgan(/obj/item/organ/penis) + if(ownerussy.getorganslot(ORGAN_SLOT_PENIS) || salami) + var/obj/item/organ/penis/ownerussypenis = ownerussy.getorganslot(ORGAN_SLOT_PENIS) if (ownerussypenis) bodypart_status += "[ownerussy] has a [find_key_by_value(GLOB.uns_named_penis_sizes, ownerussypenis.organ_size+penisAdd)] penis." else bodypart_status += "[ownerussy] has a [find_key_by_value(GLOB.uns_named_penis_sizes, 1)] penis." - if(ownerussy.has_testicles()) - var/obj/item/organ/filling_organ/testicles/ownerussyballs = ownerussy.getorgan(/obj/item/organ/filling_organ/testicles) + if(ownerussy.getorganslot(ORGAN_SLOT_TESTICLES)) + var/obj/item/organ/filling_organ/testicles/ownerussyballs = ownerussy.getorganslot(ORGAN_SLOT_TESTICLES) bodypart_status += "[ownerussy] has [find_key_by_value(GLOB.uns_named_ball_sizes, ownerussyballs.organ_size)] testicles." - if(ownerussy.has_breasts()) - var/obj/item/organ/filling_organ/breasts/ownerussybreasts = ownerussy.getorgan(/obj/item/organ/filling_organ/breasts) + if(ownerussy.getorganslot(ORGAN_SLOT_BREASTS)) + var/obj/item/organ/filling_organ/breasts/ownerussybreasts = ownerussy.getorganslot(ORGAN_SLOT_BREASTS) bodypart_status += "[ownerussy] has [find_key_by_value(GLOB.uns_named_breast_sizes, ownerussybreasts.organ_size)] breasts." - if(ownerussy.has_belly()) - var/obj/item/organ/belly/ownerussybelly = ownerussy.getorgan(/obj/item/organ/belly) + if(ownerussy.getorganslot(ORGAN_SLOT_BELLY)) + var/obj/item/organ/belly/ownerussybelly = ownerussy.getorganslot(ORGAN_SLOT_BELLY) bodypart_status += "[ownerussy] has a [find_key_by_value(GLOB.named_belly_sizes, ownerussybelly.organ_size)] belly." - if(ownerussy.has_butt()) - var/obj/item/organ/butt/ownerussybutt = ownerussy.getorgan(/obj/item/organ/butt) + if(ownerussy.getorganslot(ORGAN_SLOT_BUTT)) + var/obj/item/organ/butt/ownerussybutt = ownerussy.getorganslot(ORGAN_SLOT_BUTT) bodypart_status += "[ownerussy] has a [find_key_by_value(GLOB.uns_named_butt_sizes, ownerussybutt.organ_size)] butt." - if(ownerussy.has_vagina()) + if(ownerussy.getorganslot(ORGAN_SLOT_VAGINA)) bodypart_status += "[ownerussy] has a vagina." return bodypart_status diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index f8584d0726b..7ed0f86c80e 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -1,8 +1,7 @@ //By Vide Noir https://github.com/EaglePhntm. //templated on hearthstone sea raiders. -/mob/living/carbon/human/species/human/friendlynpc - aggressive=1 +/mob/living/carbon/human/species/human/smartnpc race = /datum/species/elf/wood mode = AI_IDLE faction = list("Station") @@ -12,8 +11,10 @@ possible_rmb_intents = list() erpable = TRUE wander = TRUE + d_intent = INTENT_DODGE show_genitals = TRUE var/list/friendlyfactions = list("Station", "neutral", "rogueanimal", "saiga", "chickens", "goats", "cows", "turtles", "rats", "crabs", "horse") + //using friendlyjobs will make this mob hostile to everyone not of those jobs, unless they are in friendlyfactions. var/list/friendlyjobs //quotes from skyrim cause we love skyrim. var/list/calmmessages = list() @@ -22,21 +23,41 @@ var/punish_attacking = FALSE //would be great if we could make them follow stone roads while idle. -/mob/living/carbon/human/species/human/friendlynpc/should_target(mob/living/L) +/mob/living/carbon/human/species/human/smartnpc/should_target(mob/living/L) + if(!L) + return FALSE + if(L == src) return FALSE + + if(HAS_TRAIT(src, TRAIT_PACIFISM)) + return FALSE + + if(!is_in_zweb(src.z,L.z)) + return FALSE + + if(L.alpha <= 100) //if mostly invisible dont see it, surely this wont go wrong. + return FALSE + + if(L.InFullCritical()) + return FALSE + + if(L.name in friends) + return FALSE + if(L.stat != CONSCIOUS) return FALSE + if(L.lying && !L.get_active_held_item()) if(ishuman(L)) var/mob/living/carbon/human/badboi = L if(badboi == lasthitter && Adjacent(badboi) && !badboi.handcuffed) //untested but yeah. say("I got you now, criminal scum.") - scom_announce("I caught the criminal scum [badboi.real_name] at [get_area(src)].") + scom_announce("I caught the criminal scum [badboi.real_name] at [get_area_name(get_area(src))].") var/obj/item/rope/ropey = new /obj/item/rope ropey.apply_cuffs(badboi, src) - start_pulling(badboi) + start_pulling(badboi, GRAB_AGGRESSIVE) return FALSE if(L == lasthitter && L.alpha > 100) return TRUE @@ -45,17 +66,27 @@ if(madafaka.Adjacent(src) && mode != AI_HUNT && madafaka.mind && madafaka.alpha > 100) if(prob(10)) face_atom(madafaka) - emote(pick("turns to [madafaka].", "faces [madafaka].")) + visible_message(span_emote(pick("[src] turns to [madafaka].", "[src] faces [madafaka]."))) say(pick(calmmessages)) if(friendlyfactions) - if(madafaka.faction |= friendlyfactions && target != lasthitter) + var/list/madafaction = madafaka.faction + if(find_match_in_list(madafaction, friendlyfactions) && lasthitter != target) return FALSE + else + return TRUE if(friendlyjobs) - if(madafaka.job |= friendlyjobs && target != lasthitter) + var/list/madajob = madafaka.job + if((madajob in friendlyjobs) && lasthitter != target) return FALSE - . = ..() + else + return TRUE + + if(enemies[L]) + return TRUE + + return FALSE -/mob/living/carbon/human/species/human/friendlynpc/MobBump(mob/M) +/mob/living/carbon/human/species/human/smartnpc/MobBump(mob/M) if(ishuman(M)) var/mob/living/carbon/human/L = M if(lasthitter == L) @@ -65,12 +96,12 @@ retaliate(L) else face_atom(L) - emote(pick("turns to [L].", "faces [L].")) + visible_message(span_emote(pick("[src] turns to [L].", "[src] faces [L]."))) if(prob(10)) say(pick(calmmessages)) . = ..() -/mob/living/carbon/human/species/human/friendlynpc/townguard +/mob/living/carbon/human/species/human/smartnpc/townguard friendlyfactions = list("Station", "neutral") calmmessages = list( "Let me guess... someone stole your sweetroll.", @@ -109,9 +140,40 @@ var/patrol = TRUE var/lastpatroltime + +// Custom idle behavior +/mob/living/carbon/human/species/human/smartnpc/townguard/npc_idle() + if(patrol) + if(world.time < next_idle + rand(30,50)) + return + next_idle = world.time + rand(30,50) + if(mode != AI_OFF) + if(prob(50)) + var/turf/target_loc = find_suitable_location() + if(target_loc) + walk2derpless(target_loc) + else + . = ..() + + +// Find a suitable location to move to +/mob/living/carbon/human/species/human/smartnpc/townguard/proc/find_suitable_location() + var/list/suitable_locations = list() + + // Collect all nearby stone road tiles + for(var/turf/T in world) + if((!istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/floor/rogue/dirt) && !istype(T, /turf/open/floor/rogue/grass) && !istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/lava) && !istype(T, /turf/open/lava/acid)) && get_dist(src, T) < 12) // Adjust distance as needed + suitable_locations += T + + // Randomly select one of the suitable locations + if(suitable_locations.len) + return pick(suitable_locations) + + return null + //this does not work for some reason unfortunately /* -/mob/living/carbon/human/species/human/friendlynpc/townguard/npc_idle() +/mob/living/carbon/human/species/human/smartnpc/townguard/npc_idle() . = ..() //im not smart enough to make a good patrol system but here. if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && patrol) @@ -135,36 +197,40 @@ name = "patrol-point" */ -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute +/mob/living/carbon/human/species/human/smartnpc/townguard/brute -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute/after_creation() - equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute) +/mob/living/carbon/human/species/human/smartnpc/townguard/brute/after_creation() + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/brute) -/mob/living/carbon/human/species/human/friendlynpc/townguard/retaliate(mob/living/L) +/mob/living/carbon/human/species/human/smartnpc/townguard/retaliate(mob/living/L) var/newtarg = target + if(L.job in list("Hedgeknight", "Hedgemaster")) + return + if(lasthitter != target) + say(pick(aggromessages)) lasthitter = target .=..() if(target) - aggressive=1 - wander = TRUE if(target == newtarg) - say(pick(aggromessages)) linepoint(target) - if(target.mind && Adjacent(target)) - //i really REALLY want to punish players who try to strip those guys for loot + if(ishuman(target) && Adjacent(target)) + //i really REALLY want to punish players who try to strip those guys for loot, also they can do those badass moves on goblins too ig. if(prob(20) && !target.IsOffBalanced()) - emote("feints an attack at [target]!") - target.OffBalance(30) + say(pick("Aha!", "Parry this!", "Ha-haa!")) + visible_message(span_emote("[src] feints an attack at [target]!")) + target.OffBalance(50) //since they cant defeat the parries might aswell give them a fat feint. else if(prob(10)) - emote("bashes [target]!") + say(pick("Sit the fuck down.", "Fuck away from me.", "Stay down.")) + visible_message(span_emote("[src] bashes [target] away!")) playsound(src,"punch_hard",100,TRUE) - target.Knockdown(30) - target.throw_at(target, pick(1,2), 1, src, FALSE, TRUE) + target.Knockdown(25) //may end up getting you tied real fast. + target.throw_at(target, pick(2,3), 1, src, FALSE, TRUE) else if(prob(5) && target.get_active_held_item()) var/obj/item/activeitem = target.get_active_held_item() if(!HAS_TRAIT(activeitem, TRAIT_NODROP)) - emote("disarms [target]!") + say(pick("You are done.", "Ha! There goes your [activeitem.name]!", "You fucked up now!")) + visible_message(span_emote("[src] disarms [target]!")) playsound(src,"bladedmedium",100,TRUE) target.OffBalance(15) target.throw_at(activeitem, get_step_away(activeitem, target, 3), 1, target, TRUE, FALSE) @@ -173,21 +239,23 @@ for(var/datum/bounty/b in GLOB.head_bounties) if(b.target == target.real_name) bounty_exists = TRUE - if(bounty_exists) + if(!bounty_exists) add_bounty(L.real_name, 500, FALSE, "Attacking a town guardsman.", "Town of Stonehedge") - var/bounty_announcement = "[target] is accused of attacking a town guardsman, wanted with a bounty of 500 mammons." - say(bounty_announcement) + var/bounty_announcement = "[target] is accused of attacking a town guardsman at [get_area_name(get_area(src))], wanted with a bounty of 500 mammons." + say("Stop right there, criminal scum!") scom_announce(bounty_announcement) to_chat(L, span_notice("I got a bounty on my head now!")) + else + scom_announce("the criminal [target] is reported attacking a townsguard at [get_area_name(get_area(src))].") -/mob/living/carbon/human/species/human/friendlynpc/townguard/Initialize() +/mob/living/carbon/human/species/human/smartnpc/townguard/Initialize() gender = pick(MALE,FEMALE) . = ..() spawn(10) after_creation() //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) -/mob/living/carbon/human/species/human/friendlynpc/townguard/after_creation() +/mob/living/carbon/human/species/human/smartnpc/townguard/after_creation() ..() job = "Town Guardsman" ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC) @@ -196,20 +264,20 @@ ADD_TRAIT(src, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard) + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/smartnpc/townguard) var/obj/item/organ/eyes/organ_eyes = getorgan(/obj/item/organ/eyes/night_vision/full_darksight) //elf eyes if(organ_eyes) organ_eyes.eye_color = pick("27becc", "35cc27", "000000") update_hair() update_body() -/mob/living/carbon/human/species/human/friendlynpc/townguard/handle_combat() +/mob/living/carbon/human/species/human/smartnpc/townguard/handle_combat() if(mode == AI_HUNT) if(prob(10)) emote("rage") . = ..() -/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/pre_equip(mob/living/carbon/human/H) if(prob(50)) wrists = /obj/item/clothing/wrists/roguetown/bracers cloak = /obj/item/clothing/cloak/templar/dendor @@ -244,7 +312,7 @@ H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) H.real_name = H.name -/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/brute/pre_equip(mob/living/carbon/human/H) wrists = /obj/item/clothing/wrists/roguetown/bracers cloak = /obj/item/clothing/cloak/templar/dendor armor = /obj/item/clothing/suit/roguetown/armor/plate/half @@ -273,14 +341,26 @@ H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) H.real_name = H.name -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry patrol = FALSE wander = FALSE + var/turf/spawned_loc + +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry/Initialize() + . = ..() + spawned_loc = get_turf(src) + addtimer(CALLBACK(src, PROC_REF(return_to_post)), 5 MINUTES, TIMER_STOPPABLE) + +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry/proc/return_to_post() + if(src.loc != spawned_loc) + walk2derpless(spawned_loc) + wander = FALSE + addtimer(CALLBACK(src, PROC_REF(return_to_post)), 5 MINUTES, TIMER_STOPPABLE) -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry/after_creation() - equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/sentry) +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry/after_creation() + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/sentry) -/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/sentry/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/sentry/pre_equip(mob/living/carbon/human/H) wrists = /obj/item/clothing/wrists/roguetown/bracers cloak = /obj/item/clothing/cloak/templar/dendor armor = /obj/item/clothing/suit/roguetown/armor/plate/half From 6b2eaaff34642c7af5267a35bf97c3c803f4160e Mon Sep 17 00:00:00 2001 From: Vide Noir <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 04:13:56 +0300 Subject: [PATCH 072/192] Alot of shit again (#124) * also whats this doing here * aw shit * a bunch of shit * Update friendly_npc.dm * a few more * fml * done ig * Update role_preferences.dm * few things more * ok done * sentries * damn * fml * fml * i wanna kms * im tired --- _maps/map_files/dreamhold/Dreamhold.dmm | 46 ++--- .../sex_actions/npc/npc_anal_ride_sex.dm | 8 +- .../sexcon/sex_actions/npc/npc_anal_sex.dm | 8 +- .../sexcon/sex_actions/npc/npc_cunnilingus.dm | 8 +- .../sexcon/sex_actions/npc/npc_facesitting.dm | 8 +- .../sexcon/sex_actions/npc/npc_rimming.dm | 8 +- .../sexcon/sex_actions/npc/npc_throat_sex.dm | 8 +- .../sex_actions/npc/npc_vaginal_ride_sex.dm | 8 +- .../sexcon/sex_actions/npc/npc_vaginal_sex.dm | 10 +- code/datums/sexcon/sexcon.dm | 3 +- code/datums/status_effects/rogue/debuff.dm | 3 + code/game/objects/effects/glowshroom.dm | 9 +- .../items/rogueweapons/melee/special.dm | 11 +- .../job_types/roguetown/garrison/bogguard.dm | 18 +- .../job_types/roguetown/garrison/bogmaster.dm | 18 +- .../mob/living/carbon/human/npc/_npc.dm | 12 +- .../living/simple_animal/hostile/hostile.dm | 8 +- .../hostile/megafauna/megafauna.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob.dm | 14 ++ .../surgery/bodyparts/bodypart_examine.dm | 22 +- .../code/game/objects/items/signal_horn.dm | 4 +- .../simple_animal/rogue/simple_skeleton.dm | 2 +- .../code/game/objects/items/war_horn.dm | 3 + .../code/datums/traits/unspecial.dm | 2 +- modular_stonehedge/code/lewdai/lewdai.dm | 57 ++--- .../simple_animal/rogue/friendly_npc.dm | 194 ++++++++++++++---- 27 files changed, 331 insertions(+), 165 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 40fbfcbd4f8..5dfb3620f84 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -648,7 +648,7 @@ name = "far stonehedge" }) "azG" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/river) "azR" = ( @@ -2909,7 +2909,7 @@ dir = 1 }, /obj/machinery/light/rogue/wallfire/candle/r, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) "cns" = ( @@ -2986,7 +2986,7 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) "cpy" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -5218,7 +5218,7 @@ /turf/closed/wall/shroud, /area/rogue/indoors/shelter/bog) "dVP" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/twig/platform, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -6068,7 +6068,7 @@ name = "far stonehedge" }) "eCw" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/indoors/shelter/bog) "eCy" = ( @@ -9121,7 +9121,7 @@ /obj/machinery/light/rogue/lanternpost{ dir = 1 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null @@ -9143,7 +9143,7 @@ }) "hau" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -10466,7 +10466,7 @@ /obj/machinery/light/rogue/torchholder{ dir = 4 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -14107,7 +14107,7 @@ name = "Silver Dragon" }) "kOv" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -14533,7 +14533,7 @@ name = "far stonehedge" }) "lfB" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -15076,7 +15076,7 @@ first_time_text = "Stonehedge" }) "lCr" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -15617,7 +15617,7 @@ pixel_x = 2; pixel_y = 7 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -16688,7 +16688,7 @@ /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) "mOd" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -17682,7 +17682,7 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "nBi" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -18336,7 +18336,7 @@ pixel_x = 2; pixel_y = 7 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/twig, /area/rogue/outdoors/river) "nYV" = ( @@ -20153,7 +20153,7 @@ pixel_x = 1; pixel_y = 7 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/twig/platform, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -20287,7 +20287,7 @@ name = "Silver Dragon" }) "pIz" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -21431,7 +21431,7 @@ /obj/machinery/light/rogue/torchholder{ dir = 4 }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/tavern{ first_time_text = "The Sylver Dragonne.."; @@ -24182,7 +24182,7 @@ first_time_text = "The Twilight Woods" }) "sCW" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -26565,7 +26565,7 @@ name = "Shores of the Emerald Coast" }) "usY" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -27916,7 +27916,7 @@ /area/rogue/outdoors/river) "vwj" = ( /obj/structure/flora/roguegrass, -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -29070,7 +29070,7 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) "wxI" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -30637,7 +30637,7 @@ }) "xKH" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" diff --git a/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm index 8b52926de1f..15258737321 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm @@ -41,8 +41,12 @@ /datum/sex_action/npc_anal_ride_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_anal_ride_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm index 595b5269610..36c014221e9 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm @@ -37,8 +37,12 @@ /datum/sex_action/npc_anal_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_anal_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm b/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm index c5ff5633e52..d1c26217587 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm @@ -27,8 +27,12 @@ /datum/sex_action/npc_cunnilingus/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] stops licking [target]'s cunt ...")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_cunnilingus/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm b/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm index 447fb3b51d6..983772b4827 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm @@ -31,8 +31,12 @@ /datum/sex_action/npc_facesitting/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target]'s face.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_facesitting/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_rimming.dm b/code/datums/sexcon/sex_actions/npc/npc_rimming.dm index c1c9371432b..91f7bd2bff0 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_rimming.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_rimming.dm @@ -25,8 +25,12 @@ /datum/sex_action/npc_rimming/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] stops rimming [target]'s butt ...")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_rimming/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm index 9a51fd862ac..4e18972bd29 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm @@ -35,8 +35,12 @@ /datum/sex_action/npc_throat_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] pulls their cock out of [target]'s throat.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_throat_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm index 438e2a73b19..b0871c07c71 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm @@ -41,8 +41,12 @@ /datum/sex_action/npc_vaginal_ride_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_vaginal_ride_sex/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm index 45b266e1940..59350671c0c 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm @@ -18,6 +18,8 @@ /datum/sex_action/npc_vaginal_sex/on_perform(mob/living/user, mob/living/target) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt.")) + + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(user.sexcon.check_active_ejaculation()) @@ -36,8 +38,12 @@ /datum/sex_action/npc_vaginal_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] pulls his cock out of [target]'s cunt.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_vaginal_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index 54fd413a53b..4186ff720ff 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -238,6 +238,7 @@ var/cum_to_take = CLAMP((testes.reagents.maximum_volume/2), 1, testes.reagents.total_volume) testes.reagents.remove_reagent(testes.reagent_to_make, cum_to_take) user.add_stress(/datum/stressevent/cumok) + after_ejaculation() return if(!issimple(target) && testes) if(oral) @@ -909,7 +910,7 @@ /datum/sex_controller/proc/try_pelvis_crush(mob/living/carbon/human/target) if(istype(user.rmb_intent, /datum/rmb_intent/strong)) if(!target.has_wound(/datum/wound/fracture/groin)) - if(prob(10)){ + if(prob(5)){ var/obj/item/bodypart/groin = target.get_bodypart(check_zone(BODY_ZONE_PRECISE_GROIN)) groin.add_wound(/datum/wound/fracture) } diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 9a7d87f516b..94d6b4f1803 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -353,6 +353,9 @@ var/initialball var/initialbreasts +/datum/status_effect/debuff/bigboobs/permanent + duration = -1 //used for quirk + /atom/movable/screen/alert/status_effect/debuff/bigboobs name = "Enchanted Endowment" //was gonna name it a curse but it isn't a technically one. desc = "They feel as heavy as gold and are massive... My back hurts." diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 5f1e986a7f3..ffc3433a306 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -59,7 +59,7 @@ if(isliving(user) && W && user.z == z) if(W.flags_1 & CONDUCT_1) var/mob/living/L = user - if(L.electrocute_act(5, src)) // The kneestingers will let you pass if you worship dendor, but they won't take your stupid ass hitting them. + if(L.electrocute_act(15, src)) // The kneestingers will let you pass if you worship dendor, but they won't take your stupid ass hitting them. L.emote("painscream") L.consider_ambush() if(L.throwing) @@ -140,13 +140,12 @@ qdel(src) /obj/structure/safeglowshroom/Destroy() - var/datum/reagents/R = new/datum/reagents(30) + var/datum/reagents/R = new/datum/reagents(25) R.my_atom = src - R.add_reagent(/datum/reagent/berrypoison, 30) + R.add_reagent(/datum/reagent/berrypoison, 25) var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 5, get_turf(src), FALSE) + smoke.set_up(R, 6, get_turf(src), FALSE) smoke.start() - explosion(loc, 1, 1, 1, 0, 0) //and gas release ig . = ..() //used by stupid spell diff --git a/code/game/objects/items/rogueweapons/melee/special.dm b/code/game/objects/items/rogueweapons/melee/special.dm index b02339efacf..f9379e61df9 100644 --- a/code/game/objects/items/rogueweapons/melee/special.dm +++ b/code/game/objects/items/rogueweapons/melee/special.dm @@ -225,7 +225,7 @@ wbalance = 0 minstr = 5 wdefense = 0 - charge = 1000 + charge = 300 on = FALSE /obj/item/rogueweapon/mace/stunmace/hedgeknight/pickup(mob/user) @@ -233,20 +233,19 @@ var/mob/living/carbon/human/H = user if(!HAS_TRAIT(H, TRAIT_SHOCKIMMUNE) || HAS_TRAIT(H, TRAIT_RAVOX_CURSE)) to_chat(H, span_danger("As you grasp the hedgeknight mace, you touch its kneestingers and feel a powerful and excruciating shock radiate through your body!")) - H.electrocute_act(30, src) - H.Paralyze(10 SECONDS, ignore_canstun = TRUE) + H.electrocute_act(15, src) //nobody likes this, its been proven at tgmc but i guess its too late now /obj/item/rogueweapon/mace/stunmace/hedgeknight/process() var/mob/living/user = loc if(istype(user)) if(!HAS_TRAIT(user, TRAIT_SHOCKIMMUNE) || HAS_TRAIT(user, TRAIT_RAVOX_CURSE)) to_chat(user, span_danger("As you grasp the hedgeknight mace, you touch its kneestingers and feel a powerful and excruciating shock radiate through your body!")) - user.Paralyze(10 SECONDS, ignore_canstun = TRUE) + user.electrocute_act(15, src) if(on) charge-- else - if(charge < 1000) - charge += 25 + if(charge < 300) + charge += 10 if(charge <= 0) on = FALSE charge = 0 diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm index 3772d3f19d7..168f7eb6ca8 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm @@ -23,20 +23,20 @@ . = ..() if(ishuman(L)) var/mob/living/carbon/human/H = L - if(istype(H.cloak, /obj/item/clothing/cloak/stabard/bog)) + if(istype(H.cloak, /obj/item/clothing/cloak/templar/dendor)) var/obj/item/clothing/S = H.cloak var/index = findtext(H.real_name, " ") if(index) index = copytext(H.real_name, 1,index) if(!index) index = H.real_name - S.name = "bogman tabard ([index])" + S.name = "Hedgeknight tabard ([index])" /datum/outfit/job/roguetown/bogguardsman/pre_equip(mob/living/carbon/human/H) . = ..() head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet armor = /obj/item/clothing/suit/roguetown/armor/plate/half/foresterarmor - cloak = /obj/item/clothing/cloak/raincloak/green + cloak = /obj/item/clothing/cloak/templar/dendor neck = /obj/item/clothing/neck/roguetown/bervor gloves = /obj/item/clothing/gloves/roguetown/forestergauntlets wrists = /obj/item/clothing/wrists/roguetown/bracers @@ -48,23 +48,21 @@ beltr = /obj/item/rogueweapon/mace/stunmace/hedgeknight backr = /obj/item/storage/backpack/rogue/satchel backl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow - wrists = /obj/item/clothing/wrists/roguetown/bracers/leather id = /obj/item/scomstone backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver = 1, /obj/item/signal_horn = 1) if(H.mind) assign_skills(H) H.verbs |= /mob/proc/haltyell ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_DARKVISION, TRAIT_GENERIC) -/*Design philosophy: Protectors of Stonehedge, whose holy maces are the bane of any who violate the Guild's few laws. While they are not as physically strong as more conventional warriors, they are swift and their endurance is second to none.*/ +/*Design philosophy: Protectors of Stonehedge, whose holy maces are the bane of any who violate the Guild's few laws. +While they are not as physically strong as more conventional warriors, they are swift and their endurance is second to none.*/ /datum/outfit/job/roguetown/bogguardsman/proc/assign_skills(mob/living/carbon/human/H) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE) @@ -87,7 +85,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change. - H.change_stat("perception", 4) + H.change_stat("perception", 2) H.change_stat("constitution", 4) H.change_stat("endurance", 4) H.change_stat("speed", 2) diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm index 7df84357ae2..34cc8e882f2 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm @@ -25,20 +25,20 @@ . = ..() if(ishuman(L)) var/mob/living/carbon/human/H = L - if(istype(H.cloak, /obj/item/clothing/cloak/stabard/bog)) + if(istype(H.cloak, /obj/item/clothing/cloak/templar/dendor)) var/obj/item/clothing/S = H.cloak var/index = findtext(H.real_name, " ") if(index) index = copytext(H.real_name, 1,index) if(!index) index = H.real_name - S.name = "bog master tabard ([index])" + S.name = "Hedgemaster tabard ([index])" /datum/outfit/job/roguetown/bogmaster/pre_equip(mob/living/carbon/human/H) . = ..() - head = /obj/item/clothing/head/roguetown/helmet/leather + head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings pants = /obj/item/clothing/under/roguetown/chainlegs - cloak = /obj/item/clothing/cloak/raincloak/green + cloak = /obj/item/clothing/cloak/templar/dendor shirt = /obj/item/clothing/suit/roguetown/armor/chainmail armor = /obj/item/clothing/suit/roguetown/armor/plate/half neck = /obj/item/clothing/neck/roguetown/bervor @@ -66,25 +66,23 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change. H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3, TRUE) //Peasent levy, so some skill - H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, pick(1,2,2), TRUE) //Peasent levy, so some skill + H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, 2, TRUE) //Peasent levy, so some skill H.change_stat("constitution", 4) - H.change_stat("perception", 4) + H.change_stat("perception", 3) H.change_stat("endurance", 4) H.change_stat("speed", 2) H.dna.species.soundpack_m = new /datum/voicepack/male/knight() H.verbs |= /mob/proc/haltyell ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_DARKVISION, TRAIT_GENERIC) /obj/effect/proc_holder/spell/self/convertrole/bog name = "Recruit Hedgeknight" diff --git a/code/modules/mob/living/carbon/human/npc/_npc.dm b/code/modules/mob/living/carbon/human/npc/_npc.dm index 0bae2b419fd..c4d7e1c16c5 100644 --- a/code/modules/mob/living/carbon/human/npc/_npc.dm +++ b/code/modules/mob/living/carbon/human/npc/_npc.dm @@ -227,20 +227,20 @@ last_special = world.time + CLICK_CD_BREAKOUT cuff_resist(I) -/mob/living/carbon/human/proc/should_target(mob/living/L) +/mob/living/carbon/human/proc/should_target(mob/living/L, attack_lying = FALSE) if(!L) return FALSE //those are here for proc dependancy. - if(L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. + if(!attack_lying && L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. if(prob(4) && L.has_quirk(/datum/quirk/monsterhunter) && erpable) //tiny chance to trigger abuss. fuckcd = 0 return FALSE - var/mob/living/carbon/lcarbon = L - if(istype(lcarbon, /mob/living/carbon)) //leave alone if handcuffed. - if(lcarbon.handcuffed) - if(prob(8) && lcarbon.has_quirk(/datum/quirk/monsterhunter) && erpable) //small chance to trigger abuss. + if(ishuman(L)) //leave alone if handcuffed. + var/mob/living/carbon/human/lhuman = L + if(lhuman.handcuffed) + if(prob(8) && lhuman.has_quirk(/datum/quirk/monsterhunter) && erpable) //small chance to trigger abuss. fuckcd = 0 return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index b2c7ddf2792..98c1eb2580a 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -228,7 +228,7 @@ return chosen_target // Please do not add one-off mob AIs here, but override this function for your mob -/mob/living/simple_animal/hostile/CanAttack(atom/the_target, ignore_lying = TRUE)//Can we actually attack a possible target? +/mob/living/simple_animal/hostile/CanAttack(atom/the_target, attack_lying = FALSE)//Can we actually attack a possible target? if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids return FALSE @@ -239,12 +239,12 @@ if(M.name in friends) return FALSE - if(ignore_laying) //used for bosses etc. - ignore_lying = FALSE + if(attack_laying) //used for bosses etc. + attack_lying = TRUE if(ishuman(the_target)) var/mob/living/carbon/human/th = the_target - if(ignore_lying && th.lying && !th.get_active_held_item()) //if is laying and holding nothing, and not in cmode. Ignore. + if(!attack_lying && th.lying && !th.get_active_held_item()) //if is laying and holding nothing, and not in cmode. Ignore. if(prob(4) && th.has_quirk(/datum/quirk/monsterhunter) && erpable) //tiny chance to trigger abuss. fuckcd = 0 return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 19f62f5a11c..c7553b09d97 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -29,7 +29,7 @@ layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - ignore_laying = TRUE // rip them apart. + attack_laying = TRUE // rip them apart. var/list/crusher_loot var/achievement_type var/crusher_achievement_type diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 615122e8761..271f7f00a7d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -250,7 +250,7 @@ GLOBAL_VAR_INIT(farm_animals, FALSE) /mob/living/simple_animal/hostile var/retreating - var/ignore_laying = FALSE + var/attack_laying = FALSE /mob/living/simple_animal/hostile/updatehealth() ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3e89b032356..1cb983c0e67 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1378,3 +1378,17 @@ GLOBAL_VAR_INIT(mobids, 1) return FALSE else return TRUE + +/proc/find_match_in_list(list/list_A, list/list_B, exact_match) + var/list/match_list + if(!list_A || !list_B) + return + if(exact_match) + match_list = list_A&list_B //only items in both lists + var/length = LAZYLEN(match_list) + if(length) + return (length == LAZYLEN(list_A)) //if they're not the same len(gth) or we don't have a len, then this isn't an exact match. + else + match_list = list_A&list_B + return LAZYLEN(match_list) + return FALSE diff --git a/code/modules/surgery/bodyparts/bodypart_examine.dm b/code/modules/surgery/bodyparts/bodypart_examine.dm index 9ac652d4e09..33f4b9c7f08 100644 --- a/code/modules/surgery/bodyparts/bodypart_examine.dm +++ b/code/modules/surgery/bodyparts/bodypart_examine.dm @@ -127,25 +127,25 @@ salami = TRUE penisAdd = 1 var/mob/living/carbon/human/ownerussy = owner - if(ownerussy.has_penis() || salami) - var/obj/item/organ/penis/ownerussypenis = ownerussy.getorgan(/obj/item/organ/penis) + if(ownerussy.getorganslot(ORGAN_SLOT_PENIS) || salami) + var/obj/item/organ/penis/ownerussypenis = ownerussy.getorganslot(ORGAN_SLOT_PENIS) if (ownerussypenis) bodypart_status += "[ownerussy] has a [find_key_by_value(GLOB.uns_named_penis_sizes, ownerussypenis.organ_size+penisAdd)] penis." else bodypart_status += "[ownerussy] has a [find_key_by_value(GLOB.uns_named_penis_sizes, 1)] penis." - if(ownerussy.has_testicles()) - var/obj/item/organ/filling_organ/testicles/ownerussyballs = ownerussy.getorgan(/obj/item/organ/filling_organ/testicles) + if(ownerussy.getorganslot(ORGAN_SLOT_TESTICLES)) + var/obj/item/organ/filling_organ/testicles/ownerussyballs = ownerussy.getorganslot(ORGAN_SLOT_TESTICLES) bodypart_status += "[ownerussy] has [find_key_by_value(GLOB.uns_named_ball_sizes, ownerussyballs.organ_size)] testicles." - if(ownerussy.has_breasts()) - var/obj/item/organ/filling_organ/breasts/ownerussybreasts = ownerussy.getorgan(/obj/item/organ/filling_organ/breasts) + if(ownerussy.getorganslot(ORGAN_SLOT_BREASTS)) + var/obj/item/organ/filling_organ/breasts/ownerussybreasts = ownerussy.getorganslot(ORGAN_SLOT_BREASTS) bodypart_status += "[ownerussy] has [find_key_by_value(GLOB.uns_named_breast_sizes, ownerussybreasts.organ_size)] breasts." - if(ownerussy.has_belly()) - var/obj/item/organ/belly/ownerussybelly = ownerussy.getorgan(/obj/item/organ/belly) + if(ownerussy.getorganslot(ORGAN_SLOT_BELLY)) + var/obj/item/organ/belly/ownerussybelly = ownerussy.getorganslot(ORGAN_SLOT_BELLY) bodypart_status += "[ownerussy] has a [find_key_by_value(GLOB.named_belly_sizes, ownerussybelly.organ_size)] belly." - if(ownerussy.has_butt()) - var/obj/item/organ/butt/ownerussybutt = ownerussy.getorgan(/obj/item/organ/butt) + if(ownerussy.getorganslot(ORGAN_SLOT_BUTT)) + var/obj/item/organ/butt/ownerussybutt = ownerussy.getorganslot(ORGAN_SLOT_BUTT) bodypart_status += "[ownerussy] has a [find_key_by_value(GLOB.uns_named_butt_sizes, ownerussybutt.organ_size)] butt." - if(ownerussy.has_vagina()) + if(ownerussy.getorganslot(ORGAN_SLOT_VAGINA)) bodypart_status += "[ownerussy] has a vagina." return bodypart_status diff --git a/modular_hearthstone/code/game/objects/items/signal_horn.dm b/modular_hearthstone/code/game/objects/items/signal_horn.dm index 8bb19ce154f..bf2664295f1 100644 --- a/modular_hearthstone/code/game/objects/items/signal_horn.dm +++ b/modular_hearthstone/code/game/objects/items/signal_horn.dm @@ -15,7 +15,7 @@ /obj/item/signal_horn/proc/sound_horn(mob/living/user) user.visible_message(span_warning("[user] sounds the alarm!")) switch(user.job) - if("Bog Guard", "Bog Master") + if("Hedge Knight", "Hedgemaster") playsound(src, 'modular_hearthstone/sound/items/bogguardhorn.ogg', 100, TRUE) if("Town Sheriff", "Watchman") playsound(src, 'modular_hearthstone/sound/items/watchhorn.ogg', 100, TRUE) @@ -81,4 +81,4 @@ to_chat(player, span_warning("I hear the horn of the Royal Guard somewhere[disttext][dirtext]!")) else player.playsound_local(get_turf(player), 'modular_hearthstone/sound/items/signalhorn.ogg', 35, FALSE, pressure_affected = FALSE) - to_chat(player, span_warning("I hear the signal horn somewhere[disttext][dirtext]!")) \ No newline at end of file + to_chat(player, span_warning("I hear the signal horn somewhere[disttext][dirtext]!")) diff --git a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm index 77ecc306a4d..4769ad4a197 100644 --- a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm +++ b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/simple_skeleton.dm @@ -108,7 +108,7 @@ /mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry var/list/friendlyjobs = list("Guild Appraiser", "Guildmaster") -/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry/CanAttack(atom/the_target, ignore_lying) +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry/CanAttack(atom/the_target, attack_lying) if(ishuman(the_target)) var/mob/living/carbon/human/madafaka = the_target if(madafaka.job |= friendlyjobs) diff --git a/modular_helmsguard/code/game/objects/items/war_horn.dm b/modular_helmsguard/code/game/objects/items/war_horn.dm index 68d596a8bf0..b32f244ef2f 100644 --- a/modular_helmsguard/code/game/objects/items/war_horn.dm +++ b/modular_helmsguard/code/game/objects/items/war_horn.dm @@ -31,6 +31,9 @@ farholdsound = 'modular_helmsguard/sound/items/horns/h_hold_distant.ogg' farchargesound = 'modular_helmsguard/sound/items/horns/h_charge_distant.ogg' +/obj/item/war_horn/human/elf + name = "elven war horn" + /obj/item/war_horn/orc name = "Orcish war horn" icon_state = "orchorn" diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 9cd008d54d3..c28f43ecbba 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -594,4 +594,4 @@ /datum/quirk/endowed/on_spawn() var/mob/living/carbon/human/H = quirk_holder - ADD_TRAIT(H, TRAIT_ENDOWMENT, QUIRK_TRAIT) + H.apply_status_effect(/datum/status_effect/debuff/bigboobs/permanent) diff --git a/modular_stonehedge/code/lewdai/lewdai.dm b/modular_stonehedge/code/lewdai/lewdai.dm index 1f7b4b54e8c..385e717f0fc 100644 --- a/modular_stonehedge/code/lewdai/lewdai.dm +++ b/modular_stonehedge/code/lewdai/lewdai.dm @@ -49,7 +49,7 @@ for(var/mob/living/carbon/human/fucktarg in around) if(!src.aggressive && fucktarg.cmode) //skip if the target has cmode on and the mob is not aggressive. continue - if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && CanAttack(fucktarg, FALSE)) + if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && CanAttack(fucktarg, TRUE)) chasesfuck = TRUE if(src.gender == MALE) src.visible_message(span_boldwarning("[src] has his eyes on [fucktarg], cock throbbing!")) @@ -108,13 +108,15 @@ L.SetKnockdown(60) if(!L.lying) L.emote("gasp") - if(!L.cmode && L.wear_pants) //pants off if not in cmode - src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) - var/obj/item/clothing/thepants = L.wear_pants - L.dropItemToGround(thepants) - thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) - else if(L.cmode && L.wear_pants) - src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) + if(L.wear_pants) + if(L.wear_pants.flags_inv & HIDECROTCH && !L.wear_pants.genitalaccess) + if(!L.cmode) //pants off if not in cmode + src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) + var/obj/item/clothing/thepants = L.wear_pants + L.dropItemToGround(thepants) + thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) + else if(L.cmode) + src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) enemies = list() target = null approaching_target = FALSE @@ -137,19 +139,19 @@ log_admin("[src] is trying to init sex on [L]") var/current_action = /datum/sex_action/npc_rimming if(src.gender == FEMALE && L.gender == MALE) - switch(rand(2)) + switch(rand(1,2)) if(2) //anal current_action = /datum/sex_action/npc_anal_ride_sex if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_ride_sex if(src.gender == MALE && L.gender == MALE) - switch(rand(2)) + switch(rand(1,2)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal current_action = /datum/sex_action/npc_anal_sex if(src.gender == MALE && L.gender == FEMALE) - switch(rand(3)) + switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal @@ -157,7 +159,7 @@ if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_sex if(src.gender == FEMALE && L.gender == FEMALE) - switch(rand(3)) + switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_facesitting if(2) //anal @@ -232,7 +234,7 @@ for(var/mob/living/carbon/human/fucktarg in around) if(!src.aggressive && fucktarg.cmode) //skip if the target has cmode on and the mob is not aggressive. continue - if(fucktarg.has_quirk(/datum/quirk/monsterhunter)) //normally checks !sexcon.beingfucked but carbon mobs arent directly on top of the mob to fuck so its probably fine to get ganged. + if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg, TRUE)) //normally checks !sexcon.beingfucked but carbon mobs arent directly on top of the mob to fuck so its probably fine to get ganged. chasesfuck = TRUE if(lewd_talk) if(src.gender == MALE) @@ -266,7 +268,7 @@ if(sexcon.current_action && fuckcd > 0) return for(var/mob/living/carbon/human/fucktarg in around) - if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg)) + if(fucktarg.has_quirk(/datum/quirk/monsterhunter)) foundfuckmeat += fucktarg L = fucktarg STOP_PROCESSING(SShumannpc,src) @@ -285,20 +287,23 @@ L.SetKnockdown(60) if(!L.lying) //i guess if already targeted but got up somehow. L.emote("gasp") - if(!L.cmode && L.wear_pants) //pants off if not in cmode - src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) - var/obj/item/clothing/thepants = L.wear_pants - L.dropItemToGround(thepants) - thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) - else if(L.cmode && L.wear_pants) - src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) + if(L.wear_pants) + if(L.wear_pants.flags_inv & HIDECROTCH && !L.wear_pants.genitalaccess) + if(!L.cmode) //pants off if not in cmode + src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) + var/obj/item/clothing/thepants = L.wear_pants + L.dropItemToGround(thepants) + thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) + else if(L.cmode) + src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) if(aggressive) sexcon.force = SEX_FORCE_MAX else sexcon.force = SEX_FORCE_MID if(!Adjacent(L)) //are we at the same tile? walk2derpless(Adjacent(L)) //get next to them since it looks like shit tweaks out. - start_pulling(L) + if(!pulling) + start_pulling(L) src.visible_message(span_danger("[src] starts to breed [L]!")) if(sexcon.force == SEX_FORCE_MAX) src.visible_message(span_danger("[src] pins [L] down for a savage fucking!")) @@ -310,19 +315,19 @@ log_admin("[src] is trying to init sex on [L]") var/current_action = /datum/sex_action/npc_rimming if(src.gender == FEMALE && L.gender == MALE) - switch(rand(2)) + switch(rand(1,2)) if(1) //anal current_action = /datum/sex_action/npc_anal_ride_sex if(2) //vaginal current_action = /datum/sex_action/npc_vaginal_ride_sex if(src.gender == MALE && L.gender == MALE) - switch(rand(2)) + switch(rand(1,2)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal current_action = /datum/sex_action/npc_anal_sex if(src.gender == MALE && L.gender == FEMALE) - switch(rand(3)) + switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal @@ -330,7 +335,7 @@ if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_sex if(src.gender == FEMALE && L.gender == FEMALE) - switch(rand(3)) + switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_facesitting if(2) //anal diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 0a645687e90..7ed0f86c80e 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -1,8 +1,7 @@ //By Vide Noir https://github.com/EaglePhntm. //templated on hearthstone sea raiders. -/mob/living/carbon/human/species/human/friendlynpc - aggressive=1 +/mob/living/carbon/human/species/human/smartnpc race = /datum/species/elf/wood mode = AI_IDLE faction = list("Station") @@ -12,30 +11,53 @@ possible_rmb_intents = list() erpable = TRUE wander = TRUE + d_intent = INTENT_DODGE show_genitals = TRUE var/list/friendlyfactions = list("Station", "neutral", "rogueanimal", "saiga", "chickens", "goats", "cows", "turtles", "rats", "crabs", "horse") + //using friendlyjobs will make this mob hostile to everyone not of those jobs, unless they are in friendlyfactions. var/list/friendlyjobs //quotes from skyrim cause we love skyrim. var/list/calmmessages = list() var/list/aggromessages = list() var/mob/living/lasthitter = null + var/punish_attacking = FALSE //would be great if we could make them follow stone roads while idle. -/mob/living/carbon/human/species/human/friendlynpc/should_target(mob/living/L) +/mob/living/carbon/human/species/human/smartnpc/should_target(mob/living/L) + if(!L) + return FALSE + if(L == src) return FALSE + + if(HAS_TRAIT(src, TRAIT_PACIFISM)) + return FALSE + + if(!is_in_zweb(src.z,L.z)) + return FALSE + + if(L.alpha <= 100) //if mostly invisible dont see it, surely this wont go wrong. + return FALSE + + if(L.InFullCritical()) + return FALSE + + if(L.name in friends) + return FALSE + if(L.stat != CONSCIOUS) return FALSE + if(L.lying && !L.get_active_held_item()) if(ishuman(L)) var/mob/living/carbon/human/badboi = L if(badboi == lasthitter && Adjacent(badboi) && !badboi.handcuffed) //untested but yeah. say("I got you now, criminal scum.") - scom_announce("I caught the criminal scum [badboi.real_name] at [get_area(src)].") + scom_announce("I caught the criminal scum [badboi.real_name] at [get_area_name(get_area(src))].") var/obj/item/rope/ropey = new /obj/item/rope ropey.apply_cuffs(badboi, src) - start_pulling(badboi) + start_pulling(badboi, GRAB_AGGRESSIVE) return FALSE if(L == lasthitter && L.alpha > 100) return TRUE @@ -44,17 +66,27 @@ if(madafaka.Adjacent(src) && mode != AI_HUNT && madafaka.mind && madafaka.alpha > 100) if(prob(10)) face_atom(madafaka) - emote(pick("turns to [madafaka].", "faces [madafaka].")) + visible_message(span_emote(pick("[src] turns to [madafaka].", "[src] faces [madafaka]."))) say(pick(calmmessages)) if(friendlyfactions) - if(madafaka.faction |= friendlyfactions && target != lasthitter) + var/list/madafaction = madafaka.faction + if(find_match_in_list(madafaction, friendlyfactions) && lasthitter != target) return FALSE + else + return TRUE if(friendlyjobs) - if(madafaka.job |= friendlyjobs && target != lasthitter) + var/list/madajob = madafaka.job + if((madajob in friendlyjobs) && lasthitter != target) return FALSE - . = ..() + else + return TRUE -/mob/living/carbon/human/species/human/friendlynpc/MobBump(mob/M) + if(enemies[L]) + return TRUE + + return FALSE + +/mob/living/carbon/human/species/human/smartnpc/MobBump(mob/M) if(ishuman(M)) var/mob/living/carbon/human/L = M if(lasthitter == L) @@ -64,12 +96,12 @@ retaliate(L) else face_atom(L) - emote(pick("turns to [L].", "faces [L].")) + visible_message(span_emote(pick("[src] turns to [L].", "[src] faces [L]."))) if(prob(10)) say(pick(calmmessages)) . = ..() -/mob/living/carbon/human/species/human/friendlynpc/townguard +/mob/living/carbon/human/species/human/smartnpc/townguard friendlyfactions = list("Station", "neutral") calmmessages = list( "Let me guess... someone stole your sweetroll.", @@ -108,9 +140,40 @@ var/patrol = TRUE var/lastpatroltime + +// Custom idle behavior +/mob/living/carbon/human/species/human/smartnpc/townguard/npc_idle() + if(patrol) + if(world.time < next_idle + rand(30,50)) + return + next_idle = world.time + rand(30,50) + if(mode != AI_OFF) + if(prob(50)) + var/turf/target_loc = find_suitable_location() + if(target_loc) + walk2derpless(target_loc) + else + . = ..() + + +// Find a suitable location to move to +/mob/living/carbon/human/species/human/smartnpc/townguard/proc/find_suitable_location() + var/list/suitable_locations = list() + + // Collect all nearby stone road tiles + for(var/turf/T in world) + if((!istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/floor/rogue/dirt) && !istype(T, /turf/open/floor/rogue/grass) && !istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/lava) && !istype(T, /turf/open/lava/acid)) && get_dist(src, T) < 12) // Adjust distance as needed + suitable_locations += T + + // Randomly select one of the suitable locations + if(suitable_locations.len) + return pick(suitable_locations) + + return null + //this does not work for some reason unfortunately /* -/mob/living/carbon/human/species/human/friendlynpc/townguard/npc_idle() +/mob/living/carbon/human/species/human/smartnpc/townguard/npc_idle() . = ..() //im not smart enough to make a good patrol system but here. if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && patrol) @@ -134,31 +197,65 @@ name = "patrol-point" */ -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute +/mob/living/carbon/human/species/human/smartnpc/townguard/brute -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute/after_creation() - equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute) +/mob/living/carbon/human/species/human/smartnpc/townguard/brute/after_creation() + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/brute) -/mob/living/carbon/human/species/human/friendlynpc/townguard/retaliate(mob/living/L) +/mob/living/carbon/human/species/human/smartnpc/townguard/retaliate(mob/living/L) var/newtarg = target + if(L.job in list("Hedgeknight", "Hedgemaster")) + return + if(lasthitter != target) + say(pick(aggromessages)) lasthitter = target .=..() if(target) - aggressive=1 - wander = TRUE if(target == newtarg) - say(pick(aggromessages)) linepoint(target) + if(ishuman(target) && Adjacent(target)) + //i really REALLY want to punish players who try to strip those guys for loot, also they can do those badass moves on goblins too ig. + if(prob(20) && !target.IsOffBalanced()) + say(pick("Aha!", "Parry this!", "Ha-haa!")) + visible_message(span_emote("[src] feints an attack at [target]!")) + target.OffBalance(50) //since they cant defeat the parries might aswell give them a fat feint. + else if(prob(10)) + say(pick("Sit the fuck down.", "Fuck away from me.", "Stay down.")) + visible_message(span_emote("[src] bashes [target] away!")) + playsound(src,"punch_hard",100,TRUE) + target.Knockdown(25) //may end up getting you tied real fast. + target.throw_at(target, pick(2,3), 1, src, FALSE, TRUE) + else if(prob(5) && target.get_active_held_item()) + var/obj/item/activeitem = target.get_active_held_item() + if(!HAS_TRAIT(activeitem, TRAIT_NODROP)) + say(pick("You are done.", "Ha! There goes your [activeitem.name]!", "You fucked up now!")) + visible_message(span_emote("[src] disarms [target]!")) + playsound(src,"bladedmedium",100,TRUE) + target.OffBalance(15) + target.throw_at(activeitem, get_step_away(activeitem, target, 3), 1, target, TRUE, FALSE) + if(punish_attacking) + var/bounty_exists = FALSE + for(var/datum/bounty/b in GLOB.head_bounties) + if(b.target == target.real_name) + bounty_exists = TRUE + if(!bounty_exists) + add_bounty(L.real_name, 500, FALSE, "Attacking a town guardsman.", "Town of Stonehedge") + var/bounty_announcement = "[target] is accused of attacking a town guardsman at [get_area_name(get_area(src))], wanted with a bounty of 500 mammons." + say("Stop right there, criminal scum!") + scom_announce(bounty_announcement) + to_chat(L, span_notice("I got a bounty on my head now!")) + else + scom_announce("the criminal [target] is reported attacking a townsguard at [get_area_name(get_area(src))].") -/mob/living/carbon/human/species/human/friendlynpc/townguard/Initialize() +/mob/living/carbon/human/species/human/smartnpc/townguard/Initialize() gender = pick(MALE,FEMALE) . = ..() spawn(10) after_creation() //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) -/mob/living/carbon/human/species/human/friendlynpc/townguard/after_creation() +/mob/living/carbon/human/species/human/smartnpc/townguard/after_creation() ..() job = "Town Guardsman" ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC) @@ -167,20 +264,20 @@ ADD_TRAIT(src, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard) + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/smartnpc/townguard) var/obj/item/organ/eyes/organ_eyes = getorgan(/obj/item/organ/eyes/night_vision/full_darksight) //elf eyes if(organ_eyes) organ_eyes.eye_color = pick("27becc", "35cc27", "000000") update_hair() update_body() -/mob/living/carbon/human/species/human/friendlynpc/townguard/handle_combat() +/mob/living/carbon/human/species/human/smartnpc/townguard/handle_combat() if(mode == AI_HUNT) if(prob(10)) emote("rage") . = ..() -/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/pre_equip(mob/living/carbon/human/H) if(prob(50)) wrists = /obj/item/clothing/wrists/roguetown/bracers cloak = /obj/item/clothing/cloak/templar/dendor @@ -192,10 +289,11 @@ pants = /obj/item/clothing/under/roguetown/tights head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet H.STASPD = 8 - H.STACON = 4 + H.STAPER = 10 + H.STACON = 14 H.STAEND = 15 - H.STAINT = 5 - H.STASTR = rand(11,16) + H.STAINT = 12 + H.STASTR = rand(13,16) if(prob(50)) r_hand = /obj/item/rogueweapon/sword else @@ -214,7 +312,7 @@ H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) H.real_name = H.name -/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/brute/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/brute/pre_equip(mob/living/carbon/human/H) wrists = /obj/item/clothing/wrists/roguetown/bracers cloak = /obj/item/clothing/cloak/templar/dendor armor = /obj/item/clothing/suit/roguetown/armor/plate/half @@ -225,10 +323,11 @@ mask = /obj/item/clothing/mask/rogue/facemask gloves = /obj/item/clothing/gloves/roguetown/chain H.STASPD = 9 - H.STACON = 8 - H.STAEND = 15 - H.STAINT = 5 - H.STASTR = rand(15,18) + H.STAPER = 10 + H.STACON = 16 + H.STAEND = 16 + H.STAINT = 14 + H.STASTR = rand(14,16) if(prob(50)) r_hand = /obj/item/rogueweapon/halberd/bardiche else @@ -242,14 +341,26 @@ H.name = pick( world.file2list("strings/rt/names/elf/elfwf.txt") ) H.real_name = H.name -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry patrol = FALSE wander = FALSE + var/turf/spawned_loc -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry/after_creation() - equipOutfit(new /datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/sentry) +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry/Initialize() + . = ..() + spawned_loc = get_turf(src) + addtimer(CALLBACK(src, PROC_REF(return_to_post)), 5 MINUTES, TIMER_STOPPABLE) + +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry/proc/return_to_post() + if(src.loc != spawned_loc) + walk2derpless(spawned_loc) + wander = FALSE + addtimer(CALLBACK(src, PROC_REF(return_to_post)), 5 MINUTES, TIMER_STOPPABLE) -/datum/outfit/job/roguetown/human/species/human/friendlynpc/townguard/sentry/pre_equip(mob/living/carbon/human/H) +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry/after_creation() + equipOutfit(new /datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/sentry) + +/datum/outfit/job/roguetown/human/species/human/smartnpc/townguard/sentry/pre_equip(mob/living/carbon/human/H) wrists = /obj/item/clothing/wrists/roguetown/bracers cloak = /obj/item/clothing/cloak/templar/dendor armor = /obj/item/clothing/suit/roguetown/armor/plate/half @@ -260,10 +371,11 @@ mask = /obj/item/clothing/mask/rogue/facemask gloves = /obj/item/clothing/gloves/roguetown/chain H.STASPD = 9 - H.STACON = 8 - H.STAEND = 15 - H.STAINT = 5 - H.STASTR = rand(15,18) + H.STAPER = 10 + H.STACON = 16 + H.STAEND = 16 + H.STAINT = 14 + H.STASTR = rand(14,16) r_hand = /obj/item/rogueweapon/halberd shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron neck = /obj/item/clothing/neck/roguetown/chaincoif From f4dddc2d86d8ab1efca353b892541231871f990c Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 04:27:06 +0300 Subject: [PATCH 073/192] factioning wildshape for druid abusers --- code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm | 1 + .../mob/living/simple_animal/rogue/creacher/honeyspider.dm | 2 ++ code/modules/mob/living/simple_animal/rogue/creacher/mole.dm | 1 + code/modules/mob/living/simple_animal/rogue/creacher/volf.dm | 1 + code/modules/mob/living/simple_animal/rogue/game/saiga.dm | 1 + code/modules/spells/spell_types/shapeshift.dm | 1 + 6 files changed, 7 insertions(+) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm b/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm index d333616da21..d19074cb20a 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm @@ -182,6 +182,7 @@ return ..() /mob/living/simple_animal/hostile/retaliate/rogue/bigrat/shapeshift + faction = list("rats", "Station") health = 200 maxHealth = 200 erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm b/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm index 7a8bb7a19d1..50b56d52f79 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm @@ -169,6 +169,8 @@ deaggroprob = 30 /mob/living/simple_animal/hostile/retaliate/rogue/spider/shapeshift + + faction = list("spiders", "Station") health = 150 maxHealth = 150 erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/mole.dm b/code/modules/mob/living/simple_animal/rogue/creacher/mole.dm index fc508233887..2a2b8e2227f 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/mole.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/mole.dm @@ -131,4 +131,5 @@ return ..() /mob/living/simple_animal/hostile/retaliate/rogue/mole/shapeshift + faction = list("wolfs", "Station") erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/volf.dm b/code/modules/mob/living/simple_animal/rogue/creacher/volf.dm index 181bbc2154d..c63f6edf6a5 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/volf.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/volf.dm @@ -141,6 +141,7 @@ return ..() /mob/living/simple_animal/hostile/retaliate/rogue/wolf/shapeshift + faction = list("wolfs", "Station") health = 200 maxHealth = 200 erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/game/saiga.dm b/code/modules/mob/living/simple_animal/rogue/game/saiga.dm index ed4765f5eb9..d9886bc7c66 100644 --- a/code/modules/mob/living/simple_animal/rogue/game/saiga.dm +++ b/code/modules/mob/living/simple_animal/rogue/game/saiga.dm @@ -356,6 +356,7 @@ update_icon() /mob/living/simple_animal/hostile/retaliate/rogue/saiga/shapeshift + faction = list("saiga", "Station") health = 200 maxHealth = 200 erpable = TRUE diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index d5829b076d0..452bd09e3dd 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -67,6 +67,7 @@ var/mob/living/shape = new shapeshift_type(caster.loc) H = new(shape,src,caster) + shape.gender = H.gender clothes_req = FALSE human_req = FALSE From 434203046d1c0e7fb2795e652f2897513116e586 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 04:30:15 +0300 Subject: [PATCH 074/192] Update glowshroom.dm --- code/game/objects/effects/glowshroom.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index ffc3433a306..e1c9ed9537b 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -4,7 +4,7 @@ name = "kneestingers" desc = "" anchored = TRUE - max_integrity = 10 + max_integrity = 1 //its a stupid mushroom opacity = 0 density = FALSE icon = 'icons/roguetown/misc/foliage.dmi' From 48ba9a85518d12269afb3b509e2513d18cb061d7 Mon Sep 17 00:00:00 2001 From: Sutures <101909198+noelle-lavenza@users.noreply.github.com> Date: Thu, 28 Nov 2024 05:54:10 -0500 Subject: [PATCH 075/192] [TESTMERGE ME] Ports nearly every fix I've made to Azure Peak (#132) * Fix screen alerts causing GC fails * Fix GLOB causing GC fails * Fix missing init hints * Give profiler permissions to admins * Adjust smoothing subsystem * Remove tity * Fix warning in migrant wave code * Optimize map generators * Remove shuffles from Roguetown subsystems * Remove delay from conveyor processing * Enable stamina/fatigue regen for AI mobs * Make sleeping status effect slightly less expensive * Optimise inhand generation * Adjust conveyor optimisations * Add waitfor = FALSE to DeadLife * Stop idle AI mobs from falling asleep * Make onprop a lazylist * Fix more onprop lazylist runtimes * Fixes runtime from mobs in nullspace * Fix runtime in NPC pool subsystem * Remove the last amt2run 'optimisation' * Port TG multiz optimisations * Fix ghosts not being able to hear multiz sounds * Fix latejoin characters ignoring anonymised status * Attempt to speed up soundloopers subsystem * Fix count cleanup when HandleQueue is tick-checked * Fix security level runtime every fucking round on local * Fix runtimes in icon code * Fix town guards causing extreme lag * Fix adventurer landmarks causing harddels * Fix simple rot component causing harddels shes rotting you nkow * Attempt to fix town guard patrol system * Fix town guards not retaliating when attacked --- _maps/deepnorth.json | 2 +- _maps/dreamhold.json | 2 +- _maps/elfkeep.json | 2 +- _maps/map_files/otherz/ashlands.json | 2 +- _maps/map_files/otherz/bog.json | 2 +- _maps/map_files/otherz/forest.json | 2 +- _maps/map_files/otherz/old/otherz.json | 2 +- _maps/map_files/otherz/rogueworld.json | 2 +- _maps/map_files/otherz/smallforest.json | 2 +- _maps/oldtown.json | 2 +- _maps/rockhill.json | 2 +- _maps/roguetown.json | 2 +- _maps/roguetown2.json | 2 +- _maps/roguewar.json | 2 +- _maps/rogueworld.json | 2 +- code/__DEFINES/mapping.dm | 6 ++ code/__DEFINES/maps.dm | 2 +- code/__DEFINES/multiz.dm | 4 + code/__DEFINES/subsystems.dm | 4 +- code/_onclick/hud/alert.dm | 2 +- code/controllers/globals.dm | 6 +- code/controllers/subsystem/fire_burning.dm | 2 +- code/controllers/subsystem/garbage.dm | 8 +- code/controllers/subsystem/icon_smooth.dm | 14 ++- code/controllers/subsystem/mapping.dm | 48 +++++++++- code/controllers/subsystem/migrants.dm | 3 +- code/controllers/subsystem/mobs.dm | 22 +---- code/controllers/subsystem/npcpool.dm | 28 +++--- .../subsystem/rogue/damoverlays.dm | 13 +-- .../subsystem/rogue/soundloopers.dm | 34 ++++---- code/controllers/subsystem/rogue/todchange.dm | 19 ++-- code/datums/components/rotting.dm | 8 +- code/datums/mutations/antenna.dm | 2 +- code/datums/status_effects/debuffs.dm | 2 +- code/datums/status_effects/status_effect.dm | 5 ++ code/game/atoms.dm | 45 +++++----- code/game/objects/effects/landmarks.dm | 25 +++--- code/game/objects/inhands_rogue.dm | 63 ++++++++------ code/game/objects/items/rogueitems/gems.dm | 2 +- code/game/objects/items/stacks/medical.dm | 2 +- .../structures/beds_chairs/roguechair.dm | 2 +- code/game/objects/structures/flora.dm | 2 +- code/game/objects/structures/fluff.dm | 4 +- code/game/objects/structures/ladders.dm | 4 +- code/game/objects/structures/mineral_doors.dm | 4 +- .../structures/roguetown/rogueflora.dm | 6 +- code/game/objects/structures/stairs.dm | 2 +- code/game/objects/structures/walldeco.dm | 2 +- code/game/sound.dm | 23 ++--- code/game/turfs/closed/transparent.dm | 4 +- code/game/turfs/open/chasm.dm | 2 +- code/game/turfs/open/floor/roguefloor.dm | 2 +- code/game/turfs/open/transparent.dm | 2 +- code/game/turfs/turf.dm | 8 +- code/modules/admin/admin_ranks.dm | 3 + code/modules/admin/holder2.dm | 2 + .../roguetown/villain/lich/phylactery.dm | 2 +- .../roguetown/villain/vampirelord.dm | 4 +- .../antagonists/slaughter/slaughter.dm | 2 +- code/modules/atmospherics/multiz.dm | 4 +- code/modules/awaymissions/capture_the_flag.dm | 2 +- .../awaymissions/mission_code/Cabin.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 2 +- code/modules/clothing/rogueclothes/cloaks.dm | 18 ++-- code/modules/clothing/rogueclothes/quiver.dm | 8 +- code/modules/clothing/rogueclothes/shirts.dm | 4 +- code/modules/flufftext/Hallucination.dm | 2 +- code/modules/mapping/ruins.dm | 4 +- .../space_management/multiz_helpers.dm | 59 +++++++------ .../mapping/space_management/traits.dm | 10 +-- .../modules/mob/dead/new_player/new_player.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 87 +++++++++---------- .../mob/living/carbon/human/update_icons.dm | 24 ++--- .../modules/mob/living/carbon/update_icons.dm | 4 +- code/modules/mob/living/life.dm | 6 +- .../hostile/megafauna/bubblegum.dm | 2 +- .../hostile/mining_mobs/elites/herald.dm | 2 +- .../hostile/roguetown/werewolf/werewolf.dm | 2 +- .../simple_animal/rogue/creacher/bigrat.dm | 2 +- .../rogue/creacher/honeyspider.dm | 2 +- .../living/simple_animal/rogue/farm/goat.dm | 4 +- .../simple_animal/rogue/rogueanimals.dm | 7 +- code/modules/power/multiz.dm | 4 +- .../procedural_mapping/mapGeneratorModule.dm | 27 +++--- .../chemistry/reagents/drug_reagents.dm | 2 +- code/modules/recycling/conveyor2.dm | 23 +++-- code/modules/recycling/disposal/multiz.dm | 4 +- code/modules/roguetown/roguemachine/throne.dm | 2 +- .../security_levels/security_levels.dm | 10 +-- code/modules/surgery/bodyparts/_bodyparts.dm | 2 +- code/modules/underworld/underworld.dm | 4 +- .../simple_animal/rogue/friendly_npc.dm | 71 ++++++++++----- roguetown.dme | 2 + 93 files changed, 472 insertions(+), 417 deletions(-) create mode 100644 code/__DEFINES/mapping.dm create mode 100644 code/__DEFINES/multiz.dm diff --git a/_maps/deepnorth.json b/_maps/deepnorth.json index 90eb4041f72..e827f08cccd 100644 --- a/_maps/deepnorth.json +++ b/_maps/deepnorth.json @@ -2,5 +2,5 @@ "map_name": "deepnorth", "map_path": "map_files/hearthstone", "map_file": "deepnorth.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/dreamhold.json b/_maps/dreamhold.json index bfadd7ad705..93e00d0b4d1 100644 --- a/_maps/dreamhold.json +++ b/_maps/dreamhold.json @@ -2,7 +2,7 @@ "map_name": "Dreamhold", "map_path": "map_files/dreamhold", "map_file": "Dreamhold.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/elfkeep.json b/_maps/elfkeep.json index 4ea6397051c..529bfc56185 100644 --- a/_maps/elfkeep.json +++ b/_maps/elfkeep.json @@ -2,7 +2,7 @@ "map_name": "Elfkeep", "map_path": "map_files/elfkeep", "map_file": "elfkeep.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/map_files/otherz/ashlands.json b/_maps/map_files/otherz/ashlands.json index 99d7a348e58..d6d25a1451f 100644 --- a/_maps/map_files/otherz/ashlands.json +++ b/_maps/map_files/otherz/ashlands.json @@ -2,5 +2,5 @@ "map_name": "ashlands", "map_path": "map_files/otherz", "map_file": "ashlands.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/bog.json b/_maps/map_files/otherz/bog.json index c14e3488212..ea3f633eec4 100644 --- a/_maps/map_files/otherz/bog.json +++ b/_maps/map_files/otherz/bog.json @@ -2,5 +2,5 @@ "map_name": "bog", "map_path": "map_files/otherz", "map_file": "bog.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/forest.json b/_maps/map_files/otherz/forest.json index d776ca05993..b1097f7823f 100644 --- a/_maps/map_files/otherz/forest.json +++ b/_maps/map_files/otherz/forest.json @@ -2,5 +2,5 @@ "map_name": "forest", "map_path": "map_files/otherz", "map_file": "forest.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/old/otherz.json b/_maps/map_files/otherz/old/otherz.json index 04241a53840..194efcae90b 100644 --- a/_maps/map_files/otherz/old/otherz.json +++ b/_maps/map_files/otherz/old/otherz.json @@ -2,5 +2,5 @@ "map_name": "Otherz", "map_path": "map_files/roguetown/otherz", "map_file": "otherz.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/rogueworld.json b/_maps/map_files/otherz/rogueworld.json index 9dfa4bfae1a..f1f75c0994e 100644 --- a/_maps/map_files/otherz/rogueworld.json +++ b/_maps/map_files/otherz/rogueworld.json @@ -2,5 +2,5 @@ "map_name": "rogueworld", "map_path": "map_files/otherz", "map_file": "rogueworld.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/smallforest.json b/_maps/map_files/otherz/smallforest.json index 6ca6150c9fe..1dc7b929601 100644 --- a/_maps/map_files/otherz/smallforest.json +++ b/_maps/map_files/otherz/smallforest.json @@ -2,5 +2,5 @@ "map_name": "smallforest", "map_path": "map_files/otherz", "map_file": "smallforest.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/oldtown.json b/_maps/oldtown.json index 35d926740dd..895f95690d4 100644 --- a/_maps/oldtown.json +++ b/_maps/oldtown.json @@ -2,7 +2,7 @@ "map_name": "Old Blackstone", "map_path": "map_files/oldtown", "map_file": "oldtown.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/rockhill.json b/_maps/rockhill.json index e68e01ed59c..1a0df035004 100644 --- a/_maps/rockhill.json +++ b/_maps/rockhill.json @@ -2,7 +2,7 @@ "map_name": "Rockhill", "map_path": "map_files/rockhill", "map_file": "rockhill.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/roguetown.json b/_maps/roguetown.json index 629f4304ba4..e115b7fed52 100644 --- a/_maps/roguetown.json +++ b/_maps/roguetown.json @@ -2,7 +2,7 @@ "map_name": "Roguetown", "map_path": "map_files/roguetown", "map_file": "roguetown.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/roguetown2.json b/_maps/roguetown2.json index 9d1c15e302d..0be4451ebbb 100644 --- a/_maps/roguetown2.json +++ b/_maps/roguetown2.json @@ -2,7 +2,7 @@ "map_name": "Roguetown 2", "map_path": "map_files/roguetown2", "map_file": "roguetown2.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/roguewar.json b/_maps/roguewar.json index 3a829e336b7..53ed11e0184 100644 --- a/_maps/roguewar.json +++ b/_maps/roguewar.json @@ -2,7 +2,7 @@ "map_name": "roguewar", "map_path": "map_files/roguewar", "map_file": "roguewar.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/rogueworld.json b/_maps/rogueworld.json index 11f857e15b8..3272a6c3ac1 100644 --- a/_maps/rogueworld.json +++ b/_maps/rogueworld.json @@ -2,7 +2,7 @@ "map_name": "Rogueworld", "map_path": "map_files/Rogueworld", "map_file": "Rogueworld.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/code/__DEFINES/mapping.dm b/code/__DEFINES/mapping.dm new file mode 100644 index 00000000000..3c08679e2a4 --- /dev/null +++ b/code/__DEFINES/mapping.dm @@ -0,0 +1,6 @@ +// Defines for SSmapping's multiz_levels +/// TRUE if we're ok with going up +#define Z_LEVEL_UP 1 +/// TRUE if we're ok with going down +#define Z_LEVEL_DOWN 2 +#define LARGEST_Z_LEVEL_INDEX Z_LEVEL_DOWN diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 9e446fbd48a..c33cb014973 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -44,7 +44,7 @@ require only minor tweaks. // number - default gravity if there's no gravity generators or area overrides present #define ZTRAIT_GRAVITY "Gravity" -// numeric offsets - e.g. {"Down": -1} means that chasms will fall to z - 1 rather than oblivion +// Whether this z level is linked up/down. Bool. #define ZTRAIT_UP "Up" #define ZTRAIT_DOWN "Down" diff --git a/code/__DEFINES/multiz.dm b/code/__DEFINES/multiz.dm new file mode 100644 index 00000000000..9d167495fa8 --- /dev/null +++ b/code/__DEFINES/multiz.dm @@ -0,0 +1,4 @@ +/// Attempt to get the turf below the provided one according to Z traits +#define GET_TURF_BELOW(turf) ((!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) +/// Attempt to get the turf above the provided one according to Z traits +#define GET_TURF_ABOVE(turf) ((!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2303dd47f12..6bd7abb34f9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -161,12 +161,12 @@ #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_SPACEDRIFT 30 #define FIRE_PRIORITY_FIELDS 30 -#define FIRE_PRIOTITY_SMOOTHING 35 +#define FIRE_PRIORITY_SMOOTHING 35 #define FIRE_PRIORITY_HUDS 40 #define FIRE_PRIORITY_NETWORKS 40 #define FIRE_PRIORITY_OBJ 40 #define FIRE_PRIORITY_ACID 40 -#define FIRE_PRIOTITY_BURNING 40 +#define FIRE_PRIORITY_BURNING 40 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_MOBS 100 diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 9b833189ac9..968ac19dcbf 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -689,8 +689,8 @@ so as to remain in compliance with the most up-to-date laws." return 1 /atom/movable/screen/alert/Destroy() - . = ..() severity = 0 master = null mob_viewer = null screen_loc = "" + return ..() diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index e39e5f210ff..24bdd186542 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -13,7 +13,11 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) GLOB = src var/datum/controller/exclude_these = new - gvars_datum_in_built_vars = exclude_these.vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) + // I know this is dumb but the nested vars list hangs a ref to the datum. This fixes that + // I have an issue report open, lummox has not responded. It might be a FeaTuRE + // Sooo we gotta be dumb + var/list/controller_vars = exclude_these.vars.Copy() + gvars_datum_in_built_vars = controller_vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) QDEL_IN(exclude_these, 0) //signal logging isn't ready log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm index bef9a767ef9..e71b4956d1c 100644 --- a/code/controllers/subsystem/fire_burning.dm +++ b/code/controllers/subsystem/fire_burning.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(fire_burning) name = "Fire Burning" - priority = FIRE_PRIOTITY_BURNING + priority = FIRE_PRIORITY_BURNING flags = SS_NO_INIT|SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 7a2d0d79fde..455302d78f2 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -146,7 +146,7 @@ SUBSYSTEM_DEF(garbage) if (length(L) < 2) count++ if (MC_TICK_CHECK) - return + break continue var/GCd_at_time = L[1] @@ -165,7 +165,7 @@ SUBSYSTEM_DEF(garbage) reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) - return + break continue // Something's still referring to the qdel'd object. @@ -202,13 +202,13 @@ SUBSYSTEM_DEF(garbage) if (GC_QUEUE_HARDDELETE) HardDelete(D) if (MC_TICK_CHECK) - return + break continue Queue(D, level+1) if (MC_TICK_CHECK) - return + break if (count) queue.Cut(1,count+1) count = 0 diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index c25fb5b44f7..f22ed770c18 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -2,9 +2,8 @@ SUBSYSTEM_DEF(icon_smooth) name = "Icon Smoothing" init_order = INIT_ORDER_ICON_SMOOTHING wait = 1 - priority = FIRE_PRIOTITY_SMOOTHING + priority = FIRE_PRIORITY_SMOOTHING flags = SS_TICKER -// flags = SS_NO_FIRE ///Blueprints assemble an image of what pipes/manifolds/wires look like on initialization, and thus should be taken after everything's been smoothed var/list/blueprint_queue = list() var/list/smooth_queue = list() @@ -30,15 +29,14 @@ SUBSYSTEM_DEF(icon_smooth) can_fire = 0 /datum/controller/subsystem/icon_smooth/Initialize() - smooth_zlevel(1,TRUE) - smooth_zlevel(2,TRUE) - var/queue = smooth_queue + var/list/queue = smooth_queue smooth_queue = list() for(var/V in queue) - var/atom/A = V - if(!A || A.z <= 2) + var/atom/smoothing_atom = queue[length(queue)] + queue.len-- + if(QDELETED(smoothing_atom) || !(smoothing_atom.smooth & SMOOTH_QUEUED) || !smoothing_atom.z) continue - smooth_icon(A) + smooth_icon(smoothing_atom) CHECK_TICK queue = blueprint_queue blueprint_queue = list() diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 4f26ad62a22..bed60628e61 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -35,7 +35,14 @@ SUBSYSTEM_DEF(mapping) // Z-manager stuff var/station_start // should only be used for maploading-related tasks var/space_levels_so_far = 0 - var/list/z_list + ///list of all z level datums in the order of their z (z level 1 is at index 1, etc.) + var/list/datum/space_level/z_list + ///list of all z level indices that form multiz connections and whether theyre linked up or down + ///list of lists, inner lists are of the form: list("up or down link direction" = TRUE) + var/list/multiz_levels = list() + ///shows the default gravity value for each z level. recalculated when gravity generators change. + ///associative list of the form: list("[z level num]" = max generator gravity in that z level OR the gravity level trait) + var/list/gravity_by_z_level = list() var/datum/space_level/transit var/datum/space_level/empty_space var/num_of_res_levels = 1 @@ -115,9 +122,47 @@ SUBSYSTEM_DEF(mapping) setup_map_transitions() generate_station_area_list() initialize_reserved_level(transit.z_value) + generate_z_level_linkages() + calculate_default_z_level_gravities() spawn_random_travel_tiles() return ..() +/datum/controller/subsystem/mapping/proc/calculate_default_z_level_gravities() + for(var/z_level in 1 to length(z_list)) + calculate_z_level_gravity(z_level) + +/datum/controller/subsystem/mapping/proc/generate_z_level_linkages() + for(var/z_level in 1 to length(z_list)) + generate_linkages_for_z_level(z_level) + +/datum/controller/subsystem/mapping/proc/generate_linkages_for_z_level(z_level) + if(!isnum(z_level) || z_level <= 0) + return FALSE + + if(multiz_levels.len < z_level) + multiz_levels.len = z_level + + var/z_above = level_trait(z_level, ZTRAIT_UP) + var/z_below = level_trait(z_level, ZTRAIT_DOWN) + if(!(z_above == TRUE || z_above == FALSE || z_above == null) || !(z_below == TRUE || z_below == FALSE || z_below == null)) + stack_trace("Warning, numeric mapping offsets are deprecated. Instead, mark z level connections by setting UP/DOWN to true if the connection is allowed") + multiz_levels[z_level] = new /list(LARGEST_Z_LEVEL_INDEX) + multiz_levels[z_level][Z_LEVEL_UP] = !!z_above + multiz_levels[z_level][Z_LEVEL_DOWN] = !!z_below + +/datum/controller/subsystem/mapping/proc/calculate_z_level_gravity(z_level_number) + if(!isnum(z_level_number) || z_level_number < 1) + return FALSE + + var/max_gravity = 0 + + for(var/obj/machinery/gravity_generator/main/grav_gen as anything in GLOB.gravity_generators["[z_level_number]"]) + max_gravity = max(grav_gen.setting, max_gravity) + + max_gravity = max_gravity || level_trait(z_level_number, ZTRAIT_GRAVITY) || 0//just to make sure no nulls + gravity_by_z_level["[z_level_number]"] = max_gravity + return max_gravity + /datum/controller/subsystem/mapping/proc/wipe_reservations(wipe_safety_delay = 100) if(clearing_reserved_turfs || !initialized) //in either case this is just not needed. return @@ -187,6 +232,7 @@ SUBSYSTEM_DEF(mapping) clearing_reserved_turfs = SSmapping.clearing_reserved_turfs z_list = SSmapping.z_list + multiz_levels = SSmapping.multiz_levels #define INIT_ANNOUNCE(X) to_chat(world, span_boldannounce("[X]")); log_world(X) /datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE) diff --git a/code/controllers/subsystem/migrants.dm b/code/controllers/subsystem/migrants.dm index c3b88d1988f..7c79d7b8b28 100644 --- a/code/controllers/subsystem/migrants.dm +++ b/code/controllers/subsystem/migrants.dm @@ -193,7 +193,6 @@ SUBSYSTEM_DEF(migrants) /datum/controller/subsystem/migrants/proc/spawn_migrant(datum/migrant_wave/wave, datum/migrant_assignment/assignment, spawn_on_location, migrant_wave_id) var/rank = "Migrant" var/mob/dead/new_player/newplayer = assignment.client.mob - var/ckey = assignment.client.ckey SSjob.AssignRole(newplayer, rank, TRUE) @@ -222,7 +221,7 @@ SUBSYSTEM_DEF(migrants) if(humanc) var/fakekey = character.ckey - if(ckey in GLOB.anonymize) + if(character.ckey in GLOB.anonymize) fakekey = get_fake_key(character.ckey) GLOB.character_list[character.mobid] = "[fakekey] was [character.real_name] ([rank])
" GLOB.character_ckey_list[character.real_name] = character.ckey diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index df357516568..2be871fd04d 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -9,8 +9,6 @@ SUBSYSTEM_DEF(mobs) var/static/list/clients_by_zlevel[][] var/static/list/dead_players_by_zlevel[][] = list(list()) // Needs to support zlevel 1 here, MaxZChanged only happens when z2 is created and new_players can login before that. var/static/list/cubemonkeys = list() - var/list/dead_mobs = list() - var/amt2process = 5 /datum/controller/subsystem/mobs/stat_entry() @@ -42,10 +40,6 @@ SUBSYSTEM_DEF(mobs) if (!resumed) src.currentrun = GLOB.mob_living_list.Copy() - var/createnewdm = FALSE - if(!dead_mobs.len) - createnewdm = TRUE - //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun var/times_fired = src.times_fired @@ -56,22 +50,8 @@ SUBSYSTEM_DEF(mobs) GLOB.mob_living_list.Remove(L) continue if(L.stat == DEAD) - if(createnewdm) - dead_mobs |= L + L.DeadLife() else L.Life(seconds, times_fired) if (MC_TICK_CHECK) return - - var/ye = 0 - while(dead_mobs.len) - if(ye > amt2process) - return - ye++ - var/mob/living/L = dead_mobs[dead_mobs.len] - dead_mobs.len-- - if(!L || QDELETED(L)) - continue - L.DeadLife() - if (MC_TICK_CHECK) - return diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 8b645d5279a..3dfcc4bfdb6 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -3,7 +3,6 @@ SUBSYSTEM_DEF(npcpool) flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND priority = FIRE_PRIORITY_NPC runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/amt2update = 10 var/list/currentrun = list() /datum/controller/subsystem/npcpool/stat_entry() @@ -12,28 +11,25 @@ SUBSYSTEM_DEF(npcpool) /datum/controller/subsystem/npcpool/fire(resumed = FALSE) - if (!resumed || !currentrun.len) + if (!resumed || !src.currentrun.len) var/list/activelist = GLOB.simple_animals[AI_ON] src.currentrun = activelist.Copy() -// //cache for sanic speed (lists are references anyways) -// var/list/currentrun = src.currentrun + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun - var/ye = 0 while(currentrun.len) - if(ye > amt2update) - return - ye++ var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len - if(!SA.ckey && !SA.notransform) - if(SA.stat != DEAD) - SA.handle_automated_action() - if(SA.stat != DEAD) - SA.handle_automated_movement() - if(SA.stat != DEAD) - SA.handle_automated_speech() + if(SA) + if(!SA.ckey && !SA.notransform) + if(SA.stat != DEAD) + SA.handle_automated_action() + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.handle_automated_speech() if (MC_TICK_CHECK) return @@ -51,4 +47,4 @@ SUBSYSTEM_DEF(npcpool) if(QDELETED(mobinput)) return mobinput.handle_automated_movement() - mobinput.move_skip = FALSE \ No newline at end of file + mobinput.move_skip = FALSE diff --git a/code/controllers/subsystem/rogue/damoverlays.dm b/code/controllers/subsystem/rogue/damoverlays.dm index 8e0401d1528..459b5dec862 100644 --- a/code/controllers/subsystem/rogue/damoverlays.dm +++ b/code/controllers/subsystem/rogue/damoverlays.dm @@ -6,20 +6,15 @@ SUBSYSTEM_DEF(damoverlays) var/list/currentrun = list() var/list/processing = list() processing_flag = PROCESSING_DAMOVERLAYS - var/amt2update = 5 /datum/controller/subsystem/damoverlays/fire(resumed = 0) - if (!resumed || !currentrun.len) - currentrun = processing.Copy() + if (!resumed || !src.currentrun.len) + src.currentrun = processing.Copy() -// //cache for sanic speed (lists are references anyways) -// var/list/currentrun = src.currentrun + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun - var/ye = 0 while(currentrun.len) - if(ye > amt2update) - return - ye++ var/mob/living/carbon/human/thing = currentrun[currentrun.len] currentrun.len-- if (!thing || QDELETED(thing)) diff --git a/code/controllers/subsystem/rogue/soundloopers.dm b/code/controllers/subsystem/rogue/soundloopers.dm index 16cd1e6ec1b..bb9f7573dd1 100644 --- a/code/controllers/subsystem/rogue/soundloopers.dm +++ b/code/controllers/subsystem/rogue/soundloopers.dm @@ -6,28 +6,30 @@ SUBSYSTEM_DEF(soundloopers) priority = FIRE_PRIORITY_DEFAULT var/list/processing = list() var/list/currentrun = list() - var/amt2update = 20 /datum/controller/subsystem/soundloopers/fire(resumed = 0) if (!resumed || !currentrun.len) - src.currentrun = shuffle(processing.Copy()) + src.currentrun = processing.Copy() -// //cache for sanic speed (lists are references anyways) -// var/list/currentrun = src.currentrun + //cache for sanic speed (lists are references anyways) + var/list/current = src.currentrun + var/static/count = 0 + if (count) //runtime last run before we could do this. + var/c = count + count = 0 //so if we runtime on the Cut, we don't try again. + current.Cut(1,c+1) - var/ye = 0 - while (currentrun.len) - if(ye > amt2update) - return - ye++ - var/datum/looping_sound/thing = currentrun[currentrun.len] - currentrun.len-- - if (!thing || QDELETED(thing)) + for(var/i in 1 to length(current)) + var/datum/looping_sound/thing = current[i] + count++ + if (QDELETED(thing)) // !thing is redundant as QDELETED includes an isnull check processing -= thing if (MC_TICK_CHECK) - return + break continue - if(thing.sound_loop()) - STOP_PROCESSING(SSsoundloopers, thing) + thing.sound_loop() if (MC_TICK_CHECK) - return \ No newline at end of file + break + if (count) + current.Cut(1,count+1) + count = 0 diff --git a/code/controllers/subsystem/rogue/todchange.dm b/code/controllers/subsystem/rogue/todchange.dm index 3a7ad2c28a6..96c6451593e 100644 --- a/code/controllers/subsystem/rogue/todchange.dm +++ b/code/controllers/subsystem/rogue/todchange.dm @@ -6,25 +6,20 @@ SUBSYSTEM_DEF(todchange) var/list/processing = list() var/list/currentrun = list() processing_flag = PROCESSING_TODCHANGE - var/amt2update = 100 /datum/controller/subsystem/todchange/fire(resumed = 0) if (!resumed || !currentrun.len) - src.currentrun = shuffle(processing.Copy()) + src.currentrun = processing.Copy() -// //cache for sanic speed (lists are references anyways) -// var/list/currentrun = src.currentrun + //cache for sanic speed (lists are references anyways) + var/list/current = src.currentrun -// if(!currentrun.len) +// if(!current.len) // testing("nothing to update [rand(1,9)]") - var/ye = 0 - while(currentrun.len) - if(ye > amt2update) - return - ye++ - var/obj/effect/sunlight/L = currentrun[currentrun.len] - currentrun.len-- + while(current.len) + var/obj/effect/sunlight/L = current[current.len] + current.len-- if (!L || QDELETED(L)) processing -= L if (MC_TICK_CHECK) diff --git a/code/datums/components/rotting.dm b/code/datums/components/rotting.dm index 68caa4cdcff..866f63e2a7a 100644 --- a/code/datums/components/rotting.dm +++ b/code/datums/components/rotting.dm @@ -16,6 +16,7 @@ START_PROCESSING(SSroguerot, src) /datum/component/rot/Destroy() + STOP_PROCESSING(SSroguerot, src) if(soundloop) soundloop.stop() . = ..() @@ -85,7 +86,6 @@ //stonehedge mob decomposition C.visible_message(span_smallgreen("[C] decomposes...")) var/datum/reagents/R = new/datum/reagents(5) - R.my_atom = src R.add_reagent(/datum/reagent/organpoison, 5) var/datum/effect_system/smoke_spread/chem/smoke = new smoke.set_up(R, 2, get_turf(C), FALSE) @@ -129,10 +129,12 @@ T.add_pollutants(/datum/pollutant/rot, 5) if(amount > 20 MINUTES) //stonehedge simple mob decomposition - L.visible_message(span_smallgreen("[L] decomposes..!")) + L.visible_message(span_smallgreen("[L] decomposes...")) var/datum/reagents/R = new/datum/reagents(5) - R.my_atom = src R.add_reagent(/datum/reagent/organpoison, 5) + var/datum/effect_system/smoke_spread/chem/smoke = new + smoke.set_up(R, 2, get_turf(L), FALSE) + smoke.start() //stonehedge simple mob decomposition end qdel(src) return L.dust(drop_items=TRUE) diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index 0b6d9365871..64d4c92a9d3 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -15,7 +15,7 @@ icon_state = "walkietalkie" /obj/item/implant/radio/antenna/Initialize(mapload) - ..() + . = ..() radio.name = "internal antenna" /datum/mutation/human/antenna/on_acquiring(mob/living/carbon/human/owner) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 1965ea2ee00..b07f4446f95 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -125,7 +125,7 @@ healing -= 0.1 break //Only count the first bedsheet if(health_ratio > 0.8) - owner.adjustToxLoss(healing * 0.5, TRUE, TRUE) + owner.adjustToxLoss(healing * 0.5, FALSE, TRUE) owner.adjustStaminaLoss(healing) if(human_owner && human_owner.drunkenness) human_owner.drunkenness *= 0.997 //reduce drunkenness by 0.3% per tick, 6% per 2 seconds diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index a3b7a928f6a..279c8b3bc05 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -39,6 +39,7 @@ /datum/status_effect/Destroy() STOP_PROCESSING(SSfastprocess, src) if(owner) + linked_alert = null owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) on_remove() @@ -112,6 +113,10 @@ inspec += "
----------------------" to_chat(user, "[inspec.Join()]") +/atom/movable/screen/alert/status_effect/Destroy() + attached_effect = null + return ..() + ////////////////// // HELPER PROCS // ////////////////// diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d0727c43aed..ec3794f0d9a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1291,6 +1291,8 @@ * Sends signals COMSIG_ATOM_HAS_GRAVITY and COMSIG_TURF_HAS_GRAVITY, both can force gravity with * the forced gravity var * + * micro-optimized to hell because this proc is very hot, being called several times per movement every movement. + * * Gravity situations: * * No gravity if you're not in a turf * * No gravity if this atom is in is a space turf @@ -1299,34 +1301,27 @@ * * Gravity if the Z level has an SSMappingTrait for ZTRAIT_GRAVITY * * otherwise no gravity */ -/atom/proc/has_gravity(turf/T) - if(!T || !isturf(T)) - T = get_turf(src) +/atom/proc/has_gravity(turf/gravity_turf) + if(!isturf(gravity_turf)) + gravity_turf = get_turf(src) - if(!T) + if(!gravity_turf)//no gravity in nullspace return 0 - var/list/forced_gravity = list() - SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, T, forced_gravity) - if(!forced_gravity.len) - SEND_SIGNAL(T, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity) - if(forced_gravity.len) - var/max_grav - for(var/i in forced_gravity) + //the list isnt created every time as this proc is very hot, its only accessed if anything is actually listening to the signal too + var/static/list/forced_gravity = list() + if(SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, gravity_turf, forced_gravity)) + if(!length(forced_gravity)) + SEND_SIGNAL(gravity_turf, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity) + + var/max_grav = 0 + for(var/i in forced_gravity)//our gravity is the strongest return forced gravity we get max_grav = max(max_grav, i) + forced_gravity.Cut() + //cut so we can reuse the list, this is ok since forced gravity movers are exceedingly rare compared to all other movement return max_grav - if(isspaceturf(T)) // Turf never has gravity - return 0 - - var/area/A = get_area(T) - if(A.has_gravity) // Areas which always has gravity - return A.has_gravity - else - // There's a gravity generator on our z level - if(GLOB.gravity_generators["[T.z]"]) - var/max_grav = 0 - for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"]) - max_grav = max(G.setting,max_grav) - return max_grav - return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY) + var/area/turf_area = gravity_turf.loc + // force_no_gravity has been removed because this is Roguetown code + // it'd be trivial to readd if you needed it, though + return SSmapping.gravity_by_z_level["[gravity_turf.z]"] || turf_area.has_gravity diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 603d42a0179..8d48ed0af5b 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -42,14 +42,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) if(delete_after_roundstart) qdel(src) -/obj/effect/landmark/start/New() +/obj/effect/landmark/start/Initialize() GLOB.start_landmarks_list += src if(jobspawn_override.len) for(var/X in jobspawn_override) - if(!GLOB.jobspawn_overrides[X]) - GLOB.jobspawn_overrides[X] = list() - GLOB.jobspawn_overrides[X] += src - ..() + LAZYADD(GLOB.jobspawn_overrides[X], src) + . = ..() if(name != "start") tag = "start*[name]" @@ -64,7 +62,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "generic_event" /obj/effect/landmark/events/haunts/Initialize(mapload) - ..() + . = ..() GLOB.hauntstart += src icon_state = "" @@ -75,7 +73,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) var/aportalloc = "a" /obj/effect/landmark/events/testportal/Initialize(mapload) - ..() + . = ..() // GLOB.hauntstart += loc #ifdef TESTSERVER var/obj/structure/fluff/testportal/T = new /obj/structure/fluff/testportal(loc) @@ -420,6 +418,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) /obj/effect/landmark/start/adventurer name = "Adventurer" icon_state = "arrow" + delete_after_roundstart = FALSE // used by mob spawners //yrf @@ -725,7 +724,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "wiznerd_spawn" /obj/effect/landmark/start/wizard/Initialize() - ..() + . = ..() GLOB.wizardstart += loc /obj/effect/landmark/start/nukeop @@ -734,7 +733,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "snukeop_spawn" /obj/effect/landmark/start/nukeop/Initialize() - ..() + . = ..() GLOB.nukeop_start += loc /obj/effect/landmark/start/bandit @@ -743,7 +742,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/bandit/Initialize() - ..() + . = ..() GLOB.bandit_starts += loc @@ -753,7 +752,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/delf/Initialize() - ..() + . = ..() GLOB.delf_starts += loc @@ -763,7 +762,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "snukeop_leader_spawn" /obj/effect/landmark/start/nukeop_leader/Initialize() - ..() + . = ..() GLOB.nukeop_leader_start += loc // Must be immediate because players will @@ -774,7 +773,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) name = "New Player" /obj/effect/landmark/start/new_player/Initialize() - ..() + . = ..() GLOB.newplayer_start += loc /obj/effect/landmark/latejoin diff --git a/code/game/objects/inhands_rogue.dm b/code/game/objects/inhands_rogue.dm index 9e32b1a7ecb..cf9a3314a28 100644 --- a/code/game/objects/inhands_rogue.dm +++ b/code/game/objects/inhands_rogue.dm @@ -1,5 +1,6 @@ /obj/item - var/list/onprop = list() + /// A lazylist to store inhands data. + var/list/onprop var/d_type = "blunt" //#ifdef TESTSERVER var/force_reupdate_inhand = TRUE @@ -32,6 +33,8 @@ var/static/list/onmob_sprites = list() var/icon/onmob = onmob_sprites["[tag][behind][mirrored][used_index]"] if(!onmob || force_reupdate_inhand) + if(force_reupdate_inhand) + has_behind_state = null onmob = fcopy_rsc(generateonmob(tag, prop, behind, mirrored)) onmob_sprites["[tag][behind][mirrored][used_index]"] = onmob return onmob @@ -68,6 +71,26 @@ if(0.7) return 1 +// For checking if we have a specific icon state in an icon. +// Cached cause asking icons is expensive. This is still expensive, so avoid using it if +// you can reasonably expect the icon_state to exist beforehand, or if you can cache the +// value somewhere. +GLOBAL_LIST_EMPTY(icon_state_cache) +/proc/check_state_in_icon(var/checkstate, var/checkicon) + // isicon() is apparently quite expensive so short-circuit out early if we can. + if(!istext(checkstate) || isnull(checkicon) || !(isfile(checkicon) || isicon(checkicon))) + return FALSE + var/checkkey = "\ref[checkicon]" + var/list/check = GLOB.icon_state_cache[checkkey] + if(!check) + check = list() + for(var/istate in icon_states(checkicon)) + check[istate] = TRUE + GLOB.icon_state_cache[checkkey] = check + . = check[checkstate] + +/obj/item/var/has_behind_state + /obj/item/proc/generateonmob(tag, prop, behind, mirrored) var/list/used_prop = prop var/UH = 64 @@ -77,18 +100,14 @@ var/icon/blended var/skipoverlays = FALSE if(behind) - var/icon/J = new(icon) - var/list/istates = J.IconStates() - if(istates.Find("[icon_state]_behind")) + if(isnull(has_behind_state)) + has_behind_state = check_state_in_icon(icon, "[icon_state]_behind") + if(has_behind_state) blended=icon("icon"=icon, "icon_state"="[icon_state]_behind") skipoverlays = TRUE else - // blended=icon("icon"=icon, "icon_state"=icon_state) -// blended=getFlatIcon(src) blended=icon("icon"=icon, "icon_state"=icon_state) else - // blended=icon("icon"=icon, "icon_state"=icon_state) -// blended=getFlatIcon(src) blended=icon("icon"=icon, "icon_state"=icon_state) if(!blended) @@ -716,16 +735,10 @@ if(!used_cat) used_cat = "gen" - for(var/X in I.onprop) - if(X == used_cat) - var/list/L = I.onprop[X] - if(L.len) - if(!needtofind in L) - L += needtofind - for(var/P in L) - if(P == needtofind) - L[P] += 0.1 - to_chat(LI, "[needtofind] = [L[P]]") + if(length(I.onprop?[used_cat])) + var/list/L = I.onprop[used_cat] + L[needtofind] += 0.1 + to_chat(LI, "[needtofind] = [L[needtofind]]") LI.update_inv_hands() LI.update_inv_belt() LI.update_inv_back() @@ -760,16 +773,10 @@ if(!used_cat) used_cat = "gen" - for(var/X in I.onprop) - if(X == used_cat) - var/list/L = I.onprop[X] - if(L.len) - if(!needtofind in L) - L += needtofind - for(var/P in L) - if(P == needtofind) - L[P] -= 0.1 - to_chat(LI, "[needtofind] = [L[P]]") + if(length(I.onprop?[used_cat])) + var/list/L = I.onprop[used_cat] + L[needtofind] -= 0.1 + to_chat(LI, "[needtofind] = [L[needtofind]]") LI.update_inv_hands() LI.update_inv_belt() LI.update_inv_back() diff --git a/code/game/objects/items/rogueitems/gems.dm b/code/game/objects/items/rogueitems/gems.dm index 80ba3f6ea86..ffcc11e3adb 100644 --- a/code/game/objects/items/rogueitems/gems.dm +++ b/code/game/objects/items/rogueitems/gems.dm @@ -247,7 +247,7 @@ . = 1 /obj/item/riddleofsteel/Initialize() - ..() + . = ..() set_light(2, 1, "#ff0d0d") /obj/item/reagent_containers/powder/mfire/Initialize() diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index c6e9acf91a9..e2dc7692c98 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -224,7 +224,7 @@ grind_results = list(/datum/reagent/medicine/spaceacillin = 2) /obj/item/stack/medical/mesh/Initialize() - ..() + . = ..() if(amount == max_amount) //only seal full mesh packs is_open = FALSE icon_state = "regen_mesh_closed" diff --git a/code/game/objects/structures/beds_chairs/roguechair.dm b/code/game/objects/structures/beds_chairs/roguechair.dm index 2bc08029e98..759ffa84fd7 100644 --- a/code/game/objects/structures/beds_chairs/roguechair.dm +++ b/code/game/objects/structures/beds_chairs/roguechair.dm @@ -82,7 +82,7 @@ /obj/structure/chair/bench/couch/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 2a0fe599bc2..df0d3a7faa1 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -4,7 +4,7 @@ anchored = TRUE /obj/structure/flora/Initialize() - ..() + . = ..() if(isclosedturf(loc)) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index ba52d565d9e..a67e7d7a0f0 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -194,7 +194,7 @@ layer = ABOVE_MOB_LAYER /obj/structure/fluff/railing/Initialize() - ..() + . = ..() var/lay = getwlayer(dir) if(lay) layer = lay @@ -320,7 +320,7 @@ climb_offset = 6 /obj/structure/fluff/railing/fence/Initialize() - ..() + . = ..() smooth_fences() /obj/structure/fluff/railing/fence/Destroy() diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index b3bfcd1c768..8007ab0d260 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -34,13 +34,13 @@ var/obj/structure/ladder/L if (!down) - L = locate() in SSmapping.get_turf_below(T) + L = locate() in GET_TURF_BELOW(T) if (L) down = L L.up = src // Don't waste effort looping the other way L.update_icon() if (!up) - L = locate() in SSmapping.get_turf_above(T) + L = locate() in GET_TURF_ABOVE(T) if (L) up = L L.down = src // Don't waste effort looping the other way diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 51961a92615..337969670cb 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -877,7 +877,7 @@ lockdir = dir /obj/structure/mineral_door/wood/deadbolt/Initialize() - ..() + . = ..() lockdir = dir icon_state = base_state @@ -995,7 +995,7 @@ icon_state = "barsold" /obj/structure/mineral_door/bars/Initialize() - ..() + . = ..() add_overlay(mutable_appearance(icon, "barsopen", ABOVE_MOB_LAYER)) diff --git a/code/game/objects/structures/roguetown/rogueflora.dm b/code/game/objects/structures/roguetown/rogueflora.dm index 0ce2498512c..a16ca31d6cc 100644 --- a/code/game/objects/structures/roguetown/rogueflora.dm +++ b/code/game/objects/structures/roguetown/rogueflora.dm @@ -375,7 +375,7 @@ leanable = TRUE /obj/structure/flora/roguegrass/bush/wall/Initialize() - ..() + . = ..() icon_state = "bushwall[pick(1,2)]" /obj/structure/flora/roguegrass/bush/wall/update_icon() @@ -400,7 +400,7 @@ static_debris = null /obj/structure/flora/roguegrass/bush/wall/tall/Initialize() - ..() + . = ..() icon_state = "tallbush[pick(1,2)]" @@ -435,7 +435,7 @@ /obj/structure/flora/rogueshroom/Initialize() - ..() + . = ..() icon_state = "mush[rand(1,5)]" if(icon_state == "mush5") static_debris = list(/obj/item/natural/thorn=1, /obj/item/grown/log/tree/small = 1) diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 3077c938909..7736f8edc2d 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -36,7 +36,7 @@ icon_state = "fancy_stairs_l" /obj/structure/stairs/fancy/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/game/objects/structures/walldeco.dm b/code/game/objects/structures/walldeco.dm index b2b4d637f37..8db4db34505 100644 --- a/code/game/objects/structures/walldeco.dm +++ b/code/game/objects/structures/walldeco.dm @@ -203,7 +203,7 @@ icon_state = "wallflag" /obj/structure/fluff/walldeco/customflag/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/game/sound.dm b/code/game/sound.dm index 5139ce5bbb5..15251ea3058 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -26,15 +26,8 @@ var/source_z = turf_source.z var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy() - var/turf/above_turf = turf_source.above() - var/turf/below_turf = turf_source.below() - - if(above_turf) - if(!is_in_zweb(turf_source.z, above_turf.z)) - above_turf=null - if(below_turf) - if(!is_in_zweb(turf_source.z, below_turf.z)) - below_turf=null + var/turf/above_turf = GET_TURF_ABOVE(turf_source) + var/turf/below_turf = GET_TURF_BELOW(turf_source) if(soundping) ping_sound(source) @@ -51,19 +44,17 @@ else if(above_turf) listeners += SSmobs.clients_by_zlevel[above_turf.z] + listeners += SSmobs.dead_players_by_zlevel[above_turf.z] if(below_turf) listeners += SSmobs.clients_by_zlevel[below_turf.z] + listeners += SSmobs.dead_players_by_zlevel[below_turf.z] + + listeners += SSmobs.dead_players_by_zlevel[source_z] . = list() - for(var/P in listeners) - var/mob/M = P - if(get_dist(M, turf_source) <= maxdistance) - if(M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, repeat)) - . += M - for(var/P in SSmobs.dead_players_by_zlevel[source_z]) - var/mob/M = P + for(var/mob/M as anything in listeners) if(get_dist(M, turf_source) <= maxdistance) if(M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, repeat)) . += M diff --git a/code/game/turfs/closed/transparent.dm b/code/game/turfs/closed/transparent.dm index f9c72d0796e..690dec89cb7 100644 --- a/code/game/turfs/closed/transparent.dm +++ b/code/game/turfs/closed/transparent.dm @@ -19,7 +19,7 @@ /turf/closed/transparent/update_multiz(prune_on_fail = FALSE, init = FALSE) . = ..() - var/turf/T = below() + var/turf/T = GET_TURF_BELOW(src) if(!T) vis_contents.len = 0 if(!show_bottom_level() && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to plating as a fallback @@ -50,4 +50,4 @@ path = /turf/open/floor/rogue/naturalstone var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER, plane = PLANE_SPACE) underlays += underlay_appearance - return TRUE \ No newline at end of file + return TRUE diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index c4ba4e5823f..8d54ba48fd7 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -12,7 +12,7 @@ /turf/open/chasm/Initialize() . = ..() - AddComponent(/datum/component/chasm, SSmapping.get_turf_below(src)) + AddComponent(/datum/component/chasm, GET_TURF_BELOW(src)) /turf/open/chasm/proc/set_target(turf/target) var/datum/component/chasm/chasm_component = GetComponent(/datum/component/chasm) diff --git a/code/game/turfs/open/floor/roguefloor.dm b/code/game/turfs/open/floor/roguefloor.dm index c56c14b1947..7e85b6298a1 100644 --- a/code/game/turfs/open/floor/roguefloor.dm +++ b/code/game/turfs/open/floor/roguefloor.dm @@ -1044,7 +1044,7 @@ icon_state = "" /turf/open/floor/rogue/carpet/lord/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/game/turfs/open/transparent.dm b/code/game/turfs/open/transparent.dm index d0a219ac2b7..cee173d0415 100644 --- a/code/game/turfs/open/transparent.dm +++ b/code/game/turfs/open/transparent.dm @@ -19,7 +19,7 @@ /turf/open/transparent/update_multiz(prune_on_fail = FALSE, init = FALSE) . = ..() - var/turf/T = below() + var/turf/T = GET_TURF_BELOW(src) if(!T) vis_contents.len = 0 if(!show_bottom_level() && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to plating as a fallback diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8239bef8358..4b6b6af5d24 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -96,11 +96,11 @@ if(turf_integrity == null) turf_integrity = max_integrity - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_new(src, DOWN) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_new(src, UP) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) @@ -122,10 +122,10 @@ if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_del(src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_del(src, UP) STOP_PROCESSING(SSweather,src) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index d2f10a2e858..bb951b7ed09 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -218,6 +218,9 @@ GLOBAL_PROTECT(protected_ranks) GLOB.deadmins.Cut() var/list/backup_file_json = load_admin_ranks(dbfail, no_update) dbfail = backup_file_json != null + //Clear profile access + for(var/A in world.GetConfig("admin")) + world.SetConfig("APP/admin", A, null) var/list/rank_names = list() for(var/datum/admin_rank/R in GLOB.admin_ranks) rank_names[R.name] = R diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 98f673d6103..c004536c691 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -52,6 +52,8 @@ GLOBAL_PROTECT(href_token) admin_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" href_token = GenerateToken() role_ban_panel = new /datum/role_ban_panel(src) + if(R.rights & R_DEBUG) //grant profile access + world.SetConfig("APP/admin", ckey, "role=admin") //only admins with +ADMIN start admined if(protected) GLOB.protected_admins[target] = src diff --git a/code/modules/antagonists/roguetown/villain/lich/phylactery.dm b/code/modules/antagonists/roguetown/villain/lich/phylactery.dm index 820c132bae8..dc2a6a901ba 100644 --- a/code/modules/antagonists/roguetown/villain/lich/phylactery.dm +++ b/code/modules/antagonists/roguetown/villain/lich/phylactery.dm @@ -12,7 +12,7 @@ var/datum/antagonist/lich/possessor /obj/item/phylactery/Initialize() - ..() + . = ..() filters += filter(type="drop_shadow", x=0, y=0, size=1, offset=2, color=rgb(rand(1,255),rand(1,255),rand(1,255))) /obj/item/phylactery/proc/be_consumed(timer) diff --git a/code/modules/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm index ba1858f1123..549a76e324f 100644 --- a/code/modules/antagonists/roguetown/villain/vampirelord.dm +++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm @@ -1103,7 +1103,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) delete_after_roundstart = FALSE /obj/effect/landmark/start/vampirelord/Initialize() - ..() + . = ..() GLOB.vlord_starts += loc /obj/effect/landmark/start/vampirespawn @@ -1118,7 +1118,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) delete_after_roundstart = FALSE /obj/effect/landmark/start/vampirespawn/Initialize() - ..() + . = ..() GLOB.vspawn_starts += loc /obj/effect/landmark/vteleport diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 759dbb71c92..bad16389dec 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -51,7 +51,7 @@ deathmessage = "screams in anger as it collapses into a puddle of viscera!" /mob/living/simple_animal/slaughter/Initialize() - ..() + . = ..() var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm index 45b6aad2603..b48adb6ee55 100644 --- a/code/modules/atmospherics/multiz.dm +++ b/code/modules/atmospherics/multiz.dm @@ -17,8 +17,8 @@ /obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion() icon = 'icons/obj/atmos.dmi' //Just to refresh. var/turf/T = get_turf(src) - var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_above(T)) - var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_below(T)) + var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(GET_TURF_ABOVE(T)) + var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(GET_TURF_BELOW(T)) if(below) below.pipeline_expansion() //If we've got one below us, force it to add us on facebook if(above) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 0b18aa467bb..46a5013abc0 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -605,7 +605,7 @@ invisibility = 0 /obj/effect/ctf/ammo/Initialize(mapload) - ..() + . = ..() QDEL_IN(src, AMMO_DROP_LIFETIME) /obj/effect/ctf/ammo/Crossed(atom/movable/AM) diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index 565119a4d47..306c38fb8f7 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -44,7 +44,7 @@ var/active = 1 /obj/structure/firepit/Initialize() - ..() + . = ..() toggleFirepit() /obj/structure/firepit/interact(mob/living/user) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 75028b190cd..15c7c6bda7f 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -52,7 +52,7 @@ /obj/item/clothing/mask/gas/welding/up /obj/item/clothing/mask/gas/welding/up/Initialize() - ..() + . = ..() visor_toggling() // ******************************************************************** diff --git a/code/modules/clothing/rogueclothes/cloaks.dm b/code/modules/clothing/rogueclothes/cloaks.dm index 8f65481a5b7..249be6617df 100644 --- a/code/modules/clothing/rogueclothes/cloaks.dm +++ b/code/modules/clothing/rogueclothes/cloaks.dm @@ -93,7 +93,7 @@ return /obj/item/clothing/cloak/tabard/knight/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -109,7 +109,7 @@ boobed_detail = FALSE /obj/item/clothing/cloak/tabard/crusader/Initialize() - ..() + . = ..() update_icon() /obj/item/clothing/cloak/tabard/crusader/attack_right(mob/user) @@ -223,7 +223,7 @@ L.update_inv_cloak() /obj/item/clothing/cloak/tabard/knight/guard/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -337,7 +337,7 @@ L.update_inv_cloak() /obj/item/clothing/cloak/stabard/guard/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -387,7 +387,7 @@ detail_tag = "_quad" /obj/item/clothing/cloak/stabard/mercenary/Initialize() - ..() + . = ..() detail_tag = pick("_quad", "_spl", "_box", "_dim") color = clothing_color2hex(pick(CLOTHING_COLOR_NAMES)) detail_color = clothing_color2hex(pick(CLOTHING_COLOR_NAMES)) @@ -486,7 +486,7 @@ /obj/item/clothing/cloak/stabard/surcoat/guard/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -538,7 +538,7 @@ L.update_inv_cloak() /obj/item/clothing/cloak/lordcloak/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -888,7 +888,7 @@ inhand_mod = FALSE /obj/item/clothing/cloak/half/vet/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -1043,7 +1043,7 @@ L.update_inv_cloak() /obj/item/clothing/cloak/stabard/guardhood/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/modules/clothing/rogueclothes/quiver.dm b/code/modules/clothing/rogueclothes/quiver.dm index 634b67a071d..766b3138fc3 100644 --- a/code/modules/clothing/rogueclothes/quiver.dm +++ b/code/modules/clothing/rogueclothes/quiver.dm @@ -80,28 +80,28 @@ icon_state = "quiver0" /obj/item/quiver/arrows/Initialize() - ..() + . = ..() for(var/i in 1 to max_storage) var/obj/item/ammo_casing/caseless/rogue/arrow/A = new() arrows += A update_icon() /obj/item/quiver/bolts/Initialize() - ..() + . = ..() for(var/i in 1 to max_storage) var/obj/item/ammo_casing/caseless/rogue/bolt/A = new() arrows += A update_icon() /obj/item/quiver/Parrows/Initialize() - ..() + . = ..() for(var/i in 1 to max_storage) var/obj/item/ammo_casing/caseless/rogue/arrow/poison/A = new() arrows += A update_icon() /obj/item/quiver/Pbolts/Initialize() - ..() + . = ..() for(var/i in 1 to max_storage) var/obj/item/ammo_casing/caseless/rogue/bolt/poison/A = new() arrows += A diff --git a/code/modules/clothing/rogueclothes/shirts.dm b/code/modules/clothing/rogueclothes/shirts.dm index 762dcef9c6a..9b9ca125907 100644 --- a/code/modules/clothing/rogueclothes/shirts.dm +++ b/code/modules/clothing/rogueclothes/shirts.dm @@ -52,7 +52,7 @@ color = CLOTHING_RED /obj/item/clothing/suit/roguetown/shirt/undershirt/guard/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -67,7 +67,7 @@ color = CLOTHING_PURPLE /obj/item/clothing/suit/roguetown/shirt/undershirt/guardsecond/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 3ad626d60fb..ee917e4c73f 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -261,7 +261,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( image_state = "clown" /obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration) - ..(loc, T) + . = ..(loc, T) name = pick(GLOB.clown_names) QDEL_IN(src,duration) diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 02dbd898300..aee778a98af 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -111,7 +111,7 @@ for(var/v in current_pick.always_spawn_with) if(current_pick.always_spawn_with[v] == PLACE_BELOW) var/turf/T = locate(1,1,target_z) - if(!SSmapping.get_turf_below(T)) + if(!GET_TURF_BELOW(T)) if(forced_z) continue outer else @@ -161,7 +161,7 @@ if(PLACE_DEFAULT) forced_ruins[linked] = -1 if(PLACE_BELOW) - forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + forced_ruins[linked] = GET_TURF_BELOW(placed_turf) if(PLACE_ISOLATED) forced_ruins[linked] = SSmapping.get_isolated_ruin_z() diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index aef3e0ed7d3..2c7a8114618 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -1,33 +1,46 @@ /proc/get_step_multiz(ref, dir) if(dir & UP) dir &= ~UP - return get_step(SSmapping.get_turf_above(get_turf(ref)), dir) + return get_step(GET_TURF_ABOVE(get_turf(ref)), dir) if(dir & DOWN) dir &= ~DOWN - return get_step(SSmapping.get_turf_below(get_turf(ref)), dir) + return get_step(GET_TURF_BELOW(get_turf(ref)), dir) return get_step(ref, dir) +/proc/get_multiz_accessible_levels(center_z) + . = list(center_z) + var/other_z = center_z + var/offset + while((offset = SSmapping.multiz_levels[other_z]["[DOWN]"])) + other_z -= offset + if(other_z in .) + break // no infinite loops + . += other_z + other_z = center_z + while((offset = SSmapping.multiz_levels[other_z]["[UP]"])) + other_z += offset + if(other_z in .) + break // no infinite loops + . += other_z + +/// A cache of stringified z-level zweb checks. +/// GLOB.zweb_cache[num2text(my_z)][num2text(compare_z)] = TRUE/FALSE +GLOBAL_LIST_EMPTY(zweb_cache) /proc/is_in_zweb(my_z, compare_z) if(!my_z || !compare_z) return FALSE if(my_z == compare_z) return TRUE - if(my_z > compare_z) - for(var/i in my_z to compare_z) - if(!i || i<0) - return FALSE - if(i == compare_z) - return TRUE - if(!SSmapping.level_trait(i, ZTRAIT_DOWN)) - return FALSE - if(my_z < compare_z) - for(var/i in my_z to compare_z) - if(!i || i<0) - return FALSE - if(i == compare_z) - return TRUE - if(!SSmapping.level_trait(i, ZTRAIT_UP)) - return FALSE + var/my_text = num2text(my_z) + var/comp_text = num2text(compare_z) + if(isnull(GLOB.zweb_cache[my_text]?[comp_text])) + LAZYINITLIST(GLOB.zweb_cache[my_text]) + for(var/zlevel in get_multiz_accessible_levels(my_z)) + var/ztext = num2text(zlevel) + GLOB.zweb_cache[my_text][ztext] = TRUE + LAZYINITLIST(GLOB.zweb_cache[ztext]) + LAZYADD(GLOB.zweb_cache[ztext], my_text) + return GLOB.zweb_cache[my_text][comp_text] /proc/get_dir_multiz(turf/us, turf/them) us = get_turf(us) @@ -37,24 +50,18 @@ if(us.z == them.z) return get_dir(us, them) else - var/turf/T = us.above() + var/turf/T = GET_TURF_ABOVE(us) var/dir = NONE if(T && (T.z == them.z)) dir = UP else - T = us.below() + T = GET_TURF_BELOW(us) if(T && (T.z == them.z)) dir = DOWN else return get_dir(us, them) return (dir | get_dir(us, them)) -/turf/proc/above() - return get_step_multiz(src, UP) - -/turf/proc/below() - return get_step_multiz(src, DOWN) - /proc/dir_inverse_multiz(dir) var/holder = dir & (UP|DOWN) if((holder == NONE) || (holder == (UP|DOWN))) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 9ba8d96d5e1..967a274732a 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -51,18 +51,18 @@ // Attempt to get the turf below the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_below(turf/T) - if (!T) + if (!T || !initialized) return - var/offset = level_trait(T.z, ZTRAIT_DOWN) + var/offset = multiz_levels[T.z]["[DOWN]"] if (!offset) return - return locate(T.x, T.y, T.z + offset) + return locate(T.x, T.y, T.z - offset) // Attempt to get the turf above the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_above(turf/T) - if (!T) + if (!T || !initialized) return - var/offset = level_trait(T.z, ZTRAIT_UP) + var/offset = multiz_levels[T.z]["[UP]"] if (!offset) return return locate(T.x, T.y, T.z + offset) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 8f010813500..a36a0d604ef 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -559,7 +559,7 @@ GLOBAL_LIST_INIT(roleplay_readme, world.file2list("strings/rt/rp_prompt.txt")) SSquirks.AssignQuirks(humanc, humanc.client, TRUE) if(humanc) var/fakekey = character.ckey - if(ckey in GLOB.anonymize) + if(character.ckey in GLOB.anonymize) fakekey = get_fake_key(character.ckey) GLOB.character_list[character.mobid] = "[fakekey] was [character.real_name] ([rank])
" GLOB.character_ckey_list[character.real_name] = character.ckey diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 01984d428a4..4ec763c715b 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -47,54 +47,47 @@ for(var/datum/mutation/human/HM in dna.mutations) // Handle active genes HM.on_life() - if(mode == AI_OFF) - handle_vamp_dreams() - if(IsSleeping()) - if(health > 0) - if(has_status_effect(/datum/status_effect/debuff/sleepytime)) - tiredness = 0 - remove_status_effect(/datum/status_effect/debuff/sleepytime) - if(mind) - mind.sleep_adv.advance_cycle() - var/datum/game_mode/chaosmode/C = SSticker.mode - if(istype(C)) - if(mind) - if(!mind.antag_datums || !mind.antag_datums.len) - allmig_reward++ - to_chat(src, span_danger("Nights Survived: \Roman[allmig_reward]")) - if(C.allmig) - if(allmig_reward > 3) - adjust_triumphs(1) - if(has_status_effect(/datum/status_effect/debuff/trainsleep)) - remove_status_effect(/datum/status_effect/debuff/trainsleep) - if(HAS_TRAIT(src, TRAIT_LEPROSY)) - if(!mob_timers["leper_bleed"] || mob_timers["leper_bleed"] + 6 MINUTES < world.time) - if(prob(10)) - to_chat(src, span_warning("My skin opens up and bleeds...")) - mob_timers["leper_bleed"] = world.time - var/obj/item/bodypart/part = pick(bodyparts) - if(part) - part.add_wound(/datum/wound/slash) - adjustToxLoss(0.3) - //heart attack stuff - handle_curses() - handle_heart() - handle_liver() - update_rogfat() - update_rogstam() - if(charflaw && !charflaw.ephemeral) - charflaw.flaw_on_life(src) - if(health <= 0) - adjustOxyLoss(0.3) - if(!client && !HAS_TRAIT(src, TRAIT_NOSLEEP)) - if(mob_timers["slo"]) - if(world.time > mob_timers["slo"] + 90 SECONDS) - Sleeping(100) - else - mob_timers["slo"] = world.time + handle_vamp_dreams() + if(IsSleeping() && health > 0) + if(has_status_effect(/datum/status_effect/debuff/sleepytime)) + tiredness = 0 + remove_status_effect(/datum/status_effect/debuff/sleepytime) + if(mind) + mind.sleep_adv.advance_cycle() + var/datum/game_mode/chaosmode/C = SSticker.mode + if(istype(C) && mind && !length(mind.antag_datums)) + allmig_reward++ + to_chat(src, span_danger("Nights Survived: \Roman[allmig_reward]")) + if(C.allmig && allmig_reward > 3) + adjust_triumphs(1) + if(has_status_effect(/datum/status_effect/debuff/trainsleep)) + remove_status_effect(/datum/status_effect/debuff/trainsleep) + if(HAS_TRAIT(src, TRAIT_LEPROSY)) + if(!mob_timers["leper_bleed"] || mob_timers["leper_bleed"] + 6 MINUTES < world.time && prob(10)) + to_chat(src, span_warning("My skin opens up and bleeds...")) + mob_timers["leper_bleed"] = world.time + var/obj/item/bodypart/part = pick(bodyparts) + if(part) + part.add_wound(/datum/wound/slash) + adjustToxLoss(0.3) + //heart attack stuff + handle_curses() + handle_heart() + handle_liver() + update_rogfat() + update_rogstam() + if(charflaw && !charflaw.ephemeral) + charflaw.flaw_on_life(src) + if(health <= 0) + adjustOxyLoss(0.3) + if(mode == AI_OFF && !client && !HAS_TRAIT(src, TRAIT_NOSLEEP)) + if(mob_timers["slo"]) + if(world.time > mob_timers["slo"] + 90 SECONDS) + Sleeping(100) else - if(mob_timers["slo"]) - mob_timers["slo"] = null + mob_timers["slo"] = world.time + else if(mob_timers["slo"]) + mob_timers["slo"] = null if(dna?.species) dna.species.spec_life(src) // for mutantraces diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ef4cdd123d9..752a56bfa18 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -724,10 +724,10 @@ There are several things that need to be remembered: if(beltr.experimental_onhip) var/list/prop if(beltr.force_reupdate_inhand) - prop = beltr.onprop["onbelt"] + prop = beltr?.onprop?["onbelt"] if(!prop) - beltr.onprop["onbelt"] = beltr.getonmobprop("onbelt") - prop = beltr.onprop["onbelt"] + prop = beltr.getonmobprop("onbelt") + LAZYSET(beltr.onprop, "onbelt", prop) else prop = beltr.getonmobprop("onbelt") if(prop) @@ -776,10 +776,10 @@ There are several things that need to be remembered: if(beltl.experimental_onhip) var/list/prop if(beltl.force_reupdate_inhand) - prop = beltl.onprop["onbelt"] + prop = beltl.onprop?["onbelt"] if(!prop) - beltl.onprop["onbelt"] = beltl.getonmobprop("onbelt") - prop = beltl.onprop["onbelt"] + prop = beltl.getonmobprop("onbelt") + LAZYSET(beltl.onprop, "onbelt", prop) else prop = beltl.getonmobprop("onbelt") if(prop) @@ -943,10 +943,10 @@ There are several things that need to be remembered: if(backr.experimental_onback) var/list/prop if(backr.force_reupdate_inhand) - prop = backr.onprop["onback"] + prop = backr.onprop?["onback"] if(!prop) - backr.onprop["onback"] = backr.getonmobprop("onback") - prop = backr.onprop["onback"] + prop = backr.getonmobprop("onback") + LAZYSET(backr.onprop, "onback", prop) else prop = backr.getonmobprop("onback") if(prop) @@ -996,10 +996,10 @@ There are several things that need to be remembered: if(backl.experimental_onback) var/list/prop if(backl.force_reupdate_inhand) - prop = backl.onprop["onback"] + prop = backl.onprop?["onback"] if(!prop) - backl.onprop["onback"] = backl.getonmobprop("onback") - prop = backl.onprop["onback"] + prop = backl.getonmobprop("onback") + LAZYSET(backl.onprop, "onback", backl.getonmobprop("onback")) else prop = backl.getonmobprop("onback") if(prop) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index d33a0aeafe0..05a875cd88b 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -144,10 +144,10 @@ used_prop = "gen" prop = I.getonmobprop(used_prop) if(I.force_reupdate_inhand) - if(I.onprop[used_prop]) + if(I.onprop?[used_prop]) prop = I.onprop[used_prop] else - I.onprop[used_prop] = prop + LAZYSET(I.onprop, used_prop, prop) if(!prop) continue var/flipsprite = FALSE diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index a6e37fdccb3..4d9e0af7452 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -53,7 +53,7 @@ //Random events (vomiting etc) handle_random_events() //Handle temperature/pressure differences between body and environment - var/datum/gas_mixture/environment = loc.return_air() + var/datum/gas_mixture/environment = loc?.return_air() if(environment) handle_environment(environment) @@ -76,11 +76,9 @@ if(stat != DEAD) return 1 -/mob/living - var/last_deadlife - /mob/living/proc/DeadLife() set invisibility = 0 + set waitfor = FALSE if (notransform) return if(!loc) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 63bba77d16d..a522c7ef16c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -549,7 +549,7 @@ Difficulty: Hard true_spawn = FALSE /mob/living/simple_animal/hostile/retaliate/rogue/megafauna/bubblegum/hallucination/Initialize() - ..() + . = ..() toggle_ai(AI_OFF) /mob/living/simple_animal/hostile/retaliate/rogue/megafauna/bubblegum/hallucination/charge(atom/chargeat = target, delay = 3, chargepast = 2) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index aaf03fb1212..264e83bdd40 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -233,7 +233,7 @@ var/mob/living/simple_animal/hostile/retaliate/rogue/asteroid/elite/herald/my_master = null /mob/living/simple_animal/hostile/retaliate/rogue/asteroid/elite/herald/mirror/Initialize() - ..() + . = ..() toggle_ai(AI_OFF) /mob/living/simple_animal/hostile/retaliate/rogue/asteroid/elite/herald/mirror/Destroy() diff --git a/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/werewolf.dm b/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/werewolf.dm index 6f43b9792e9..bd4d1851305 100644 --- a/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/werewolf.dm +++ b/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/werewolf.dm @@ -28,7 +28,7 @@ footstep_type = FOOTSTEP_MOB_HEAVY /mob/living/simple_animal/hostile/rogue/werewolf/Initialize() - ..() + . = ..() regenerate_icons() ADD_TRAIT(src, TRAIT_SIMPLE_WOUNDS, TRAIT_GENERIC) */ diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm b/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm index d19074cb20a..d5757e0f2f3 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm @@ -55,7 +55,7 @@ pixel_y = -8 /mob/living/simple_animal/hostile/retaliate/rogue/bigrat/Initialize() - ..() + . = ..() gender = MALE if(prob(50)) gender = FEMALE diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm b/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm index 50b56d52f79..e44d4f4077c 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm @@ -58,7 +58,7 @@ maxHealth = 130 /mob/living/simple_animal/hostile/retaliate/rogue/spider/Initialize() - ..() + . = ..() gender = MALE if(prob(33)) gender = FEMALE diff --git a/code/modules/mob/living/simple_animal/rogue/farm/goat.dm b/code/modules/mob/living/simple_animal/rogue/farm/goat.dm index 9ac0c3ab2ed..e9652a840ee 100644 --- a/code/modules/mob/living/simple_animal/rogue/farm/goat.dm +++ b/code/modules/mob/living/simple_animal/rogue/farm/goat.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/hostile/retaliate/rogue/goat/Initialize() - ..() + . = ..() GLOB.farm_animals++ /mob/living/simple_animal/hostile/retaliate/rogue/goat/Destroy() @@ -244,7 +244,7 @@ D.set_vehicle_dir_layer(WEST, OBJ_LAYER) /mob/living/simple_animal/hostile/retaliate/rogue/goatmale/Initialize() - ..() + . = ..() GLOB.farm_animals++ /mob/living/simple_animal/hostile/retaliate/rogue/goatmale/Destroy() diff --git a/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm b/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm index 3acfba1f384..b037e57d104 100644 --- a/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm +++ b/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm @@ -154,7 +154,7 @@ return FALSE /mob/living/simple_animal/hostile/retaliate/rogue/Initialize() - ..() + . = ..() if(milkies) udder = new() if(tame) @@ -179,9 +179,8 @@ ..() /mob/living/simple_animal/hostile/retaliate/rogue/Destroy() - qdel(udder) - udder = null - ..() + QDEL_NULL(udder) + return ..() /mob/living/simple_animal/hostile/retaliate/rogue/Life() . = ..() diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index 88f45e5258b..3f044f2f574 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -73,8 +73,8 @@ if(C && C.powernet) C.powernet.add_machine(src) //Nice we're in. powernet = C.powernet - below = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_below(T)) - above = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_above(T)) + below = locate(/obj/machinery/power/deck_relay) in(GET_TURF_BELOW(T)) + above = locate(/obj/machinery/power/deck_relay) in(GET_TURF_ABOVE(T)) if(below || above) icon_state = "cablerelay-on" return TRUE diff --git a/code/modules/procedural_mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm index d7399909a94..01328f0d757 100644 --- a/code/modules/procedural_mapping/mapGeneratorModule.dm +++ b/code/modules/procedural_mapping/mapGeneratorModule.dm @@ -24,9 +24,13 @@ /datum/mapGeneratorModule/proc/generate() if(!mother) return + excluded_turfs = typecacheof(excluded_turfs) + allowed_turfs = typecacheof(allowed_turfs) + allowed_areas = typecacheof(allowed_areas, only_root_path = !include_subtypes) var/list/map = mother.map for(var/turf/T in map) place(T) + CHECK_TICK //Place a spawnable atom or turf on this turf @@ -36,27 +40,16 @@ var/clustering = 0 var/skipLoopIteration = FALSE - if(T.type in excluded_turfs) + if(excluded_turfs[T.type]) return - if(allowed_turfs.len) - if(!(T.type in allowed_turfs)) - return + if(length(allowed_turfs) && !allowed_turfs[T.type]) + return - if(allowed_areas.len) + if(length(allowed_areas)) var/area/A = get_area(T) - if(A) - if(include_subtypes) - var/found - for(var/AT in allowed_areas) - if(istype(A, AT)) - found = TRUE - break - if(!found) - return - else - if(!(A.type in allowed_areas)) - return + if(!allowed_areas[A.type]) + return //Turfs don't care whether atoms can be placed here for(var/turfPath in spawnableTurfs) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 70b73ff5af4..3d213acc160 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -55,7 +55,7 @@ show_when_dead = FALSE /atom/movable/screen/fullscreen/weedsm/Initialize() - ..() + . = ..() // if(L.has_status_effect(/datum/status_effect/buff/weed)) filters += filter(type="angular_blur",x=5,y=5,size=1) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 2daf62c4b54..59a467f6af7 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -130,13 +130,22 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) if(!operating) return use_power(6) - affecting = loc.contents - src // moved items will be all in loc - addtimer(CALLBACK(src, PROC_REF(convey), affecting), 1) - -/obj/machinery/conveyor/proc/convey(list/affecting) - for(var/atom/movable/A in affecting) - if((A.loc == loc) && A.has_gravity()) - A.ConveyorMove(movedir) + if(!isturf(loc)) // We're nowhere! + return + var/turf/turf_loc = loc + var/list/cached_contents = loc.contents - src - turf_loc.lighting_object + if(!length(cached_contents)) // nothing to convey, don't waste time creating a timer! + return + // This is on a one-decisecond delay to prevent conveyors from chaining movement into each other. + addtimer(CALLBACK(src, PROC_REF(convey), cached_contents), 0.1 SECONDS) + +/obj/machinery/conveyor/proc/convey(list/atom/movable/cached_contents) + for(var/atom/movable/A as anything in cached_contents) + if(A == src) + continue + if(A.anchored) + continue + A.ConveyorMove(movedir) // attack with item, place item on conveyor /obj/machinery/conveyor/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/recycling/disposal/multiz.dm b/code/modules/recycling/disposal/multiz.dm index fe94926b967..5e26cabc8ce 100644 --- a/code/modules/recycling/disposal/multiz.dm +++ b/code/modules/recycling/disposal/multiz.dm @@ -19,9 +19,9 @@ if(multiz_dir) //Are we a trunk that goes up? Or down? var/turf/T = null if(multiz_dir == MULTIZ_PIPE_UP) - T = SSmapping.get_turf_above(get_turf(src)) //Get the turf above us + T = GET_TURF_ABOVE(get_turf(src)) //Get the turf above us if(multiz_dir == MULTIZ_PIPE_DOWN) - T = SSmapping.get_turf_below(get_turf(src)) + T = GET_TURF_BELOW(get_turf(src)) if(!T) expel(H) return //Nothing located. diff --git a/code/modules/roguetown/roguemachine/throne.dm b/code/modules/roguetown/roguemachine/throne.dm index a13a21457c8..81f72ebed59 100644 --- a/code/modules/roguetown/roguemachine/throne.dm +++ b/code/modules/roguetown/roguemachine/throne.dm @@ -25,7 +25,7 @@ GLOBAL_VAR(king_throne) M.reset_offsets("bed_buckle") /obj/structure/roguethrone/Initialize() - ..() + . = ..() if(GLOB.king_throne == null) GLOB.king_throne = src if(GLOB.lordprimary) diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index 8c7b376d005..6057fe9b64a 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -22,7 +22,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) switch(level) if(SEC_LEVEL_GREEN) minor_announce(CONFIG_GET(string/alert_green), "Attention! Security level lowered to green:") - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) + if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)) if(GLOB.security_level >= SEC_LEVEL_RED) SSshuttle.emergency.modTimer(4) else @@ -34,11 +34,11 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) if(SEC_LEVEL_BLUE) if(GLOB.security_level < SEC_LEVEL_BLUE) minor_announce(CONFIG_GET(string/alert_blue_upto), "Attention! Security level elevated to blue:",1) - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) + if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)) SSshuttle.emergency.modTimer(0.5) else minor_announce(CONFIG_GET(string/alert_blue_downto), "Attention! Security level lowered to blue:") - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) + if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)) SSshuttle.emergency.modTimer(2) GLOB.security_level = SEC_LEVEL_BLUE for(var/obj/machinery/firealarm/FA in GLOB.machines) @@ -47,7 +47,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) if(SEC_LEVEL_RED) if(GLOB.security_level < SEC_LEVEL_RED) minor_announce(CONFIG_GET(string/alert_red_upto), "Attention! Code red!",1) - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) + if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)) if(GLOB.security_level == SEC_LEVEL_GREEN) SSshuttle.emergency.modTimer(0.25) else @@ -63,7 +63,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) pod.admin_controlled = 0 if(SEC_LEVEL_DELTA) minor_announce(CONFIG_GET(string/alert_delta), "Attention! Delta security level reached!",1) - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) + if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)) if(GLOB.security_level == SEC_LEVEL_GREEN) SSshuttle.emergency.modTimer(0.25) else if(GLOB.security_level == SEC_LEVEL_BLUE) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 49fe4135bd9..e5f58872841 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -263,7 +263,7 @@ . |= BODYPART_LIFE_UPDATE_HEALTH /obj/item/bodypart/Initialize() - ..() + . = ..() update_HP() /obj/item/bodypart/proc/update_HP() diff --git a/code/modules/underworld/underworld.dm b/code/modules/underworld/underworld.dm index 0653cf17991..fd0aea27f60 100644 --- a/code/modules/underworld/underworld.dm +++ b/code/modules/underworld/underworld.dm @@ -29,7 +29,7 @@ density = TRUE /obj/structure/underworld/carriageman/Initialize() - ..() + . = ..() set_light(5, 30, LIGHT_COLOR_BLUE) /obj/structure/underworld/carriageman/attack_hand(mob/living/carbon/spirit/user) @@ -149,7 +149,7 @@ /obj/structure/underworld/carriage/Initialize() - ..() + . = ..() set_light(5, 30, LIGHT_COLOR_BLUE) /obj/structure/underworld/carriage/attack_hand(mob/living/carbon/spirit/user) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 7ed0f86c80e..c6b5b115aa1 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -137,6 +137,7 @@ "Fool!", "You will pay, with your blood!", ) + punish_attacking = TRUE var/patrol = TRUE var/lastpatroltime @@ -161,41 +162,65 @@ var/list/suitable_locations = list() // Collect all nearby stone road tiles - for(var/turf/T in world) - if((!istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/floor/rogue/dirt) && !istype(T, /turf/open/floor/rogue/grass) && !istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/lava) && !istype(T, /turf/open/lava/acid)) && get_dist(src, T) < 12) // Adjust distance as needed - suitable_locations += T + // Adjust distance as needed, please keep it relatively low + var/const/search_distance = 12 // allow them to move slightly out of their view range + // It's genuinely faster to do three separate checks because BYOND does internal optimizations for it + for(var/turf/open/floor/rogue/blocks/T in range(search_distance)) + suitable_locations += T + for(var/turf/open/floor/rogue/cobble/T in range(search_distance)) + suitable_locations += T + for(var/turf/open/floor/rogue/cobblerock/T in range(search_distance)) + suitable_locations += T // Randomly select one of the suitable locations - if(suitable_locations.len) - return pick(suitable_locations) + return safepick(suitable_locations) - return null +// working on fixing this, it's much better than the above system +// - ophelia //this does not work for some reason unfortunately /* /mob/living/carbon/human/species/human/smartnpc/townguard/npc_idle() + var/static/foliage_turfs // turf types we shouldn't move to as a fallback + if(!foliage_turfs) + foliage_turfs = typecacheof(list(/turf/open/floor/rogue/dirt, /turf/open/floor/rogue/grass)) . = ..() + if(mobility_flags & MOBILITY_MOVE || !isturf(loc) || !patrol) + return //im not smart enough to make a good patrol system but here. - if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && patrol) - if(prob(20)) - if(world.time > lastpatroltime + 10 SECONDS) //give em some time to reach and whatever - var/foundpatrolpoints - for(var/obj/effect/landmark/townpatrol/patrolpoint in orange(30,src)) - foundpatrolpoints += patrolpoint - if(foundpatrolpoints) - var/pickedpoint = get_closest_atom(/obj/effect/landmark/townpatrol, foundpatrolpoints, src) - if(pickedpoint) - walk2derpless(pickedpoint) - lastpatroltime = world.time - else - //make them randomly go to a distant tile thats not foilage, if there is no patrol landmark around - var/turf/open/T = oview(pick(13,24),src) - if(!istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/floor/rogue/dirt) && !istype(T, /turf/open/floor/rogue/grass)) - walk2derpless(T) + if(prob(20) && world.time > lastpatroltime + 10 SECONDS) //give em some time to reach and whatever + var/obj/effect/landmark/townpatrol/closest_point + var/min_distance = INFINITY + for(var/obj/effect/landmark/townpatrol/patrolpoint in GLOB.patrol_points) + var/candidate_dist = get_dist(src, patrolpoint) + if(candidate_dist < 1 || candidate_dist > 30) // too close or too far away + continue + if(candidate_dist < min_distance) + min_distance = candidate_dist + closest_point = patrolpoint + if(closest_point) + walk2derpless(pickedpoint) + lastpatroltime = world.time + else // this is expensive but should be a last resort for if they've been dragged off to the woods or something + //make them randomly go to a distant tile thats not foilage, if there is no patrol landmark around + var/turf/open/T = oview(rand(13,24),src) + if(!isgroundlessturf(T) && !foliage_turfs) + if(!istype(T, /turf/open/transparent/openspace) && !istype(T, /turf/open/floor/rogue/dirt) && !istype(T, /turf/open/floor/rogue/grass)) + walk2derpless(T) +*/ +// Currently unused pending map changes. +GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) /obj/effect/landmark/townpatrol name = "patrol-point" -*/ + +/obj/effect/landmark/townpatrol/Initialize() + . = ..() + GLOB.patrol_points += src + +/obj/effect/landmark/townpatrol/Destroy() + GLOB.patrol_points -= src + return ..() /mob/living/carbon/human/species/human/smartnpc/townguard/brute diff --git a/roguetown.dme b/roguetown.dme index ae5141286dc..74c4bef8b0d 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -59,6 +59,7 @@ #include "code\__DEFINES\lighting.dm" #include "code\__DEFINES\logging.dm" #include "code\__DEFINES\machines.dm" +#include "code\__DEFINES\mapping.dm" #include "code\__DEFINES\maps.dm" #include "code\__DEFINES\materials.dm" #include "code\__DEFINES\maths.dm" @@ -75,6 +76,7 @@ #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" #include "code\__DEFINES\movespeed_modification.dm" +#include "code\__DEFINES\multiz.dm" #include "code\__DEFINES\musicsystem.dm" #include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" From 8e6889639c7a903e55274cac6f38da51f9a957a5 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:04:14 +0300 Subject: [PATCH 076/192] Update vampirelord.dm --- code/modules/antagonists/roguetown/villain/vampirelord.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm index 549a76e324f..17a483c8b87 100644 --- a/code/modules/antagonists/roguetown/villain/vampirelord.dm +++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm @@ -73,7 +73,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) ADD_TRAIT(owner.current, TRAIT_VAMPMANSION, "[type]") ADD_TRAIT(owner.current, TRAIT_TOXIMMUNE, "[type]") ADD_TRAIT(owner.current, TRAIT_STEELHEARTED, "[type]") - owner.current.faction = list("undead") + owner.current.faction = list("undead") for(var/obj/structure/fluff/traveltile/vampire/tile in GLOB.traveltiles) tile.show_travel_tile(owner.current) owner.current.cmode_music = 'sound/music/combat_vamp.ogg' From 26640e92acbe667c07f4fd9e2783ef3e704da13d Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:05:00 +0300 Subject: [PATCH 077/192] Update unspecial.dm --- modular_stonehedge/code/datums/traits/unspecial.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index c28f43ecbba..98f97d03542 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -29,7 +29,7 @@ /datum/quirk/curseofcain name = "Flawed Immortality" - desc = "I don't need to eat or breathe anymore... Is this normal?" + desc = "I don't need to eat, sleep or breathe anymore... Is this normal?" value = 5 /datum/quirk/curseofcain/on_spawn() From 40fbbb12638b48abfa6e5d7ae4f4e04a56ae462a Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:12:19 +0300 Subject: [PATCH 078/192] Update friendly_npc.dm --- .../mob/living/simple_animal/rogue/friendly_npc.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index c6b5b115aa1..c9d6971a899 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -49,7 +49,7 @@ return FALSE if(L.lying && !L.get_active_held_item()) - if(ishuman(L)) + if(ishuman(L) && L.mind) var/mob/living/carbon/human/badboi = L if(badboi == lasthitter && Adjacent(badboi) && !badboi.handcuffed) //untested but yeah. @@ -237,6 +237,7 @@ GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) lasthitter = target .=..() if(target) + wander = TRUE if(target == newtarg) linepoint(target) if(ishuman(target) && Adjacent(target)) @@ -249,9 +250,9 @@ GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) say(pick("Sit the fuck down.", "Fuck away from me.", "Stay down.")) visible_message(span_emote("[src] bashes [target] away!")) playsound(src,"punch_hard",100,TRUE) + target.throw_at(target, pick(1,3), 1, src, FALSE, TRUE) target.Knockdown(25) //may end up getting you tied real fast. - target.throw_at(target, pick(2,3), 1, src, FALSE, TRUE) - else if(prob(5) && target.get_active_held_item()) + else if(prob(5) && target.get_active_held_item() != null) var/obj/item/activeitem = target.get_active_held_item() if(!HAS_TRAIT(activeitem, TRAIT_NODROP)) say(pick("You are done.", "Ha! There goes your [activeitem.name]!", "You fucked up now!")) @@ -259,7 +260,7 @@ GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) playsound(src,"bladedmedium",100,TRUE) target.OffBalance(15) target.throw_at(activeitem, get_step_away(activeitem, target, 3), 1, target, TRUE, FALSE) - if(punish_attacking) + if(punish_attacking && target.mind) var/bounty_exists = FALSE for(var/datum/bounty/b in GLOB.head_bounties) if(b.target == target.real_name) From be3ebde4122d1111d2f79454f9d55f47e45e688b Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:24:58 +0300 Subject: [PATCH 079/192] Update genitals.dm --- code/modules/surgery/organs/feature_organs/genitals.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/surgery/organs/feature_organs/genitals.dm b/code/modules/surgery/organs/feature_organs/genitals.dm index 3c3e7838bc3..b37f421608d 100644 --- a/code/modules/surgery/organs/feature_organs/genitals.dm +++ b/code/modules/surgery/organs/feature_organs/genitals.dm @@ -175,6 +175,7 @@ refilling = TRUE hungerhelp = FALSE //balls dont be dry if you starve reagent_generate_rate = 0.2 + storage_per_size = 30 //3 times the normal since they have only 3 size options organ_sizeable = TRUE altnames = list("balls", "testicles", "testes", "orbs", "cum tanks", "seed tanks") //used in thought messages. startsfilled = TRUE From fbfc4546fd8f842f6e821df3ff88066aa817f3b6 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:32:19 +0300 Subject: [PATCH 080/192] adds town patrol points --- _maps/map_files/dreamhold/Dreamhold.dmm | 46 +++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 5dfb3620f84..336c10c8d93 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -7458,6 +7458,13 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"fDe" = ( +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "fDk" = ( /obj/structure/spider/stickyweb, /turf/open/floor/rogue/dirt, @@ -13199,6 +13206,13 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"kfa" = ( +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kfO" = ( /obj/structure/flora/roguegrass/bush, /obj/machinery/light/rogue/wallfire/candle/blue, @@ -26762,6 +26776,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"uyo" = ( +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "uyu" = ( /obj/item/natural/rock/gem, /turf/open/floor/rogue/naturalstone, @@ -28591,6 +28611,12 @@ }, /turf/open/floor/rogue/carpet, /area/rogue/indoors/shelter/town) +"vYY" = ( +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "vYZ" = ( /obj/structure/flora/roguegrass/water/reeds, /obj/structure/flora/roguegrass/water/reeds, @@ -111028,7 +111054,7 @@ qJZ qJZ haD ycO -ycO +kfa ycO haD mYC @@ -116684,6 +116710,7 @@ qJZ tLk ucF beK +fDe beK beK beK @@ -116692,8 +116719,7 @@ beK beK beK beK -beK -beK +fDe beK beK beK @@ -122551,7 +122577,7 @@ qJZ qJZ qJZ beK -beK +fDe beK rLF aeO @@ -126551,7 +126577,7 @@ fqz kJr fqz fqz -fqz +uyo fqz fqz mfo @@ -128409,7 +128435,7 @@ beK beK beK beK -beK +fDe nFS qJZ ucZ @@ -129601,7 +129627,7 @@ xBY xBY xBY xBY -xBY +vYY agO beK beK @@ -129783,7 +129809,7 @@ sPO cMN fqz ixt -xBY +vYY xBY xBY xBY @@ -156827,7 +156853,7 @@ nPY sPO nPY fqz -fqz +uyo fqz wLq sPO @@ -161476,7 +161502,7 @@ fqz fqz fqz fqz -fqz +uyo fqz fqz fqz From d74c3028d1f100b9106fac21d33803cd15ad9168 Mon Sep 17 00:00:00 2001 From: Ghostcoffeee <66063955+Ghostcoffeee@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:10:44 +0200 Subject: [PATCH 081/192] OrganCapChange (#133) --- code/modules/surgery/organs/filling_organ.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/filling_organ.dm b/code/modules/surgery/organs/filling_organ.dm index c08fb06ca80..1ca2cf0f5a9 100644 --- a/code/modules/surgery/organs/filling_organ.dm +++ b/code/modules/surgery/organs/filling_organ.dm @@ -52,7 +52,7 @@ //updates size caps if(!issimple(H) && H.mind) var/athletics = H.mind?.get_skill_level(/datum/skill/misc/athletics) - var/captarget = max_reagents+(athletics*4) + var/captarget = max_reagents+(athletics*4)+(5+storage_per_size+(storage_per_size*organ_size)) // Updates the max_reagents in case the organ size changes if(damage) captarget -= damage if(contents.len) From af2c82724ae6f59a67c27258b40a0d740d05df07 Mon Sep 17 00:00:00 2001 From: DerFlammenwerfer <7h3ph4nt0m@gmail.com> Date: Thu, 28 Nov 2024 08:43:14 -0500 Subject: [PATCH 082/192] Expansion of Gravesinger, Part 1 (#134) * Expansion of Gravesinger, Part 1 * Update mask.dm * last minute tweaks * forgot to grant seance spell * missed a typo in seance * added a feedback if missing ashes * greater than colon hyphen left parenthesis --- code/__DEFINES/traits.dm | 3 +- code/controllers/subsystem/rogue/treasury.dm | 2 +- code/modules/clothing/rogueclothes/mask.dm | 8 +- code/modules/clothing/rogueclothes/wrists.dm | 4 +- code/modules/farming/tools.dm | 9 +- .../job_types/roguetown/church/mortician.dm | 60 ++++++---- code/modules/language/language_holder.dm | 3 + code/modules/mob/living/carbon/carbon.dm | 2 + .../modules/spells/roguetown/acolyte/necra.dm | 105 +++++++++++++++--- 9 files changed, 147 insertions(+), 49 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e9510ea0d24..9d96d9c56b8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -41,6 +41,7 @@ #define TRAIT_SEEDKNOW "Seed Knower" #define TRAIT_GOODRUNNER "Good Runner" #define TRAIT_TINY "Tiny" +#define TRAIT_SEESPIRITS "Spectral Sight" // ROGUEspecialTRAITS (description when rmb skills button) #define TRAIT_CIVILIZEDBARBARIAN "Tavern Brawler" #define TRAIT_COMICSANS "Annoying Face" @@ -195,7 +196,6 @@ GLOBAL_LIST_INIT(roguetraits, list( TRAIT_FIENDKISS = "When I cast projectile magic, the fiend also hurls a fire bolt at the same location.", // Hearthstone change TRAIT_CHARGER = "I can charge into people like a ram.", // Hearthstone change TRAIT_ARTIFICER = "I can use gems to improve items.", // Hearthstone change - TRAIT_BOG_TREKKING = "Expert in navigating these lands.", // Hearthstone change TRAIT_GOODRUNNER = span_info("I can run without breaking a sweat!"), TRAIT_NUDE_SLEEPER = span_warning("I can't fall asleep unless I'm nude and in bed."), @@ -204,6 +204,7 @@ GLOBAL_LIST_INIT(roguetraits, list( TRAIT_NIGHT_VISION = span_info("Whether because of my species, my career choice, or by some boon of my patron, my eyes have adapted to see well in the dark."), TRAIT_SUPER_NV = span_info("My ability to see in the dark extends further than that of most others, and I can consciously control how bright my surroundings appear to me."), TRAIT_BLINDFIGHTING = span_info("I have an incredible sense of awareness, allowing me to dodge and parry attacks even when I can't see them coming, If i am in high awareness, I can even prevent sneak attacks."), + TRAIT_SEESPIRITS = span_necrosis("My eyes peer beyond the veil of life and death, allowing me to perceive spirits."), )) // trait accessor defines diff --git a/code/controllers/subsystem/rogue/treasury.dm b/code/controllers/subsystem/rogue/treasury.dm index 19251c97272..be72cc58ea8 100644 --- a/code/controllers/subsystem/rogue/treasury.dm +++ b/code/controllers/subsystem/rogue/treasury.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(treasury) wait = 1 priority = FIRE_PRIORITY_WATER_LEVEL var/tax_value = 0.11 - var/queens_tax = 0.15 + var/queens_tax = 0.2 var/treasury_value = 0 var/list/bank_accounts = list() var/list/stockpile_datums = list() diff --git a/code/modules/clothing/rogueclothes/mask.dm b/code/modules/clothing/rogueclothes/mask.dm index 8c2240a422f..9d232395023 100644 --- a/code/modules/clothing/rogueclothes/mask.dm +++ b/code/modules/clothing/rogueclothes/mask.dm @@ -178,10 +178,10 @@ break_sound = 'sound/foley/breaksound.ogg' drop_sound = 'sound/foley/dropsound/gen_drop.ogg' resistance_flags = FIRE_PROOF - armor = list("blunt" = 10, "slash" = 40, "stab" = 40, "bullet" = 8, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - prevent_crits = null - flags_inv = HIDEFACE - body_parts_covered = FACE + armor = list("blunt" = 45, "slash" = 100, "stab" = 80, "bullet" = 20, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT) + flags_inv = HIDEFACE|HIDEFACIALHAIR + body_parts_covered = FACE|EYES|MOUTH|HEAD|HAIR block2add = FOV_BEHIND slot_flags = ITEM_SLOT_MASK|ITEM_SLOT_HIP experimental_onhip = TRUE diff --git a/code/modules/clothing/rogueclothes/wrists.dm b/code/modules/clothing/rogueclothes/wrists.dm index 5a5d62f0c4b..92e02aec177 100644 --- a/code/modules/clothing/rogueclothes/wrists.dm +++ b/code/modules/clothing/rogueclothes/wrists.dm @@ -24,7 +24,7 @@ armor = list("blunt" = 90, "slash" = 100, "stab" = 80, "bullet" = 100, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) blocksound = PLATEHIT - max_integrity = 150 + max_integrity = 450 anvilrepair = /datum/skill/craft/armorsmithing smeltresult = /obj/item/ingot/steel @@ -37,7 +37,7 @@ armor = list("blunt" = 70, "slash" = 90, "stab" = 60, "bullet" = 50, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) blocksound = PLATEHIT - max_integrity = 100 + max_integrity = 200 anvilrepair = /datum/skill/craft/armorsmithing smeltresult = /obj/item/ingot/iron diff --git a/code/modules/farming/tools.dm b/code/modules/farming/tools.dm index 1a68409f0c4..9d56466764a 100644 --- a/code/modules/farming/tools.dm +++ b/code/modules/farming/tools.dm @@ -383,8 +383,8 @@ /obj/item/rogueweapon/sickle/scythe force = 15 force_wielded = 25 - possible_item_intents = list(DAGGER_CUT) - gripped_intents = list(SPEAR_BASH,DAGGER_CUT) + possible_item_intents = list(/datum/intent/axe/cut) + gripped_intents = list(/datum/intent/axe/cut,/datum/intent/axe/chop/battle/scythe,SPEAR_BASH) name = "scythe" desc = "A curved blade used to sow harvest." icon_state = "scythe" @@ -400,8 +400,13 @@ slot_flags = ITEM_SLOT_BACK drop_sound = 'sound/foley/dropsound/wooden_drop.ogg' smeltresult = /obj/item/ingot/iron + wdefense = 6 improvised = TRUE +/datum/intent/axe/chop/battle/scythe + reach = 2 + swingdelay = 5 + /obj/item/rogueweapon/sickle/scythe/getonmobprop(tag) . = ..() if(tag) diff --git a/code/modules/jobs/job_types/roguetown/church/mortician.dm b/code/modules/jobs/job_types/roguetown/church/mortician.dm index 9f61291de1c..60048b363c1 100644 --- a/code/modules/jobs/job_types/roguetown/church/mortician.dm +++ b/code/modules/jobs/job_types/roguetown/church/mortician.dm @@ -9,55 +9,69 @@ allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_DIVINE_PATRONS //gets set to necra on the outfit anyways lol - tutorial = "As an acolyte of a death god, you have been given the honor and rites of putting the dead to rest instead of healing the living. Yamais bestows much wisdom in her reminders of our balance in life. Will you toil for her?" + tutorial = "The purpose of a Gravesinger, working on behalf of both the local temple and of the Adventurers' Guild, is two-fold. As a priest of Yamais, it is to be the shepard of spirits to their preferred destination, whether it be burial and reincarnation, or reanimated in their own body, restored and cured of decomposition. As an expert on the affairs of the dead, it is to assist Adventurers in locating missing or slain comrades and providing the testimony of the dead to the Hedgeknights. Additionally, you have some medical training and the tools to use them, along with the expectation that you should rescue the dying if you can." outfit = /datum/outfit/job/roguetown/undertaker display_order = JDO_GRAVEMAN give_bank_account = TRUE - min_pq = -5 + min_pq = 5 max_pq = null /datum/outfit/job/roguetown/undertaker - allowed_patrons = list(/datum/patron/divine/necra,/datum/patron/divine/pestra) + allowed_patrons = list(/datum/patron/divine/necra) -/datum/outfit/job/roguetown/undertaker/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/roguetown/undertaker/pre_equip(mob/living/carbon/human/H)//Updated to have medium armor, because they'll be at odds with Necromancers and likely be targeted by antags. ..() - head = /obj/item/clothing/head/roguetown/necrahood + head = /obj/item/clothing/head/roguetown/roguehood/surghood + mask = /obj/item/clothing/mask/rogue/skullmask neck = /obj/item/clothing/neck/roguetown/psicross/necra - cloak = /obj/item/clothing/cloak/raincloak/mortus - armor = /obj/item/clothing/suit/roguetown/shirt/robe/necra - shirt = /obj/item/clothing/suit/roguetown/armor/leather/vest/black - pants = /obj/item/clothing/under/roguetown/trou/leather/mourning - shoes = /obj/item/clothing/shoes/roguetown/boots - belt = /obj/item/storage/belt/rogue/leather/rope + gloves = /obj/item/clothing/gloves/roguetown/plate + cloak = /obj/item/clothing/cloak/templar/necra + wrists = /obj/item/clothing/wrists/roguetown/bracers + shirt = /obj/item/clothing/suit/roguetown/shirt/robe/surgrobe + armor = /obj/item/clothing/suit/roguetown/armor/plate/half + pants = /obj/item/clothing/under/roguetown/platelegs + shoes = /obj/item/clothing/shoes/roguetown/boots/armor + belt = /obj/item/storage/belt/rogue/leather/blackleather backl = /obj/item/storage/backpack/rogue/satchel - backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver =1, /obj/item/toy/cards/deck/tarot =1, /obj/item/scrying =1,) + backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver =1, /obj/item/toy/cards/deck/tarot =1, /obj/item/scrying =1, /obj/item/storage/fancy/skit =1, /obj/item/reagent_containers/glass/alembic =1) beltr = /obj/item/storage/belt/rogue/pouch/coins/poor - backr = /obj/item/rogueweapon/shovel - backl = /obj/item/rogueweapon/sickle/scythe - backl = /obj/item/storage/backpack/rogue/satchel + beltl = /obj/item/rogueweapon/shovel/small + backr = /obj/item/rogueweapon/sickle/scythe if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 5, TRUE)//So that they can be extra menacing with their scythe. H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 5, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) if(H.age == AGE_OLD) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE) - H.change_stat("strength", 1) + H.mind.adjust_skillrank(/datum/skill/magic/holy, 1, TRUE) + H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE) + H.change_stat("strength", 2) H.change_stat("constitution", 2) - H.change_stat("intelligence", -2) - H.change_stat("endurance", 1) - H.change_stat("speed", 1) + H.change_stat("endurance", 2) + H.change_stat("intelligence", 1) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/stable)//Spare the dying + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/purge) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/seance) + H.grant_language(/datum/language_holder/abyssal) + H.grant_language(/datum/language_holder/celestial) ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SOUL_EXAMINE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_SIXTHSENSE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_SEESPIRITS, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + H.update_sight() H.cmode_music = 'sound/music/combat_clergy.ogg' var/datum/devotion/C = new /datum/devotion(H, H.patron) C.grant_spells(H) diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 6e3f9577d4a..0fea056f545 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -142,3 +142,6 @@ /datum/language_holder/abyssal languages = list(/datum/language/hellspeak) + +/datum/language_holder/celestial + languages = list(/datum/language/celestial) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3142097ecdb..136544af21c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -730,6 +730,8 @@ /mob/living/carbon/update_sight() if(!client) return + if(HAS_TRAIT(src, TRAIT_SEESPIRITS))//DK Change + see_invisible = SEE_INVISIBLE_OBSERVER // if(stat == DEAD) // sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) // see_in_dark = 8 diff --git a/code/modules/spells/roguetown/acolyte/necra.dm b/code/modules/spells/roguetown/acolyte/necra.dm index dcd688484f7..58fc9dc7ebd 100644 --- a/code/modules/spells/roguetown/acolyte/necra.dm +++ b/code/modules/spells/roguetown/acolyte/necra.dm @@ -30,6 +30,55 @@ return to_chat(user, span_red("I failed to perform the rites.")) +/obj/effect/proc_holder/spell/targeted/seance + name = "Seance" + range = 5 + overlay_state = "consecrateburial" + releasedrain = 30 + charge_max = 30 SECONDS + req_items = list(/obj/item/clothing/neck/roguetown/psicross) + max_targets = 0 + cast_without_targets = TRUE + sound = 'sound/magic/churn.ogg' + associated_skill = /datum/skill/magic/holy + invocation = "With ashes do I annoint the eyes and ears of those around me and allow them to commune with the dead." + invocation_type = "shout" //can be none, whisper, emote and shout + miracle = TRUE + devotion_cost = 50 + +/obj/effect/proc_holder/spell/targeted/seance/cast(list/targets, mob/user = usr) + . = ..() + var/requirement = FALSE + var/sacrifice + for(var/obj/item/I in user.held_items) + if(istype(I, /obj/item/ash)) + requirement = TRUE + sacrifice = I + qdel(sacrifice) + if(requirement == TRUE) + for(var/mob/living/carbon/human/person in view(2)) + if(person == user) + user.visible_message("[user] scatters the [sacrifice]", "I scatter the [sacrifice]!") + else + add_buff_timer(person) + else + to_chat(user, span_warning("I need to be holding ashes in my hand to cast this.")) + +/obj/effect/proc_holder/spell/targeted/seance/proc/add_buff_timer(mob/living/user) + ADD_TRAIT(user, TRAIT_SEESPIRITS, MAGIC_TRAIT) + ADD_TRAIT(user, TRAIT_SIXTHSENSE, MAGIC_TRAIT) + user.grant_language(/datum/language_holder/abyssal) + user.update_sight() + addtimer(CALLBACK(src, PROC_REF(remove_buff), user), wait = 5 MINUTES) + to_chat(user, span_notice("My eyes and ears become aware of the spectral.")) + +/obj/effect/proc_holder/spell/targeted/seance/proc/remove_buff(mob/living/user) + REMOVE_TRAIT(user, TRAIT_SEESPIRITS, MAGIC_TRAIT) + REMOVE_TRAIT(user, TRAIT_SIXTHSENSE, MAGIC_TRAIT) + user.remove_language(/datum/language_holder/abyssal) + user.update_sight() + to_chat(user, span_warning("My eyes and ears grow blind to the spectral.")) + /obj/effect/proc_holder/spell/targeted/churn name = "Churn Undead" range = 2 @@ -84,7 +133,7 @@ return TRUE /obj/effect/proc_holder/spell/targeted/soulspeak - name = "Speak with Dead" + name = "Summon Spirit" range = 5 overlay_state = "speakwithdead" releasedrain = 30 @@ -94,12 +143,30 @@ cast_without_targets = TRUE sound = 'sound/magic/churn.ogg' associated_skill = /datum/skill/magic/holy - invocation = "oriri mortuus spiritus." + invocation = "Oriri mortuus spiritus." invocation_type = "whisper" //can be none, whisper, emote and shout miracle = FALSE devotion_cost = 0 + var/summoned_spirit /obj/effect/proc_holder/spell/targeted/soulspeak/cast(list/targets,mob/user = usr) + if(summoned_spirit) + var/mob/living/carbon/spirit/SS = summoned_spirit + to_chat(user, "You dismiss the spirit to the underworld.") + to_chat(SS, "[user.real_name] returns you to the underworld. If you are wrongfully denied your reward by your summoner, please open a ticket.") + for(var/obj/effect/landmark/underworld/A in GLOB.landmarks_list) + for(var/obj/item/I in SS.held_items) + if(!istype(I, /obj/item/roguecoin/silver) || !istype(I, /obj/item/flashlight/lantern/shrunken)) + . |= SS.dropItemToGround(I) + if(istype(I, /obj/item/roguecoin/silver)) + to_chat(SS, "As you return across the veil to the underworld, the silver coin in your hand is transformed.") + var/obj/item/underworld/coin/C = new + SS.put_in_hand(C) + SS.loc = A.loc + SS.invisibility = initial(SS.invisibility) + user.remove_language(/datum/language_holder/abyssal) + summoned_spirit = null + return var/mob/living/carbon/spirit/capturedsoul = null var/list/souloptions = list() var/list/itemstorestore = list() @@ -110,12 +177,14 @@ return for(var/mob/living/carbon/spirit/P in GLOB.carbon_list) if(P.livingname == pickedsoul) - to_chat(P, "You feel yourself being pulled out of the underworld.") + to_chat(P, "You feel yourself being summoned to a Gravesinger.") sleep(2 SECONDS) P.loc = user.loc + user.say("I call upon the soul of [P.livingname] to become corporeal and walk this world for a time. In return for your obediance, I offer the choice of reincarnation by paying your toll in silver, or the choice of reanimation, by returning your body to life.", language = /datum/language/common, forced = "invocation") capturedsoul = P - P.invisibility = INVISIBILITY_OBSERVER - user.grant_language(/datum/language_holder/abyssal) + summoned_spirit = capturedsoul + P.invisibility = 0 +/* for(var/obj/item/I in P.held_items) // this is big ass, will revisit later . |= P.dropItemToGround(I) if(istype(I, /obj/item/underworld/coin)) @@ -123,22 +192,26 @@ if(istype(I, /obj/item/flashlight/lantern/shrunken)) itemstorestore |= "lamp" qdel(I) +*/ break to_chat(P, "[itemstorestore]") if(capturedsoul) - spawn(2 MINUTES) - to_chat(user, "The soul returns to the underworld.") - to_chat(capturedsoul, "You feel yourself being pulled back to the underworld.") + spawn(60 MINUTES) + to_chat(user, "The soul returns to the underworld as your spell expires.") + to_chat(capturedsoul, "You feel yourself being pulled to the underworld as your summoner's spell expires. The carriage awaits, if your summoner") for(var/obj/effect/landmark/underworld/A in GLOB.landmarks_list) capturedsoul.loc = A.loc capturedsoul.invisibility = initial(capturedsoul.invisibility) - for(var/I in itemstorestore) - if(I == "token") + for(var/obj/item/I in capturedsoul.held_items) + if(istype(I, /obj/item/roguecoin/silver)) + qdel(I) + to_chat(capturedsoul, "As you return across the veil to the underworld, the silver coin in your hand is transformed.") var/obj/item/underworld/coin/C = new capturedsoul.put_in_hands(C) - if(I == "lamp") - var/obj/item/flashlight/lantern/shrunken/L = new - capturedsoul.put_in_hands(L) - user.remove_language(/datum/language_holder/abyssal) - to_chat(user, "I feel a cold chill run down my spine, a presence has arrived.") - capturedsoul.Paralyze(1200) + if(istype(I, /obj/item/flashlight/lantern/shrunken)) + return + else + . |= capturedsoul.dropItemToGround(I) + summoned_spirit = null + to_chat(user, "I feel a cold chill run down my spine; the spirit has arrived.") + capturedsoul.Immobilize(10 SECONDS) From 537119cd65d61046ed4335071fbe802ae043c2e3 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 16:52:29 +0300 Subject: [PATCH 083/192] pain --- _maps/map_files/dreamhold/Dreamhold.dmm | 107 ++++++------------ code/game/gamemodes/roguetown/roguetown.dm | 2 +- .../objects/items/rogueweapons/rmb_intents.dm | 4 +- .../adventurer/types/combat/rogue.dm | 8 +- .../job_types/roguetown/garrison/bogguard.dm | 4 +- code/modules/roguetown/roguemachine/bounty.dm | 33 ++++++ code/testing.dm | 1 + .../simple_animal/rogue/friendly_npc.dm | 28 +++-- 8 files changed, 99 insertions(+), 88 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 336c10c8d93..7bd98e12478 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -647,10 +647,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"azG" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard, -/turf/open/floor/rogue/cobble/mossy, -/area/rogue/outdoors/river) "azR" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -9128,7 +9124,6 @@ /obj/machinery/light/rogue/lanternpost{ dir = 1 }, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null @@ -10473,7 +10468,6 @@ /obj/machinery/light/rogue/torchholder{ dir = 4 }, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -14542,13 +14536,6 @@ "lfk" = ( /obj/machinery/light/rogue/lanternpost, /turf/open/floor/rogue/cobblerock, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" - }) -"lfB" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard, -/turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -15624,18 +15611,6 @@ /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) -"maS" = ( -/obj/structure/fluff/railing/wood{ - dir = 1; - layer = 2.7; - pixel_x = 2; - pixel_y = 7 - }, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/ruinedwood/herringbone, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "mba" = ( /obj/structure/roguetent, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -16702,8 +16677,9 @@ /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) "mOd" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard, -/turf/open/floor/rogue/dirt/road, +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge" }) @@ -17696,11 +17672,10 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "nBi" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/grass, +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, +/turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" + first_time_text = "Stonehedge" }) "nBZ" = ( /obj/structure/chair/wood/rogue{ @@ -18344,15 +18319,13 @@ /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/exposed/tavern) "nYE" = ( -/obj/structure/fluff/railing/wood{ - dir = 1; - layer = 2.7; - pixel_x = 2; - pixel_y = 7 - }, +/obj/structure/flora/grass/jungle/b, /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/twig, -/area/rogue/outdoors/river) +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "nYV" = ( /obj/structure/flora/newleaf{ icon_state = "center-leaf2" @@ -24196,8 +24169,9 @@ first_time_text = "The Twilight Woods" }) "sCW" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/brute, -/turf/open/floor/rogue/cobblerock, +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge" }) @@ -26579,11 +26553,10 @@ name = "Shores of the Emerald Coast" }) "usY" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/mob/living/carbon/human/species/human/smartnpc/townguard, +/turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" + first_time_text = "Stonehedge" }) "utn" = ( /obj/structure/rack/rogue, @@ -29095,12 +29068,6 @@ /obj/item/bedsheet/rogue/double_pelt, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) -"wxI" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "wxO" = ( /obj/structure/rack/rogue/shelf, /obj/structure/table/wood{ @@ -113679,7 +113646,7 @@ qJZ qJZ qMs haD -lfB +ycO ycO ycO haD @@ -116521,7 +116488,7 @@ nEK beK beK beK -lCr +beK vjX lfk beK @@ -119747,7 +119714,7 @@ sfZ ycO qJZ vmN -nBi +qJZ beK beK beK @@ -120149,7 +120116,7 @@ sfZ guW wsc voH -tac +nYE ycO ycO nFS @@ -126375,7 +126342,7 @@ fqz kJr kjF aGY -fqz +cpy nhG fqz dKA @@ -126777,11 +126744,11 @@ fqz fqz fqz nrx +cpy fqz fqz fqz -fqz -fqz +nBi vil foY vVw @@ -126980,7 +126947,7 @@ sjb nZO kIc bGw -azG +pbG pbG pbG waZ @@ -127586,7 +127553,7 @@ rps rps reQ rps -nYE +rth buM buM vwh @@ -130010,10 +129977,10 @@ bjQ hif fqz aJC -mOd +yls qoW jCl -sCW +xBY xBY xBY eYD @@ -130032,7 +129999,7 @@ qhI pwR oea pwR -usY +nFS rLF nFS beK @@ -157053,11 +157020,11 @@ rfD edm uxu uxu -nPY +mOd dKA fqz fqz -wxI +sPO sPO wLq sPO @@ -158267,7 +158234,7 @@ nPY ulr cMY fqz -cpy +fqz fqz nPY kLn @@ -161293,7 +161260,7 @@ xOB xBY xBY xBY -xBY +usY rWq lJD fqz @@ -161496,7 +161463,7 @@ xBY xBY qCV qCV -cpy +fqz fqz fqz fqz @@ -162110,7 +162077,7 @@ fqz fqz fqz fqz -qnW +sCW nnZ xBY sPO @@ -162712,7 +162679,7 @@ bcc bcc bcc bcc -maS +jCG vMS vMS vMS diff --git a/code/game/gamemodes/roguetown/roguetown.dm b/code/game/gamemodes/roguetown/roguetown.dm index 12b7a35d508..546a97ab58e 100644 --- a/code/game/gamemodes/roguetown/roguetown.dm +++ b/code/game/gamemodes/roguetown/roguetown.dm @@ -413,7 +413,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E "Consort", "Archpriest", "Wytcher", - "Hedgeknight", + "Hedge Knight", "Hedgemaster", "Royal Guard", "Gravesinger", diff --git a/code/game/objects/items/rogueweapons/rmb_intents.dm b/code/game/objects/items/rogueweapons/rmb_intents.dm index 6964ff28e0a..ddb03aa79e9 100644 --- a/code/game/objects/items/rogueweapons/rmb_intents.dm +++ b/code/game/objects/items/rogueweapons/rmb_intents.dm @@ -10,7 +10,7 @@ return if(user.incapacitated()) return - var/mob/living/L = target + var/mob/living/carbon/human/L = target user.changeNext_move(CLICK_CD_RAPID) playsound(user, 'sound/combat/feint.ogg', 100, TRUE) user.visible_message(span_danger("[user] feints an attack at [target]!")) @@ -39,6 +39,8 @@ L.Immobilize(30) to_chat(user, span_notice("[L] is tripped up by my combat maneuver and momentarily stunned!")) user.apply_status_effect(/datum/status_effect/debuff/feintcd) + L.target = user + L.retaliate(user) else to_chat(user, span_warning("[L] avoids my trip maneuver... 80%")) return diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm index fd2621d23a0..e106f3cc4b8 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm @@ -89,7 +89,7 @@ ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC) H.change_stat("perception", 2) - H.change_stat("speed", 2) + H.change_stat("speed", 3) H.change_stat("intelligence", 2) //Assassin, nearly same as rogue but not versatile in weapon skills yet specialized in knives. @@ -132,7 +132,7 @@ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //they are killers ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) H.change_stat("perception", 2) - H.change_stat("speed", 2) + H.change_stat("speed", 3) H.change_stat("intelligence", 2) H.visible_message(span_info("I honed my skills as an assassin through the years. My bracers have a hidden blade, and my boots have a bottle of berry poison.")) backpack_contents = list(/obj/item/lockpickring/mundane, /obj/item/rogueweapon/huntingknife/idagger/steel) @@ -182,7 +182,7 @@ ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) //extra damage to groin (dirty fighting) ADD_TRAIT(H, TRAIT_NOSEGRAB, TRAIT_GENERIC) //funny nose grab. H.change_stat("strength", 1) - H.change_stat("speed", 2) + H.change_stat("speed", 3) H.change_stat("perception", 1) H.change_stat("intelligence", 2) H.visible_message(span_info("I trained as a swashbuckler. I have some skills and tricks under my cape.")) @@ -222,7 +222,7 @@ ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC) H.change_stat("strength", -1) H.change_stat("perception", 2) - H.change_stat("speed", 2) + H.change_stat("speed", 3) H.change_stat("intelligence", 3) H.visible_message(span_info("I’m not just a thief. I'm a master of illusion and deception. One moment, I'm a harmless vagabond. The next, I'm a blur of motion, leaving my pursuers bewildered and outwitted.")) H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm index 168f7eb6ca8..24d9923bf36 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm @@ -14,7 +14,7 @@ whitelist_req = FALSE outfit = /datum/outfit/job/roguetown/bogguardsman give_bank_account = 60 - min_pq = 15 + min_pq = 0 max_pq = null cmode_music = 'sound/music/combat_bog.ogg' @@ -30,7 +30,7 @@ index = copytext(H.real_name, 1,index) if(!index) index = H.real_name - S.name = "Hedgeknight tabard ([index])" + S.name = "Hedge Knight tabard ([index])" /datum/outfit/job/roguetown/bogguardsman/pre_equip(mob/living/carbon/human/H) . = ..() diff --git a/code/modules/roguetown/roguemachine/bounty.dm b/code/modules/roguetown/roguemachine/bounty.dm index c0f22448217..c0012843622 100644 --- a/code/modules/roguetown/roguemachine/bounty.dm +++ b/code/modules/roguetown/roguemachine/bounty.dm @@ -27,6 +27,8 @@ // Main Menu var/list/choices = list("Consult bounties", "Set bounty") + if(user.job in list("Hedgemaster", "Hedge Knight")) + choices += "Remove bounty" var/selection = input(user, "The Excidium listens", src) as null|anything in choices switch(selection) @@ -37,6 +39,9 @@ if("Set bounty") set_bounty(H) + if("Remove bounty") + remove_bounty(H) + /obj/structure/roguemachine/bounty/attackby(obj/item/P, mob/user, params) if(!(ishuman(user))) return @@ -164,6 +169,34 @@ message_admins("[ADMIN_LOOKUPFLW(user)] has set a bounty on [ADMIN_LOOKUPFLW(target)] with the reason of: '[reason]'") +/obj/structure/roguemachine/bounty/proc/remove_bounty(mob/living/carbon/human/user) + var/list/eligible_players = list() + + if(user.mind.known_people.len) + for(var/datum/bounty/b in GLOB.head_bounties) + eligible_players += b.target + else + to_chat(user, span_warning("I don't know anyone.")) + return + var/mob/living/carbon/target = input(user, "Whose name shall be removed from the wanted list?", src) as null|anything in eligible_players + if(isnull(target)) + say("No target selected.") + return + + var/confirm = input(user, "Do you dare release this one?", src) as null|anything in list("Yes", "No") + if(isnull(confirm) || confirm == "No") return + for(var/datum/bounty/b in GLOB.head_bounties) + if(b.target == target.real_name) + GLOB.head_bounties -= b + + //Announce it locally and on scomm + playsound(src, 'sound/misc/machinetalk.ogg', 100, FALSE, -1) + var/bounty_announcement = "[target] is no longer wanted." + say(bounty_announcement) + scom_announce(bounty_announcement) + + message_admins("[ADMIN_LOOKUPFLW(user)] has removed a bounty on [ADMIN_LOOKUPFLW(target)]'") + /proc/add_bounty(target_realname, amount, bandit_status, reason, employer_name) var/datum/bounty/new_bounty = new /datum/bounty new_bounty.amount = amount diff --git a/code/testing.dm b/code/testing.dm index 1d44a88e0f5..d1f973f8109 100644 --- a/code/testing.dm +++ b/code/testing.dm @@ -15,3 +15,4 @@ #endif //#define WARTIME +#define FASTLOAD diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index c9d6971a899..2060ccd3101 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -11,7 +11,6 @@ possible_rmb_intents = list() erpable = TRUE wander = TRUE - d_intent = INTENT_DODGE show_genitals = TRUE var/list/friendlyfactions = list("Station", "neutral", "rogueanimal", "saiga", "chickens", "goats", "cows", "turtles", "rats", "crabs", "horse") //using friendlyjobs will make this mob hostile to everyone not of those jobs, unless they are in friendlyfactions. @@ -22,6 +21,8 @@ var/mob/living/lasthitter = null var/punish_attacking = FALSE +/mob/living/carbon/human/species/human/smartnpc/ + //would be great if we could make them follow stone roads while idle. /mob/living/carbon/human/species/human/smartnpc/should_target(mob/living/L) if(!L) @@ -30,6 +31,9 @@ if(L == src) return FALSE + if(L.job in list("Hedge Knight", "Hedgemaster")) + return + if(HAS_TRAIT(src, TRAIT_PACIFISM)) return FALSE @@ -54,10 +58,11 @@ if(badboi == lasthitter && Adjacent(badboi) && !badboi.handcuffed) //untested but yeah. say("I got you now, criminal scum.") - scom_announce("I caught the criminal scum [badboi.real_name] at [get_area_name(get_area(src))].") - var/obj/item/rope/ropey = new /obj/item/rope - ropey.apply_cuffs(badboi, src) - start_pulling(badboi, GRAB_AGGRESSIVE) + if(do_after_mob(src, badboi, 3 SECONDS, FALSE)) + scom_announce("I caught the criminal scum [badboi.real_name] at [get_area_name(get_area(src))].") + var/obj/item/rope/ropey = new /obj/item/rope + ropey.apply_cuffs(badboi, src) + start_pulling(badboi) return FALSE if(L == lasthitter && L.alpha > 100) return TRUE @@ -140,6 +145,7 @@ punish_attacking = TRUE var/patrol = TRUE var/lastpatroltime + var/last_report // Custom idle behavior @@ -230,7 +236,7 @@ GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) /mob/living/carbon/human/species/human/smartnpc/townguard/retaliate(mob/living/L) var/newtarg = target - if(L.job in list("Hedgeknight", "Hedgemaster")) + if(L.job in list("Hedge Knight", "Hedgemaster")) return if(lasthitter != target) say(pick(aggromessages)) @@ -244,6 +250,7 @@ GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) //i really REALLY want to punish players who try to strip those guys for loot, also they can do those badass moves on goblins too ig. if(prob(20) && !target.IsOffBalanced()) say(pick("Aha!", "Parry this!", "Ha-haa!")) + playsound(src, 'sound/combat/feint.ogg', 100, TRUE) visible_message(span_emote("[src] feints an attack at [target]!")) target.OffBalance(50) //since they cant defeat the parries might aswell give them a fat feint. else if(prob(10)) @@ -266,13 +273,14 @@ GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) if(b.target == target.real_name) bounty_exists = TRUE if(!bounty_exists) - add_bounty(L.real_name, 500, FALSE, "Attacking a town guardsman.", "Town of Stonehedge") - var/bounty_announcement = "[target] is accused of attacking a town guardsman at [get_area_name(get_area(src))], wanted with a bounty of 500 mammons." + add_bounty(L.real_name, 200, FALSE, "Attacking a town guardsman.", "Hedgeknights") + var/bounty_announcement = "[target.real_name] is accused of attacking a town guardsman at [get_area_name(get_area(src))], wanted with a bounty of 200 mammons." say("Stop right there, criminal scum!") scom_announce(bounty_announcement) to_chat(L, span_notice("I got a bounty on my head now!")) - else - scom_announce("the criminal [target] is reported attacking a townsguard at [get_area_name(get_area(src))].") + else if(world.time > (last_report + 3 MINUTES)) + last_report = world.time + scom_announce("the criminal [target.real_name] is reported attacking a townsguard at [get_area_name(get_area(src))].") /mob/living/carbon/human/species/human/smartnpc/townguard/Initialize() gender = pick(MALE,FEMALE) From 836c53454eab5a0cf1430ad243f2c36d2fa3452a Mon Sep 17 00:00:00 2001 From: Vide Noir <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:08:40 +0300 Subject: [PATCH 084/192] Revert "Add: Qdel maturity SQL query (#129)" (#135) This reverts commit 6de185f304fa3fb8cc2980c7cffdce37775b9b5f. --- .../code/modules/maturity-prompt/code/maturity_subsystem.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm b/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm index f6a3b41dc51..6dc43758da4 100644 --- a/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm +++ b/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm @@ -122,9 +122,7 @@ SUBSYSTEM_DEF(maturity_guard) // There should be only one, we're querying by the primary key; if it returns more than one row something is very wrong var/result = query_age_from_db.NextRow() if(result) - qdel(query_age_from_db) return query_age_from_db.item - qdel(query_age_from_db) return FALSE @@ -148,10 +146,8 @@ SUBSYSTEM_DEF(maturity_guard) ) if(!add_age_to_db.warn_execute()) - qdel(add_age_to_db) return FALSE - qdel(add_age_to_db) return TRUE // Logic inspired by S.P.L.U.R.T age_gate From 3136894a2a595f98d35a221051e25aac6da00670 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:26:02 +0300 Subject: [PATCH 085/192] Update Dreamhold.dmm --- _maps/map_files/dreamhold/Dreamhold.dmm | 47 +++++++------------------ 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 7bd98e12478..59ed4734a74 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -2905,7 +2905,6 @@ dir = 1 }, /obj/machinery/light/rogue/wallfire/candle/r, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) "cns" = ( @@ -2982,10 +2981,10 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) "cpy" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard, -/turf/open/floor/rogue/cobble/mossy, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" }) "cqm" = ( /obj/structure/table/wood{ @@ -5213,13 +5212,6 @@ "dVE" = ( /turf/closed/wall/shroud, /area/rogue/indoors/shelter/bog) -"dVP" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/twig/platform, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" - }) "dWh" = ( /obj/structure/flora/newbranch/connector{ icon_state = "center-leaf1" @@ -9145,7 +9137,6 @@ }) "hau" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -11049,6 +11040,7 @@ /obj/effect/decal/dirt{ dir = 4 }, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -20133,19 +20125,6 @@ }, /turf/open/floor/rogue/tile, /area/rogue/indoors/shelter/town) -"pEC" = ( -/obj/structure/fluff/railing/wood{ - dir = 1; - layer = 2.7; - pixel_x = 1; - pixel_y = 7 - }, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/twig/platform, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" - }) "pEJ" = ( /obj/effect/mob_spawner/wilderness, /turf/open/floor/rogue/grass, @@ -109605,7 +109584,7 @@ oZS mVp bbB miB -mVp +cpy ilr eHG ilr @@ -110616,9 +110595,9 @@ fbr kqH kqH ucF -pEC +qzW +jQX jQX -dVP bqG mYC mYC @@ -126342,7 +126321,7 @@ fqz kJr kjF aGY -cpy +fqz nhG fqz dKA @@ -126735,7 +126714,7 @@ oCe oCe gWL qGx -cpy +fqz fqz fqz dKA @@ -126744,7 +126723,7 @@ fqz fqz fqz nrx -cpy +fqz fqz fqz fqz @@ -129575,7 +129554,7 @@ nnZ qCV fhZ xBY -xBY +usY xBY xBY drI @@ -161260,7 +161239,7 @@ xOB xBY xBY xBY -usY +xBY rWq lJD fqz From d1594d50c4bba5aca8c263565dc40b656d8c94b0 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:51:55 +0300 Subject: [PATCH 086/192] unmeme --- .../mob/living/simple_animal/rogue/friendly_npc.dm | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 2060ccd3101..ac7d7dc2bfa 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -109,30 +109,18 @@ /mob/living/carbon/human/species/human/smartnpc/townguard friendlyfactions = list("Station", "neutral") calmmessages = list( - "Let me guess... someone stole your sweetroll.", - "I used to be an adventurer like you. Then I took an arrow in the knee...", - "Disrespect the law, and you disrespect me.", "What do you need?", "Trouble?", "What is it?", "No lollygaggin'.", - "My cousin's out fighting dragons, and what do I get? Guard duty.", - "Gotta keep my eyes open. Damn dragons could swoop down at any time.", - "Fear not. Come dragon or giant, we'll be ready.", - "Brigands I can handle, but this talk of dragons? World's gone mad, I say.", "Everything's in order.", "Staying safe I hope.", "Everything all right?", "Could sure use a warm bed right about now...", - "I'd be a lot warmer and a lot happier with a bellyful of mead...", - "I mostly deal with petty thievery and drunken brawls. Been too long since we've had a good bandit raid.", - "What is it? Dragons?", - "Watch the skies, traveler.", "I fear the night. Because the werewolves and vampires don't.", "Just a few more hours and I can crawl under some furs...", ) aggromessages = list( - "Never should have come here!", "Then let me speed your passage to Yamais' hands!", "Then pay with your blood!", "That can be arranged!", From 2f7c685a4c6d7d6a2b88f70342a68c949f1a0244 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:55:22 +0300 Subject: [PATCH 087/192] Update friendly_npc.dm --- .../modules/mob/living/simple_animal/rogue/friendly_npc.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index ac7d7dc2bfa..97b01eae767 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -138,7 +138,7 @@ // Custom idle behavior /mob/living/carbon/human/species/human/smartnpc/townguard/npc_idle() - if(patrol) + if(wander) if(world.time < next_idle + rand(30,50)) return next_idle = world.time + rand(30,50) @@ -147,8 +147,6 @@ var/turf/target_loc = find_suitable_location() if(target_loc) walk2derpless(target_loc) - else - . = ..() // Find a suitable location to move to From 1a6e7578665a55f503bb5c7efae4cda1f9fad6bb Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:22:37 +0300 Subject: [PATCH 088/192] lil change --- code/modules/jobs/job_types/roguetown/garrison/bogguard.dm | 2 +- .../code/modules/mob/living/simple_animal/rogue/friendly_npc.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm index 24d9923bf36..4d75b9df673 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm @@ -14,7 +14,7 @@ whitelist_req = FALSE outfit = /datum/outfit/job/roguetown/bogguardsman give_bank_account = 60 - min_pq = 0 + min_pq = 15 max_pq = null cmode_music = 'sound/music/combat_bog.ogg' diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index 97b01eae767..a624da8ec54 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -264,7 +264,7 @@ GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) say("Stop right there, criminal scum!") scom_announce(bounty_announcement) to_chat(L, span_notice("I got a bounty on my head now!")) - else if(world.time > (last_report + 3 MINUTES)) + else if(world.time > (last_report + 5 MINUTES)) last_report = world.time scom_announce("the criminal [target.real_name] is reported attacking a townsguard at [get_area_name(get_area(src))].") From 7abab85f10715251b8058c3ef1995ba55a86f1ef Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:23:36 +0300 Subject: [PATCH 089/192] okay --- code/__DEFINES/traits.dm | 5 +++++ code/game/objects/items/granters.dm | 6 ++++++ .../job_types/roguetown/adventurer/types/combat/bard.dm | 1 + .../job_types/roguetown/adventurer/types/combat/cleric.dm | 1 + .../job_types/roguetown/adventurer/types/combat/mage.dm | 1 + .../roguetown/adventurer/types/combat/rare/bladesinger.dm | 2 +- .../roguetown/adventurer/types/combat/rare/witchhunter.dm | 2 +- .../job_types/roguetown/adventurer/types/combat/rogue.dm | 5 +++++ .../job_types/roguetown/adventurer/types/combat/warlock.dm | 2 +- code/modules/jobs/job_types/roguetown/church/puritan.dm | 1 + .../jobs/job_types/roguetown/youngfolk/mage_apprentice.dm | 1 + 11 files changed, 24 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e9510ea0d24..e321fd8127e 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -119,6 +119,9 @@ #define TRAIT_BAOTHA_CURSE "Baotha's Curse" #define TRAIT_NYMPHO_CURSE "Nympho Curse" +//STONEHEDGE TRAITS +#define TRAIT_USEMAGICITEM "Use Magic Item" + GLOBAL_LIST_INIT(roguetraits, list( TRAIT_LEPROSY = span_necrosis("I'm a disgusting leper..."), TRAIT_CHOSEN = "Elysius choose you to represent his glory.", @@ -204,6 +207,8 @@ GLOBAL_LIST_INIT(roguetraits, list( TRAIT_NIGHT_VISION = span_info("Whether because of my species, my career choice, or by some boon of my patron, my eyes have adapted to see well in the dark."), TRAIT_SUPER_NV = span_info("My ability to see in the dark extends further than that of most others, and I can consciously control how bright my surroundings appear to me."), TRAIT_BLINDFIGHTING = span_info("I have an incredible sense of awareness, allowing me to dodge and parry attacks even when I can't see them coming, If i am in high awareness, I can even prevent sneak attacks."), + TRAIT_SEESPIRITS = span_necrosis("My eyes peer beyond the veil of life and death, allowing me to perceive spirits."), + TRAIT_USEMAGICITEM = span_info("I know my way around magic items by legit means or trickery."), )) // trait accessor defines diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 9eb9a2de5b5..fdf6d61057f 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -9,6 +9,7 @@ var/reading = FALSE //sanity var/oneuse = TRUE //default this is true, but admins can var this to 0 if we wanna all have a pass around of the rod form book var/used = FALSE //only really matters if oneuse but it might be nice to know if someone's used it for admin investigations perhaps + var/required_trait = null /obj/item/book/granter/proc/turn_page(mob/user) playsound(user, pick('sound/blank.ogg'), 30, TRUE) @@ -54,6 +55,10 @@ if(user.STAINT < 8) to_chat(user, span_warning("You can't make sense of the sprawling runes!")) return FALSE + if(required_trait) + if(!HAS_TRAIT(user, required_trait)) + to_chat(user, span_warning("You can't figure out a way to use this!")) + return if(used) if(oneuse) recoil(user) @@ -255,6 +260,7 @@ /obj/item/book/granter/spell var/spell var/spellname = "conjure bugs" + required_trait = TRAIT_USEMAGICITEM /obj/item/book/granter/spell/already_known(mob/user) if(!spell) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm index d45ba04365a..aace0fcb31d 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm @@ -166,6 +166,7 @@ ADD_TRAIT(H, TRAIT_EMPATH, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) //You have speed, use it. What musucian plays with cumbersome armor anyway? ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) if(isseelie(H)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/seelie_dust) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/summon_rat) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm index 4d1c1bcddf5..8c310f13720 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm @@ -180,6 +180,7 @@ H.mind.adjust_spellpoints(1) H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) if(/datum/patron/divine/necra) head = /obj/item/clothing/head/roguetown/necrahood diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm index affe70f242f..a55b442fe42 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm @@ -7,6 +7,7 @@ outfit = /datum/outfit/job/roguetown/adventurer/mage category_tags = list(CTAG_ADVENTURER) cmode_music = 'sound/music/combat_bandit_mage.ogg' + traits_applied = list(TRAIT_USEMAGICITEM) /datum/outfit/job/roguetown/adventurer/mage/pre_equip(mob/living/carbon/human/H) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm index bd1be073fb5..3669bccf746 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm @@ -7,7 +7,7 @@ /datum/species/elf/wood, ) maximum_possible_slots = 2 - traits_applied = list(TRAIT_MEDIUMARMOR) + traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_USEMAGICITEM) category_tags = list(CTAG_ADVENTURER) outfit = /datum/outfit/job/roguetown/adventurer/bladesinger diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm index 941b51efa5d..e5a27e96a86 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm @@ -6,7 +6,7 @@ allowed_races = RACES_ALL_KINDSPLUS outfit = /datum/outfit/job/roguetown/adventurer/puritan maximum_possible_slots = 2 - traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_PERFECT_TRACKER) + traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_PERFECT_TRACKER, TRAIT_USEMAGICITEM) category_tags = list(CTAG_ADVENTURER) /datum/outfit/job/roguetown/adventurer/puritan diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm index fd2621d23a0..e4b1111868b 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm @@ -88,6 +88,7 @@ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("perception", 2) H.change_stat("speed", 2) H.change_stat("intelligence", 2) @@ -131,6 +132,7 @@ ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //they are killers ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("perception", 2) H.change_stat("speed", 2) H.change_stat("intelligence", 2) @@ -181,6 +183,7 @@ ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) //if they got all the shield and parry stuff, might aswell. ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) //extra damage to groin (dirty fighting) ADD_TRAIT(H, TRAIT_NOSEGRAB, TRAIT_GENERIC) //funny nose grab. + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("strength", 1) H.change_stat("speed", 2) H.change_stat("perception", 1) @@ -220,6 +223,7 @@ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) //extra damage to groin (dirty fighting) ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("strength", -1) H.change_stat("perception", 2) H.change_stat("speed", 2) @@ -267,6 +271,7 @@ ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC) //never queezy around death ADD_TRAIT(H, TRAIT_SIXTHSENSE, TRAIT_GENERIC) //can hear ghosts ADD_TRAIT(H, TRAIT_SOUL_EXAMINE, TRAIT_GENERIC) //can determine if someone has their soul. + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("perception", 2) H.change_stat("constitution", 1) H.change_stat("speed", 2) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm index a3685ce6c9e..def1a13d79c 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm @@ -6,7 +6,6 @@ allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS outfit = /datum/outfit/job/roguetown/adventurer/warlock - //traits_applied = list(TRAIT_DODGEEXPERT) category_tags = list(CTAG_ADVENTURER) cmode_music = 'sound/music/combat_bandit_mage.ogg' @@ -90,6 +89,7 @@ H.change_stat("intelligence", 1) H.mind.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/guidance5e) + traits_applied = list(TRAIT_USEMAGICITEM) if("power") //empowered eldritch blast H.mind.RemoveSpell(/obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e/empowered) diff --git a/code/modules/jobs/job_types/roguetown/church/puritan.dm b/code/modules/jobs/job_types/roguetown/church/puritan.dm index 439e50df9dd..b5409914516 100644 --- a/code/modules/jobs/job_types/roguetown/church/puritan.dm +++ b/code/modules/jobs/job_types/roguetown/church/puritan.dm @@ -78,6 +78,7 @@ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.cmode_music = 'sound/music/combat_clergy.ogg' /mob/living/carbon/human/proc/torture_victim() diff --git a/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm b/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm index 3318608fcd5..43027c91b39 100644 --- a/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm +++ b/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm @@ -15,6 +15,7 @@ display_order = JDO_MAGEAPPRENTICE give_bank_account = TRUE + traits_applied = list(TRAIT_USEMAGICITEM) min_pq = 0 max_pq = null From 5dc98d88ee7d3d9f3ded6427a68d77c17fdba7a2 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:33:56 +0300 Subject: [PATCH 090/192] Update warlock.dm --- .../jobs/job_types/roguetown/adventurer/types/combat/warlock.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm index def1a13d79c..ea65989dfcf 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm @@ -89,7 +89,7 @@ H.change_stat("intelligence", 1) H.mind.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/guidance5e) - traits_applied = list(TRAIT_USEMAGICITEM) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) if("power") //empowered eldritch blast H.mind.RemoveSpell(/obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e/empowered) From e77fecbe587a122478d2ad35d8476bac27de389d Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:42:26 +0300 Subject: [PATCH 091/192] adjustments to hoonger --- code/modules/surgery/organs/feature_organs/genitals.dm | 4 ++-- code/modules/surgery/organs/filling_organ.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/surgery/organs/feature_organs/genitals.dm b/code/modules/surgery/organs/feature_organs/genitals.dm index b37f421608d..834273e6278 100644 --- a/code/modules/surgery/organs/feature_organs/genitals.dm +++ b/code/modules/surgery/organs/feature_organs/genitals.dm @@ -173,9 +173,9 @@ organ_size = DEFAULT_TESTICLES_SIZE reagent_to_make = /datum/reagent/consumable/cum refilling = TRUE - hungerhelp = FALSE //balls dont be dry if you starve + //hungerhelp = FALSE //balls dont be dry if you starve reagent_generate_rate = 0.2 - storage_per_size = 30 //3 times the normal since they have only 3 size options + storage_per_size = 20 //2 times the normal since they have only 3 size options organ_sizeable = TRUE altnames = list("balls", "testicles", "testes", "orbs", "cum tanks", "seed tanks") //used in thought messages. startsfilled = TRUE diff --git a/code/modules/surgery/organs/filling_organ.dm b/code/modules/surgery/organs/filling_organ.dm index 1ca2cf0f5a9..1d832d9080a 100644 --- a/code/modules/surgery/organs/filling_organ.dm +++ b/code/modules/surgery/organs/filling_organ.dm @@ -99,14 +99,14 @@ if(owner.nutrition < (NUTRITION_LEVEL_HUNGRY - 25) && hungerhelp) //consumes if hungry and uses nutrient, putting below the limit so person dont get stress message spam. var/remove_amount = min(reagent_generate_rate, reagents.total_volume) if(uses_nutrient) //add nutrient - owner.adjust_nutrition(remove_amount*20) //since hunger factor is so tiny compared to the nutrition levels it has to fill + owner.adjust_nutrition(remove_amount) //since hunger factor is so tiny compared to the nutrition levels it has to fill reagents.remove_reagent(reagent_to_make, remove_amount) else if((reagents.total_volume < reagents.maximum_volume) && refilling) //if organ is not full. var/max_restore = owner.nutrition > (NUTRITION_LEVEL_WELL_FED) ? reagent_generate_rate * 2 : reagent_generate_rate var/restore_amount = min(max_restore, reagents.maximum_volume - reagents.total_volume) // amount restored if fed, capped by reagents.maximum_volume if(uses_nutrient) //consume nutrient - owner.adjust_nutrition(-restore_amount*20) + owner.adjust_nutrition(-restore_amount) reagents.add_reagent(reagent_to_make, restore_amount) else //if nohunger, should just regenerate stuff for free no matter what, if refilling. if((reagents.total_volume < reagents.maximum_volume) && refilling) From c41ea8d855ef00fab0e59d32194c2bb4fe362e15 Mon Sep 17 00:00:00 2001 From: Luctus <117505981+Luctus-Comptus@users.noreply.github.com> Date: Thu, 28 Nov 2024 10:10:14 -0600 Subject: [PATCH 092/192] coffee and clockwork limb fix (#136) limbs had no damage reduction or better max HP than wood made acorns have a chance to spawn from tree's. acorn coffee. mortar and pestle an acorn, add reagent to water. heat water and reagent till bubble bubble sound from pot. make coffee. coffee removes sleep debuff and adds some blue abr back. have to drink half mug worth before removes sleep. its a metabolism check happens after awhile. Co-authored-by: Moribun <117505981+Moribun@users.noreply.github.com> --- .../objects/items/rogueitems/prosthetics.dm | 14 ++- .../objects/structures/roguetown/newtree.dm | 3 + code/modules/farming/produce.dm | 3 +- .../chemistry/reagents/drink_reagents.dm | 80 +++++++++++++++++ .../blacksmith/anvil_recipes/tools.dm | 6 +- code/modules/surgery/organs/augments_arms.dm | 9 ++ code/modules/surgery/organs/heart.dm | 88 +++++++++++++++++++ 7 files changed, 197 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/rogueitems/prosthetics.dm b/code/game/objects/items/rogueitems/prosthetics.dm index 97b8b94483a..f20d578f610 100644 --- a/code/game/objects/items/rogueitems/prosthetics.dm +++ b/code/game/objects/items/rogueitems/prosthetics.dm @@ -57,6 +57,9 @@ icon = 'icons/roguetown/items/misc.dmi' icon_state = "prc_arm" prosthetic_prefix = "prc" + brute_reduction = 10 + burn_reduction = 10 + max_damage = 50 fingers = TRUE sellprice = 50 @@ -105,6 +108,9 @@ icon = 'icons/roguetown/items/misc.dmi' icon_state = "prc_arm" prosthetic_prefix = "prc" + brute_reduction = 10 + burn_reduction = 10 + max_damage = 50 fingers = TRUE sellprice = 50 @@ -155,6 +161,9 @@ icon = 'icons/roguetown/items/misc.dmi' icon_state = "prc_leg" prosthetic_prefix = "prc" + brute_reduction = 10 + burn_reduction = 10 + max_damage = 50 organ_slowdown = 0 sellprice = 50 @@ -205,8 +214,11 @@ icon = 'icons/roguetown/items/misc.dmi' icon_state = "prc_leg" prosthetic_prefix = "prc" + brute_reduction = 10 + burn_reduction = 10 + max_damage = 50 organ_slowdown = 0 sellprice = 50 /obj/item/bodypart/r_leg/rprosthetic/attack(mob/living/M, mob/user) - prosthetic_attachment(M, user) \ No newline at end of file + prosthetic_attachment(M, user) diff --git a/code/game/objects/structures/roguetown/newtree.dm b/code/game/objects/structures/roguetown/newtree.dm index 8fce8b54a11..654ab05df35 100644 --- a/code/game/objects/structures/roguetown/newtree.dm +++ b/code/game/objects/structures/roguetown/newtree.dm @@ -171,6 +171,9 @@ if(istype(loc, /turf/open/floor/rogue/grass)) var/turf/T = loc T.ChangeTurf(/turf/open/floor/rogue/dirt) + // Add the nut with a 25% chance + if(prob(25)) + static_debris += /obj/item/reagent_containers/food/snacks/grown/nut /obj/structure/flora/newtree/proc/build_trees() var/turf/target = get_step_multiz(src, UP) diff --git a/code/modules/farming/produce.dm b/code/modules/farming/produce.dm index fc59e22fa1b..643abc53a0e 100644 --- a/code/modules/farming/produce.dm +++ b/code/modules/farming/produce.dm @@ -449,9 +449,10 @@ icon_state = "nut" tastes = list("nutty" = 1) filling_color = "#6b4d18" - bitesize = 3 + bitesize = 1 foodtype = FRUIT list_reagents = list(/datum/reagent/consumable/nutriment = 4) + grind_results = list(/datum/reagent/consumable/acorn_powder = 4) /obj/item/reagent_containers/food/snacks/grown/tomato name = "tomato" diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 160301305cb..7992d3222f3 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -894,3 +894,83 @@ glass_icon_state = "glass_yellow" glass_name = "glass of bungo juice" glass_desc = "" +//////////////////////////////////////////////////////////////////-------------------------------DREAM-------------------------------//////////////////////////////////// + +/datum/reagent/consumable/acorn_powder + name = "Acorn Powder" + description = "A bitter fine powder" + color = "#dcb137" + quality = DRINK_VERYGOOD + taste_description = "bitter earthy-ness" + +/datum/reagent/consumable/acorn_powder/on_mob_life(mob/living/carbon/M) + M.rogstam_add(8) + ..() + +/datum/reagent/consumable/Acoffee + name = "Acorn Coffee" + description = "A nice bitter stimulating brew" + color = "#800000" + quality = DRINK_VERYGOOD + taste_description = "robust earthy-ness" + metabolization_rate = 0.2 * REAGENTS_METABOLISM + overdose_threshold = null + var/hydration = 8 + +// Add variables to track initial and consumed amounts +/mob/living/carbon/var/initial_acoffee_amount = 0 // Tracks the initial amount of Acorn Coffee when consumed +/mob/living/carbon/var/metabolized_acoffee = 0 // Tracks the total amount of Acorn Coffee metabolized + +/datum/reagent/consumable/Acoffee/on_mob_life(mob/living/carbon/M) + // Initialize the initial amount when first consumed + if(M.initial_acoffee_amount == 0) + M.initial_acoffee_amount = M.reagents.get_reagent_amount(src) + + // Calculate the current amount and the amount metabolized in this cycle + var current_amount = M.reagents.get_reagent_amount(src) + var metabolized_now = (M.initial_acoffee_amount - current_amount) * metabolization_rate + + // Update the total metabolized amount + M.metabolized_acoffee += metabolized_now + // Update the initial amount for the next cycle + M.initial_acoffee_amount = current_amount + + // Apply the effects of Acorn Coffee + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!HAS_TRAIT(H, TRAIT_NOHUNGER)) + H.adjust_hydration(hydration) + if(M.blood_volume < BLOOD_VOLUME_NORMAL) + M.blood_volume = min(M.blood_volume+10, BLOOD_VOLUME_NORMAL) + M.rogstam_add(8) + M.dizziness = max(0, M.dizziness - 5) + M.drowsyness = max(0, M.drowsyness - 3) + M.SetSleeping(0, FALSE) + + // Remove the sleepytime status effect after 12u of Acorn Coffee has metabolized + if(M.metabolized_acoffee >= 12) + if(M.has_status_effect(/datum/status_effect/debuff/sleepytime)) + M.remove_status_effect(/datum/status_effect/debuff/sleepytime) + M.remove_stress(/datum/stressevent/sleepytime) + M.mind.sleep_adv.advance_cycle() + + ..() + +/datum/chemical_reaction/alch/acoffee + name = "coffee-acorn" + mix_sound = 'sound/items/fillbottle.ogg' + id = /datum/reagent/consumable/Acoffee + required_temp = 374 + results = list(/datum/reagent/consumable/Acoffee = 24) + required_reagents = list(/datum/reagent/consumable/acorn_powder = 4, /datum/reagent/water = 20) + + /datum/chemical_reaction/alch/acoffee/on_reaction(var/mob/user, var/obj/item/reagent_containers/container, var/total_volume) + ..() + if(container) + // Remove all leftover water + var/datum/reagent/R + for(R in container.reagents.reagent_list) + if(istype(R, /datum/reagent/water)) + container.reagents.remove_reagent(/datum/reagent/water, R.volume) + + diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm index df27e4217a5..87bf383a928 100644 --- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm +++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm @@ -326,16 +326,14 @@ /datum/anvil_recipe/tools/glassbottles name = "5x glass bottles" //more efficent cuz u smith em ig - created_item = /obj/item/reagent_containers/glass/bottle - additional_items = list(/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle) + created_item = list(/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle) req_bar = /obj/item/ingot/glass craftdiff = 1 i_type = "General" /datum/anvil_recipe/tools/glasssyringes name = "5x glass syringes" //more efficent cuz u smith em ig - created_item = /obj/item/reagent_containers/syringe - additional_items = list(/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe) + created_item = list(/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe) req_bar = /obj/item/ingot/glass craftdiff = 2 i_type = "General" diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 69fdfa7d08c..203873f0ac1 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -236,3 +236,12 @@ name = "surgical toolset implant" desc = "" contents = newlist(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes) + +/obj/item/organ/cyberimp/arm/clock + name = "clockwork arm modification" + desc = "" + contents = newlist(/obj/item/rogueweapon/whip/antique, /obj/item/rogueweapon/huntingknife/cleaver, /obj/item/rogueweapon/shovel/small, + /obj/item/rogueweapon/pick, /obj/item/rogueweapon/tongs, /obj/item/rogueweapon/hammer) // whip is a monowire reference. im sorry I fucking had too. + +/obj/item/organ/cyberimp/arm/clock/l + zone = BODY_ZONE_L_ARM diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 64ee1b4a4d7..2b82539da04 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -274,3 +274,91 @@ owner.heal_overall_damage(15, 15, 0, BODYPART_ORGANIC) if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/ephedrine) < 20) owner.reagents.add_reagent(/datum/reagent/medicine/ephedrine, 10) + + +/obj/item/organ/heart/clockwork + name = "clockwork heart" + desc = "" + organ_flags = ORGAN_SYNTHETIC + var/min_next_adrenaline = 0 + var/revive_cost = 0 + var/reviving = 0 + var/cooldown = 0 + +/obj/item/organ/heart/clockwork/on_life() + . = ..() + + // Define healing amounts per cycle + var/constant_healing = 0.1 + var/list/wCount = owner.get_wounds() + + // Constant healing for specified damage types + owner.adjustBruteLoss(-0.1, 0) // Brute damage + owner.adjustFireLoss(-0.1, 0) // Fire damage + owner.adjustOxyLoss(-0.1, 0) // Oxygen damage + owner.adjustToxLoss(-0.1, 0) // Toxin damage + if(wCount.len > 0) + owner.heal_wounds(-0.1, 0) // Wound damage + owner.update_damage_overlays() + to_chat(owner, span_nicegreen("I feel one of my wounds mend.")) + owner.adjustOrganLoss(ORGAN_SLOT_LUNGS, -constant_healing) // Lungs + owner.adjustOrganLoss(ORGAN_SLOT_HEART, -constant_healing) // Heart + owner.adjustOrganLoss(ORGAN_SLOT_TONGUE, -constant_healing) // Tongue + owner.adjustOrganLoss(ORGAN_SLOT_EARS, -constant_healing) // Ears + owner.adjustOrganLoss(ORGAN_SLOT_EYES, -constant_healing) // Eyes + owner.adjustOrganLoss(ORGAN_SLOT_LIVER, -constant_healing) // Liver + owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -constant_healing) // Appendix + owner.adjustOrganLoss(ORGAN_SLOT_STOMACH, -constant_healing) // Stomach + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -constant_healing) // Brain + owner.adjustCloneLoss(-constant_healing, 0) // Clone damage + + // Adrenaline boost logic + if(owner.health < 5 && world.time > min_next_adrenaline) + min_next_adrenaline = world.time + rand(200, 400) + to_chat(owner, span_danger("I feel myself dying, but you refuse to give up!")) + owner.heal_overall_damage(15, 15, 0, BODYPART_ORGANIC) + if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/ephedrine) < 20) + owner.reagents.add_reagent(/datum/reagent/medicine/ephedrine, 10) + + // Reviver implant functionality + if(reviving) + if(owner.stat == UNCONSCIOUS) + addtimer(CALLBACK(src, PROC_REF(heal)), 30) + else + cooldown = revive_cost + world.time + reviving = FALSE + to_chat(owner, span_notice("My clockwork heart shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].")) + return + + if(cooldown > world.time) + return + if(owner.stat != UNCONSCIOUS) + return + if(owner.suiciding) + return + + revive_cost = 0 + reviving = TRUE + to_chat(owner, span_notice("I feel a faint buzzing as my clockwork heart starts mending me...")) + +/obj/item/organ/heart/clockwork/proc/heal() + if(owner.getOxyLoss()) + owner.adjustOxyLoss(-5) + revive_cost += 5 + if(owner.getBruteLoss()) + owner.adjustBruteLoss(-2) + revive_cost += 40 + if(owner.getFireLoss()) + owner.adjustFireLoss(-2) + revive_cost += 40 + if(owner.getToxLoss()) + owner.adjustToxLoss(-1) + revive_cost += 40 + + // Adjust blood volume + if(owner.blood_volume < BLOOD_VOLUME_NORMAL) + owner.blood_volume += BLOOD_VOLUME_SURVIVE + + + + From 04d3cf4f3c8a9f8b75662ad1940457f171d67e06 Mon Sep 17 00:00:00 2001 From: DerFlammenwerfer <7h3ph4nt0m@gmail.com> Date: Thu, 28 Nov 2024 13:40:16 -0500 Subject: [PATCH 093/192] Surgrobe and feldrobe drip factor increased (#138) * Expansion of Gravesinger, Part 1 * Update mask.dm * last minute tweaks * forgot to grant seance spell * missed a typo in seance * added a feedback if missing ashes * greater than colon hyphen left parenthesis * surgrobes and feldrobes can be worn in shirt slot for added drip --- code/modules/clothing/rogueclothes/robes.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/rogueclothes/robes.dm b/code/modules/clothing/rogueclothes/robes.dm index a3db50a43e7..83b43bbda3c 100644 --- a/code/modules/clothing/rogueclothes/robes.dm +++ b/code/modules/clothing/rogueclothes/robes.dm @@ -1,5 +1,5 @@ /obj/item/clothing/suit/roguetown/shirt/robe - slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_CLOAK + slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT name = "robe" desc = "" body_parts_covered = CHEST|GROIN|ARMS|LEGS|VITALS @@ -274,7 +274,7 @@ icon = 'icons/roguetown/clothing/armor.dmi' mob_overlay_icon = 'icons/roguetown/clothing/onmob/armor.dmi' icon_state = "feldrobe" - slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK + slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT sleeved = null boobed = TRUE color = null @@ -288,7 +288,7 @@ icon = 'icons/roguetown/clothing/armor.dmi' mob_overlay_icon = 'icons/roguetown/clothing/onmob/armor.dmi' icon_state = "surgrobe" - slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK + slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT sleeved = null boobed = TRUE color = null From d1a0ba5ef71c69bca2e4d67ecd712172278546ba Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Thu, 28 Nov 2024 10:40:32 -0800 Subject: [PATCH 094/192] oh god (#137) --- code/datums/wounds/types/special.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/datums/wounds/types/special.dm b/code/datums/wounds/types/special.dm index b06eb896fd1..0655601aa04 100644 --- a/code/datums/wounds/types/special.dm +++ b/code/datums/wounds/types/special.dm @@ -238,8 +238,6 @@ "The testicles are twisted!", "The testicles are torsioned!", ) - if(HAS_TRAIT(affected, TRAIT_CRITICAL_WEAKNESS)) - affected.death() /datum/wound/cbt/on_life() . = ..() From ecc6ba8c3f9ad06103750499a18c05366a611bfe Mon Sep 17 00:00:00 2001 From: DerFlammenwerfer <7h3ph4nt0m@gmail.com> Date: Thu, 28 Nov 2024 14:54:03 -0500 Subject: [PATCH 095/192] hotfix for summoned spirits dropping their lantern and silver coin when dismissed. (#140) --- code/modules/spells/roguetown/acolyte/necra.dm | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/code/modules/spells/roguetown/acolyte/necra.dm b/code/modules/spells/roguetown/acolyte/necra.dm index 58fc9dc7ebd..ae6f08a459b 100644 --- a/code/modules/spells/roguetown/acolyte/necra.dm +++ b/code/modules/spells/roguetown/acolyte/necra.dm @@ -153,10 +153,10 @@ if(summoned_spirit) var/mob/living/carbon/spirit/SS = summoned_spirit to_chat(user, "You dismiss the spirit to the underworld.") - to_chat(SS, "[user.real_name] returns you to the underworld. If you are wrongfully denied your reward by your summoner, please open a ticket.") + to_chat(SS, "[user.real_name] has returned you to the underworld. If you are wrongfully denied your reward by your summoner, please open a ticket.") for(var/obj/effect/landmark/underworld/A in GLOB.landmarks_list) for(var/obj/item/I in SS.held_items) - if(!istype(I, /obj/item/roguecoin/silver) || !istype(I, /obj/item/flashlight/lantern/shrunken)) + if(!istype(I, /obj/item/roguecoin/silver) && !istype(I, /obj/item/flashlight/lantern/shrunken)) . |= SS.dropItemToGround(I) if(istype(I, /obj/item/roguecoin/silver)) to_chat(SS, "As you return across the veil to the underworld, the silver coin in your hand is transformed.") @@ -203,15 +203,12 @@ capturedsoul.loc = A.loc capturedsoul.invisibility = initial(capturedsoul.invisibility) for(var/obj/item/I in capturedsoul.held_items) + if(!istype(I, /obj/item/roguecoin/silver) && !istype(I, /obj/item/flashlight/lantern/shrunken)) + . |= capturedsoul.dropItemToGround(I) if(istype(I, /obj/item/roguecoin/silver)) - qdel(I) to_chat(capturedsoul, "As you return across the veil to the underworld, the silver coin in your hand is transformed.") var/obj/item/underworld/coin/C = new - capturedsoul.put_in_hands(C) - if(istype(I, /obj/item/flashlight/lantern/shrunken)) - return - else - . |= capturedsoul.dropItemToGround(I) + capturedsoul.put_in_hand(C) summoned_spirit = null to_chat(user, "I feel a cold chill run down my spine; the spirit has arrived.") capturedsoul.Immobilize(10 SECONDS) From 28dfb942ace59ecc5ee2f7d12ce22990c5b77129 Mon Sep 17 00:00:00 2001 From: Cupa <5896309+Cupax3@users.noreply.github.com> Date: Thu, 28 Nov 2024 22:08:19 +0100 Subject: [PATCH 096/192] Fix: Query result no longer gets qdel'd with qeury (#139) --- .../modules/maturity-prompt/code/maturity_subsystem.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm b/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm index 6dc43758da4..f91971455f4 100644 --- a/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm +++ b/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm @@ -122,7 +122,10 @@ SUBSYSTEM_DEF(maturity_guard) // There should be only one, we're querying by the primary key; if it returns more than one row something is very wrong var/result = query_age_from_db.NextRow() if(result) - return query_age_from_db.item + qdel(query_age_from_db) + var/list/itemreturn = query_age_from_db.item.Copy() + return itemreturn + qdel(query_age_from_db) return FALSE @@ -146,8 +149,10 @@ SUBSYSTEM_DEF(maturity_guard) ) if(!add_age_to_db.warn_execute()) + qdel(add_age_to_db) return FALSE + qdel(add_age_to_db) return TRUE // Logic inspired by S.P.L.U.R.T age_gate From 5b7f011021a2968cdfe174fd2b12ea4efc1476cc Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Fri, 29 Nov 2024 00:11:26 +0300 Subject: [PATCH 097/192] progress... --- _maps/map_files/dreamhold/Dreamhold.dmm | 143 +++++++----------- .../sex_actions/utility/store_nipple.dm | 23 +-- .../sex_actions/utility/store_nipple_other.dm | 23 +-- .../simple_animal/rogue/friendly_npc.dm | 5 +- 4 files changed, 84 insertions(+), 110 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 59ed4734a74..eec6befca09 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -2981,7 +2981,10 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) "cpy" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ + friendlyfactions = null; + friendlyjobs = list("Guildmaster", "Guild Appraiser") + }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -6056,9 +6059,12 @@ name = "far stonehedge" }) "eCw" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/grass, -/area/rogue/indoors/shelter/bog) +/obj/effect/landmark/events/haunts, +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "eCy" = ( /obj/structure/flora/roguegrass/bush{ icon_state = "bush2" @@ -9137,6 +9143,10 @@ }) "hau" = ( /obj/machinery/light/rogue/wallfire/candle/blue, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ + friendlyfactions = null; + friendlyjobs = list("Guildmaster", "Guild Appraiser") + }, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -11040,7 +11050,6 @@ /obj/effect/decal/dirt{ dir = 4 }, -/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -14106,13 +14115,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"kOv" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" - }) "kOC" = ( /obj/structure/spacevine, /turf/closed/wall/mineral/rogue/stone/moss, @@ -15069,11 +15071,14 @@ first_time_text = "Stonehedge" }) "lCr" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/cobblerock, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ + friendlyfactions = null; + friendlyjobs = list("Guildmaster", "Guild Appraiser") + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "lCH" = ( /obj/machinery/light/rogue/torchholder{ @@ -16668,13 +16673,6 @@ /obj/machinery/light/rogue/campfire/densefire, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) -"mOd" = ( -/obj/structure/flora/grass/jungle/b, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "mOu" = ( /obj/effect/decal/border/ruinedwood{ dir = 8 @@ -17663,12 +17661,6 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) -"nBi" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/brute, -/turf/open/floor/rogue/cobble/mossy, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "nBZ" = ( /obj/structure/chair/wood/rogue{ dir = 8 @@ -18311,12 +18303,10 @@ /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/exposed/tavern) "nYE" = ( -/obj/structure/flora/grass/jungle/b, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/obj/effect/landmark/townpatrol, /turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" }) "nYV" = ( /obj/structure/flora/newleaf{ @@ -20253,7 +20243,10 @@ name = "Silver Dragon" }) "pIz" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ + friendlyfactions = null; + friendlyjobs = list("Guildmaster", "Guild Appraiser") + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -21393,16 +21386,6 @@ }, /turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town) -"qwx" = ( -/obj/machinery/light/rogue/torchholder{ - dir = 4 - }, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/tavern{ - first_time_text = "The Sylver Dragonne.."; - name = "Silver Dragon" - }) "qwU" = ( /mob/living/carbon/human/species/skeleton/npc/dungeon/ambush, /turf/open/floor/rogue/naturalstone, @@ -24148,11 +24131,10 @@ first_time_text = "The Twilight Woods" }) "sCW" = ( -/obj/structure/flora/grass/jungle/b, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" }) "sDr" = ( /turf/closed/mineral/rogue/bedrock, @@ -26531,12 +26513,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"usY" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard, -/turf/open/floor/rogue/cobblerock, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "utn" = ( /obj/structure/rack/rogue, /obj/item/clothing/suit/roguetown/shirt/shortshirt, @@ -27886,14 +27862,6 @@ icon_state = "rockwd" }, /area/rogue/outdoors/river) -"vwj" = ( -/obj/structure/flora/roguegrass, -/mob/living/carbon/human/species/human/smartnpc/townguard/brute, -/turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" - }) "vwm" = ( /obj/item/natural/stone, /turf/open/floor/rogue/dirt, @@ -30609,7 +30577,10 @@ }) "xKH" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ + friendlyfactions = null; + friendlyjobs = list("Guildmaster", "Guild Appraiser") + }, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -88387,7 +88358,7 @@ qrm pjI hAi mgS -qgp +lCr qgp qgp gfu @@ -107162,7 +107133,7 @@ lqr eJD oZS ilr -ilr +nYE ilr ilr ilr @@ -107222,7 +107193,7 @@ eHG eHG ilr eHG -ilr +nYE eHG miB miB @@ -109588,7 +109559,7 @@ cpy ilr eHG ilr -mVp +cpy oZS fmt eyG @@ -109638,7 +109609,7 @@ miB hmK nEo fmt -ilr +nYE eHG miB oZS @@ -116301,7 +116272,7 @@ ilr ilr ilr ilr -ilr +nYE ilr ilr ilr @@ -116496,7 +116467,7 @@ ilr ilr ilr ilr -oZZ +eCw ilr ilr ilr @@ -120095,7 +120066,7 @@ sfZ guW wsc voH -nYE +tac ycO ycO nFS @@ -122152,7 +122123,7 @@ dFG eHG mVp oZS -ilr +nYE eyG fmt mVp @@ -126727,7 +126698,7 @@ fqz fqz fqz fqz -nBi +fqz vil foY vVw @@ -127568,7 +127539,7 @@ tac nFT lvM ycO -kOv +ijB pTW qJZ qJZ @@ -127969,7 +127940,7 @@ nze ufX voH ijB -vwj +slN ycO nWn qMs @@ -128616,7 +128587,7 @@ kFO xhU rfe xhU -eHG +sCW ilr jJS jJS @@ -129554,7 +129525,7 @@ nnZ qCV fhZ xBY -usY +xBY xBY xBY drI @@ -131206,7 +131177,7 @@ kbK ycO ycO ycO -ycO +kfa ycO ycO xKV @@ -156999,7 +156970,7 @@ rfD edm uxu uxu -mOd +nPY dKA fqz fqz @@ -159843,7 +159814,7 @@ enU tJb tJb tJb -qwx +dmS tJb tJb tJb @@ -162056,7 +162027,7 @@ fqz fqz fqz fqz -sCW +qnW nnZ xBY sPO @@ -162174,7 +162145,7 @@ sib sib hKD eQy -eCw +qmG qmG vEo wSW @@ -165795,7 +165766,7 @@ snY cSc ijB rzN -lCr +beK hcX rjd oPy diff --git a/code/datums/sexcon/sex_actions/utility/store_nipple.dm b/code/datums/sexcon/sex_actions/utility/store_nipple.dm index d7d1112d490..22740114df5 100644 --- a/code/datums/sexcon/sex_actions/utility/store_nipple.dm +++ b/code/datums/sexcon/sex_actions/utility/store_nipple.dm @@ -52,25 +52,26 @@ /datum/sex_action/store_nipple/on_start(mob/living/user, mob/living/target) var/obj/item/organ/filling_organ/breasts/userbreasts = user.getorgan(/obj/item/organ/filling_organ/breasts) var/obj/item/heldstuff = user.get_active_held_item() - if(userbreasts.organ_size < 4) - to_chat(user, span_info("Unfortunately, my breasts are not big enough to fit anything in them.")) - user.dropItemToGround(heldstuff) - return - else - if(userbreasts.organ_size < 6 && heldstuff.w_class > WEIGHT_CLASS_TINY) - to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit tiny things.")) + if(heldstuff) + if(userbreasts.organ_size < 4) + to_chat(user, span_info("Unfortunately, my breasts are not big enough to fit anything in them.")) user.dropItemToGround(heldstuff) return else - if(userbreasts.organ_size < 8 && heldstuff.w_class > WEIGHT_CLASS_SMALL) - to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit small things.")) + if(userbreasts.organ_size < 6 && heldstuff.w_class > WEIGHT_CLASS_TINY) + to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit tiny things.")) user.dropItemToGround(heldstuff) return else - if(userbreasts.organ_size < 10 && heldstuff.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit medium sized things.")) + if(userbreasts.organ_size < 8 && heldstuff.w_class > WEIGHT_CLASS_SMALL) + to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit small things.")) user.dropItemToGround(heldstuff) return + else + if(userbreasts.organ_size < 10 && heldstuff.w_class > WEIGHT_CLASS_NORMAL) + to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit medium sized things.")) + user.dropItemToGround(heldstuff) + return if(istype(heldstuff, /obj/item/rogueweapon)) to_chat(user, span_userdanger("[heldstuff] may cut me while i put it in, depending on my precision of hand.")) diff --git a/code/datums/sexcon/sex_actions/utility/store_nipple_other.dm b/code/datums/sexcon/sex_actions/utility/store_nipple_other.dm index 16080394b86..e6ed233a71b 100644 --- a/code/datums/sexcon/sex_actions/utility/store_nipple_other.dm +++ b/code/datums/sexcon/sex_actions/utility/store_nipple_other.dm @@ -56,25 +56,26 @@ /datum/sex_action/store_nipple_other/on_start(mob/living/user, mob/living/target) var/obj/item/organ/filling_organ/breasts/targetbreasts = target.getorgan(/obj/item/organ/filling_organ/breasts) var/obj/item/heldstuff = user.get_active_held_item() - if(targetbreasts.organ_size < 4) - to_chat(user, span_info("Unfortunately, [target]'s breasts are not big enough to fit anything in them.")) - user.dropItemToGround(heldstuff) - return - else - if(targetbreasts.organ_size < 6 && heldstuff.w_class > WEIGHT_CLASS_TINY) - to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit tiny things.")) + if(heldstuff) + if(targetbreasts.organ_size < 4) + to_chat(user, span_info("Unfortunately, [target]'s breasts are not big enough to fit anything in them.")) user.dropItemToGround(heldstuff) return else - if(targetbreasts.organ_size < 8 && heldstuff.w_class > WEIGHT_CLASS_SMALL) - to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit small things.")) + if(targetbreasts.organ_size < 6 && heldstuff.w_class > WEIGHT_CLASS_TINY) + to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit tiny things.")) user.dropItemToGround(heldstuff) return else - if(targetbreasts.organ_size < 10 && heldstuff.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit medium sized things.")) + if(targetbreasts.organ_size < 8 && heldstuff.w_class > WEIGHT_CLASS_SMALL) + to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit small things.")) user.dropItemToGround(heldstuff) return + else + if(targetbreasts.organ_size < 10 && heldstuff.w_class > WEIGHT_CLASS_NORMAL) + to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit medium sized things.")) + user.dropItemToGround(heldstuff) + return if(istype(heldstuff, /obj/item/rogueweapon)) to_chat(user, span_userdanger("[heldstuff] may cut me while i put it in, depending on my precision of hand.")) diff --git a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm index a624da8ec54..d4110098e5d 100644 --- a/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm +++ b/modular_stonehedge/code/modules/mob/living/simple_animal/rogue/friendly_npc.dm @@ -31,7 +31,8 @@ if(L == src) return FALSE - if(L.job in list("Hedge Knight", "Hedgemaster")) + //leaders arent shat on. + if(L.job in list("Hedge Knight", "Hedgemaster", "Guildmaster", "Guild Appraiser", "Grandmaster", "Archpriest", "Archpriestess", "Wytcher", "Wytcher Captain")) return if(HAS_TRAIT(src, TRAIT_PACIFISM)) @@ -222,7 +223,7 @@ GLOBAL_LIST_EMPTY_TYPED(patrol_points, /obj/effect/landmark/townpatrol) /mob/living/carbon/human/species/human/smartnpc/townguard/retaliate(mob/living/L) var/newtarg = target - if(L.job in list("Hedge Knight", "Hedgemaster")) + if(L.job in list("Hedge Knight", "Hedgemaster", "Guildmaster", "Guild Appraiser", "Grandmaster", "Archpriest", "Archpriestess", "Wytcher", "Wytcher Captain")) return if(lasthitter != target) say(pick(aggromessages)) From 454f4a1df11c43e1f2112dd230863dd011dbbc70 Mon Sep 17 00:00:00 2001 From: Luctus <117505981+Luctus-Comptus@users.noreply.github.com> Date: Thu, 28 Nov 2024 15:12:36 -0600 Subject: [PATCH 098/192] as title says (#141) fixed it Co-authored-by: Moribun <117505981+Moribun@users.noreply.github.com> --- code/game/objects/structures/roguetown/newtree.dm | 3 --- code/game/objects/structures/roguetown/rogueflora.dm | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/code/game/objects/structures/roguetown/newtree.dm b/code/game/objects/structures/roguetown/newtree.dm index 654ab05df35..8fce8b54a11 100644 --- a/code/game/objects/structures/roguetown/newtree.dm +++ b/code/game/objects/structures/roguetown/newtree.dm @@ -171,9 +171,6 @@ if(istype(loc, /turf/open/floor/rogue/grass)) var/turf/T = loc T.ChangeTurf(/turf/open/floor/rogue/dirt) - // Add the nut with a 25% chance - if(prob(25)) - static_debris += /obj/item/reagent_containers/food/snacks/grown/nut /obj/structure/flora/newtree/proc/build_trees() var/turf/target = get_step_multiz(src, UP) diff --git a/code/game/objects/structures/roguetown/rogueflora.dm b/code/game/objects/structures/roguetown/rogueflora.dm index a16ca31d6cc..df5f48a48c0 100644 --- a/code/game/objects/structures/roguetown/rogueflora.dm +++ b/code/game/objects/structures/roguetown/rogueflora.dm @@ -15,7 +15,7 @@ plane = GAME_PLANE_UPPER attacked_sound = 'sound/misc/woodhit.ogg' destroy_sound = 'sound/misc/woodhit.ogg' - debris = list(/obj/item/grown/log/tree/stick = 8) + debris = list(/obj/item/grown/log/tree/stick = 8, /obj/item/reagent_containers/food/snacks/grown/nut = 1) static_debris = list(/obj/item/grown/log/tree/large = 4) alpha = 200 leanable = TRUE From 56f1edd80d72e9b501ff8a25e3b06b67a1f827e7 Mon Sep 17 00:00:00 2001 From: Luctus <117505981+Luctus-Comptus@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:39:48 -0600 Subject: [PATCH 099/192] stupid windows... (#142) fixed dumb window and tree lean thing. no one made a fucking release proc... Co-authored-by: Moribun <117505981+Moribun@users.noreply.github.com> --- code/game/objects/structures/roguetown/newtree.dm | 12 ++++++++++-- code/game/objects/structures/roguewindow.dm | 12 ++++++++++-- .../code/game/objects/items/class_selectors.dm | 4 ++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/roguetown/newtree.dm b/code/game/objects/structures/roguetown/newtree.dm index 8fce8b54a11..0ade3fd1914 100644 --- a/code/game/objects/structures/roguetown/newtree.dm +++ b/code/game/objects/structures/roguetown/newtree.dm @@ -37,13 +37,16 @@ return /obj/structure/flora/newtree/proc/wallpress(mob/living/user) - if(user.wallpressed) + if(user.wallpressed) { + // Release wallpressed state if already pressed + release_wallpress(user) return + } if(user.pixelshifted) return if(!(user.mobility_flags & MOBILITY_STAND)) return - var/dir2wall = get_dir(user,src) + var/dir2wall = get_dir(user, src) if(!(dir2wall in GLOB.cardinals)) return user.wallpressed = dir2wall @@ -63,6 +66,11 @@ user.setDir(EAST) user.set_mob_offsets("wall_press", _x = -12, _y = 0) +/obj/structure/flora/newtree/proc/release_wallpress(mob/living/user) + user.wallpressed = null + user.update_wallpress_slowdown() + user.set_mob_offsets("reset_wall_press", _x = 0, _y = 0) + /obj/structure/flora/newtree/attack_right(mob/user) if(user.mind && isliving(user)) if(user.mind.special_items && user.mind.special_items.len) diff --git a/code/game/objects/structures/roguewindow.dm b/code/game/objects/structures/roguewindow.dm index 4168c68fd49..4325999dd8a 100644 --- a/code/game/objects/structures/roguewindow.dm +++ b/code/game/objects/structures/roguewindow.dm @@ -59,13 +59,16 @@ return /obj/structure/roguewindow/proc/wallpress(mob/living/user) - if(user.wallpressed) + if(user.wallpressed) { + // Release wallpressed state if already pressed + release_wallpress(user) return + } if(user.pixelshifted) return if(!(user.mobility_flags & MOBILITY_STAND)) return - var/dir2wall = get_dir(user,src) + var/dir2wall = get_dir(user, src) if(!(dir2wall in GLOB.cardinals)) return user.wallpressed = dir2wall @@ -85,6 +88,11 @@ user.setDir(EAST) user.set_mob_offsets("wall_press", _x = -12, _y = 0) +/obj/structure/roguewindow/proc/release_wallpress(mob/living/user) + user.wallpressed = null + user.update_wallpress_slowdown() + user.set_mob_offsets("reset_wall_press", _x = 0, _y = 0) + /obj/structure/roguewindow/stained icon_state = null base_state = null diff --git a/modular_stonehedge/code/game/objects/items/class_selectors.dm b/modular_stonehedge/code/game/objects/items/class_selectors.dm index 1fc0ae2fe1b..2d6a15c5905 100644 --- a/modular_stonehedge/code/game/objects/items/class_selectors.dm +++ b/modular_stonehedge/code/game/objects/items/class_selectors.dm @@ -257,6 +257,10 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/stealing, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/craft/blacksmithing, 6, TRUE) // testing smith item qualities + H.mind.adjust_skillrank_up_to(/datum/skill/craft/armorsmithing, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/craft/weaponsmithing, 6, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/craft/smelting, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 3, TRUE) H.change_stat("strength", 3) H.change_stat("constitution", 3) From 6152b033ec341b837f2ebfe2e5e1e289967d1da1 Mon Sep 17 00:00:00 2001 From: Murderfox Date: Fri, 29 Nov 2024 10:28:48 +1030 Subject: [PATCH 100/192] Update Dreamhold.dmm --- _maps/map_files/dreamhold/Dreamhold.dmm | 739 ++++++++++++++++-------- 1 file changed, 502 insertions(+), 237 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 59ed4734a74..6a4b1c92ce3 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -647,6 +647,17 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +<<<<<<< Updated upstream +======= +"azG" = ( +/obj/machinery/light/rogue/wallfire/candle/blue/r, +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/cobble, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +>>>>>>> Stashed changes "azR" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -1054,7 +1065,7 @@ dir = 1; icon_state = "longtable" }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/open/floor/rogue/cobblerock, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -2141,7 +2152,7 @@ name = "far stonehedge" }) "bFR" = ( -/obj/structure/ladder, +/obj/structure/stairs/stone, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -2981,11 +2992,17 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) "cpy" = ( +<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +======= +/obj/item/clothing/neck/roguetown/psicross/eora, +/turf/open/water/bath, +/area/rogue/indoors/town/bath) +>>>>>>> Stashed changes "cqm" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -3286,6 +3303,15 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"cCv" = ( +/obj/structure/fluff/railing/border{ + dir = 4 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "cCy" = ( /obj/structure/flora/roguegrass/water, /turf/open/water/river{ @@ -4168,11 +4194,16 @@ name = "Shrine of Lune" }) "dij" = ( -/obj/effect/decal/stone/blockedge/blockedgeinvert, -/turf/open/floor/rogue/blocks/stone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/obj/structure/roguewindow/openclose, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" }) "diD" = ( /obj/structure/fluff/statue/gargoyle/moss/candles, @@ -4408,11 +4439,23 @@ /turf/open/floor/carpet/red, /area/rogue/indoors/shelter/town) "dpz" = ( -/obj/structure/fluff/statue/knight/interior, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/obj/structure/roguewindow/openclose{ + dir = 8 + }, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/outdoors/exposed/magiciantower{ + first_time_text = "Ravenloft Academy"; + name = "Schoolgrounds" }) "dpW" = ( /obj/effect/landmark/start/archivist, @@ -4469,11 +4512,11 @@ first_time_text = null }) "dqW" = ( -/obj/structure/closet/crate/coffin, -/turf/open/floor/rogue/twig, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/fluff/dryingrack, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "drI" = ( /obj/effect/landmark/events/haunts, @@ -4561,11 +4604,16 @@ first_time_text = "The Twilight Woods" }) "dvC" = ( -/obj/structure/safeglowshroom, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/fluff/railing/wood{ + dir = 1; + layer = 2.7; + pixel_x = 2; + pixel_y = 7 + }, +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/turf/open/floor/rogue/ruinedwood/herringbone, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" }) "dvN" = ( /obj/structure/closet/crate/roguecloset/inn/south, @@ -6786,6 +6834,7 @@ "eZV" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/spacevine, +/obj/structure/fluff/statue/small, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "fah" = ( @@ -6852,6 +6901,20 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/swamp, /area/rogue/under/cavewet/bogcaves) +"fcd" = ( +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/obj/structure/roguewindow/openclose{ + dir = 4 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) "fch" = ( /obj/effect/decal/border{ dir = 10 @@ -7922,6 +7985,13 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) +"fWh" = ( +/obj/structure/telescope, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) "fXv" = ( /obj/structure/flora/rogueshroom/happyrandom{ icon_state = "mush4" @@ -7997,21 +8067,11 @@ first_time_text = "The Twilight Woods" }) "fZA" = ( -/obj/structure/roguemachine/vendor{ - keycontrol = "steward" - }, /obj/effect/decal/stone/blockedge, -/obj/effect/decal/stone/blockedge/blockedgeinvert, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/turf/closed/wall/mineral/rogue/decowood, +/obj/structure/table/wood{ + icon_state = "tablewood1" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -8179,7 +8239,7 @@ /obj/structure/flora/grass/jungle{ icon_state = "grassa1" }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/closed/wall/mineral/rogue/decostone, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -9597,6 +9657,7 @@ /obj/item/book/granter/spell/spells5e/poisonspray5e, /obj/item/book/granter/spell/blackstone/lightning, /obj/item/book/granter/spell/blackstone/fireball, +/obj/item/scrying, /turf/open/floor/bronze, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -9758,9 +9819,7 @@ /turf/open/floor/rogue/dirt, /area/rogue/outdoors/river) "hzm" = ( -/obj/structure/bookcase, -/obj/item/book/granter/spell/spells5e/mending5e, -/obj/item/book/granter/spell/spells5e/poisonspray5e, +/obj/structure/chair/bench/coucha/r, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -10357,6 +10416,13 @@ /obj/item/bedsheet/rogue/double_pelt, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/entrance) +"hXg" = ( +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "hXl" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/stairs/stone{ @@ -11855,6 +11921,15 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"jgy" = ( +/obj/structure/fluff/clock{ + pixel_y = 20 + }, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "jhB" = ( /obj/effect/mist, /turf/closed/wall/shroud, @@ -11905,6 +11980,16 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) +"jjp" = ( +/obj/structure/mineral_door/wood/window{ + lockid = "mage"; + locked = 1 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) "jkg" = ( /obj/machinery/light/rogue/oven/south, /turf/open/floor/rogue/tile, @@ -11958,6 +12043,12 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"jmP" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 8 + }, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/entrance) "jmV" = ( /obj/effect/mist, /obj/structure/closet/crate/chest/refilling/trait, @@ -13099,7 +13190,7 @@ first_time_text = "The Twilight Woods" }) "kcf" = ( -/obj/structure/fluff/statue/lewd/random, +/obj/structure/fluff/statue/small, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "kct" = ( @@ -13586,6 +13677,7 @@ /obj/structure/table/church{ icon_state = "churchtable_end" }, +/obj/item/clothing/neck/roguetown/psicross/silver, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -14057,9 +14149,13 @@ first_time_text = "Stonehedge" }) "kMT" = ( -/obj/structure/fluff/statue/small, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/bath) +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kNb" = ( /obj/structure/flora/newbranch/connector{ dir = 5; @@ -14107,11 +14203,19 @@ name = "Silver Dragon" }) "kOv" = ( +<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" +======= +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/cobble, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" +>>>>>>> Stashed changes }) "kOC" = ( /obj/structure/spacevine, @@ -14326,6 +14430,13 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) +"kUr" = ( +/obj/structure/table/church, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "kUu" = ( /obj/item/clothing/suit/roguetown/armor/leather/studded, /obj/item/clothing/suit/roguetown/armor/leather/studded, @@ -14532,6 +14643,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +<<<<<<< Updated upstream +======= +"lfB" = ( +/obj/structure/fluff/statue/tdummy, +/turf/open/floor/rogue/cobble, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) +>>>>>>> Stashed changes "lfC" = ( /obj/structure/fluff/walldeco/maidensigil, /obj/item/roguestatue/silver, @@ -15030,10 +15150,11 @@ first_time_text = "Stonehedge" }) "lyw" = ( -/turf/closed/wall/mineral/rogue/decostone/mossy/blue/end, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/chair/bench/couchablack, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "lyF" = ( /turf/closed/wall/mineral/rogue/stone/moss, @@ -15069,11 +15190,18 @@ first_time_text = "Stonehedge" }) "lCr" = ( +<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" +======= +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/rtfield{ + first_time_text = null +>>>>>>> Stashed changes }) "lCH" = ( /obj/machinery/light/rogue/torchholder{ @@ -15394,6 +15522,7 @@ }) "lSz" = ( /obj/structure/closet/crate/chest/refilling/medicine, +/obj/item/clothing/neck/roguetown/psicross/pestra, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -15545,7 +15674,11 @@ /obj/structure/roguewindow/openclose{ dir = 4 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -15964,6 +16097,7 @@ }) "mpi" = ( /obj/structure/fluff/walldeco/bigpainting/lake, +/obj/structure/chair/bench/couchablack, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -16182,7 +16316,7 @@ /obj/item/paper, /obj/item/paper, /obj/item/paper, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -16449,6 +16583,15 @@ /obj/machinery/light/rogue/wallfire/candle/l, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"mGY" = ( +/obj/structure/fluff/railing/border{ + dir = 8 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "mHk" = ( /obj/structure/fluff/railing/border{ dir = 4 @@ -16670,10 +16813,20 @@ /area/rogue/outdoors/caves) "mOd" = ( /obj/structure/flora/grass/jungle/b, +<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge" +======= +/obj/structure/fluff/railing/border{ + dir = 8 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" +>>>>>>> Stashed changes }) "mOu" = ( /obj/effect/decal/border/ruinedwood{ @@ -17664,10 +17817,18 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "nBi" = ( +<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/brute, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors{ first_time_text = "Stonehedge" +======= +/obj/structure/fluff/statue/gargoyle/moss, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" +>>>>>>> Stashed changes }) "nBZ" = ( /obj/structure/chair/wood/rogue{ @@ -18097,6 +18258,7 @@ /obj/item/book/granter/spell/spells5e/rayoffrost5e, /obj/item/book/granter/spell/spells5e/boomingblade5e, /obj/item/book/granter/spell/spells5e/acidsplash5e, +/obj/item/book/granter/spell/spells5e/poisonspray5e, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -18142,6 +18304,7 @@ /obj/structure/closet/crate/roguecloset/dark, /obj/item/reagent_containers/glass/bottle/rogue/majorhealthpot, /obj/item/reagent_containers/glass/bottle/rogue/majorhealthpot, +/obj/item/scrying, /turf/open/floor/bronze, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -18311,12 +18474,19 @@ /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/exposed/tavern) "nYE" = ( +<<<<<<< Updated upstream /obj/structure/flora/grass/jungle/b, /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" +======= +/obj/effect/mob_spawner/wilderness, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" +>>>>>>> Stashed changes }) "nYV" = ( /obj/structure/flora/newleaf{ @@ -18425,6 +18595,7 @@ first_time_text = "Stonehedge" }) "oeB" = ( +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors/river) "oeO" = ( @@ -18623,10 +18794,11 @@ name = "Adventurers Guild" }) "orU" = ( -/obj/machinery/light/rogue/wallfire/candle/blue/r, -/obj/structure/fluff/statue/small, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/bath) +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/entrance) "osH" = ( /turf/open/floor/rogue/cobble, /area/rogue/outdoors/river) @@ -19131,7 +19303,11 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -19692,10 +19868,10 @@ name = "far stonehedge" }) "piY" = ( -/obj/structure/fluff/statue/lewd/random, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/bath{ - first_time_text = "The Dreamers Demesne.." +/obj/structure/long_sleep/mushroom, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Mountain Passe" }) "pjg" = ( /obj/structure/flora/grass/jungle/b, @@ -20253,10 +20429,17 @@ name = "Silver Dragon" }) "pIz" = ( +<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ first_time_text = "Stonehedge" +======= +/obj/effect/mob_spawner/wilderness, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" +>>>>>>> Stashed changes }) "pJt" = ( /obj/structure/flora/grass/jungle/b, @@ -20630,7 +20813,7 @@ }) "pWc" = ( /obj/machinery/light/rogue/wallfire/candle/blue/r, -/turf/open/floor/rogue/twig, +/turf/open/floor/rogue/cobble, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -21268,10 +21451,15 @@ }, /area/rogue/under/cavewet) "qrG" = ( -/turf/open/floor/rogue/twig, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/newtree, +/turf/open/floor/rogue/rooftop{ + dir = 4; + icon_state = "roof" + }, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "qrP" = ( /obj/structure/flora/rogueshroom/happyrandom, @@ -21394,6 +21582,7 @@ /turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town) "qwx" = ( +<<<<<<< Updated upstream /obj/machinery/light/rogue/torchholder{ dir = 4 }, @@ -21403,6 +21592,11 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +======= +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/cobble, +/area/rogue/outdoors/river) +>>>>>>> Stashed changes "qwU" = ( /mob/living/carbon/human/species/skeleton/npc/dungeon/ambush, /turf/open/floor/rogue/naturalstone, @@ -22254,6 +22448,16 @@ "rcU" = ( /obj/structure/roguemachine/scomm/r, /obj/effect/decal/stone/blockedge, +/obj/structure/closet/crate/chest, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -23125,9 +23329,7 @@ /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/town/tavern) "rLF" = ( -/obj/machinery/light/rogue/lanternpost{ - dir = 1 - }, +/obj/structure/fluff/statue/knight/interior, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -23726,12 +23928,11 @@ name = "Adventurers Guild" }) "siA" = ( -/obj/structure/flora/grass/jungle/b, -/obj/structure/long_sleep/mushroom, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/woods{ - first_time_text = "The Mountain Passe" - }) +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/turf/open/floor/rogue/twig/platform, +/area/rogue/indoors/shelter/rtfield) "siF" = ( /obj/item/roguegem/diamond, /turf/open/floor/rogue/dirt, @@ -23755,7 +23956,11 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -24110,7 +24315,7 @@ first_time_text = "The Twilight Woods" }) "sBl" = ( -/obj/structure/closet/crate/chest, +/obj/structure/chair/bench/couchablack/r, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -24149,10 +24354,17 @@ }) "sCW" = ( /obj/structure/flora/grass/jungle/b, +<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge" +======= +/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/rtfield{ + first_time_text = null +>>>>>>> Stashed changes }) "sDr" = ( /turf/closed/mineral/rogue/bedrock, @@ -24166,6 +24378,7 @@ layer = 2.8; pixel_x = 8 }, +/obj/structure/spacevine, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -24364,6 +24577,7 @@ }) "sLW" = ( /obj/effect/decal/border/stone/inverted, +/obj/machinery/light/rogue/firebowl/standing/blue, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -24514,7 +24728,8 @@ }) "sPq" = ( /obj/machinery/light/rogue/wallfire/candle/blue/l, -/turf/open/floor/rogue/twig, +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/cobble, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -24766,9 +24981,15 @@ /turf/open/floor/rogue/dirt, /area/rogue/under/cavewet/bogcaves) "tbx" = ( -/obj/structure/bed/rogue/inn/wooldouble, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/entrance) +/obj/structure/flora/roguegrass, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "tbX" = ( /obj/structure/chair/wood/rogue, /obj/structure/fluff/railing/wood{ @@ -25179,12 +25400,18 @@ /turf/open/floor/rogue/greenstone, /area/rogue/indoors/town/bath) "toi" = ( -/obj/structure/well, -/obj/structure/spacevine, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/obj/structure/roguewindow/openclose{ + dir = 1 + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" }) "top" = ( /obj/structure/flora/grass/jungle/b, @@ -25277,6 +25504,7 @@ /obj/item/book/granter/spell/spells5e/primalsavagery5e, /obj/item/book/granter/spell/blackstone/lightning, /obj/item/book/granter/spell/blackstone/fireball, +/obj/item/book/granter/spell/spells5e/mending5e, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -25295,6 +25523,7 @@ /obj/structure/table/church{ icon_state = "churchtable_mid" }, +/obj/item/clothing/neck/roguetown/psicross/silver, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -25648,7 +25877,7 @@ /obj/structure/rack/rogue, /obj/machinery/light/rogue/wallfire/candle/blue/r, /obj/item/rogueweapon/shovel, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/open/floor/rogue/cobblerock, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -27418,6 +27647,7 @@ /obj/effect/decal/border/stone/inverted{ dir = 8 }, +/obj/machinery/light/rogue/firebowl/standing/blue, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -27531,6 +27761,9 @@ }) "vdK" = ( /obj/structure/flora/grass/jungle, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -27887,12 +28120,25 @@ }, /area/rogue/outdoors/river) "vwj" = ( +<<<<<<< Updated upstream /obj/structure/flora/roguegrass, /mob/living/carbon/human/species/human/smartnpc/townguard/brute, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" +======= +/obj/structure/roguewindow/openclose, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" +>>>>>>> Stashed changes }) "vwm" = ( /obj/item/natural/stone, @@ -27948,7 +28194,7 @@ /obj/item/paper/scroll, /obj/item/paper/scroll, /obj/item/natural/feather, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -29047,6 +29293,16 @@ /obj/item/bedsheet/rogue/double_pelt, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) +<<<<<<< Updated upstream +======= +"wxI" = ( +/obj/structure/flora/grass/jungle/b, +/turf/closed/wall/mineral/rogue/decostone, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +>>>>>>> Stashed changes "wxO" = ( /obj/structure/rack/rogue/shelf, /obj/structure/table/wood{ @@ -30481,7 +30737,7 @@ }) "xDM" = ( /obj/structure/fluff/statue/knight/interior/r, -/turf/open/floor/rogue/dirt, +/turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -77673,7 +77929,7 @@ ifi foa cgq cgq -jrB +kiG izZ fai pCG @@ -78076,7 +78332,7 @@ stf jrB stf stf -stf +nLN stf ptG pmJ @@ -84132,8 +84388,8 @@ rPi sZB sZB sZB -kan -kan +cVO +cVO sZB nVt nVt @@ -84731,13 +84987,13 @@ xDh rPi nmp sPq -qrG -qrG -qrG +rsg +rsg +rsg nmp sZB sZB -fWg +hXg kan fWg kan @@ -84932,11 +85188,11 @@ prw xDh oSM hio -dqW +rsg kan kan kan -sPq +kOv nmp fWg kan @@ -84944,8 +85200,8 @@ kan gHx kan kan -kan -wgl +cVO +kUr sZB nVt rxm @@ -85134,17 +85390,17 @@ xhl xDh xDh hio -dqW -kan +rsg +cVO bFR -kan -qrG +icP +rsg ayP kan ktL -kan +gIK gNI -kan +cVO ktL kan trL @@ -85336,15 +85592,15 @@ xDh xDh xDh hio -dqW -kan +rsg kan kan +cVO pWc nmp kan kan -kan +cVO aMy kan kan @@ -85538,10 +85794,10 @@ xDh xDh xcU nmp -pWc -qrG -qrG -qrG +azG +rsg +rsg +rsg nmp sZB sZB @@ -86520,7 +86776,7 @@ gec mDb vTS vTS -vTS +cpy rsF gec nVt @@ -86755,7 +87011,7 @@ nVt nVt sZB iDC -dvC +eHD ajF nvL tUh @@ -88574,8 +88830,8 @@ nVt nVt sZB xWw -kwu -xjT +eHD +bRi otA kan cVO @@ -88740,9 +88996,9 @@ gec evw evw kcf -orU +iOZ odP -kMT +ixO eZV evw cgq @@ -88777,7 +89033,7 @@ cgq sZB sZB eHD -bRi +xjT syp eLM iDC @@ -99506,10 +99762,10 @@ huM huM hgJ hgJ -nhM -nhM -nhM -nhM +hgJ +hgJ +hgJ +hgJ hgJ hgJ hgJ @@ -99711,8 +99967,8 @@ nhM nhM hgJ hgJ -nhM -nhM +hgJ +hgJ hgJ gFw hgJ @@ -99914,7 +100170,7 @@ hgJ hgJ hgJ hgJ -nhM +hgJ hgJ gFw gFw @@ -100116,8 +100372,8 @@ hgJ huM huM hgJ -nhM -nhM +hgJ +hgJ hgJ huM huM @@ -100319,7 +100575,7 @@ hgJ huM huM hgJ -nhM +hgJ hgJ hgJ huM @@ -100521,8 +100777,8 @@ hgJ hgJ huM hgJ -nhM -nhM +hgJ +hgJ hgJ hgJ hgJ @@ -100921,10 +101177,10 @@ nhM nhM hgJ hgJ -nhM -nhM -nhM -nhM +hgJ +hgJ +hgJ +hgJ hgJ hgJ hgJ @@ -101121,16 +101377,16 @@ nhM nhM nhM nhM -nhM -nhM -nhM -nhM -nhM -nhM -nhM -nhM -nhM -nhM +gRX +gRX +gRX +gRX +gRX +gRX +gRX +gRX +gRX +gRX nhM nhM oCe @@ -105159,7 +105415,7 @@ mVp mVp miB mVp -mVp +pEJ mVp mVp mVp @@ -105561,7 +105817,7 @@ miB miB oZS mVp -pEJ +mVp aYm aYm mVp @@ -106456,7 +106712,7 @@ oCe oCe shH shH -gbC +piY nxm qhN lvj @@ -107871,7 +108127,7 @@ oCe shH shH shH -siA +tgA nxm lvj lvj @@ -117667,7 +117923,7 @@ kqH lwK tLk qMs -toi +pkF lam vmN gTl @@ -118525,7 +118781,7 @@ miB eUJ kHM xyW -pEJ +mVp eUJ mVp miB @@ -119097,9 +119353,9 @@ kXp kXp ffo iXt -nNz -dij -rJG +dYB +dYB +dYB nNz wUD pFc @@ -119270,7 +119526,7 @@ gdU kan kan kan -sfZ +wxI oTG eHD wsc @@ -119287,7 +119543,7 @@ wza vmN qJZ gTl -qJZ +dqW qMs tLk vIa @@ -119299,7 +119555,7 @@ kXp kXp daC dYB -nNz +dYB rvt rJG nNz @@ -119483,9 +119739,9 @@ cal xDh xDh xDh -xDh -bQq -guW +xcU +tNb +pOo wsc pOo kQG @@ -119501,7 +119757,7 @@ kXp kXp daC dYB -nNz +dYB mwE rJG hiA @@ -119681,15 +119937,15 @@ cal tax sfZ kan -icP +kan xis icP xis tax wsc jLy -emy -sfZ +kan +hVW ycO qJZ vmN @@ -119703,7 +119959,7 @@ kXp kXp ffo dYB -nNz +dYB vzt jlS hiA @@ -119881,9 +120137,9 @@ mpx mpx xAN xis -kan -kan -kan +cCv +cCv +vcN kan pJt kan @@ -119905,7 +120161,7 @@ hQY kXp oRk dYB -nNz +dYB fZA rcU pFc @@ -120083,12 +120339,12 @@ eWu kvk mpx xis +mfc bFR kan kan kan kan -kan mMv kan sfZ @@ -120285,9 +120541,9 @@ eHD mpx eHD xis -sfZ -kan -kan +mOd +mGY +lXw kan eLJ kan @@ -120489,15 +120745,15 @@ tax cal kan sfZ -icP +kan xis icP xis cal icP jLy -hVW -kan +sfZ +emy ycO qJZ qJZ @@ -120697,7 +120953,7 @@ xDh xDh xDh tNb -lyw +pOo wsc pOo fpN @@ -120886,7 +121142,7 @@ alQ kan kan kan -kan +icP oTG eOW wsc @@ -121114,12 +121370,12 @@ beK haD uCN hiA -sBl +dYB dYB qKQ dYB dYB -tno +dYB hiA hHR jdj @@ -121152,7 +121408,7 @@ eyG eHG eUJ eHG -ilr +nYE ilr fmt eHG @@ -121316,7 +121572,7 @@ beK mJe uCN nWu -qFr +lyw dYB hiA hiA @@ -121720,7 +121976,7 @@ nFS mJe ucZ hiA -qFr +tno dYB hiA tiA @@ -122529,9 +122785,9 @@ rLF aeO avu elJ -laG elJ -avu +elJ +lfB pVI vQz nfU @@ -122727,7 +122983,7 @@ qJZ beK beK beK -dpz +beK elJ gZN elJ @@ -123137,8 +123393,8 @@ elJ elJ elJ elJ -laG -avu +elJ +lfB okm ucZ uCN @@ -123738,12 +123994,12 @@ beK beK beK xhh -npg +elJ elJ elJ pMv pMv -avu +lfB ucZ dok uCN @@ -123943,7 +124199,7 @@ gGI xKV laG avu -laG +elJ jql xKV jFL @@ -124189,7 +124445,7 @@ cBD uMJ oZS eUJ -mVp +pEJ nEo dZZ mVp @@ -124568,7 +124824,7 @@ oZS qRz miB tNE -eHG +pIz fMm oZS miB @@ -125303,7 +125559,7 @@ nXV lss nXV jsd -piY +ptM jsd nXV jsd @@ -127568,7 +127824,7 @@ tac nFT lvM ycO -kOv +ijB pTW qJZ qJZ @@ -127969,7 +128225,7 @@ nze ufX voH ijB -vwj +slN ycO nWn qMs @@ -128342,7 +128598,7 @@ aBk pcE oeB aBk -osH +qwx pcE tNb tlm @@ -128967,8 +129223,8 @@ uxu ccn oea oea -dxy -beK +oea +kMT nFS beK beK @@ -129166,7 +129422,7 @@ pFL uxu uxu uxu -pIz +hGY pwR oea pwR @@ -129174,7 +129430,7 @@ beK beK beK beK -tEM +qJZ qJZ qJZ qJZ @@ -129978,14 +130234,19 @@ qhI pwR oea pwR +<<<<<<< Updated upstream nFS rLF +======= +usY +beK +>>>>>>> Stashed changes nFS beK nFS ycO ijB -vmN +tbx qJZ qJZ qJZ @@ -130383,7 +130644,7 @@ oea oea oea umo -vmN +tbx cns pTW nFS @@ -131041,7 +131302,7 @@ fMm fMm eHG pan -mVp +pEJ ilr eHG eHG @@ -131211,7 +131472,7 @@ ycO ycO xKV ucZ -ucZ +lCr uCN wyc wyc @@ -131817,7 +132078,7 @@ qJZ qJZ ucZ ucZ -ucZ +sCW wyc wyc ubt @@ -146366,7 +146627,7 @@ vLX lVD vLX vLX -dko +jjp dqk vLX vLX @@ -148182,7 +148443,7 @@ vLX rZk kdu kdu -kdu +dpz rZk vLX mQc @@ -154223,7 +154484,7 @@ ovd ovd sfZ sfZ -kan +nBi mha aZy aZy @@ -155833,13 +156094,13 @@ fTn kan kan kan -sfZ +wxI ovd ovd ovd sfZ kan -kan +nBi mha aZy aZy @@ -156465,7 +156726,7 @@ aZy aZy aZy nWu -dYB +jgy dYB tiA lhA @@ -159843,7 +160104,7 @@ enU tJb tJb tJb -qwx +dmS tJb tJb tJb @@ -161442,6 +161703,10 @@ xBY xBY qCV qCV +<<<<<<< Updated upstream +======= +fqz +>>>>>>> Stashed changes fqz fqz fqz @@ -162456,7 +162721,7 @@ bcc bcc bcc bcc -jCG +dvC vMS vMS vMS @@ -165592,7 +165857,7 @@ gEU uCO wSd ijB -pAs +rzN ijB hcX rjd @@ -165794,8 +166059,8 @@ gEU snY cSc ijB -rzN -lCr +pAs +beK hcX rjd oPy @@ -181284,7 +181549,7 @@ aZy jHZ oTS xbp -xbp +jmP hvz xbp dDo @@ -181310,7 +181575,7 @@ taL lbr vLX vLX -vLX +fcd vLX vLX taL @@ -181690,7 +181955,7 @@ nyl amA rsv dDo -tbx +hWG dDo aZy aZy @@ -182112,7 +182377,7 @@ aZy sib egl lbr -vLX +dij uij vBX vBX @@ -182124,7 +182389,7 @@ aXd vBX vBX ePk -vLX +toi lbr egl egl @@ -182284,7 +182549,7 @@ dDo xbp xbp xbp -dDo +lXW oZz itq itq @@ -182314,7 +182579,7 @@ aZy sib egl lbr -vLX +dij cjY vBX nzB @@ -182326,7 +182591,7 @@ vLX vLX vBX cqm -vLX +toi lbr egl egl @@ -182889,7 +183154,7 @@ aZy jHZ xbp xbp -xbp +orU xbp hvz amA @@ -183328,11 +183593,11 @@ teF lbr lbr lbr -vLX -lwi +vwj +fWh lwi lwi -vLX +toi lbr fJT teF @@ -184716,7 +184981,7 @@ aZy jHZ oTS xbp -xbp +orU xbp xbp dDo @@ -184920,7 +185185,7 @@ fnH oTS xbp xFY -tbx +hWG dDo aZy aZy @@ -189368,7 +189633,7 @@ xSp htw xSp xSp -htw +qrG xDy xDy xSp @@ -190579,7 +190844,7 @@ xSp xSp xSp xDy -htw +qrG htw xSp htw @@ -199486,9 +199751,9 @@ jQX tDy itq dvV +siA eCz -eCz -eCz +wmj dvV vYE vYE @@ -200496,7 +200761,7 @@ aZy vYE vYE dvV -wmj +lCH eCz wmj dvV From 2d02f7a9cd47f8837fcafd8d4dcbf6f9749deb96 Mon Sep 17 00:00:00 2001 From: Murderfox Date: Fri, 29 Nov 2024 13:19:02 +1030 Subject: [PATCH 101/192] Revert "Update Dreamhold.dmm" This reverts commit 6152b033ec341b837f2ebfe2e5e1e289967d1da1. --- _maps/map_files/dreamhold/Dreamhold.dmm | 739 ++++++++---------------- 1 file changed, 237 insertions(+), 502 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 6a4b1c92ce3..59ed4734a74 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -647,17 +647,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -<<<<<<< Updated upstream -======= -"azG" = ( -/obj/machinery/light/rogue/wallfire/candle/blue/r, -/obj/structure/closet/crate/coffin, -/turf/open/floor/rogue/cobble, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) ->>>>>>> Stashed changes "azR" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -1065,7 +1054,7 @@ dir = 1; icon_state = "longtable" }, -/turf/open/floor/rogue/cobblerock, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -2152,7 +2141,7 @@ name = "far stonehedge" }) "bFR" = ( -/obj/structure/stairs/stone, +/obj/structure/ladder, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -2992,17 +2981,11 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) "cpy" = ( -<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) -======= -/obj/item/clothing/neck/roguetown/psicross/eora, -/turf/open/water/bath, -/area/rogue/indoors/town/bath) ->>>>>>> Stashed changes "cqm" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -3303,15 +3286,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"cCv" = ( -/obj/structure/fluff/railing/border{ - dir = 4 - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "cCy" = ( /obj/structure/flora/roguegrass/water, /turf/open/water/river{ @@ -4194,16 +4168,11 @@ name = "Shrine of Lune" }) "dij" = ( -/obj/structure/projected_forcefield{ - name = "Magick Barrier"; - desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; - icon_state = "purplesparkles" - }, -/obj/structure/roguewindow/openclose, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/magician{ - first_time_text = "Ravenloft Academy"; - name = "Ravenloft Academy" +/obj/effect/decal/stone/blockedge/blockedgeinvert, +/turf/open/floor/rogue/blocks/stone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "diD" = ( /obj/structure/fluff/statue/gargoyle/moss/candles, @@ -4439,23 +4408,11 @@ /turf/open/floor/carpet/red, /area/rogue/indoors/shelter/town) "dpz" = ( -/obj/structure/roguewindow/openclose{ - dir = 8 - }, -/obj/effect/forcefield{ - icon_state = "purplesparkles"; - name = "Warding Spell"; - desc = "It glimmers with potent magick!" - }, -/obj/structure/projected_forcefield{ - name = "Magick Barrier"; - desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; - icon_state = "purplesparkles" - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/outdoors/exposed/magiciantower{ - first_time_text = "Ravenloft Academy"; - name = "Schoolgrounds" +/obj/structure/fluff/statue/knight/interior, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "dpW" = ( /obj/effect/landmark/start/archivist, @@ -4512,11 +4469,11 @@ first_time_text = null }) "dqW" = ( -/obj/structure/fluff/dryingrack, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "drI" = ( /obj/effect/landmark/events/haunts, @@ -4604,16 +4561,11 @@ first_time_text = "The Twilight Woods" }) "dvC" = ( -/obj/structure/fluff/railing/wood{ - dir = 1; - layer = 2.7; - pixel_x = 2; - pixel_y = 7 - }, -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, -/turf/open/floor/rogue/ruinedwood/herringbone, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" +/obj/structure/safeglowshroom, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "dvN" = ( /obj/structure/closet/crate/roguecloset/inn/south, @@ -6834,7 +6786,6 @@ "eZV" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/spacevine, -/obj/structure/fluff/statue/small, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "fah" = ( @@ -6901,20 +6852,6 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/swamp, /area/rogue/under/cavewet/bogcaves) -"fcd" = ( -/obj/structure/projected_forcefield{ - name = "Magick Barrier"; - desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; - icon_state = "purplesparkles" - }, -/obj/structure/roguewindow/openclose{ - dir = 4 - }, -/turf/open/floor/rogue/blocks/stone/stonepattern2, -/area/rogue/indoors/town/magician{ - first_time_text = "Ravenloft Academy"; - name = "Ravenloft Academy" - }) "fch" = ( /obj/effect/decal/border{ dir = 10 @@ -7985,13 +7922,6 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) -"fWh" = ( -/obj/structure/telescope, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/magician{ - first_time_text = "Ravenloft Academy"; - name = "Ravenloft Academy" - }) "fXv" = ( /obj/structure/flora/rogueshroom/happyrandom{ icon_state = "mush4" @@ -8067,11 +7997,21 @@ first_time_text = "The Twilight Woods" }) "fZA" = ( -/obj/effect/decal/stone/blockedge, -/obj/structure/table/wood{ - icon_state = "tablewood1" +/obj/structure/roguemachine/vendor{ + keycontrol = "steward" }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/obj/effect/decal/stone/blockedge, +/obj/effect/decal/stone/blockedge/blockedgeinvert, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -8239,7 +8179,7 @@ /obj/structure/flora/grass/jungle{ icon_state = "grassa1" }, -/turf/closed/wall/mineral/rogue/decostone, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -9657,7 +9597,6 @@ /obj/item/book/granter/spell/spells5e/poisonspray5e, /obj/item/book/granter/spell/blackstone/lightning, /obj/item/book/granter/spell/blackstone/fireball, -/obj/item/scrying, /turf/open/floor/bronze, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -9819,7 +9758,9 @@ /turf/open/floor/rogue/dirt, /area/rogue/outdoors/river) "hzm" = ( -/obj/structure/chair/bench/coucha/r, +/obj/structure/bookcase, +/obj/item/book/granter/spell/spells5e/mending5e, +/obj/item/book/granter/spell/spells5e/poisonspray5e, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -10416,13 +10357,6 @@ /obj/item/bedsheet/rogue/double_pelt, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/entrance) -"hXg" = ( -/obj/machinery/light/rogue/wallfire/candle/blue/l, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "hXl" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/stairs/stone{ @@ -11921,15 +11855,6 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) -"jgy" = ( -/obj/structure/fluff/clock{ - pixel_y = 20 - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "jhB" = ( /obj/effect/mist, /turf/closed/wall/shroud, @@ -11980,16 +11905,6 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) -"jjp" = ( -/obj/structure/mineral_door/wood/window{ - lockid = "mage"; - locked = 1 - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/magician{ - first_time_text = "Ravenloft Academy"; - name = "Ravenloft Academy" - }) "jkg" = ( /obj/machinery/light/rogue/oven/south, /turf/open/floor/rogue/tile, @@ -12043,12 +11958,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"jmP" = ( -/obj/machinery/light/rogue/torchholder{ - dir = 8 - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/entrance) "jmV" = ( /obj/effect/mist, /obj/structure/closet/crate/chest/refilling/trait, @@ -13190,7 +13099,7 @@ first_time_text = "The Twilight Woods" }) "kcf" = ( -/obj/structure/fluff/statue/small, +/obj/structure/fluff/statue/lewd/random, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "kct" = ( @@ -13677,7 +13586,6 @@ /obj/structure/table/church{ icon_state = "churchtable_end" }, -/obj/item/clothing/neck/roguetown/psicross/silver, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -14149,13 +14057,9 @@ first_time_text = "Stonehedge" }) "kMT" = ( -/obj/structure/flora/grass/jungle/b, -/mob/living/carbon/human/species/human/friendlynpc/townguard/brute, -/turf/open/floor/rogue/cobblerock, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" - }) +/obj/structure/fluff/statue/small, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/bath) "kNb" = ( /obj/structure/flora/newbranch/connector{ dir = 5; @@ -14203,19 +14107,11 @@ name = "Silver Dragon" }) "kOv" = ( -<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" -======= -/obj/machinery/light/rogue/wallfire/candle/blue/l, -/turf/open/floor/rogue/cobble, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" ->>>>>>> Stashed changes }) "kOC" = ( /obj/structure/spacevine, @@ -14430,13 +14326,6 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) -"kUr" = ( -/obj/structure/table/church, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "kUu" = ( /obj/item/clothing/suit/roguetown/armor/leather/studded, /obj/item/clothing/suit/roguetown/armor/leather/studded, @@ -14643,15 +14532,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -<<<<<<< Updated upstream -======= -"lfB" = ( -/obj/structure/fluff/statue/tdummy, -/turf/open/floor/rogue/cobble, -/area/rogue/outdoors/rtfield{ - first_time_text = null - }) ->>>>>>> Stashed changes "lfC" = ( /obj/structure/fluff/walldeco/maidensigil, /obj/item/roguestatue/silver, @@ -15150,11 +15030,10 @@ first_time_text = "Stonehedge" }) "lyw" = ( -/obj/structure/chair/bench/couchablack, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" +/turf/closed/wall/mineral/rogue/decostone/mossy/blue/end, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "lyF" = ( /turf/closed/wall/mineral/rogue/stone/moss, @@ -15190,18 +15069,11 @@ first_time_text = "Stonehedge" }) "lCr" = ( -<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" -======= -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null ->>>>>>> Stashed changes }) "lCH" = ( /obj/machinery/light/rogue/torchholder{ @@ -15522,7 +15394,6 @@ }) "lSz" = ( /obj/structure/closet/crate/chest/refilling/medicine, -/obj/item/clothing/neck/roguetown/psicross/pestra, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -15674,11 +15545,7 @@ /obj/structure/roguewindow/openclose{ dir = 4 }, -/obj/structure/projected_forcefield{ - name = "Magick Barrier"; - desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; - icon_state = "purplesparkles" - }, +/obj/structure/bars/steel, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -16097,7 +15964,6 @@ }) "mpi" = ( /obj/structure/fluff/walldeco/bigpainting/lake, -/obj/structure/chair/bench/couchablack, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -16316,7 +16182,7 @@ /obj/item/paper, /obj/item/paper, /obj/item/paper, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -16583,15 +16449,6 @@ /obj/machinery/light/rogue/wallfire/candle/l, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) -"mGY" = ( -/obj/structure/fluff/railing/border{ - dir = 8 - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "mHk" = ( /obj/structure/fluff/railing/border{ dir = 4 @@ -16813,20 +16670,10 @@ /area/rogue/outdoors/caves) "mOd" = ( /obj/structure/flora/grass/jungle/b, -<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge" -======= -/obj/structure/fluff/railing/border{ - dir = 8 - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" ->>>>>>> Stashed changes }) "mOu" = ( /obj/effect/decal/border/ruinedwood{ @@ -17817,18 +17664,10 @@ /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) "nBi" = ( -<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/brute, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors{ first_time_text = "Stonehedge" -======= -/obj/structure/fluff/statue/gargoyle/moss, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" ->>>>>>> Stashed changes }) "nBZ" = ( /obj/structure/chair/wood/rogue{ @@ -18258,7 +18097,6 @@ /obj/item/book/granter/spell/spells5e/rayoffrost5e, /obj/item/book/granter/spell/spells5e/boomingblade5e, /obj/item/book/granter/spell/spells5e/acidsplash5e, -/obj/item/book/granter/spell/spells5e/poisonspray5e, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -18304,7 +18142,6 @@ /obj/structure/closet/crate/roguecloset/dark, /obj/item/reagent_containers/glass/bottle/rogue/majorhealthpot, /obj/item/reagent_containers/glass/bottle/rogue/majorhealthpot, -/obj/item/scrying, /turf/open/floor/bronze, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -18474,19 +18311,12 @@ /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/exposed/tavern) "nYE" = ( -<<<<<<< Updated upstream /obj/structure/flora/grass/jungle/b, /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" -======= -/obj/effect/mob_spawner/wilderness, -/turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors/woods{ - first_time_text = "The Twilight Woods" ->>>>>>> Stashed changes }) "nYV" = ( /obj/structure/flora/newleaf{ @@ -18595,7 +18425,6 @@ first_time_text = "Stonehedge" }) "oeB" = ( -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors/river) "oeO" = ( @@ -18794,11 +18623,10 @@ name = "Adventurers Guild" }) "orU" = ( -/obj/machinery/light/rogue/torchholder{ - dir = 4 - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/entrance) +/obj/machinery/light/rogue/wallfire/candle/blue/r, +/obj/structure/fluff/statue/small, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/bath) "osH" = ( /turf/open/floor/rogue/cobble, /area/rogue/outdoors/river) @@ -19303,11 +19131,7 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/projected_forcefield{ - name = "Magick Barrier"; - desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; - icon_state = "purplesparkles" - }, +/obj/structure/bars/steel, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -19868,10 +19692,10 @@ name = "far stonehedge" }) "piY" = ( -/obj/structure/long_sleep/mushroom, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/woods{ - first_time_text = "The Mountain Passe" +/obj/structure/fluff/statue/lewd/random, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/bath{ + first_time_text = "The Dreamers Demesne.." }) "pjg" = ( /obj/structure/flora/grass/jungle/b, @@ -20429,17 +20253,10 @@ name = "Silver Dragon" }) "pIz" = ( -<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ first_time_text = "Stonehedge" -======= -/obj/effect/mob_spawner/wilderness, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/woods{ - first_time_text = "The Twilight Woods" ->>>>>>> Stashed changes }) "pJt" = ( /obj/structure/flora/grass/jungle/b, @@ -20813,7 +20630,7 @@ }) "pWc" = ( /obj/machinery/light/rogue/wallfire/candle/blue/r, -/turf/open/floor/rogue/cobble, +/turf/open/floor/rogue/twig, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -21451,15 +21268,10 @@ }, /area/rogue/under/cavewet) "qrG" = ( -/obj/structure/flora/grass/jungle/b, -/obj/structure/flora/newtree, -/turf/open/floor/rogue/rooftop{ - dir = 4; - icon_state = "roof" - }, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "qrP" = ( /obj/structure/flora/rogueshroom/happyrandom, @@ -21582,7 +21394,6 @@ /turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town) "qwx" = ( -<<<<<<< Updated upstream /obj/machinery/light/rogue/torchholder{ dir = 4 }, @@ -21592,11 +21403,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -======= -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, -/turf/open/floor/rogue/cobble, -/area/rogue/outdoors/river) ->>>>>>> Stashed changes "qwU" = ( /mob/living/carbon/human/species/skeleton/npc/dungeon/ambush, /turf/open/floor/rogue/naturalstone, @@ -22448,16 +22254,6 @@ "rcU" = ( /obj/structure/roguemachine/scomm/r, /obj/effect/decal/stone/blockedge, -/obj/structure/closet/crate/chest, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -23329,7 +23125,9 @@ /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/town/tavern) "rLF" = ( -/obj/structure/fluff/statue/knight/interior, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -23928,11 +23726,12 @@ name = "Adventurers Guild" }) "siA" = ( -/obj/machinery/light/rogue/torchholder{ - dir = 4 - }, -/turf/open/floor/rogue/twig/platform, -/area/rogue/indoors/shelter/rtfield) +/obj/structure/flora/grass/jungle/b, +/obj/structure/long_sleep/mushroom, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Mountain Passe" + }) "siF" = ( /obj/item/roguegem/diamond, /turf/open/floor/rogue/dirt, @@ -23956,11 +23755,7 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/projected_forcefield{ - name = "Magick Barrier"; - desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; - icon_state = "purplesparkles" - }, +/obj/structure/bars/steel, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -24315,7 +24110,7 @@ first_time_text = "The Twilight Woods" }) "sBl" = ( -/obj/structure/chair/bench/couchablack/r, +/obj/structure/closet/crate/chest, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -24354,17 +24149,10 @@ }) "sCW" = ( /obj/structure/flora/grass/jungle/b, -<<<<<<< Updated upstream /mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge" -======= -/mob/living/carbon/human/species/human/friendlynpc/townguard/sentry, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null ->>>>>>> Stashed changes }) "sDr" = ( /turf/closed/mineral/rogue/bedrock, @@ -24378,7 +24166,6 @@ layer = 2.8; pixel_x = 8 }, -/obj/structure/spacevine, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -24577,7 +24364,6 @@ }) "sLW" = ( /obj/effect/decal/border/stone/inverted, -/obj/machinery/light/rogue/firebowl/standing/blue, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -24728,8 +24514,7 @@ }) "sPq" = ( /obj/machinery/light/rogue/wallfire/candle/blue/l, -/obj/structure/closet/crate/coffin, -/turf/open/floor/rogue/cobble, +/turf/open/floor/rogue/twig, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -24981,15 +24766,9 @@ /turf/open/floor/rogue/dirt, /area/rogue/under/cavewet/bogcaves) "tbx" = ( -/obj/structure/flora/roguegrass, -/obj/machinery/light/rogue/lanternpost{ - dir = 1 - }, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" - }) +/obj/structure/bed/rogue/inn/wooldouble, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/entrance) "tbX" = ( /obj/structure/chair/wood/rogue, /obj/structure/fluff/railing/wood{ @@ -25400,18 +25179,12 @@ /turf/open/floor/rogue/greenstone, /area/rogue/indoors/town/bath) "toi" = ( -/obj/structure/roguewindow/openclose{ - dir = 1 - }, -/obj/structure/projected_forcefield{ - name = "Magick Barrier"; - desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; - icon_state = "purplesparkles" - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/magician{ - first_time_text = "Ravenloft Academy"; - name = "Ravenloft Academy" +/obj/structure/well, +/obj/structure/spacevine, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "top" = ( /obj/structure/flora/grass/jungle/b, @@ -25504,7 +25277,6 @@ /obj/item/book/granter/spell/spells5e/primalsavagery5e, /obj/item/book/granter/spell/blackstone/lightning, /obj/item/book/granter/spell/blackstone/fireball, -/obj/item/book/granter/spell/spells5e/mending5e, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -25523,7 +25295,6 @@ /obj/structure/table/church{ icon_state = "churchtable_mid" }, -/obj/item/clothing/neck/roguetown/psicross/silver, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -25877,7 +25648,7 @@ /obj/structure/rack/rogue, /obj/machinery/light/rogue/wallfire/candle/blue/r, /obj/item/rogueweapon/shovel, -/turf/open/floor/rogue/cobblerock, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -27647,7 +27418,6 @@ /obj/effect/decal/border/stone/inverted{ dir = 8 }, -/obj/machinery/light/rogue/firebowl/standing/blue, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -27761,9 +27531,6 @@ }) "vdK" = ( /obj/structure/flora/grass/jungle, -/obj/machinery/light/rogue/lanternpost{ - dir = 1 - }, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -28120,25 +27887,12 @@ }, /area/rogue/outdoors/river) "vwj" = ( -<<<<<<< Updated upstream /obj/structure/flora/roguegrass, /mob/living/carbon/human/species/human/smartnpc/townguard/brute, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" -======= -/obj/structure/roguewindow/openclose, -/obj/structure/projected_forcefield{ - name = "Magick Barrier"; - desc = "It glistens and hums with arcane energy. Powerful Magicks, this."; - icon_state = "purplesparkles" - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/magician{ - first_time_text = "Ravenloft Academy"; - name = "Ravenloft Academy" ->>>>>>> Stashed changes }) "vwm" = ( /obj/item/natural/stone, @@ -28194,7 +27948,7 @@ /obj/item/paper/scroll, /obj/item/paper/scroll, /obj/item/natural/feather, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -29293,16 +29047,6 @@ /obj/item/bedsheet/rogue/double_pelt, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) -<<<<<<< Updated upstream -======= -"wxI" = ( -/obj/structure/flora/grass/jungle/b, -/turf/closed/wall/mineral/rogue/decostone, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) ->>>>>>> Stashed changes "wxO" = ( /obj/structure/rack/rogue/shelf, /obj/structure/table/wood{ @@ -30737,7 +30481,7 @@ }) "xDM" = ( /obj/structure/fluff/statue/knight/interior/r, -/turf/open/floor/rogue/cobblerock, +/turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -77929,7 +77673,7 @@ ifi foa cgq cgq -kiG +jrB izZ fai pCG @@ -78332,7 +78076,7 @@ stf jrB stf stf -nLN +stf stf ptG pmJ @@ -84388,8 +84132,8 @@ rPi sZB sZB sZB -cVO -cVO +kan +kan sZB nVt nVt @@ -84987,13 +84731,13 @@ xDh rPi nmp sPq -rsg -rsg -rsg +qrG +qrG +qrG nmp sZB sZB -hXg +fWg kan fWg kan @@ -85188,11 +84932,11 @@ prw xDh oSM hio -rsg +dqW kan kan kan -kOv +sPq nmp fWg kan @@ -85200,8 +84944,8 @@ kan gHx kan kan -cVO -kUr +kan +wgl sZB nVt rxm @@ -85390,17 +85134,17 @@ xhl xDh xDh hio -rsg -cVO +dqW +kan bFR -icP -rsg +kan +qrG ayP kan ktL -gIK +kan gNI -cVO +kan ktL kan trL @@ -85592,15 +85336,15 @@ xDh xDh xDh hio -rsg +dqW +kan kan kan -cVO pWc nmp kan kan -cVO +kan aMy kan kan @@ -85794,10 +85538,10 @@ xDh xDh xcU nmp -azG -rsg -rsg -rsg +pWc +qrG +qrG +qrG nmp sZB sZB @@ -86776,7 +86520,7 @@ gec mDb vTS vTS -cpy +vTS rsF gec nVt @@ -87011,7 +86755,7 @@ nVt nVt sZB iDC -eHD +dvC ajF nvL tUh @@ -88830,8 +88574,8 @@ nVt nVt sZB xWw -eHD -bRi +kwu +xjT otA kan cVO @@ -88996,9 +88740,9 @@ gec evw evw kcf -iOZ +orU odP -ixO +kMT eZV evw cgq @@ -89033,7 +88777,7 @@ cgq sZB sZB eHD -xjT +bRi syp eLM iDC @@ -99762,10 +99506,10 @@ huM huM hgJ hgJ -hgJ -hgJ -hgJ -hgJ +nhM +nhM +nhM +nhM hgJ hgJ hgJ @@ -99967,8 +99711,8 @@ nhM nhM hgJ hgJ -hgJ -hgJ +nhM +nhM hgJ gFw hgJ @@ -100170,7 +99914,7 @@ hgJ hgJ hgJ hgJ -hgJ +nhM hgJ gFw gFw @@ -100372,8 +100116,8 @@ hgJ huM huM hgJ -hgJ -hgJ +nhM +nhM hgJ huM huM @@ -100575,7 +100319,7 @@ hgJ huM huM hgJ -hgJ +nhM hgJ hgJ huM @@ -100777,8 +100521,8 @@ hgJ hgJ huM hgJ -hgJ -hgJ +nhM +nhM hgJ hgJ hgJ @@ -101177,10 +100921,10 @@ nhM nhM hgJ hgJ -hgJ -hgJ -hgJ -hgJ +nhM +nhM +nhM +nhM hgJ hgJ hgJ @@ -101377,16 +101121,16 @@ nhM nhM nhM nhM -gRX -gRX -gRX -gRX -gRX -gRX -gRX -gRX -gRX -gRX +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM nhM nhM oCe @@ -105415,7 +105159,7 @@ mVp mVp miB mVp -pEJ +mVp mVp mVp mVp @@ -105817,7 +105561,7 @@ miB miB oZS mVp -mVp +pEJ aYm aYm mVp @@ -106712,7 +106456,7 @@ oCe oCe shH shH -piY +gbC nxm qhN lvj @@ -108127,7 +107871,7 @@ oCe shH shH shH -tgA +siA nxm lvj lvj @@ -117923,7 +117667,7 @@ kqH lwK tLk qMs -pkF +toi lam vmN gTl @@ -118781,7 +118525,7 @@ miB eUJ kHM xyW -mVp +pEJ eUJ mVp miB @@ -119353,9 +119097,9 @@ kXp kXp ffo iXt -dYB -dYB -dYB +nNz +dij +rJG nNz wUD pFc @@ -119526,7 +119270,7 @@ gdU kan kan kan -wxI +sfZ oTG eHD wsc @@ -119543,7 +119287,7 @@ wza vmN qJZ gTl -dqW +qJZ qMs tLk vIa @@ -119555,7 +119299,7 @@ kXp kXp daC dYB -dYB +nNz rvt rJG nNz @@ -119739,9 +119483,9 @@ cal xDh xDh xDh -xcU -tNb -pOo +xDh +bQq +guW wsc pOo kQG @@ -119757,7 +119501,7 @@ kXp kXp daC dYB -dYB +nNz mwE rJG hiA @@ -119937,15 +119681,15 @@ cal tax sfZ kan -kan +icP xis icP xis tax wsc jLy -kan -hVW +emy +sfZ ycO qJZ vmN @@ -119959,7 +119703,7 @@ kXp kXp ffo dYB -dYB +nNz vzt jlS hiA @@ -120137,9 +119881,9 @@ mpx mpx xAN xis -cCv -cCv -vcN +kan +kan +kan kan pJt kan @@ -120161,7 +119905,7 @@ hQY kXp oRk dYB -dYB +nNz fZA rcU pFc @@ -120339,12 +120083,12 @@ eWu kvk mpx xis -mfc bFR kan kan kan kan +kan mMv kan sfZ @@ -120541,9 +120285,9 @@ eHD mpx eHD xis -mOd -mGY -lXw +sfZ +kan +kan kan eLJ kan @@ -120745,15 +120489,15 @@ tax cal kan sfZ -kan +icP xis icP xis cal icP jLy -sfZ -emy +hVW +kan ycO qJZ qJZ @@ -120953,7 +120697,7 @@ xDh xDh xDh tNb -pOo +lyw wsc pOo fpN @@ -121142,7 +120886,7 @@ alQ kan kan kan -icP +kan oTG eOW wsc @@ -121370,12 +121114,12 @@ beK haD uCN hiA -dYB +sBl dYB qKQ dYB dYB -dYB +tno hiA hHR jdj @@ -121408,7 +121152,7 @@ eyG eHG eUJ eHG -nYE +ilr ilr fmt eHG @@ -121572,7 +121316,7 @@ beK mJe uCN nWu -lyw +qFr dYB hiA hiA @@ -121976,7 +121720,7 @@ nFS mJe ucZ hiA -tno +qFr dYB hiA tiA @@ -122785,9 +122529,9 @@ rLF aeO avu elJ +laG elJ -elJ -lfB +avu pVI vQz nfU @@ -122983,7 +122727,7 @@ qJZ beK beK beK -beK +dpz elJ gZN elJ @@ -123393,8 +123137,8 @@ elJ elJ elJ elJ -elJ -lfB +laG +avu okm ucZ uCN @@ -123994,12 +123738,12 @@ beK beK beK xhh -elJ +npg elJ elJ pMv pMv -lfB +avu ucZ dok uCN @@ -124199,7 +123943,7 @@ gGI xKV laG avu -elJ +laG jql xKV jFL @@ -124445,7 +124189,7 @@ cBD uMJ oZS eUJ -pEJ +mVp nEo dZZ mVp @@ -124824,7 +124568,7 @@ oZS qRz miB tNE -pIz +eHG fMm oZS miB @@ -125559,7 +125303,7 @@ nXV lss nXV jsd -ptM +piY jsd nXV jsd @@ -127824,7 +127568,7 @@ tac nFT lvM ycO -ijB +kOv pTW qJZ qJZ @@ -128225,7 +127969,7 @@ nze ufX voH ijB -slN +vwj ycO nWn qMs @@ -128598,7 +128342,7 @@ aBk pcE oeB aBk -qwx +osH pcE tNb tlm @@ -129223,8 +128967,8 @@ uxu ccn oea oea -oea -kMT +dxy +beK nFS beK beK @@ -129422,7 +129166,7 @@ pFL uxu uxu uxu -hGY +pIz pwR oea pwR @@ -129430,7 +129174,7 @@ beK beK beK beK -qJZ +tEM qJZ qJZ qJZ @@ -130234,19 +129978,14 @@ qhI pwR oea pwR -<<<<<<< Updated upstream nFS rLF -======= -usY -beK ->>>>>>> Stashed changes nFS beK nFS ycO ijB -tbx +vmN qJZ qJZ qJZ @@ -130644,7 +130383,7 @@ oea oea oea umo -tbx +vmN cns pTW nFS @@ -131302,7 +131041,7 @@ fMm fMm eHG pan -pEJ +mVp ilr eHG eHG @@ -131472,7 +131211,7 @@ ycO ycO xKV ucZ -lCr +ucZ uCN wyc wyc @@ -132078,7 +131817,7 @@ qJZ qJZ ucZ ucZ -sCW +ucZ wyc wyc ubt @@ -146627,7 +146366,7 @@ vLX lVD vLX vLX -jjp +dko dqk vLX vLX @@ -148443,7 +148182,7 @@ vLX rZk kdu kdu -dpz +kdu rZk vLX mQc @@ -154484,7 +154223,7 @@ ovd ovd sfZ sfZ -nBi +kan mha aZy aZy @@ -156094,13 +155833,13 @@ fTn kan kan kan -wxI +sfZ ovd ovd ovd sfZ kan -nBi +kan mha aZy aZy @@ -156726,7 +156465,7 @@ aZy aZy aZy nWu -jgy +dYB dYB tiA lhA @@ -160104,7 +159843,7 @@ enU tJb tJb tJb -dmS +qwx tJb tJb tJb @@ -161703,10 +161442,6 @@ xBY xBY qCV qCV -<<<<<<< Updated upstream -======= -fqz ->>>>>>> Stashed changes fqz fqz fqz @@ -162721,7 +162456,7 @@ bcc bcc bcc bcc -dvC +jCG vMS vMS vMS @@ -165857,7 +165592,7 @@ gEU uCO wSd ijB -rzN +pAs ijB hcX rjd @@ -166059,8 +165794,8 @@ gEU snY cSc ijB -pAs -beK +rzN +lCr hcX rjd oPy @@ -181549,7 +181284,7 @@ aZy jHZ oTS xbp -jmP +xbp hvz xbp dDo @@ -181575,7 +181310,7 @@ taL lbr vLX vLX -fcd +vLX vLX vLX taL @@ -181955,7 +181690,7 @@ nyl amA rsv dDo -hWG +tbx dDo aZy aZy @@ -182377,7 +182112,7 @@ aZy sib egl lbr -dij +vLX uij vBX vBX @@ -182389,7 +182124,7 @@ aXd vBX vBX ePk -toi +vLX lbr egl egl @@ -182549,7 +182284,7 @@ dDo xbp xbp xbp -lXW +dDo oZz itq itq @@ -182579,7 +182314,7 @@ aZy sib egl lbr -dij +vLX cjY vBX nzB @@ -182591,7 +182326,7 @@ vLX vLX vBX cqm -toi +vLX lbr egl egl @@ -183154,7 +182889,7 @@ aZy jHZ xbp xbp -orU +xbp xbp hvz amA @@ -183593,11 +183328,11 @@ teF lbr lbr lbr -vwj -fWh +vLX lwi lwi -toi +lwi +vLX lbr fJT teF @@ -184981,7 +184716,7 @@ aZy jHZ oTS xbp -orU +xbp xbp xbp dDo @@ -185185,7 +184920,7 @@ fnH oTS xbp xFY -hWG +tbx dDo aZy aZy @@ -189633,7 +189368,7 @@ xSp htw xSp xSp -qrG +htw xDy xDy xSp @@ -190844,7 +190579,7 @@ xSp xSp xSp xDy -qrG +htw htw xSp htw @@ -199751,9 +199486,9 @@ jQX tDy itq dvV -siA eCz -wmj +eCz +eCz dvV vYE vYE @@ -200761,7 +200496,7 @@ aZy vYE vYE dvV -lCH +wmj eCz wmj dvV From efa789674fc8d2b736b532ddd2f5ad97029a4c16 Mon Sep 17 00:00:00 2001 From: Sutures <101909198+noelle-lavenza@users.noreply.github.com> Date: Fri, 29 Nov 2024 11:19:46 -0500 Subject: [PATCH 102/192] Port some de-bloating (#143) * Merge pull request #7 from dwasint/kills-aliens Removes Unusued Features from the codebase (cherry picked from commit dff8952dc78c7daa18c0dbcaae255e131426f216) * Merge pull request #7 from dwasint/kills-aliens Removes Unusued Features from the codebase (cherry picked from commit dff8952dc78c7daa18c0dbcaae255e131426f216) * hydroponics! * Fix overcomplicated reagent clear code --------- Co-authored-by: dwasint <82520990+dwasint@users.noreply.github.com> Co-authored-by: Gyran <62253058+Gyrandola@users.noreply.github.com> --- code/__DEFINES/is_helpers.dm | 14 - code/__DEFINES/mobs.dm | 2 - code/__DEFINES/role_preferences.dm | 3 +- code/__DEFINES/say.dm | 1 - code/__DEFINES/traits.dm | 1 - code/__DEFINES/vv.dm | 1 - code/_globalvars/lists/mapping.dm | 1 - code/_globalvars/lists/poll_ignore.dm | 2 - code/_globalvars/traits.dm | 1 - code/_onclick/hud/_defines.dm | 10 - code/_onclick/hud/alert.dm | 22 - code/_onclick/hud/alien.dm | 135 --- code/_onclick/hud/alien_larva.dm | 37 - code/_onclick/hud/hud.dm | 5 - code/_onclick/hud/screen_objects.dm | 12 - code/_onclick/hud/swarmer.dm | 98 -- code/_onclick/other_mobs.dm | 20 - .../configuration/entries/game_options.dm | 5 - code/controllers/subsystem/traumas.dm | 42 +- code/datums/action.dm | 10 - code/datums/brain_damage/phobia.dm | 4 - code/datums/diseases/transformation.dm | 52 +- code/datums/emotes.dm | 6 - code/datums/saymode.dm | 15 - code/game/data_huds.dm | 4 +- .../dynamic/dynamic_rulesets_midround.dm | 93 -- .../dynamic/dynamic_rulesets_roundstart.dm | 35 - code/game/gamemodes/meteor/meteor.dm | 60 -- code/game/gamemodes/meteor/meteors.dm | 348 ------- code/game/gamemodes/objective.dm | 17 +- code/game/machinery/_machinery.dm | 2 - code/game/machinery/doors/airlock.dm | 23 - code/game/machinery/doors/airlock_types.dm | 14 - code/game/machinery/doors/door.dm | 5 +- code/game/machinery/doors/firedoor.dm | 7 - code/game/machinery/droneDispenser.dm | 260 ------ code/game/machinery/medical_kiosk.dm | 11 - .../porta_turret/portable_turret_cover.dm | 3 - .../mecha/equipment/tools/mining_tools.dm | 5 +- code/game/mecha/mecha_defense.dm | 5 - code/game/objects/effects/alien_acid.dm | 27 - code/game/objects/effects/landmarks.dm | 10 - .../objects/effects/spawners/gibspawner.dm | 46 - .../game/objects/effects/spawners/lootdrop.dm | 23 - .../effects/spawners/xeno_egg_delivery.dm | 1 - code/game/objects/items.dm | 14 - code/game/objects/items/body_egg.dm | 53 -- .../circuitboards/computer_circuitboards.dm | 52 -- .../objects/items/devices/chameleonproj.dm | 3 - .../items/implants/implant_abductor.dm | 35 - .../objects/items/stacks/sheets/leather.dm | 31 - .../objects/items/stacks/sheets/mineral.dm | 25 - code/game/objects/items/storage/backpack.dm | 1 + code/game/objects/items/toys.dm | 4 - code/game/objects/obj_defense.dm | 4 - code/game/objects/structures/aliens.dm | 337 ------- .../structures/beds_chairs/alien_nest.dm | 88 -- .../crates_lockers/closets/secure/cargo.dm | 1 - .../crates_lockers/closets/syndicate.dm | 1 - code/game/objects/structures/displaycase.dm | 6 - code/game/objects/structures/extinguisher.dm | 4 +- code/game/objects/structures/false_walls.dm | 9 - code/game/objects/structures/grille.dm | 7 - code/game/objects/structures/guncase.dm | 4 +- code/game/turfs/closed/minerals.dm | 6 - code/game/turfs/closed/wall/mineral_walls.dm | 11 - code/game/turfs/turf.dm | 2 - code/modules/admin/player_panel.dm | 5 - code/modules/admin/topic.dm | 25 +- code/modules/admin/verbs/debug.dm | 15 - code/modules/admin/verbs/randomverbs.dm | 91 +- .../antagonists/_common/antag_spawner.dm | 58 -- .../abductor/abductee/abductee_objectives.dm | 54 -- code/modules/antagonists/abductor/abductor.dm | 219 ----- .../abductor/equipment/abduction_gear.dm | 847 ------------------ .../abductor/equipment/abduction_outfits.dm | 56 -- .../abductor/equipment/abduction_surgery.dm | 40 - .../antagonists/abductor/equipment/gland.dm | 109 --- .../abductor/equipment/glands/access.dm | 19 - .../abductor/equipment/glands/blood.dm | 18 - .../abductor/equipment/glands/chem.dm | 20 - .../abductor/equipment/glands/egg.dm | 15 - .../abductor/equipment/glands/electric.dm | 26 - .../abductor/equipment/glands/heal.dm | 178 ---- .../abductor/equipment/glands/mindshock.dm | 64 -- .../abductor/equipment/glands/plasma.dm | 22 - .../abductor/equipment/glands/quantum.dm | 47 - .../abductor/equipment/glands/slime.dm | 21 - .../abductor/equipment/glands/spider.dm | 14 - .../abductor/equipment/glands/transform.dm | 15 - .../abductor/equipment/glands/trauma.dm | 18 - .../abductor/equipment/glands/ventcrawl.dm | 12 - .../abductor/equipment/glands/viral.dm | 34 - .../antagonists/abductor/ice_abductor.dm | 12 - .../antagonists/abductor/machinery/camera.dm | 139 --- .../antagonists/abductor/machinery/console.dm | 248 ----- .../abductor/machinery/dispenser.dm | 84 -- .../abductor/machinery/experiment.dm | 218 ----- .../antagonists/abductor/machinery/pad.dm | 56 -- .../antagonists/changeling/powers/headcrab.dm | 43 - .../changeling/powers/mutations.dm | 4 - .../antagonists/changeling/powers/panacea.dm | 1 - code/modules/antagonists/cult/blood_magic.dm | 1 - code/modules/antagonists/cult/runes.dm | 10 +- .../antagonists/disease/disease_event.dm | 26 - code/modules/antagonists/morph/morph.dm | 245 ----- .../antagonists/slaughter/slaughter.dm | 190 ---- .../antagonists/slaughter/slaughter_antag.dm | 31 - .../antagonists/slaughter/slaughterevent.dm | 47 - code/modules/antagonists/swarmer/swarmer.dm | 672 -------------- .../antagonists/swarmer/swarmer_event.dm | 28 - .../antagonists/wizard/equipment/spellbook.dm | 37 - code/modules/antagonists/xeno/xeno.dm | 38 - .../components/unary_devices/cryo.dm | 13 +- .../components/unary_devices/vent_pump.dm | 10 - .../components/unary_devices/vent_scrubber.dm | 11 - code/modules/awaymissions/corpse.dm | 6 - .../awaymissions/mission_code/snowdin.dm | 1 - code/modules/awaymissions/signpost.dm | 3 - .../modules/awaymissions/super_secret_room.dm | 2 - code/modules/cargo/bounties/assistant.dm | 204 ----- code/modules/cargo/bounties/chef.dm | 131 --- code/modules/cargo/bounties/engineering.dm | 37 - code/modules/cargo/bounties/item.dm | 39 - code/modules/cargo/bounties/mech.dm | 44 - code/modules/cargo/bounties/medical.dm | 59 -- code/modules/cargo/bounties/mining.dm | 51 -- code/modules/cargo/bounties/reagent.dm | 258 ------ code/modules/cargo/bounties/science.dm | 66 -- code/modules/cargo/bounties/security.dm | 13 - code/modules/cargo/bounties/slime.dm | 39 - code/modules/cargo/bounties/special.dm | 55 -- code/modules/cargo/bounties/virus.dm | 81 -- code/modules/cargo/bounty.dm | 180 ---- code/modules/cargo/bounty_console.dm | 96 -- code/modules/cargo/console.dm | 246 ----- code/modules/cargo/export_scanner.dm | 45 - code/modules/cargo/exports/parts.dm | 5 - code/modules/cargo/exports/sheets.dm | 12 - code/modules/cargo/expressconsole.dm | 215 ----- .../cargo/{packs.dm => packsrogue/_pack.dm} | 0 code/modules/cargo/supplypod_beacon.dm | 95 -- code/modules/clothing/chameleon.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 9 - code/modules/events/abductor.dm | 35 - code/modules/events/alien_infestation.dm | 78 -- code/modules/events/dust.dm | 31 - code/modules/events/fugitive_spawning.dm | 115 --- code/modules/events/high_priority_bounty.dm | 20 - code/modules/events/immovable_rod.dm | 165 ---- code/modules/events/major_dust.dm | 19 - code/modules/events/meateor_wave.dm | 11 - code/modules/events/meteor_wave.dm | 71 -- code/modules/events/nightmare.dm | 43 - code/modules/events/sentience.dm | 112 --- code/modules/events/space_dragon.dm | 44 - code/modules/events/spacevine.dm | 3 - .../kitchen_machinery/gibber.dm | 2 - code/modules/jobs/access.dm | 2 +- .../jobs/job_types/old/cargo_technician.dm | 2 - code/modules/mining/equipment/vendor_items.dm | 14 - code/modules/mining/machine_vending.dm | 1 - code/modules/mob/living/bloodcrawl.dm | 7 +- code/modules/mob/living/carbon/alien/alien.dm | 150 ---- .../mob/living/carbon/alien/alien_defense.dm | 129 --- .../mob/living/carbon/alien/damage_procs.dm | 13 - code/modules/mob/living/carbon/alien/death.dm | 14 - code/modules/mob/living/carbon/alien/emote.dm | 29 - .../carbon/alien/humanoid/alien_powers.dm | 336 ------- .../carbon/alien/humanoid/caste/drone.dm | 43 - .../carbon/alien/humanoid/caste/hunter.dm | 95 -- .../carbon/alien/humanoid/caste/praetorian.dm | 42 - .../carbon/alien/humanoid/caste/sentinel.dm | 16 - .../mob/living/carbon/alien/humanoid/death.dm | 22 - .../living/carbon/alien/humanoid/humanoid.dm | 116 --- .../carbon/alien/humanoid/humanoid_defense.dm | 68 -- .../living/carbon/alien/humanoid/inventory.dm | 5 - .../mob/living/carbon/alien/humanoid/life.dm | 18 - .../mob/living/carbon/alien/humanoid/queen.dm | 139 --- .../carbon/alien/humanoid/update_icons.dm | 94 -- .../mob/living/carbon/alien/larva/death.dm | 22 - .../living/carbon/alien/larva/inventory.dm | 3 - .../mob/living/carbon/alien/larva/larva.dm | 69 -- .../carbon/alien/larva/larva_defense.dm | 33 - .../mob/living/carbon/alien/larva/life.dm | 32 - .../mob/living/carbon/alien/larva/powers.dm | 63 -- .../living/carbon/alien/larva/update_icons.dm | 31 - code/modules/mob/living/carbon/alien/life.dm | 54 -- code/modules/mob/living/carbon/alien/login.dm | 4 - .../modules/mob/living/carbon/alien/logout.dm | 4 - .../modules/mob/living/carbon/alien/organs.dm | 192 ---- code/modules/mob/living/carbon/alien/say.dm | 23 - .../modules/mob/living/carbon/alien/screen.dm | 33 - .../carbon/alien/special/alien_embryo.dm | 129 --- .../living/carbon/alien/special/facehugger.dm | 271 ------ .../mob/living/carbon/alien/status_procs.dm | 20 - .../mob/living/carbon/alien/update_icons.dm | 11 - code/modules/mob/living/carbon/carbon.dm | 3 - code/modules/mob/living/carbon/human/human.dm | 7 - .../mob/living/carbon/human/human_defense.dm | 62 -- .../carbon/human/species_types/golems.dm | 11 - .../living/carbon/monkey/monkey_defense.dm | 61 -- .../living/carbon/spirit/spirit_defense.dm | 62 -- code/modules/mob/living/emote.dm | 2 - code/modules/mob/living/living_defense.dm | 48 - .../mob/living/silicon/ai/ai_defense.dm | 7 - .../mob/living/silicon/robot/robot_defense.dm | 21 - .../mob/living/silicon/silicon_defense.dm | 24 - .../living/simple_animal/animal_defense.dm | 26 - .../mob/living/simple_animal/bot/honkbot.dm | 6 - .../mob/living/simple_animal/bot/secbot.dm | 6 - .../mob/living/simple_animal/corpse.dm | 15 - .../living/simple_animal/hostile/headcrab.dm | 87 -- .../hostile/megafauna/colossus.dm | 2 - .../hostile/megafauna/swarmer.dm | 288 ------ .../hostile/mining_mobs/curse_blob.dm | 4 - .../simple_animal/hostile/retaliate/clown.dm | 6 +- .../mob/living/simple_animal/parrot.dm | 3 - .../mob/living/simple_animal/slime/life.dm | 4 +- .../mob/living/simple_animal/slime/slime.dm | 10 - code/modules/mob/transform_procs.dm | 31 - code/modules/paperwork/photocopier.dm | 4 +- code/modules/power/apc.dm | 2 - code/modules/power/singularity/singularity.dm | 3 - code/modules/power/supermatter/supermatter.dm | 3 - code/modules/projectiles/projectile.dm | 7 +- code/modules/projectiles/projectile/magic.dm | 12 +- .../projectile/special/neurotoxin.dm | 6 - .../chemistry/reagents/drink_reagents.dm | 19 +- .../chemistry/reagents/other_reagents.dm | 25 - .../chemistry/reagents/toxin_reagents.dm | 1 - .../reagents/reagent_containers/dropper.dm | 3 - .../reagents/reagent_containers/spray.dm | 2 +- .../reagents/reagent_containers/syringes.dm | 7 - .../research/designs/comp_board_designs.dm | 24 - .../research/designs/mining_designs.dm | 9 - .../research/designs/smelting_designs.dm | 10 - code/modules/research/designs/tool_designs.dm | 64 -- code/modules/research/techweb/all_nodes.dm | 43 - code/modules/ruins/lavaland_ruin_code.dm | 1 - .../ruins/objects_and_mobs/sin_ruins.dm | 5 +- .../ruins/spaceruin_code/hilbertshotel.dm | 3 - .../spells/spell_types/rightandwrong.dm | 1 - code/modules/spells/spell_types/rod_form.dm | 56 -- code/modules/station_goals/shield.dm | 182 ---- code/modules/surgery/bodyparts/_bodyparts.dm | 52 -- code/modules/surgery/bodyparts/head.dm | 26 +- code/modules/surgery/bodyparts/helpers.dm | 89 +- code/modules/surgery/organs/augments_chest.dm | 6 - roguetown.dme | 119 +-- 251 files changed, 53 insertions(+), 13023 deletions(-) delete mode 100644 code/_onclick/hud/alien.dm delete mode 100644 code/_onclick/hud/alien_larva.dm delete mode 100644 code/_onclick/hud/swarmer.dm delete mode 100644 code/game/gamemodes/meteor/meteor.dm delete mode 100644 code/game/gamemodes/meteor/meteors.dm delete mode 100644 code/game/machinery/droneDispenser.dm delete mode 100644 code/game/objects/items/body_egg.dm delete mode 100644 code/game/objects/items/implants/implant_abductor.dm delete mode 100644 code/game/objects/structures/aliens.dm delete mode 100644 code/game/objects/structures/beds_chairs/alien_nest.dm delete mode 100644 code/modules/antagonists/abductor/abductee/abductee_objectives.dm delete mode 100644 code/modules/antagonists/abductor/abductor.dm delete mode 100644 code/modules/antagonists/abductor/equipment/abduction_gear.dm delete mode 100644 code/modules/antagonists/abductor/equipment/abduction_outfits.dm delete mode 100644 code/modules/antagonists/abductor/equipment/abduction_surgery.dm delete mode 100644 code/modules/antagonists/abductor/equipment/gland.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/access.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/blood.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/chem.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/egg.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/electric.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/heal.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/mindshock.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/plasma.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/quantum.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/slime.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/spider.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/transform.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/trauma.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm delete mode 100644 code/modules/antagonists/abductor/equipment/glands/viral.dm delete mode 100644 code/modules/antagonists/abductor/ice_abductor.dm delete mode 100644 code/modules/antagonists/abductor/machinery/camera.dm delete mode 100644 code/modules/antagonists/abductor/machinery/console.dm delete mode 100644 code/modules/antagonists/abductor/machinery/dispenser.dm delete mode 100644 code/modules/antagonists/abductor/machinery/experiment.dm delete mode 100644 code/modules/antagonists/abductor/machinery/pad.dm delete mode 100644 code/modules/antagonists/changeling/powers/headcrab.dm delete mode 100644 code/modules/antagonists/disease/disease_event.dm delete mode 100644 code/modules/antagonists/morph/morph.dm delete mode 100644 code/modules/antagonists/slaughter/slaughter.dm delete mode 100644 code/modules/antagonists/slaughter/slaughter_antag.dm delete mode 100644 code/modules/antagonists/slaughter/slaughterevent.dm delete mode 100644 code/modules/antagonists/swarmer/swarmer.dm delete mode 100644 code/modules/antagonists/swarmer/swarmer_event.dm delete mode 100644 code/modules/antagonists/xeno/xeno.dm delete mode 100644 code/modules/cargo/bounties/assistant.dm delete mode 100644 code/modules/cargo/bounties/chef.dm delete mode 100644 code/modules/cargo/bounties/engineering.dm delete mode 100644 code/modules/cargo/bounties/item.dm delete mode 100644 code/modules/cargo/bounties/mech.dm delete mode 100644 code/modules/cargo/bounties/medical.dm delete mode 100644 code/modules/cargo/bounties/mining.dm delete mode 100644 code/modules/cargo/bounties/reagent.dm delete mode 100644 code/modules/cargo/bounties/science.dm delete mode 100644 code/modules/cargo/bounties/security.dm delete mode 100644 code/modules/cargo/bounties/slime.dm delete mode 100644 code/modules/cargo/bounties/special.dm delete mode 100644 code/modules/cargo/bounties/virus.dm delete mode 100644 code/modules/cargo/bounty.dm delete mode 100644 code/modules/cargo/bounty_console.dm delete mode 100644 code/modules/cargo/console.dm delete mode 100644 code/modules/cargo/export_scanner.dm delete mode 100644 code/modules/cargo/expressconsole.dm rename code/modules/cargo/{packs.dm => packsrogue/_pack.dm} (100%) delete mode 100644 code/modules/cargo/supplypod_beacon.dm delete mode 100644 code/modules/events/abductor.dm delete mode 100644 code/modules/events/alien_infestation.dm delete mode 100644 code/modules/events/dust.dm delete mode 100644 code/modules/events/fugitive_spawning.dm delete mode 100644 code/modules/events/high_priority_bounty.dm delete mode 100644 code/modules/events/immovable_rod.dm delete mode 100644 code/modules/events/major_dust.dm delete mode 100644 code/modules/events/meateor_wave.dm delete mode 100644 code/modules/events/meteor_wave.dm delete mode 100644 code/modules/events/nightmare.dm delete mode 100644 code/modules/events/sentience.dm delete mode 100644 code/modules/events/space_dragon.dm delete mode 100644 code/modules/mining/equipment/vendor_items.dm delete mode 100644 code/modules/mob/living/carbon/alien/alien.dm delete mode 100644 code/modules/mob/living/carbon/alien/alien_defense.dm delete mode 100644 code/modules/mob/living/carbon/alien/damage_procs.dm delete mode 100644 code/modules/mob/living/carbon/alien/death.dm delete mode 100644 code/modules/mob/living/carbon/alien/emote.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/death.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/humanoid.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/inventory.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/life.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/queen.dm delete mode 100644 code/modules/mob/living/carbon/alien/humanoid/update_icons.dm delete mode 100644 code/modules/mob/living/carbon/alien/larva/death.dm delete mode 100644 code/modules/mob/living/carbon/alien/larva/inventory.dm delete mode 100644 code/modules/mob/living/carbon/alien/larva/larva.dm delete mode 100644 code/modules/mob/living/carbon/alien/larva/larva_defense.dm delete mode 100644 code/modules/mob/living/carbon/alien/larva/life.dm delete mode 100644 code/modules/mob/living/carbon/alien/larva/powers.dm delete mode 100644 code/modules/mob/living/carbon/alien/larva/update_icons.dm delete mode 100644 code/modules/mob/living/carbon/alien/life.dm delete mode 100644 code/modules/mob/living/carbon/alien/login.dm delete mode 100644 code/modules/mob/living/carbon/alien/logout.dm delete mode 100644 code/modules/mob/living/carbon/alien/organs.dm delete mode 100644 code/modules/mob/living/carbon/alien/say.dm delete mode 100644 code/modules/mob/living/carbon/alien/screen.dm delete mode 100644 code/modules/mob/living/carbon/alien/special/alien_embryo.dm delete mode 100644 code/modules/mob/living/carbon/alien/special/facehugger.dm delete mode 100644 code/modules/mob/living/carbon/alien/status_procs.dm delete mode 100644 code/modules/mob/living/carbon/alien/update_icons.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/headcrab.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm delete mode 100644 code/modules/spells/spell_types/rod_form.dm delete mode 100644 code/modules/station_goals/shield.dm diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 33516d87c6c..c254269d124 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -107,20 +107,6 @@ GLOBAL_LIST_INIT(our_forest_sex, typecacheof(list( #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) -#define isalien(A) (istype(A, /mob/living/carbon/alien)) - -#define islarva(A) (istype(A, /mob/living/carbon/alien/larva)) - -#define isalienadult(A) (istype(A, /mob/living/carbon/alien/humanoid) || istype(A, /mob/living/simple_animal/hostile/alien)) - -#define isalienhunter(A) (istype(A, /mob/living/carbon/alien/humanoid/hunter)) - -#define isaliensentinel(A) (istype(A, /mob/living/carbon/alien/humanoid/sentinel)) - -#define isalienroyal(A) (istype(A, /mob/living/carbon/alien/humanoid/royal)) - -#define isalienqueen(A) (istype(A, /mob/living/carbon/alien/humanoid/royal/queen)) - #define istruedevil(A) (istype(A, /mob/living/carbon/true_devil)) //Silicon mobs diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 698988095c1..e0adc9c8e99 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -79,8 +79,6 @@ #define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' #define MONKEY_BODYPART "monkey" -#define ALIEN_BODYPART "alien" -#define LARVA_BODYPART "larva" #define DEVIL_BODYPART "devil" /*see __DEFINES/inventory.dm for bodypart bitflag defines*/ diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 3251e18b383..4eb61e5dbf9 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -25,7 +25,7 @@ #define ROLE_MALF "Malf AI" #define ROLE_REV "Revolutionary" #define ROLE_REV_HEAD "Head Revolutionary" -#define ROLE_ALIEN "Xenomorph" + #define ROLE_PAI "pAI" #define ROLE_CULTIST "Cultist" #define ROLE_BLOB "Blob" @@ -58,7 +58,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_WIZARD = /datum/game_mode/wizard, ROLE_MALF, ROLE_REV = /datum/game_mode/revolution, - ROLE_ALIEN, ROLE_PAI, ROLE_BLOB, ROLE_NINJA, diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 9983aec6ea3..75d1658eb13 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -33,7 +33,6 @@ #define MODE_DEADMIN "deadmin" #define MODE_KEY_DEADMIN "d" -#define MODE_ALIEN "alientalk" #define MODE_HOLOPAD "holopad" #define MODE_CHANGELING "changeling" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 9d96d9c56b8..151498afeef 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -289,7 +289,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown" #define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness #define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination -#define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy. #define TRAIT_STUNIMMUNE "stun_immunity" #define TRAIT_STUNRESISTANCE "stun_resistance" #define TRAIT_SLEEPIMMUNE "sleep_immunity" diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 91f8280c3ce..330e1421c01 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -119,7 +119,6 @@ #define VV_HK_MAKE_MONKEY "human_monkify" #define VV_HK_MAKE_CYBORG "human_cyborgify" #define VV_HK_MAKE_SLIME "human_slimeify" -#define VV_HK_MAKE_ALIEN "human_alienify" #define VV_HK_SET_SPECIES "setspecies" #define VV_HK_PURRBATION "purrbation" diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index ad49a192034..f2958c11206 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -30,7 +30,6 @@ GLOBAL_LIST_EMPTY(nukeop_leader_start) GLOBAL_LIST_EMPTY(newplayer_start) GLOBAL_LIST_EMPTY(prisonwarp) //admin prisoners go to these GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here (ninja energy net) -GLOBAL_LIST_EMPTY(xeno_spawn)//aliens, morphs and nightmares spawn at these GLOBAL_LIST_EMPTY(tdome1) GLOBAL_LIST_EMPTY(tdome2) GLOBAL_LIST_EMPTY(tdomeobserve) diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 754c220f9d8..8e458a43ec2 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -2,7 +2,6 @@ #define POLL_IGNORE_SENTIENCE_POTION "sentience_potion" #define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" -#define POLL_IGNORE_ALIEN_LARVA "alien_larva" #define POLL_IGNORE_SYNDICATE "syndicate" #define POLL_IGNORE_HOLOPARASITE "holoparasite" #define POLL_IGNORE_POSIBRAIN "posibrain" @@ -26,7 +25,6 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", POLL_IGNORE_POSSESSED_BLADE = "Possessed blade", - POLL_IGNORE_ALIEN_LARVA = "Xenomorph larva", POLL_IGNORE_SYNDICATE = "Syndicate", POLL_IGNORE_HOLOPARASITE = "Holoparasite", POLL_IGNORE_POSIBRAIN = "Positronic brain", diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 832a9cb9d10..74841770847 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -22,7 +22,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, - "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 054938464ec..909a31f786a 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -69,10 +69,6 @@ #define ui_monkey_neck "CENTER-3:15,SOUTH:5" //monkey #define ui_monkey_back "CENTER-2:16,SOUTH:5" //monkey -//#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien -#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien -#define ui_alien_language_menu "EAST-3:26,SOUTH:5" //alien - #define ui_drone_drop "CENTER+1:18,SOUTH:5" //maintenance drones #define ui_drone_pull "CENTER+2:2,SOUTH:5" //maintenance drones #define ui_drone_storage "CENTER-2:14,SOUTH:5" //maintenance drones @@ -197,12 +193,6 @@ //borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. -//aliens -#define ui_alien_health "EAST,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. -#define ui_alienplasmadisplay "EAST,CENTER-2:15" -#define ui_alien_queen_finder "EAST,CENTER-3:15" - -//constructs #define ui_construct_pull "EAST,CENTER-2:15" #define ui_construct_health "EAST,CENTER:15" //same as borgs and humans diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 968ac19dcbf..b8e64bef0cb 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -286,28 +286,6 @@ if(L.mobility_flags & MOBILITY_MOVE) return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt. - -//ALIENS - -/atom/movable/screen/alert/alien_tox - name = "Plasma" - desc = "" - icon_state = "alien_tox" - alerttooltipstyle = "alien" - -/atom/movable/screen/alert/alien_fire -// This alert is temporarily gonna be thrown for all hot air but one day it will be used for literally being on fire - name = "Too Hot" - desc = "" - icon_state = "alien_fire" - alerttooltipstyle = "alien" - -/atom/movable/screen/alert/alien_vulnerable - name = "Severed Matriarchy" - desc = "" - icon_state = "alien_noqueen" - alerttooltipstyle = "alien" - //BLOBS /atom/movable/screen/alert/nofactory diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm deleted file mode 100644 index a7cd99620fb..00000000000 --- a/code/_onclick/hud/alien.dm +++ /dev/null @@ -1,135 +0,0 @@ -/atom/movable/screen/alien - icon = 'icons/mob/screen_alien.dmi' - -/atom/movable/screen/alien/leap - name = "toggle leap" - icon_state = "leap_off" - -/atom/movable/screen/alien/leap/Click() - if(isalienhunter(usr)) - var/mob/living/carbon/alien/humanoid/hunter/AH = usr - AH.toggle_leap() - -/atom/movable/screen/alien/plasma_display - icon = 'icons/mob/screen_gen.dmi' - icon_state = "power_display2" - name = "plasma stored" - screen_loc = ui_alienplasmadisplay - - -/atom/movable/screen/alien/alien_queen_finder - icon = 'icons/mob/screen_alien.dmi' - icon_state = "queen_finder" - name = "queen sense" - desc = "" - screen_loc = ui_alien_queen_finder - -/datum/hud/alien - ui_style = 'icons/mob/screen_alien.dmi' - -/datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner) - ..() - - var/atom/movable/screen/using - -//equippable shit - -//hands - build_hand_slots() - -//begin buttons - - using = new /atom/movable/screen/swap_hand() - using.icon = ui_style - using.icon_state = "swap_1" - using.screen_loc = ui_swaphand_position(owner,1) - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swap_hand() - using.icon = ui_style - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand_position(owner,2) - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/act_intent/alien() - using.icon_state = mymob.used_intent.name - using.hud = src - static_inventory += using - action_intent = using - - if(isalienhunter(mymob)) - var/mob/living/carbon/alien/humanoid/hunter/H = mymob - H.leap_icon = new /atom/movable/screen/alien/leap() - H.leap_icon.screen_loc = ui_alien_storage_r - static_inventory += H.leap_icon - - using = new/atom/movable/screen/language_menu - using.screen_loc = ui_alien_language_menu - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/drop() - using.icon = ui_style - using.screen_loc = ui_drop_throw - using.hud = src - static_inventory += using - -// using = new /atom/movable/screen/resist() -// using.icon = ui_style -// using.screen_loc = ui_above_movement -// using.hud = src -// hotkeybuttons += using - - throw_icon = new /atom/movable/screen/throw_catch() - throw_icon.icon = ui_style - throw_icon.screen_loc = ui_drop_throw - throw_icon.hud = src - hotkeybuttons += throw_icon - - pull_icon = new /atom/movable/screen/pull() - pull_icon.icon = ui_style - pull_icon.update_icon() - pull_icon.screen_loc = ui_above_movement - pull_icon.hud = src - static_inventory += pull_icon - -//begin indicators - - healths = new /atom/movable/screen/healths/alien() - healths.hud = src - infodisplay += healths - - alien_plasma_display = new /atom/movable/screen/alien/plasma_display() - alien_plasma_display.hud = src - infodisplay += alien_plasma_display - - if(!isalienqueen(mymob)) - alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder - alien_queen_finder.hud = src - infodisplay += alien_queen_finder - - zone_select = new /atom/movable/screen/zone_sel/alien() - zone_select.hud = src - zone_select.update_icon() - static_inventory += zone_select - - for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) - if(inv.slot_id) - inv.hud = src - inv_slots[inv.slot_id] = inv - inv.update_icon() - -/datum/hud/alien/persistent_inventory_update() - if(!mymob) - return - var/mob/living/carbon/alien/humanoid/H = mymob - if(hud_version != HUD_STYLE_NOHUD) - for(var/obj/item/I in H.held_items) - I.screen_loc = ui_hand_position(H.get_held_index_of_item(I)) - H.client.screen += I - else - for(var/obj/item/I in H.held_items) - I.screen_loc = null - H.client.screen -= I diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm deleted file mode 100644 index a17e9cca082..00000000000 --- a/code/_onclick/hud/alien_larva.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/hud/larva - ui_style = 'icons/mob/screen_alien.dmi' - -/datum/hud/larva/New(mob/owner) - ..() - var/atom/movable/screen/using - - using = new /atom/movable/screen/act_intent/alien() - using.icon_state = mymob.used_intent.name - using.hud = src - static_inventory += using - action_intent = using - - healths = new /atom/movable/screen/healths/alien() - healths.hud = src - infodisplay += healths - - alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder() - alien_queen_finder.hud = src - infodisplay += alien_queen_finder - - pull_icon = new /atom/movable/screen/pull() - pull_icon.icon = 'icons/mob/screen_alien.dmi' - pull_icon.update_icon() - pull_icon.screen_loc = ui_above_movement - pull_icon.hud = src - hotkeybuttons += pull_icon - - using = new/atom/movable/screen/language_menu - using.screen_loc = ui_alien_language_menu - using.hud = src - static_inventory += using - - zone_select = new /atom/movable/screen/zone_sel/alien() - zone_select.hud = src - zone_select.update_icon() - static_inventory += zone_select diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 2d7e29d56a9..1444fc3f4fa 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -24,9 +24,6 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( var/atom/movable/screen/blobpwrdisplay - var/atom/movable/screen/alien_plasma_display - var/atom/movable/screen/alien_queen_finder - var/atom/movable/screen/devil/soul_counter/devilsouldisplay var/atom/movable/screen/act_intent/action_intent @@ -139,8 +136,6 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( devilsouldisplay = null lingstingdisplay = null blobpwrdisplay = null - alien_plasma_display = null - alien_queen_finder = null QDEL_LIST_ASSOC_VAL(plane_masters) QDEL_LIST(screenoverlays) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index f856ffe5a54..24b441e2683 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -633,10 +633,6 @@ L.toggle_cmode() update_icon() -/atom/movable/screen/act_intent/alien - icon = 'icons/mob/screen_alien.dmi' - screen_loc = ui_movi - /atom/movable/screen/act_intent/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_intents @@ -1371,10 +1367,6 @@ . += mutable_appearance(overlay_icon, "[hud.mymob.gender == "male" ? "m" : "f"]_[hud.mymob.zone_selected]") // . += mutable_appearance(overlay_icon, "height_arrow[hud.mymob.aimheight]") -/atom/movable/screen/zone_sel/alien - icon = 'icons/mob/screen_alien.dmi' - overlay_icon = 'icons/mob/screen_alien.dmi' - /atom/movable/screen/zone_sel/robot icon = 'icons/mob/screen_cyborg.dmi' @@ -1401,10 +1393,6 @@ icon_state = "health0" screen_loc = ui_health -/atom/movable/screen/healths/alien - icon = 'icons/mob/screen_alien.dmi' - screen_loc = ui_alien_health - /atom/movable/screen/healths/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_health diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm deleted file mode 100644 index 0ce47ca7aff..00000000000 --- a/code/_onclick/hud/swarmer.dm +++ /dev/null @@ -1,98 +0,0 @@ - - -/atom/movable/screen/swarmer - icon = 'icons/mob/swarmer.dmi' - -/atom/movable/screen/swarmer/FabricateTrap - icon_state = "ui_trap" - name = "Create trap (Costs 5 Resources)" - desc = "" - -/atom/movable/screen/swarmer/FabricateTrap/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateTrap() - -/atom/movable/screen/swarmer/Barricade - icon_state = "ui_barricade" - name = "Create barricade (Costs 5 Resources)" - desc = "" - -/atom/movable/screen/swarmer/Barricade/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateBarricade() - -/atom/movable/screen/swarmer/Replicate - icon_state = "ui_replicate" - name = "Replicate (Costs 50 Resources)" - desc = "" - -/atom/movable/screen/swarmer/Replicate/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateSwarmer() - -/atom/movable/screen/swarmer/RepairSelf - icon_state = "ui_self_repair" - name = "Repair self" - desc = "" - -/atom/movable/screen/swarmer/RepairSelf/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.RepairSelf() - -/atom/movable/screen/swarmer/ToggleLight - icon_state = "ui_light" - name = "Toggle light" - desc = "" - -/atom/movable/screen/swarmer/ToggleLight/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.ToggleLight() - -/atom/movable/screen/swarmer/ContactSwarmers - icon_state = "ui_contact_swarmers" - name = "Contact swarmers" - desc = "" - -/atom/movable/screen/swarmer/ContactSwarmers/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.ContactSwarmers() - -/datum/hud/swarmer/New(mob/owner) - ..() - var/atom/movable/screen/using - - using = new /atom/movable/screen/swarmer/FabricateTrap() - using.screen_loc = ui_hand_position(2) - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/Barricade() - using.screen_loc = ui_hand_position(1) - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/Replicate() - using.screen_loc = ui_zonesel - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/RepairSelf() - using.screen_loc = ui_storage1 - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/ToggleLight() - using.screen_loc = ui_back - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/ContactSwarmers() - using.screen_loc = ui_inventory - using.hud = src - static_inventory += using diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 1ab39d611f5..43b6a24865f 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -675,26 +675,6 @@ span_danger("I avoid [src]'s bite!"), span_hear("I hear jaws snapping shut!"), COMBAT_MESSAGE_RANGE, src) to_chat(src, span_danger("My bite misses [ML]!")) -/* - Aliens - Defaults to same as monkey in most places -*/ -/mob/living/carbon/alien/UnarmedAttack(atom/A) - A.attack_alien(src) - -/atom/proc/attack_alien(mob/living/carbon/alien/user) - attack_paw(user) - return - -/mob/living/carbon/alien/RestrainedClickOn(atom/A) - return - -// Babby aliens -/mob/living/carbon/alien/larva/UnarmedAttack(atom/A) - A.attack_larva(src) -/atom/proc/attack_larva(mob/user) - return - /* Slimes diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 7f69512cdd3..090ad552490 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -210,9 +210,6 @@ config_entry_value = list( //DEFAULTS /mob/living/simple_animal = 1, /mob/living/silicon/pai = 1, - /mob/living/carbon/alien/humanoid/hunter = -1, - /mob/living/carbon/alien/humanoid/royal/praetorian = 1, - /mob/living/carbon/alien/humanoid/royal/queen = 3 ) /datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() @@ -260,8 +257,6 @@ movedelay_type = /mob/living/silicon/robot /datum/config_entry/number/outdated_movedelay/monkey_delay movedelay_type = /mob/living/carbon/monkey -/datum/config_entry/number/outdated_movedelay/alien_delay - movedelay_type = /mob/living/carbon/alien /datum/config_entry/number/outdated_movedelay/slime_delay movedelay_type = /mob/living/simple_animal/slime /datum/config_entry/number/outdated_movedelay/animal_delay diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 1be52163537..372177774df 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -13,8 +13,8 @@ SUBSYSTEM_DEF(traumas) /datum/controller/subsystem/traumas/Initialize() //phobia types is to pull from randomly for brain traumas, e.g. conspiracies is for special assignment only phobia_types = sortList(list("spiders", "space", "security", "clowns", "greytide", "lizards", - "skeletons", "snakes", "robots", "doctors", "authority", "the supernatural", - "aliens", "strangers", "birds", "falling", "anime")) + "skeletons", "snakes", "doctors", "authority", "the supernatural", + "strangers", "birds", "falling", "anime")) phobia_words = list("spiders" = strings(PHOBIA_FILE, "spiders"), "space" = strings(PHOBIA_FILE, "space"), @@ -24,11 +24,9 @@ SUBSYSTEM_DEF(traumas) "lizards" = strings(PHOBIA_FILE, "lizards"), "skeletons" = strings(PHOBIA_FILE, "skeletons"), "snakes" = strings(PHOBIA_FILE, "snakes"), - "robots" = strings(PHOBIA_FILE, "robots"), "doctors" = strings(PHOBIA_FILE, "doctors"), "authority" = strings(PHOBIA_FILE, "authority"), "the supernatural" = strings(PHOBIA_FILE, "the supernatural"), - "aliens" = strings(PHOBIA_FILE, "aliens"), "strangers" = strings(PHOBIA_FILE, "strangers"), "conspiracies" = strings(PHOBIA_FILE, "conspiracies"), "birds" = strings(PHOBIA_FILE, "birds"), @@ -42,14 +40,9 @@ SUBSYSTEM_DEF(traumas) "lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)), "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), "snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/poison/snake)), - "robots" = typecacheof(list(/mob/living/silicon/robot, /mob/living/silicon/ai, - /mob/living/simple_animal/drone, /mob/living/simple_animal/bot, /mob/living/simple_animal/hostile/swarmer)), "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), "the supernatural" = typecacheof(list(/mob/living/simple_animal/hostile/construct, /mob/living/simple_animal/revenant, /mob/living/simple_animal/shade)), - "aliens" = typecacheof(list(/mob/living/carbon/alien, /mob/living/simple_animal/slime)), - "conspiracies" = typecacheof(list(/mob/living/simple_animal/bot/secbot, /mob/living/simple_animal/drone, - /mob/living/simple_animal/pet/penguin)), "birds" = typecacheof(list(/mob/living/simple_animal/parrot, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, /mob/living/simple_animal/pet/penguin)), "anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian)) @@ -78,21 +71,6 @@ SUBSYSTEM_DEF(traumas) "skeletons" = typecacheof(list(/obj/item/organ/tongue/bone, /obj/item/clothing/suit/armor/bone, /obj/item/stack/sheet/bone, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton, /obj/effect/decal/remains/human)), - "conspiracies" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/security/head_of_security, - /obj/item/clothing/under/rank/engineering/chief_engineer, /obj/item/clothing/under/rank/medical/chief_medical_officer, - /obj/item/clothing/under/rank/civilian/head_of_personnel, /obj/item/clothing/under/rank/rnd/research_director, - /obj/item/clothing/under/rank/security/head_of_security/grey, /obj/item/clothing/under/rank/security/head_of_security/alt, - /obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck, - /obj/item/clothing/under/rank/captain/parade, /obj/item/clothing/under/rank/security/head_of_security/parade, /obj/item/clothing/under/rank/security/head_of_security/parade/female, - /obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor/baton, - /obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer, - /obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/officer, - /obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec, - /obj/item/clothing/suit/space/hardsuit/ert/engi, /obj/item/clothing/suit/space/hardsuit/ert/med, - /obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad, - /obj/machinery/door/airlock/centcom)), - "robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/aiModule/, /obj/machinery/recharge_station, - /obj/item/aicard, /obj/item/deactivated_swarmer, /obj/effect/mob_spawn/swarmer)), "doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill/, /obj/item/reagent_containers/hypospray, @@ -120,16 +98,6 @@ SUBSYSTEM_DEF(traumas) /obj/item/gun/magic/staff, /obj/item/gun/magic/wand, /obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)), - "aliens" = typecacheof(list(/obj/item/clothing/mask/facehugger, /obj/item/organ/body_egg/alien_embryo, - /obj/structure/alien, /obj/item/toy/toy_xeno, - /obj/item/clothing/suit/armor/abductor, /obj/item/abductor, /obj/item/gun/energy/alien, - /obj/item/abductor/baton, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien, - /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien, - /obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor, - /obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland, - /obj/machinery/abductor, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/weldingtool/abductor, - /obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor)), - "birds" = typecacheof(list(/obj/item/clothing/mask/gas/plaguedoctor, /obj/item/reagent_containers/food/snacks/cracker, /obj/item/clothing/suit/chickensuit, /obj/item/clothing/head/chicken, /obj/item/clothing/suit/toggle/owlwings, /obj/item/clothing/under/costume/owl, /obj/item/clothing/mask/gas/owl_mask, @@ -144,18 +112,12 @@ SUBSYSTEM_DEF(traumas) phobia_turfs = list("space" = typecacheof(list(/turf/open/space, /turf/open/floor/holofloor/space, /turf/open/floor/fakespace)), "the supernatural" = typecacheof(list(/turf/open/floor/plasteel/cult, /turf/closed/wall/mineral/cult)), - "aliens" = typecacheof(list(/turf/open/floor/plating/abductor, /turf/open/floor/plating/abductor2, - /turf/open/floor/mineral/abductor, /turf/closed/wall/mineral/abductor)), "falling" = typecacheof(list(/turf/open/chasm, /turf/open/floor/fakepit)) ) phobia_species = list("lizards" = typecacheof(list(/datum/species/lizard)), "skeletons" = typecacheof(list(/datum/species/skeleton, /datum/species/plasmaman)), - "conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard, /datum/species/synth)), - "robots" = typecacheof(list(/datum/species/android)), "the supernatural" = typecacheof(list(/datum/species/golem/runic)), - "aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, - /datum/species/shadow)), "anime" = typecacheof(list(/datum/species/human/felinid)) ) diff --git a/code/datums/action.dm b/code/datums/action.dm index 23f854a8e76..b054ad16fd4 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -566,16 +566,6 @@ return S.can_cast(owner) return FALSE -/datum/action/spell_action/alien - -/datum/action/spell_action/alien/IsAvailable() - if(!target) - return FALSE - var/obj/effect/proc_holder/alien/ab = target - if(owner) - return ab.cost_check(ab.check_turf,owner,1) - return FALSE - //Preset for general and toggled actions diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index ded162245a4..30bb7b0ec25 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -184,10 +184,6 @@ phobia_type = "the supernatural" random_gain = FALSE -/datum/brain_trauma/mild/phobia/aliens - phobia_type = "aliens" - random_gain = FALSE - /datum/brain_trauma/mild/phobia/strangers phobia_type = "strangers" random_gain = FALSE diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 65ef9e25334..4ba3efbb86d 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -5,7 +5,7 @@ spread_flags = DISEASE_SPREAD_SPECIAL cure_text = "A coder's love (theoretical)." agent = "Shenanigans" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey, /mob/living/carbon/alien) + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) severity = DISEASE_SEVERITY_BIOHAZARD stage_prob = 10 visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC @@ -184,37 +184,6 @@ if (prob(20)) affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."), forced = "robotic transformation") - -/datum/disease/transformation/xeno - - name = "Xenomorph Transformation" - cure_text = "Spaceacillin & Glycerol" - cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/glycerol) - cure_chance = 5 - agent = "Rip-LEY Alien Microbes" - desc = "" - severity = DISEASE_SEVERITY_BIOHAZARD - visibility_flags = 0 - stage1 = list() - stage2 = list("Your throat feels scratchy.", span_danger("Kill...")) - stage3 = list(span_danger("My throat feels very scratchy."), "Your skin feels tight.", span_danger("I can feel something move...inside.")) - stage4 = list(span_danger("My skin feels very tight."), span_danger("My blood boils!"), span_danger("I can feel... something...inside you.")) - stage5 = list(span_danger("My skin feels as if it's about to burst off!")) - new_form = /mob/living/carbon/alien/humanoid/hunter - bantype = ROLE_ALIEN - -/datum/disease/transformation/xeno/stage_act() - ..() - switch(stage) - if(3) - if (prob(4)) - to_chat(affected_mob, span_danger("I feel a stabbing pain in my head.")) - affected_mob.Unconscious(40) - if(4) - if (prob(20)) - affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"), forced = "xenomorph transformation") - - /datum/disease/transformation/slime name = "Advanced Mutation Transformation" cure_text = "frost oil" @@ -268,25 +237,6 @@ if(4) if (prob(20)) affected_mob.say(pick("Bark!", "AUUUUUU"), forced = "corgi transformation") - -/datum/disease/transformation/morph - name = "Gluttony's Blessing" - cure_text = /datum/reagent/consumable/nothing - cures = list(/datum/reagent/medicine/adminordrazine) - agent = "Gluttony's Blessing" - desc = "" - stage_prob = 20 - severity = DISEASE_SEVERITY_BIOHAZARD - visibility_flags = 0 - stage1 = list("Your stomach rumbles.") - stage2 = list("Your skin feels saggy.") - stage3 = list(span_danger("My appendages are melting away."), span_danger("My limbs begin to lose their shape.")) - stage4 = list(span_danger("You're ravenous.")) - stage5 = list(span_danger("I have become a morph.")) - new_form = /mob/living/simple_animal/hostile/morph - infectable_biotypes = MOB_ORGANIC|MOB_MINERAL|MOB_UNDEAD //magic! - transformed_antag_datum = /datum/antagonist/morph - /datum/disease/transformation/gondola name = "Gondola Transformation" cure_text = "Condensed Capsaicin, ingested or injected." //getting pepper sprayed doesn't help diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 2a3dc658e4e..6d77c20cfc5 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -6,8 +6,6 @@ var/key_third_person = "" //This will also call the emote var/message = "" //Message displayed when emote is used var/message_mime = "" //Message displayed if the user is a mime - var/message_alien = "" //Message displayed if the user is a grown alien - var/message_larva = "" //Message displayed if the user is an alien larva var/message_robot = "" //Message displayed if the user is a robot var/message_AI = "" //Message displayed if the user is an AI var/message_monkey = "" //Message displayed if the user is a monkey @@ -196,10 +194,6 @@ return "makes a [pick("strong ", "weak ", "")]noise." if(user.mind && user.mind.miming && message_mime) . = message_mime - if(isalienadult(user) && message_alien) - . = message_alien - else if(islarva(user) && message_larva) - . = message_larva else if(iscyborg(user) && message_robot) . = message_robot else if(isAI(user) && message_AI) diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index acd198523f3..e3fc0eaf155 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -61,17 +61,6 @@ to_chat(user, span_changeling("Our senses have not evolved enough to be able to communicate this way...")) return FALSE - -/datum/saymode/xeno - key = "a" - mode = MODE_ALIEN - -/datum/saymode/xeno/handle_message(mob/living/user, message, datum/language/language) - if(user.hivecheck()) - user.alien_talk(message) - return FALSE - - /datum/saymode/vocalcords key = MODE_KEY_VOCALCORDS mode = MODE_VOCALCORDS @@ -91,10 +80,6 @@ mode = MODE_BINARY /datum/saymode/binary/handle_message(mob/living/user, message, datum/language/language) - if(isswarmer(user)) - var/mob/living/simple_animal/hostile/swarmer/S = user - S.swarmer_chat(message) - return FALSE if(isblobmonster(user)) var/mob/living/simple_animal/hostile/blob/B = user B.blob_chat(message) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 1a8516c6a28..8dac6c9056a 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -184,9 +184,7 @@ var/icon/I = icon(icon, icon_state, dir) var/virus_threat = check_virus() holder.pixel_y = I.Height() - world.icon_size - if(HAS_TRAIT(src, TRAIT_XENO_HOST)) - holder.icon_state = "hudxeno" - else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) + if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) if(tod) var/tdelta = round(world.time - timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index e13ebfac2c2..b84051d826b 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -361,96 +361,3 @@ /datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) var/body = applicant.become_overmind() return body - -////////////////////////////////////////////// -// // -// XENOMORPH (GHOST) // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph - name = "Alien Infestation" - antag_datum = /datum/antagonist/xeno - antag_flag = ROLE_ALIEN - enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 3 - cost = 10 - requirements = list(101,101,101,70,50,40,20,15,10,10) - high_population_requirement = 50 - repeatable = TRUE - var/list/vents = list() - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute() - // 50% chance of being incremented by one - required_candidates += prob(50) - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines) - if(QDELETED(temp_vent)) - continue - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] - if(!temp_vent_parent) - continue // No parent vent - // Stops Aliens getting stuck in small networks. - // See: Security, Virology - if(temp_vent_parent.other_atmosmch.len > 20) - vents += temp_vent - if(!vents.len) - return FALSE - . = ..() - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/generate_ruleset_body(mob/applicant) - var/obj/vent = pick_n_take(vents) - var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - new_xeno.key = applicant.key - message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by the midround ruleset.") - log_game("DYNAMIC: [key_name(new_xeno)] was spawned as an alien by the midround ruleset.") - return new_xeno - -////////////////////////////////////////////// -// // -// NIGHTMARE (GHOST) // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/from_ghosts/nightmare - name = "Nightmare" - antag_datum = /datum/antagonist/nightmare - antag_flag = "Nightmare" - antag_flag_override = ROLE_ALIEN - enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 3 - cost = 10 - requirements = list(101,101,101,70,50,40,20,15,10,10) - high_population_requirement = 50 - repeatable = TRUE - var/list/spawn_locs = list() - -/datum/dynamic_ruleset/midround/from_ghosts/nightmare/execute() - for(var/X in GLOB.xeno_spawn) - var/turf/T = X - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - spawn_locs += T - if(!spawn_locs.len) - return FALSE - . = ..() - -/datum/dynamic_ruleset/midround/from_ghosts/nightmare/generate_ruleset_body(mob/applicant) - var/datum/mind/player_mind = new /datum/mind(applicant.key) - player_mind.active = TRUE - - var/mob/living/carbon/human/S = new (pick(spawn_locs)) - player_mind.transfer_to(S) - player_mind.assigned_role = "Nightmare" - player_mind.special_role = "Nightmare" - player_mind.add_antag_datum(/datum/antagonist/nightmare) - S.set_species(/datum/species/shadow/nightmare) - - playsound(S, 'sound/blank.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by the midround ruleset.") - log_game("DYNAMIC: [key_name(S)] was spawned as a Nightmare by the midround ruleset.") - return S diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 37048a45b09..d1caa634236 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -620,38 +620,3 @@ SSticker.mode_result = "win - monkey win" else SSticker.mode_result = "loss - staff stopped the monkeys" - -////////////////////////////////////////////// -// // -// METEOR // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/roundstart/meteor - name = "Meteor" - persistent = TRUE - required_candidates = 0 - weight = 3 - cost = 0 - requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 - var/meteordelay = 2000 - var/nometeors = 0 - var/rampupdelta = 5 - -/datum/dynamic_ruleset/roundstart/meteor/rule_process() - if(nometeors || meteordelay > world.time - SSticker.round_start_time) - return - - var/list/wavetype = GLOB.meteors_normal - var/meteorminutes = (world.time - SSticker.round_start_time - meteordelay) / 10 / 60 - - if (prob(meteorminutes)) - wavetype = GLOB.meteors_threatening - - if (prob(meteorminutes/2)) - wavetype = GLOB.meteors_catastrophic - - var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) - - spawn_meteors(ramp_up_final, wavetype) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm deleted file mode 100644 index 0f33c03b4c8..00000000000 --- a/code/game/gamemodes/meteor/meteor.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/game_mode/meteor - name = "meteor" - config_tag = "meteor" - report_type = "meteor" - false_report_weight = 1 - var/meteordelay = 2000 - var/nometeors = 0 - var/rampupdelta = 5 - required_players = 0 - - announce_span = "danger" - announce_text = "A major meteor shower is bombarding the station! The crew needs to evacuate or survive the onslaught." - - -/datum/game_mode/meteor/process() - if(nometeors || meteordelay > world.time - SSticker.round_start_time) - return - - var/list/wavetype = GLOB.meteors_normal - var/meteorminutes = (world.time - SSticker.round_start_time - meteordelay) / 10 / 60 - - - if (prob(meteorminutes)) - wavetype = GLOB.meteors_threatening - - if (prob(meteorminutes/2)) - wavetype = GLOB.meteors_catastrophic - - var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) - - spawn_meteors(ramp_up_final, wavetype) - - -/datum/game_mode/meteor/special_report() - var/survivors = 0 - var/list/survivor_list = list() - - for(var/mob/living/player in GLOB.player_list) - if(player.stat != DEAD) - ++survivors - - if(player.onCentCom()) - survivor_list += span_greentext("[player.real_name] escaped to the safety of CentCom.") - else if(player.onSyndieBase()) - survivor_list += span_greentext("[player.real_name] escaped to the (relative) safety of Syndicate Space.") - else - survivor_list += span_neutraltext("[player.real_name] survived but is stranded without any hope of rescue.") - - if(survivors) - return "

The following survived the meteor storm:
[survivor_list.Join("
")]
" - else - return "
Nobody survived the meteor storm!
" - -/datum/game_mode/meteor/set_round_result() - ..() - SSticker.mode_result = "end - evacuation" - -/datum/game_mode/meteor/generate_report() - return "[pick("Asteroids have", "Meteors have", "Large rocks have", "Stellar minerals have", "Space hail has", "Debris has")] been detected near your station, and a collision is possible, \ - though unlikely. Be prepared for largescale impacts and destruction. Please note that the debris will prevent the escape shuttle from arriving quickly." diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm deleted file mode 100644 index 538b11832f5..00000000000 --- a/code/game/gamemodes/meteor/meteors.dm +++ /dev/null @@ -1,348 +0,0 @@ -#define DEFAULT_METEOR_LIFETIME 1800 -GLOBAL_VAR_INIT(meteor_wave_delay, 625) //minimum wait between waves in tenths of seconds -//set to at least 100 unless you want evarr ruining every round - -//Meteors probability of spawning during a given wave -GLOBAL_LIST_INIT(meteors_normal, list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \ - /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3)) //for normal meteor event - -GLOBAL_LIST_INIT(meteors_threatening, list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, \ - /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3)) //for threatening meteor event - -GLOBAL_LIST_INIT(meteors_catastrophic, list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \ - /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/tunguska = 1)) //for catastrophic meteor event - -GLOBAL_LIST_INIT(meteorsB, list(/obj/effect/meteor/meaty=5, /obj/effect/meteor/meaty/xeno=1)) //for meaty ore event - -GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event - - -/////////////////////////////// -//Meteor spawning global procs -/////////////////////////////// - -/proc/spawn_meteors(number = 10, list/meteortypes) - for(var/i = 0; i < number; i++) - spawn_meteor(meteortypes) - -/proc/spawn_meteor(list/meteortypes) - var/turf/pickedstart - var/turf/pickedgoal - var/max_i = 10//number of tries to spawn meteor. - while(!isspaceturf(pickedstart)) - var/startSide = pick(GLOB.cardinals) - var/startZ = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) - pickedstart = spaceDebrisStartLoc(startSide, startZ) - pickedgoal = spaceDebrisFinishLoc(startSide, startZ) - max_i-- - if(max_i<=0) - return - var/Me = pickweight(meteortypes) - var/obj/effect/meteor/M = new Me(pickedstart, pickedgoal) - M.dest = pickedgoal - -/proc/spaceDebrisStartLoc(startSide, Z) - var/starty - var/startx - switch(startSide) - if(NORTH) - starty = world.maxy-(TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(EAST) - starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - startx = world.maxx-(TRANSITIONEDGE+1) - if(SOUTH) - starty = (TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(WEST) - starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - startx = (TRANSITIONEDGE+1) - . = locate(startx, starty, Z) - -/proc/spaceDebrisFinishLoc(startSide, Z) - var/endy - var/endx - switch(startSide) - if(NORTH) - endy = (TRANSITIONEDGE+1) - endx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(EAST) - endy = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - endx = (TRANSITIONEDGE+1) - if(SOUTH) - endy = world.maxy-(TRANSITIONEDGE+1) - endx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(WEST) - endy = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - endx = world.maxx-(TRANSITIONEDGE+1) - . = locate(endx, endy, Z) - -/////////////////////// -//The meteor effect -////////////////////// - -/obj/effect/meteor - name = "the concept of meteor" - desc = "" - icon = 'icons/obj/meteor.dmi' - icon_state = "small" - density = TRUE - anchored = TRUE - var/hits = 4 - var/hitpwr = 2 //Level of ex_act to be called on hit. - var/dest - pass_flags = PASSTABLE - var/heavy = 0 - var/meteorsound = 'sound/blank.ogg' - var/z_original - var/threat = 0 // used for determining which meteors are most interesting - var/lifetime = DEFAULT_METEOR_LIFETIME - var/timerid = null - var/list/meteordrop = list(/obj/item/stack/ore/iron) - var/dropamt = 2 - -/obj/effect/meteor/Move() - if(z != z_original || loc == dest) - qdel(src) - return FALSE - - . = ..() //process movement... - - if(.)//.. if did move, ram the turf we get in - var/turf/T = get_turf(loc) - ram_turf(T) - - if(prob(10) && !isspaceturf(T))//randomly takes a 'hit' from ramming - get_hit() - -/obj/effect/meteor/Destroy() - if (timerid) - deltimer(timerid) - GLOB.meteor_list -= src - SSaugury.unregister_doom(src) - walk(src,0) //this cancels the walk_towards() proc - . = ..() - -/obj/effect/meteor/Initialize(mapload, target) - . = ..() - z_original = z - GLOB.meteor_list += src - SSaugury.register_doom(src, threat) - SpinAnimation() - timerid = QDEL_IN(src, lifetime) - chase_target(target) - -/obj/effect/meteor/Bump(atom/A) - if(A) - ram_turf(get_turf(A)) - playsound(src.loc, meteorsound, 40, TRUE) - get_hit() - -/obj/effect/meteor/proc/ram_turf(turf/T) - //first bust whatever is in the turf - for(var/atom/A in T) - if(A != src) - if(isliving(A)) - A.visible_message(span_warning("[src] slams into [A]."), span_danger("[src] slams into you!.")) - A.ex_act(hitpwr) - - //then, ram the turf if it still exists - if(T) - T.ex_act(hitpwr) - - - -//process getting 'hit' by colliding with a dense object -//or randomly when ramming turfs -/obj/effect/meteor/proc/get_hit() - hits-- - if(hits <= 0) - make_debris() - meteor_effect() - qdel(src) - -/obj/effect/meteor/ex_act() - return - -/obj/effect/meteor/examine(mob/user) - . = ..() - if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user)) - user.client.give_award(/datum/award/achievement/misc/meteor_examine, user) - -/obj/effect/meteor/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_MINING) - make_debris() - qdel(src) - else - . = ..() - -/obj/effect/meteor/proc/make_debris() - for(var/throws = dropamt, throws > 0, throws--) - var/thing_to_spawn = pick(meteordrop) - new thing_to_spawn(get_turf(src)) - -/obj/effect/meteor/proc/chase_target(atom/chasing, delay = 1) - set waitfor = FALSE - if(chasing) - walk_towards(src, chasing, delay) - -/obj/effect/meteor/proc/meteor_effect() - if(heavy) - var/sound/meteor_sound = sound(meteorsound) - var/random_frequency = get_rand_frequency() - - for(var/mob/M in GLOB.player_list) - if((M.orbiting) && (SSaugury.watchers[M])) - continue - var/turf/T = get_turf(M) - if(!T || T.z != src.z) - continue - var/dist = get_dist(M.loc, src.loc) - shake_camera(M, dist > 20 ? 2 : 4, dist > 20 ? 1 : 3) - M.playsound_local(src.loc, null, 50, 1, random_frequency, 10, S = meteor_sound) - -/////////////////////// -//Meteor types -/////////////////////// - -//Dust -/obj/effect/meteor/dust - name = "space dust" - icon_state = "dust" - pass_flags = PASSTABLE | PASSGRILLE - hits = 1 - hitpwr = 3 - meteorsound = 'sound/blank.ogg' - meteordrop = list(/obj/item/stack/ore/glass) - threat = 1 - -//Medium-sized -/obj/effect/meteor/medium - name = "meteor" - dropamt = 3 - threat = 5 - -/obj/effect/meteor/medium/meteor_effect() - ..() - explosion(src.loc, 0, 1, 2, 3, 0) - -//Large-sized -/obj/effect/meteor/big - name = "big meteor" - icon_state = "large" - hits = 6 - heavy = 1 - dropamt = 4 - threat = 10 - -/obj/effect/meteor/big/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0) - -//Flaming meteor -/obj/effect/meteor/flaming - name = "flaming meteor" - icon_state = "flaming" - hits = 5 - heavy = 1 - meteorsound = 'sound/blank.ogg' - meteordrop = list(/obj/item/stack/ore/plasma) - threat = 20 - -/obj/effect/meteor/flaming/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0, 0, 5) - -//Radiation meteor -/obj/effect/meteor/irradiated - name = "glowing meteor" - icon_state = "glowing" - heavy = 1 - meteordrop = list(/obj/item/stack/ore/uranium) - threat = 15 - - -/obj/effect/meteor/irradiated/meteor_effect() - ..() - explosion(src.loc, 0, 0, 4, 3, 0) - new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - radiation_pulse(src, 500) - -//Meaty Ore -/obj/effect/meteor/meaty - name = "meaty ore" - icon_state = "meateor" - desc = "" - hits = 2 - heavy = 1 - meteorsound = 'sound/blank.ogg' - meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/human, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/) - var/meteorgibs = /obj/effect/gibspawner/generic - threat = 2 - -/obj/effect/meteor/meaty/Initialize() - for(var/path in meteordrop) - if(path == /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant) - meteordrop -= path - meteordrop += pick(subtypesof(path)) - - for(var/path in meteordrop) - if(path == /obj/item/organ/tongue) - meteordrop -= path - meteordrop += pick(typesof(path)) - return ..() - -/obj/effect/meteor/meaty/make_debris() - ..() - new meteorgibs(get_turf(src)) - - -/obj/effect/meteor/meaty/ram_turf(turf/T) - if(!isspaceturf(T)) - new /obj/effect/decal/cleanable/blood(T) - -/obj/effect/meteor/meaty/Bump(atom/A) - A.ex_act(hitpwr) - get_hit() - -//Meaty Ore Xeno edition -/obj/effect/meteor/meaty/xeno - color = "#5EFF00" - meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien) - meteorgibs = /obj/effect/gibspawner/xeno - -/obj/effect/meteor/meaty/xeno/Initialize() - meteordrop += subtypesof(/obj/item/organ/alien) - return ..() - -/obj/effect/meteor/meaty/xeno/ram_turf(turf/T) - if(!isspaceturf(T)) - new /obj/effect/decal/cleanable/xenoblood(T) - -//Station buster Tunguska -/obj/effect/meteor/tunguska - name = "tunguska meteor" - icon_state = "flaming" - desc = "" - hits = 30 - hitpwr = 1 - heavy = 1 - meteorsound = 'sound/blank.ogg' - meteordrop = list(/obj/item/stack/ore/plasma) - threat = 50 - -/obj/effect/meteor/tunguska/Move() - . = ..() - if(.) - new /obj/effect/temp_visual/revenant(get_turf(src)) - -/obj/effect/meteor/tunguska/meteor_effect() - ..() - explosion(src.loc, 5, 10, 15, 20, 0) - -/obj/effect/meteor/tunguska/Bump() - ..() - if(prob(20)) - explosion(src.loc,2,4,6,8) -////////////////////////// -#undef DEFAULT_METEOR_LIFETIME diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a0751cafe5f..5ef7e053023 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -689,22 +689,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) captured_amount+=1 for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure. captured_amount+=0.1 - for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research. - if(M.stat == DEAD) - captured_amount+=0.5 - continue - captured_amount+=1 - for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans. - if(istype(M, /mob/living/carbon/alien/humanoid/royal/queen))//Queens are worth three times as much as humans. - if(M.stat == DEAD) - captured_amount+=1.5 - else - captured_amount+=3 - continue - if(M.stat == DEAD) - captured_amount+=1 - continue - captured_amount+=2 + return captured_amount >= target_amount /datum/objective/capture/admin_edit(mob/admin) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 4346619fbfb..42500145f5b 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -606,8 +606,6 @@ Class Procs: var/adjusted_climb_time = climb_time if(user.restrained()) //climbing takes twice as long when restrained. adjusted_climb_time *= 2 - if(isalien(user)) - adjusted_climb_time *= 0.25 //aliens are terrifyingly fast if(HAS_TRAIT(user, TRAIT_FREERUNNING)) //do you have any idea how fast I am??? adjusted_climb_time *= 0.5 adjusted_climb_time -= user.STASPD * 2 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index d59a207c535..660e3c550e9 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1223,29 +1223,6 @@ loseMainPower() loseBackupPower() -/obj/machinery/door/airlock/attack_alien(mob/living/carbon/alien/humanoid/user) - add_fingerprint(user) - if(isElectrified()) - shock(user, 100) //Mmm, fried xeno! - return - if(!density) //Already open - return - if(locked || welded) //Extremely generic, as aliens only understand the basics of how airlocks work. - to_chat(user, span_warning("[src] refuses to budge!")) - return - user.visible_message(span_warning("[user] begins prying open [src]."),\ - span_noticealien("I begin digging your claws into [src] with all your might!"),\ - span_warning("I hear groaning metal...")) - var/time_to_open = 5 - if(hasPower()) - time_to_open = 50 //Powered airlocks take longer to open, and are loud. - playsound(src, 'sound/blank.ogg', 100, TRUE) - - - if(do_after(user, time_to_open, TRUE, src)) - if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) - to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!")) - /obj/machinery/door/airlock/hostile_lockdown(mob/origin) // Must be powered and have working AI wire. if(canAIControl(src) && !stat) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 896f47fad7c..55d43bf83c1 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -421,20 +421,6 @@ opacity = 0 glass = TRUE -/obj/machinery/door/airlock/abductor - name = "alien airlock" - desc = "" - icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' - overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_abductor - note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - damage_deflection = 30 - explosion_block = 3 - hackProof = TRUE - aiControlDisabled = 1 - normal_integrity = 700 - security_level = 1 - ////////////////////////////////// /* Cult Airlocks diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 66c337740d4..fba860a547a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -339,10 +339,7 @@ /obj/machinery/door/proc/crush() for(var/mob/living/L in get_turf(src)) L.visible_message(span_warning("[src] closes on [L], crushing [L.p_them()]!"), span_danger("[src] closes on you and crushes you!")) - if(isalien(L)) //For xenos - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. - L.emote("roar") - else if(ishuman(L)) //For humans + if(ishuman(L)) //For humans L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) L.emote("scream") L.Paralyze(100) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 710b4a5592c..ddfda5821fe 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -154,13 +154,6 @@ /obj/machinery/door/firedoor/attack_robot(mob/user) return attack_ai(user) -/obj/machinery/door/firedoor/attack_alien(mob/user) - add_fingerprint(user) - if(welded) - to_chat(user, span_warning("[src] refuses to budge!")) - return - open() - /obj/machinery/door/firedoor/do_animate(animation) switch(animation) if("opening") diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm deleted file mode 100644 index cbe3c437229..00000000000 --- a/code/game/machinery/droneDispenser.dm +++ /dev/null @@ -1,260 +0,0 @@ -#define DRONE_PRODUCTION "production" -#define DRONE_RECHARGING "recharging" -#define DRONE_READY "ready" - -/obj/machinery/droneDispenser //Most customizable machine 2015 - name = "drone shell dispenser" - desc = "" - - icon = 'icons/obj/machines/droneDispenser.dmi' - icon_state = "on" - density = TRUE - - max_integrity = 250 - integrity_failure = 0.33 - - // These allow for different icons when creating custom dispensers - var/icon_off = "off" - var/icon_on = "on" - var/icon_recharging = "recharge" - var/icon_creating = "make" - - var/list/using_materials - var/starting_amount = 0 - var/metal_cost = 1000 - var/glass_cost = 1000 - var/power_used = 1000 - - var/mode = DRONE_READY - var/timer - var/cooldownTime = 1800 //3 minutes - var/production_time = 30 - //The item the dispenser will create - var/dispense_type = /obj/effect/mob_spawn/drone - - // The maximum number of "idle" drone shells it will make before - // ceasing production. Set to 0 for infinite. - var/maximum_idle = 3 - - var/work_sound = 'sound/blank.ogg' - var/create_sound = 'sound/blank.ogg' - var/recharge_sound = 'sound/blank.ogg' - - var/begin_create_message = "whirs to life!" - var/end_create_message = "dispenses a drone shell." - var/recharge_message = "pings." - var/recharging_text = "It is whirring and clicking. It seems to be recharging." - -/obj/machinery/droneDispenser/Initialize() - . = ..() - var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, /obj/item/stack) - materials.insert_amount_mat(starting_amount) - materials.precise_insertion = TRUE - using_materials = list(/datum/material/iron = metal_cost, /datum/material/glass = glass_cost) - -/obj/machinery/droneDispenser/preloaded - starting_amount = 5000 - -/obj/machinery/droneDispenser/syndrone //Please forgive me - name = "syndrone shell dispenser" - desc = "" - dispense_type = /obj/effect/mob_spawn/drone/syndrone - //If we're gonna be a jackass, go the full mile - 10 second recharge timer - cooldownTime = 100 - end_create_message = "dispenses a suspicious drone shell." - starting_amount = 25000 - -/obj/machinery/droneDispenser/syndrone/badass //Please forgive me - name = "badass syndrone shell dispenser" - desc = "" - dispense_type = /obj/effect/mob_spawn/drone/syndrone/badass - end_create_message = "dispenses an ominous suspicious drone shell." - -// I don't need your forgiveness, this is awesome. -/obj/machinery/droneDispenser/snowflake - name = "snowflake drone shell dispenser" - desc = "" - dispense_type = /obj/effect/mob_spawn/drone/snowflake - end_create_message = "dispenses a snowflake drone shell." - // Those holoprojectors aren't cheap - metal_cost = 2000 - glass_cost = 2000 - power_used = 2000 - starting_amount = 10000 - -// If the derelict gets lonely, make more friends. -/obj/machinery/droneDispenser/derelict - name = "derelict drone shell dispenser" - desc = "" - dispense_type = /obj/effect/mob_spawn/drone/derelict - end_create_message = "dispenses a derelict drone shell." - metal_cost = 10000 - glass_cost = 5000 - starting_amount = 0 - cooldownTime = 600 - -// An example of a custom drone dispenser. -// This one requires no materials and creates basic hivebots -/obj/machinery/droneDispenser/hivebot - name = "hivebot fabricator" - desc = "" - icon = 'icons/obj/objects.dmi' - icon_state = "hivebot_fab" - icon_off = "hivebot_fab" - icon_on = "hivebot_fab" - icon_recharging = "hivebot_fab" - icon_creating = "hivebot_fab_on" - metal_cost = 0 - glass_cost = 0 - power_used = 0 - cooldownTime = 10 //Only 1 second - hivebots are extremely weak - dispense_type = /mob/living/simple_animal/hostile/hivebot - begin_create_message = "closes and begins fabricating something within." - end_create_message = "slams open, revealing a hivebot!" - recharge_sound = null - recharge_message = null - -/obj/machinery/droneDispenser/swarmer - name = "swarmer fabricator" - desc = "" - icon = 'icons/obj/machines/gateway.dmi' - icon_state = "toffcenter" - icon_off = "toffcenter" - icon_on = "toffcenter" - icon_recharging = "toffcenter" - icon_creating = "offcenter" - metal_cost = 0 - glass_cost = 0 - cooldownTime = 300 //30 seconds - maximum_idle = 0 // Swarmers have no restraint - dispense_type = /obj/effect/mob_spawn/swarmer - begin_create_message = "hums softly as an interface appears above it, scrolling by at unreadable speed." - end_create_message = "materializes a strange shell, which drops to the ground." - recharging_text = "Its lights are slowly increasing in brightness." - work_sound = 'sound/blank.ogg' - create_sound = 'sound/blank.ogg' - break_sound = 'sound/blank.ogg' - break_message = "slowly falls dark, lights stuttering." - -/obj/machinery/droneDispenser/examine(mob/user) - . = ..() - if((mode == DRONE_RECHARGING) && !stat && recharging_text) - . += span_warning("[recharging_text]") - -/obj/machinery/droneDispenser/process() - ..() - if((stat & (NOPOWER|BROKEN)) || !anchored) - return - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - if(!materials.has_materials(using_materials)) - return // We require more minerals - - // We are currently in the middle of something - if(timer > world.time) - return - - switch(mode) - if(DRONE_READY) - // If we have X drone shells already on our turf - if(maximum_idle && (count_shells() >= maximum_idle)) - return // then do nothing; check again next tick - if(begin_create_message) - visible_message(span_notice("[src] [begin_create_message]")) - if(work_sound) - playsound(src, work_sound, 50, TRUE) - mode = DRONE_PRODUCTION - timer = world.time + production_time - update_icon() - - if(DRONE_PRODUCTION) - materials.use_materials(using_materials) - if(power_used) - use_power(power_used) - - var/atom/A = new dispense_type(loc) - A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) - - if(create_sound) - playsound(src, create_sound, 50, TRUE) - if(end_create_message) - visible_message(span_notice("[src] [end_create_message]")) - - mode = DRONE_RECHARGING - timer = world.time + cooldownTime - update_icon() - - if(DRONE_RECHARGING) - if(recharge_sound) - playsound(src, recharge_sound, 50, TRUE) - if(recharge_message) - visible_message(span_notice("[src] [recharge_message]")) - - mode = DRONE_READY - update_icon() - -/obj/machinery/droneDispenser/proc/count_shells() - . = 0 - for(var/a in loc) - if(istype(a, dispense_type)) - .++ - -/obj/machinery/droneDispenser/update_icon_state() - if(stat & (BROKEN|NOPOWER)) - icon_state = icon_off - else if(mode == DRONE_RECHARGING) - icon_state = icon_recharging - else if(mode == DRONE_PRODUCTION) - icon_state = icon_creating - else - icon_state = icon_on - -/obj/machinery/droneDispenser/attackby(obj/item/I, mob/living/user) - if(I.tool_behaviour == TOOL_CROWBAR) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.retrieve_all() - I.play_tool_sound(src) - to_chat(user, span_notice("I retrieve the materials from [src].")) - - else if(I.tool_behaviour == TOOL_WELDER) - if(!(stat & BROKEN)) - to_chat(user, span_warning("[src] doesn't need repairs.")) - return - - if(!I.tool_start_check(user, amount=1)) - return - - user.visible_message( - span_notice("[user] begins patching up [src] with [I]."), - span_notice("I begin restoring the damage to [src]...")) - - if(!I.use_tool(src, user, 40, volume=50, amount=1)) - return - - user.visible_message( - span_notice("[user] fixes [src]!"), - span_notice("I restore [src] to operation.")) - - stat &= ~BROKEN - obj_integrity = max_integrity - update_icon() - else - return ..() - -/obj/machinery/droneDispenser/obj_break(damage_flag) - . = ..() - if(!.) - return - if(break_message) - audible_message(span_warning("[src] [break_message]")) - if(break_sound) - playsound(src, break_sound, 50, TRUE) - -/obj/machinery/droneDispenser/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1)) - new /obj/item/stack/sheet/metal(loc, 5) - qdel(src) - -#undef DRONE_PRODUCTION -#undef DRONE_RECHARGING -#undef DRONE_READY diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index a5931aa6523..98b0e8f903a 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -134,17 +134,6 @@ qdel(scanner_wand) return ..() -/obj/machinery/medical_kiosk/emag_act(mob/living/emagger) - ..() - if(obj_flags & EMAGGED) - return - emagger.visible_message(span_warning("[emagger] waves a suspicious card by the [src]'s biometric scanner!"), - span_notice("I overload the sensory electronics, the diagnostic readouts start jittering across the screen..")) - obj_flags |= EMAGGED - var/obj/item/circuitboard/computer/cargo/board = circuit - board.obj_flags |= EMAGGED //Mirrors emag status onto the board as well. - pandemonium = TRUE - /obj/machinery/medical_kiosk/examine(mob/user) . = ..() if(scanner_wand == null) diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index dd90d082357..a6706d08ca9 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -73,9 +73,6 @@ /obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user) parent_turret.attacked_by(I, user) -/obj/machinery/porta_turret_cover/attack_alien(mob/living/carbon/alien/humanoid/user) - parent_turret.attack_alien(user) - /obj/machinery/porta_turret_cover/attack_animal(mob/living/simple_animal/user) parent_turret.attack_animal(user) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index a7078bd46a1..a217b37dd8e 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -126,10 +126,7 @@ //blood splatters var/splatter_dir = get_dir(chassis, target) - if(isalien(target)) - new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target.drop_location(), splatter_dir) - else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target.drop_location(), splatter_dir) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target.drop_location(), splatter_dir) //organs go everywhere if(target_part && prob(10 * drill_level)) diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index aebfcb9b90d..d0df878db42 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -66,11 +66,6 @@ /obj/mecha/attack_paw(mob/user as mob) return attack_hand(user) -/obj/mecha/attack_alien(mob/living/user) - log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") - playsound(src.loc, 'sound/blank.ogg', 100, TRUE) - attack_generic(user, 15, BRUTE, "slash", 0) - /obj/mecha/attack_animal(mob/living/simple_animal/user) log_message("Attack by simple animal. Attacker - [user].", LOG_MECHA, color="red") if(!user.melee_damage_upper && !user.obj_damage) diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 3fe017fd383..d9ed0805796 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -63,30 +63,3 @@ acid_level = max(0, acid_level - acid_used*10) playsound(L, 'sound/blank.ogg', 50, TRUE) to_chat(L, span_danger("[src] burns you!")) - -//xenomorph corrosive acid -/obj/effect/acid/alien - var/target_strength = 30 - - -/obj/effect/acid/alien/process() - . = ..() - if(.) - if(prob(45)) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - target_strength-- - if(target_strength <= 0) - target.visible_message(span_warning("[target] collapses under its own weight into a puddle of goop and undigested debris!")) - target.acid_melt() - qdel(src) - else - - switch(target_strength) - if(24) - visible_message(span_warning("[target] is holding up against the acid!")) - if(16) - visible_message(span_warning("[target] is being melted by the acid!")) - if(8) - visible_message(span_warning("[target] is struggling to withstand the acid!")) - if(4) - visible_message(span_warning("[target] begins to crumble under the acid!")) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 8d48ed0af5b..12d01de107a 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -794,16 +794,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) name = "Observer-Start" icon_state = "x" -//xenos, morphs and nightmares spawn here -/obj/effect/landmark/xeno_spawn - name = "xeno_spawn" - icon_state = "xeno_spawn" - -/obj/effect/landmark/xeno_spawn/Initialize(mapload) - ..() - GLOB.xeno_spawn += loc - return INITIALIZE_HINT_QDEL - //objects with the stationloving component (nuke disk) respawn here. //also blobs that have their spawn forcemoved (running out of time when picking their spawn spot), santa and respawning devils /obj/effect/landmark/blobstart diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index e591fac8378..e25a49b1ae5 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -93,52 +93,6 @@ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) return ..() - - -/obj/effect/gibspawner/xeno - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up, /obj/effect/decal/cleanable/xenoblood/xgibs/down, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core) - gibamounts = list(1, 1, 1, 1, 1, 1, 1) - gib_mob_type = /mob/living/carbon/alien - -/obj/effect/gibspawner/xeno/Initialize() - if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) - return ..() - - -/obj/effect/gibspawner/xeno/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso) - gibamounts = list(1, 1, 1, 1, 1, 1) - - -/obj/effect/gibspawner/xeno/bodypartless/Initialize() - if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) - return ..() - - - -/obj/effect/gibspawner/larva - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body) - gibamounts = list(1, 1, 1, 1) - gib_mob_type = /mob/living/carbon/alien/larva - -/obj/effect/gibspawner/larva/Initialize() - if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs) - return ..() - -/obj/effect/gibspawner/larva/bodypartless - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva) - gibamounts = list(1, 1, 1) - -/obj/effect/gibspawner/larva/bodypartless/Initialize() - if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list()) - return ..() - - - /obj/effect/gibspawner/robot sparks = 1 gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up, /obj/effect/decal/cleanable/robot_debris/down, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris/limb) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 45ad43578b7..af089d96075 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -156,29 +156,6 @@ "" = 80 ) -/obj/effect/spawner/lootdrop/organ_spawner - name = "organ spawner" - loot = list( - /obj/item/organ/heart/gland/electric = 3, - /obj/item/organ/heart/gland/trauma = 4, - /obj/item/organ/heart/gland/egg = 7, - /obj/item/organ/heart/gland/chem = 5, - /obj/item/organ/heart/gland/mindshock = 5, - /obj/item/organ/heart/gland/plasma = 7, - /obj/item/organ/heart/gland/transform = 5, - /obj/item/organ/heart/gland/slime = 4, - /obj/item/organ/heart/gland/spiderman = 5, - /obj/item/organ/heart/gland/ventcrawling = 1, - /obj/item/organ/body_egg/alien_embryo = 1, - /obj/item/organ/regenerative_core = 2) - lootcount = 3 - -/obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner - name = "2% chance xeno egg spawner" - loot = list( - /obj/effect/decal/remains/xeno = 49, - /obj/effect/spawner/xeno_egg_delivery = 1) - /obj/effect/spawner/lootdrop/costume name = "random costume spawner" diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm index 111fcc42040..a04f8a8cc7f 100644 --- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm +++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm @@ -8,7 +8,6 @@ ..() var/turf/T = get_turf(src) - new /obj/structure/alien/egg(T) new /obj/effect/temp_visual/gravpush(T) playsound(T, 'sound/blank.ogg', 50, TRUE, -1) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4fd3024040d..ed9c9c08603 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -586,16 +586,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(!user.put_in_active_hand(src, FALSE, FALSE)) user.dropItemToGround(src) -/obj/item/attack_alien(mob/user) - var/mob/living/carbon/alien/A = user - - if(!A.has_fine_manipulation) - if(src in A.contents) // To stop Aliens having items stuck in their pockets - A.dropItemToGround(src) - to_chat(user, span_warning("My claws aren't capable of such fine manipulation!")) - return - attack_paw(A) - /obj/item/attack_ai(mob/user) if(istype(src.loc, /obj/item/robot_module)) //If the item is part of a cyborg module, equip it @@ -759,10 +749,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) to_chat(user, span_warning("You're going to need to remove [M.p_their()] eye protection first!")) return - if(isalien(M))//Aliens don't have eyes./N slimes also don't have eyes! - to_chat(user, span_warning("I cannot locate any eyes on this creature!")) - return - if(isbrain(M)) to_chat(user, span_warning("I cannot locate any organic eyes on this brain!")) return diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm deleted file mode 100644 index 10b341fafe4..00000000000 --- a/code/game/objects/items/body_egg.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/organ/body_egg - name = "body egg" - desc = "" - icon_state = "innards" - zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_PARASITE_EGG - -/obj/item/organ/body_egg/on_find(mob/living/finder) - ..() - to_chat(finder, span_warning("I found an unknown alien organism in [owner]'s [zone]!")) - -/obj/item/organ/body_egg/Initialize() - . = ..() - if(iscarbon(loc)) - Insert(loc) - -/obj/item/organ/body_egg/Insert(mob/living/carbon/M, special = 0) - ..() - ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_XENO_IMMUNE, "xeno immune") - owner.med_hud_set_status() - INVOKE_ASYNC(src, PROC_REF(AddInfectionImages), owner) - -/obj/item/organ/body_egg/Remove(mob/living/carbon/M, special = 0) - if(owner) - REMOVE_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_XENO_IMMUNE, "xeno immune") - owner.med_hud_set_status() - INVOKE_ASYNC(src, PROC_REF(RemoveInfectionImages), owner) - ..() - -/obj/item/organ/body_egg/on_death() - . = ..() - if(!owner) - return - egg_process() - -/obj/item/organ/body_egg/on_life() - . = ..() - egg_process() - -/obj/item/organ/body_egg/proc/egg_process() - return - -/obj/item/organ/body_egg/proc/RefreshInfectionImage() - RemoveInfectionImages() - AddInfectionImages() - -/obj/item/organ/body_egg/proc/AddInfectionImages() - return - -/obj/item/organ/body_egg/proc/RemoveInfectionImages() - return diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 7b9134172d4..a8b846a68d7 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -144,11 +144,6 @@ icon_state = "engineering" build_path = /obj/machinery/computer/monitor/secret -/obj/item/circuitboard/computer/sat_control - name = "Satellite Network Control (Computer Board)" - icon_state = "engineering" - build_path = /obj/machinery/computer/sat_control - /obj/item/circuitboard/computer/solar_control name = "Solar Control (Computer Board)" //name fixed 250810 icon_state = "engineering" @@ -428,53 +423,6 @@ //Service -//Supply - -/obj/item/circuitboard/computer/bounty - name = "Nanotrasen Bounty Console (Computer Board)" - icon_state = "supply" - build_path = /obj/machinery/computer/bounty - -/obj/item/circuitboard/computer/cargo - name = "Supply Console (Computer Board)" - icon_state = "supply" - build_path = /obj/machinery/computer/cargo - var/contraband = FALSE - -/obj/item/circuitboard/computer/cargo/multitool_act(mob/living/user) - . = ..() - if(!(obj_flags & EMAGGED)) - contraband = !contraband - to_chat(user, span_notice("Receiver spectrum set to [contraband ? "Broad" : "Standard"].")) - else - to_chat(user, span_alert("The spectrum chip is unresponsive.")) - -/obj/item/circuitboard/computer/cargo/emag_act(mob/living/user) - if(!(obj_flags & EMAGGED)) - contraband = TRUE - obj_flags |= EMAGGED - to_chat(user, span_notice("I adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) - -/obj/item/circuitboard/computer/cargo/express - name = "Express Supply Console (Computer Board)" - build_path = /obj/machinery/computer/cargo/express - -/obj/item/circuitboard/computer/cargo/express/multitool_act(mob/living/user) - . = ..() - if (!(obj_flags & EMAGGED)) - to_chat(user, span_alert("Routing protocols are already set to: \"factory defaults\".")) - else - to_chat(user, span_notice("I reset the routing protocols to: \"factory defaults\".")) - obj_flags &= ~EMAGGED - -/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user) - to_chat(user, span_notice("I change the routing protocols, allowing the Drop Pod to land anywhere on the station.")) - obj_flags |= EMAGGED - -/obj/item/circuitboard/computer/cargo/request - name = "Supply Request Console (Computer Board)" - build_path = /obj/machinery/computer/cargo/request - /obj/item/circuitboard/computer/ferry name = "Transport Ferry (Computer Board)" icon_state = "supply" diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 6db6699eb3b..a1011b44aec 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -142,9 +142,6 @@ /obj/effect/dummy/chameleon/attack_slime() master.disrupt() -/obj/effect/dummy/chameleon/attack_alien() - master.disrupt() - /obj/effect/dummy/chameleon/ex_act(S, T) contents_explosion(S, T) master.disrupt() diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm deleted file mode 100644 index b95321a2f66..00000000000 --- a/code/game/objects/items/implants/implant_abductor.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/item/implant/abductor - name = "recall implant" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "implant" - activated = 1 - var/obj/machinery/abductor/pad/home - var/cooldown = 60 SECONDS - var/on_cooldown - -/obj/item/implant/abductor/activate() - . = ..() - if(on_cooldown) - to_chat(imp_in, span_warning("I must wait [timeleft(on_cooldown)*0.1] seconds to use [src] again!")) - return - - home.Retrieve(imp_in,1) - on_cooldown = addtimer(VARSET_CALLBACK(src, on_cooldown, null), cooldown) - -/obj/item/implant/abductor/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) - if(..()) - var/obj/machinery/abductor/console/console - if(ishuman(target)) - var/datum/antagonist/abductor/A = target.mind.has_antag_datum(/datum/antagonist/abductor) - if(A) - console = get_abductor_console(A.team.team_number) - home = console.pad - - if(!home) - var/list/consoles = list() - for(var/obj/machinery/abductor/console/C in GLOB.machines) - consoles += C - console = pick(consoles) - home = console.pad - return TRUE diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 26562b2612d..a88d7891b7f 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -87,37 +87,6 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ icon_state = "sheet-lizard" item_state = "sheet-lizard" -/obj/item/stack/sheet/animalhide/xeno - name = "alien hide" - desc = "" - singular_name = "alien hide piece" - icon_state = "sheet-xeno" - item_state = "sheet-xeno" - -GLOBAL_LIST_INIT(xeno_recipes, list ( \ - new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1), \ - new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2), \ - )) - -/obj/item/stack/sheet/animalhide/xeno/get_main_recipes() - . = ..() - . += GLOB.xeno_recipes - -//don't see anywhere else to put these, maybe together they could be used to make the xenos suit? -/obj/item/stack/sheet/xenochitin - name = "alien chitin" - desc = "" - singular_name = "alien hide piece" - icon = 'icons/mob/alien.dmi' - icon_state = "chitin" - novariants = TRUE - -/obj/item/xenos_claw - name = "alien claw" - desc = "" - icon = 'icons/mob/alien.dmi' - icon_state = "claw" - /obj/item/weed_extract name = "weed extract" desc = "" diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index bc93fff79bf..89ed44ed798 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -24,7 +24,6 @@ Mineral Sheets */ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ - new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1) \ @@ -405,30 +404,6 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( custom_materials = list(/datum/material/mythril=MINERAL_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/mineral/mythril -/* - * Alien Alloy - */ -/obj/item/stack/sheet/mineral/abductor - name = "alien alloy" - icon = 'icons/obj/abductor.dmi' - icon_state = "sheet-abductor" - item_state = "sheet-abductor" - singular_name = "alien alloy sheet" - sheettype = "abductor" - merge_type = /obj/item/stack/sheet/mineral/abductor - -GLOBAL_LIST_INIT(abductor_recipes, list ( \ - new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 15, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 20, one_per_turf = 1, on_floor = 1), \ - null, \ - new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \ - )) - -/obj/item/stack/sheet/mineral/abductor/get_main_recipes() - . = ..() - . += GLOB.abductor_recipes /* * Coal diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index d382cabcd43..ff4f29fe58c 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -313,6 +313,7 @@ icon_state = initial(icon_state) REMOVE_TRAIT(src, TRAIT_T_RAY_VISIBLE, TRAIT_GENERIC) + /obj/item/storage/backpack/satchel/flat/with_tools/PopulateContents() new /obj/item/stack/tile/plasteel(src) new /obj/item/crowbar(src) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b7248278d87..d2f120baab6 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -570,10 +570,6 @@ var/chattering = FALSE var/phomeme -// Talking toys are language universal, and thus all species can use them -/obj/item/toy/talking/attack_alien(mob/user) - return attack_hand(user) - /obj/item/toy/talking/attack_self(mob/user) if(!cooldown) activation_message(user) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index a1ea2f4752a..7a575e85bba 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -112,10 +112,6 @@ user.changeNext_move(CLICK_CD_MELEE) return take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration) -/obj/attack_alien(mob/living/carbon/alien/humanoid/user) - if(attack_generic(user, 60, BRUTE, "slash", 0)) - playsound(src.loc, 'sound/blank.ogg', 100, TRUE) - /obj/attack_animal(mob/living/simple_animal/M) if(!M.melee_damage_upper && !M.obj_damage) M.emote("custom", message = "[M.friendly_verb_continuous] [src].") diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm deleted file mode 100644 index 08bedbfb0eb..00000000000 --- a/code/game/objects/structures/aliens.dm +++ /dev/null @@ -1,337 +0,0 @@ -/* Alien shit! - * Contains: - * structure/alien - * Resin - * Weeds - * Egg - */ - - -/obj/structure/alien - icon = 'icons/mob/alien.dmi' - max_integrity = 100 - -/obj/structure/alien/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "blunt" || damage_flag == "slash" || damage_flag == "stab") - switch(damage_type) - if(BRUTE) - damage_amount *= 0.25 - if(BURN) - damage_amount *= 2 - . = ..() - -/obj/structure/alien/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - else - playsound(src, 'sound/blank.ogg', 50, TRUE) - if(BURN) - if(damage_amount) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - -/* - * Generic alien stuff, not related to the purple lizards but still alien-like - */ - -/obj/structure/alien/gelpod - name = "gelatinous mound" - desc = "" - icon = 'icons/obj/fluff.dmi' - icon_state = "gelmound" - -/obj/structure/alien/gelpod/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1)) - new/obj/effect/mob_spawn/human/corpse/damaged(get_turf(src)) - qdel(src) - -/* - * Resin - */ -/obj/structure/alien/resin - name = "resin" - desc = "" - icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "smooth" - density = TRUE - opacity = 1 - anchored = TRUE - canSmoothWith = list(/obj/structure/alien/resin) - max_integrity = 200 - smooth = SMOOTH_TRUE - var/resintype = null - CanAtmosPass = ATMOS_PASS_DENSITY - - -/obj/structure/alien/resin/Initialize(mapload) - . = ..() - air_update_turf(TRUE) - -/obj/structure/alien/resin/Move() - var/turf/T = loc - . = ..() - move_update_air(T) - -/obj/structure/alien/resin/wall - name = "resin wall" - desc = "" - icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "smooth" //same as resin, but consistency ho! - resintype = "wall" - canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) - -/obj/structure/alien/resin/wall/BlockSuperconductivity() - return 1 - -/obj/structure/alien/resin/membrane - name = "resin membrane" - desc = "" - icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi' - icon_state = "smooth" - opacity = 0 - max_integrity = 160 - resintype = "membrane" - canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) - -/obj/structure/alien/resin/attack_paw(mob/user) - return attack_hand(user) - - -/obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target) - return !density - - -/* - * Weeds - */ - -#define NODERANGE 3 - -/obj/structure/alien/weeds - gender = PLURAL - name = "resin floor" - desc = "" - anchored = TRUE - density = FALSE - layer = TURF_LAYER - plane = FLOOR_PLANE - icon_state = "weeds" - max_integrity = 15 - canSmoothWith = list(/obj/structure/alien/weeds, /turf/closed/wall) - smooth = SMOOTH_MORE - var/last_expand = 0 //last world.time this weed expanded - var/growth_cooldown_low = 150 - var/growth_cooldown_high = 200 - var/static/list/blacklisted_turfs - -/obj/structure/alien/weeds/Initialize() - pixel_x = -4 - pixel_y = -4 //so the sprites line up right in the map editor - . = ..() - - if(!blacklisted_turfs) - blacklisted_turfs = typecacheof(list( - /turf/open/space, - /turf/open/chasm, - /turf/open/lava)) - - - last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high) - if(icon == initial(icon)) - switch(rand(1,3)) - if(1) - icon = 'icons/obj/smooth_structures/alien/weeds1.dmi' - if(2) - icon = 'icons/obj/smooth_structures/alien/weeds2.dmi' - if(3) - icon = 'icons/obj/smooth_structures/alien/weeds3.dmi' - -/obj/structure/alien/weeds/proc/expand() - var/turf/U = get_turf(src) - if(is_type_in_typecache(U, blacklisted_turfs)) - qdel(src) - return FALSE - - for(var/turf/T in U.GetAtmosAdjacentTurfs()) - if(locate(/obj/structure/alien/weeds) in T) - continue - - if(is_type_in_typecache(T, blacklisted_turfs)) - continue - - new /obj/structure/alien/weeds(T) - return TRUE - -/obj/structure/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - take_damage(5, BURN, 0, 0) - -//Weed nodes -/obj/structure/alien/weeds/node - name = "glowing resin" - desc = "" - icon_state = "weednode" - light_color = LIGHT_COLOR_BLUE - light_power = 0.5 - var/lon_range = 4 - var/node_range = NODERANGE - -/obj/structure/alien/weeds/node/Initialize() - icon = 'icons/obj/smooth_structures/alien/weednode.dmi' - . = ..() - set_light(lon_range) - var/obj/structure/alien/weeds/W = locate(/obj/structure/alien/weeds) in loc - if(W && W != src) - qdel(W) - START_PROCESSING(SSobj, src) - -/obj/structure/alien/weeds/node/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/structure/alien/weeds/node/process() - for(var/obj/structure/alien/weeds/W in range(node_range, src)) - if(W.last_expand <= world.time) - if(W.expand()) - W.last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high) - -#undef NODERANGE - - -/* - * Egg - */ - -//for the status var -#define BURST "burst" -#define GROWING "growing" -#define GROWN "grown" -#define MIN_GROWTH_TIME 900 //time it takes to grow a hugger -#define MAX_GROWTH_TIME 1500 - -/obj/structure/alien/egg - name = "egg" - desc = "" - var/base_icon = "egg" - icon_state = "egg_growing" - density = FALSE - anchored = TRUE - max_integrity = 100 - integrity_failure = 0.05 - var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive - layer = MOB_LAYER - var/obj/item/clothing/mask/facehugger/child - -/obj/structure/alien/egg/Initialize(mapload) - . = ..() - update_icon() - if(status == GROWING || status == GROWN) - child = new(src) - if(status == GROWING) - addtimer(CALLBACK(src, PROC_REF(Grow)), rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME)) - proximity_monitor = new(src, status == GROWN ? 1 : 0) - if(status == BURST) - obj_integrity = integrity_failure * max_integrity - -/obj/structure/alien/egg/update_icon() - ..() - switch(status) - if(GROWING) - icon_state = "[base_icon]_growing" - if(GROWN) - icon_state = "[base_icon]" - if(BURST) - icon_state = "[base_icon]_hatched" - -/obj/structure/alien/egg/attack_paw(mob/living/user) - return attack_hand(user) - -/obj/structure/alien/egg/attack_alien(mob/living/carbon/alien/user) - return attack_hand(user) - -/obj/structure/alien/egg/attack_hand(mob/living/user) - . = ..() - if(.) - return - if(user.getorgan(/obj/item/organ/alien/plasmavessel)) - switch(status) - if(BURST) - to_chat(user, span_notice("I clear the hatched egg.")) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - qdel(src) - return - if(GROWING) - to_chat(user, span_notice("The child is not developed yet.")) - return - if(GROWN) - to_chat(user, span_notice("I retrieve the child.")) - Burst(kill=FALSE) - return - else - to_chat(user, span_notice("It feels slimy.")) - user.changeNext_move(CLICK_CD_MELEE) - - -/obj/structure/alien/egg/proc/Grow() - status = GROWN - update_icon() - proximity_monitor.SetRange(1) - -//drops and kills the hugger if any is remaining -/obj/structure/alien/egg/proc/Burst(kill = TRUE) - if(status == GROWN || status == GROWING) - proximity_monitor.SetRange(0) - status = BURST - update_icon() - flick("egg_opening", src) - addtimer(CALLBACK(src, PROC_REF(finish_bursting), kill), 15) - -/obj/structure/alien/egg/proc/finish_bursting(kill = TRUE) - if(child) - child.forceMove(get_turf(src)) - // TECHNICALLY you could put non-facehuggers in the child var - if(istype(child)) - if(kill) - child.Die() - else - for(var/mob/M in range(1,src)) - if(CanHug(M)) - child.Leap(M) - break - -/obj/structure/alien/egg/obj_break(damage_flag) - if(!(flags_1 & NODECONSTRUCT_1)) - if(status != BURST) - Burst(kill=TRUE) - ..() - -/obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 500) - take_damage(5, BURN, 0, 0) - - -/obj/structure/alien/egg/HasProximity(atom/movable/AM) - if(status == GROWN) - if(!CanHug(AM)) - return - - var/mob/living/carbon/C = AM - if(C.stat == CONSCIOUS && C.getorgan(/obj/item/organ/body_egg/alien_embryo)) - return - - Burst(kill=FALSE) - -/obj/structure/alien/egg/grown - status = GROWN - icon_state = "egg" - -/obj/structure/alien/egg/burst - status = BURST - icon_state = "egg_hatched" - -#undef BURST -#undef GROWING -#undef GROWN -#undef MIN_GROWTH_TIME -#undef MAX_GROWTH_TIME diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm deleted file mode 100644 index 2c1244d1ffb..00000000000 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ /dev/null @@ -1,88 +0,0 @@ -//Alium nests. Essentially beds with an unbuckle delay that only aliums can buckle mobs to. - -/obj/structure/bed/nest - name = "alien nest" - desc = "" - icon = 'icons/obj/smooth_structures/alien/nest.dmi' - icon_state = "nest" - max_integrity = 120 - smooth = SMOOTH_TRUE - can_be_unanchored = FALSE - canSmoothWith = null - buildstacktype = null - flags_1 = NODECONSTRUCT_1 - bolts = FALSE - var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/alien.dmi', "nestoverlay", LYING_MOB_LAYER) - -/obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) - if(has_buckled_mobs()) - for(var/buck in buckled_mobs) //breaking a nest releases all the buckled mobs, because the nest isn't holding them down anymore - var/mob/living/M = buck - - if(user.getorgan(/obj/item/organ/alien/plasmavessel)) - unbuckle_mob(M) - add_fingerprint(user) - return - - if(M != user) - M.visible_message(span_notice("[user.name] pulls [M.name] free from the sticky nest!"),\ - span_notice("[user.name] pulls you free from the gelatinous resin."),\ - span_hear("I hear squelching...")) - else - M.visible_message(span_warning("[M.name] struggles to break free from the gelatinous resin!"),\ - span_notice("I struggle to break free from the gelatinous resin... (Stay still for two minutes.)"),\ - span_hear("I hear squelching...")) - if(!do_after(M, 1200, target = src)) - if(M && M.buckled) - to_chat(M, span_warning("I fail to unbuckle yourself!")) - return - if(!M.buckled) - return - M.visible_message(span_warning("[M.name] breaks free from the gelatinous resin!"),\ - span_notice("I break free from the gelatinous resin!"),\ - span_hear("I hear squelching...")) - - unbuckle_mob(M) - add_fingerprint(user) - -/obj/structure/bed/nest/user_buckle_mob(mob/living/M, mob/living/user) - if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.incapacitated() || M.buckled ) - return - - if(M.getorgan(/obj/item/organ/alien/plasmavessel)) - return - if(!user.getorgan(/obj/item/organ/alien/plasmavessel)) - return - - if(has_buckled_mobs()) - unbuckle_all_mobs() - - if(buckle_mob(M)) - M.visible_message(span_notice("[user.name] secretes a thick vile goo, securing [M.name] into [src]!"),\ - span_danger("[user.name] drenches you in a foul-smelling resin, trapping you in [src]!"),\ - span_hear("I hear squelching...")) - -/obj/structure/bed/nest/post_buckle_mob(mob/living/M) - M.pixel_y = 0 - M.pixel_x = initial(M.pixel_x) + 2 - M.layer = BELOW_MOB_LAYER - add_overlay(nest_overlay) - -/obj/structure/bed/nest/post_unbuckle_mob(mob/living/M) - M.pixel_x = M.get_standard_pixel_x_offset(M.lying) - M.pixel_y = M.get_standard_pixel_y_offset(M.lying) - M.layer = initial(M.layer) - cut_overlay(nest_overlay) - -/obj/structure/bed/nest/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - if(BURN) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - -/obj/structure/bed/nest/attack_alien(mob/living/carbon/alien/user) - if(user.used_intent.type != INTENT_HARM) - return attack_hand(user) - else - return ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 3c761299e33..cc1cefd397a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -17,7 +17,6 @@ new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/head/soft(src) - new /obj/item/export_scanner(src) new /obj/item/door_remote/quartermaster(src) new /obj/item/circuitboard/machine/techfab/department/cargo(src) new /obj/item/storage/photo_album/QM(src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 77768474340..26c36996e23 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -109,7 +109,6 @@ /obj/item/stack/sheet/mineral/plastitanium, /obj/item/stack/rods, /obj/item/stack/sheet/bluespace_crystal, - /obj/item/stack/sheet/mineral/abductor, /obj/item/stack/sheet/plastic, /obj/item/stack/sheet/mineral/wood ) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index c98b88408ca..50e87ade8ca 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -234,12 +234,6 @@ start_showpiece_type = /obj/item/gun/energy/laser/captain req_access = list(ACCESS_CENT_SPECOPS) -/obj/structure/displaycase/labcage - name = "lab cage" - desc = "" - start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr - req_access = list(ACCESS_RD) - /obj/structure/displaycase/trophy name = "trophy display case" desc = "" diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 7854785848b..66cd3665c5c 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -50,7 +50,7 @@ deconstruct(TRUE) return - if(iscyborg(user) || isalien(user)) + if(iscyborg(user)) return if(istype(I, /obj/item/extinguisher)) if(!stored_extinguisher && opened) @@ -72,7 +72,7 @@ . = ..() if(.) return - if(iscyborg(user) || isalien(user)) + if(iscyborg(user)) return if(stored_extinguisher) user.put_in_hands(stored_extinguisher) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index efd2fc12e98..3555102e921 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -284,15 +284,6 @@ walltype = /turf/closed/wall/mineral/iron canSmoothWith = list(/obj/structure/falsewall/iron, /turf/closed/wall/mineral/iron) -/obj/structure/falsewall/abductor - name = "alien wall" - desc = "" - icon = 'icons/turf/walls/abductor_wall.dmi' - icon_state = "abductor" - mineral = /obj/item/stack/sheet/mineral/abductor - walltype = /turf/closed/wall/mineral/abductor - canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/closed/wall/mineral/abductor) - /obj/structure/falsewall/titanium name = "wall" desc = "" diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 727981c5b70..3922ebd1be9 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -107,13 +107,6 @@ if(!shock(user, 70)) take_damage(rand(5,10), BRUTE, "blunt", 1) -/obj/structure/grille/attack_alien(mob/living/user) - user.do_attack_animation(src) - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message(span_warning("[user] mangles [src]."), null, null, COMBAT_MESSAGE_RANGE) - if(!shock(user, 70)) - take_damage(20, BRUTE, "slash", 1) - /obj/structure/grille/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGRILLE)) diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 8f313657283..f1f036ac910 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -35,7 +35,7 @@ add_overlay("[icon_state]_door") /obj/structure/guncase/attackby(obj/item/I, mob/user, params) - if(iscyborg(user) || isalien(user)) + if(iscyborg(user)) return if(istype(I, gun_category) && open) if(LAZYLEN(contents) < capacity) @@ -57,7 +57,7 @@ . = ..() if(.) return - if(iscyborg(user) || isalien(user)) + if(iscyborg(user)) return if(contents.len && open) ShowWindow(user) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 9b7ba4d4f66..27066cbf0e0 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -119,12 +119,6 @@ gets_drilled(user) ..() -/turf/closed/mineral/attack_alien(mob/living/carbon/alien/M) - to_chat(M, span_notice("I start digging into the rock...")) - playsound(src, 'sound/blank.ogg', 50, TRUE) - if(do_after(M, 40, target = src)) - to_chat(M, span_notice("I tunnel into the rock.")) - gets_drilled(M) /* /turf/closed/mineral/Bumped(atom/movable/AM) ..() diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index e1abe6fe47f..399f638da5f 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -170,17 +170,6 @@ bullet_sizzle = TRUE bullet_bounce_sound = null -/turf/closed/wall/mineral/abductor - name = "alien wall" - desc = "" - icon = 'icons/turf/walls/abductor_wall.dmi' - icon_state = "abductor" - smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL - sheet_type = /obj/item/stack/sheet/mineral/abductor - slicing_duration = 200 //alien wall takes twice as much time to slice - explosion_block = 3 - canSmoothWith = list(/turf/closed/wall/mineral/abductor, /obj/structure/falsewall/abductor) - /////////////////////Titanium walls///////////////////// /turf/closed/wall/mineral/titanium //has to use this path due to how building walls works diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4b6b6af5d24..11aa1719be1 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -605,8 +605,6 @@ /turf/acid_act(acidpwr, acid_volume) . = 1 var/acid_type = /obj/effect/acid - if(acidpwr >= 200) //alien acid power - acid_type = /obj/effect/acid/alien var/has_acid_effect = FALSE for(var/obj/O in src) if(intact && O.level == 1) //hidden under the floor diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 21b19dbab3d..35f75e9b3d1 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -225,11 +225,6 @@ M_job = M.get_role_title() else if(ismonkey(M)) M_job = "Monkey" - else if(isalien(M)) //aliens - if(islarva(M)) - M_job = "Alien larva" - else - M_job = ROLE_ALIEN else M_job = "Carbon-based" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 0855f89ffd3..38a0e7d79ab 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -56,7 +56,7 @@ to_chat(usr, span_danger("ERROR: Client not found.")) return toggle_exempt_status(C) - + else if(href_list["forceevent"]) if(!check_rights(R_FUN)) return @@ -264,18 +264,6 @@ switch(href_list["simplemake"]) if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob ) - if("drone") - M.change_mob_type( /mob/living/carbon/alien/humanoid/drone , null, null, delmob ) - if("hunter") - M.change_mob_type( /mob/living/carbon/alien/humanoid/hunter , null, null, delmob ) - if("queen") - M.change_mob_type( /mob/living/carbon/alien/humanoid/royal/queen , null, null, delmob ) - if("praetorian") - M.change_mob_type( /mob/living/carbon/alien/humanoid/royal/praetorian , null, null, delmob ) - if("sentinel") - M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob ) - if("larva") - M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob ) if("human") var/posttransformoutfit = usr.client.robust_dress_shop() if (!posttransformoutfit) @@ -1054,17 +1042,6 @@ log_admin("[key_name(usr)] AIized [key_name(H)].") H.AIize(TRUE, H.client) - else if(href_list["makealien"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makealien"]) - if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human.") - return - - usr.client.cmd_admin_alienize(H) - else if(href_list["makeslime"]) if(!check_rights(R_SPAWN)) return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index b1a84db71e2..c9c8d9d6c3e 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -120,21 +120,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that SSpai.candidates.Remove(candidate) SSblackbox.record_feedback("tally", "admin_verb", 1, "Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_alienize(mob/M in GLOB.mob_list) - set category = "Fun" - set name = "Make Alien" - - if(!SSticker.HasRoundStarted()) - alert("Wait until the game starts") - return - if(ishuman(M)) - INVOKE_ASYNC(M, TYPE_PROC_REF(/mob/living/carbon/human, Alienize)) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] made [key_name(M)] into an alien at [AREACOORD(M)].") - message_admins(span_adminnotice("[key_name_admin(usr)] made [ADMIN_LOOKUPFLW(M)] into an alien.")) - else - alert("Invalid mob") - /client/proc/cmd_admin_slimeize(mob/M in GLOB.mob_list) set category = "Fun" set name = "Make slime" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 82cd1c15bdb..295e27a60d6 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -281,55 +281,6 @@ to_chat(C, "You have been [muteunmute] from [mute_string] by [key_name(usr, include_name = FALSE)].") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Mute [feedback_string]", "[P.muted & mute_type]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -//I use this proc for respawn character too. /N -/proc/create_xeno(ckey) - if(!ckey) - var/list/candidates = list() - for(var/mob/M in GLOB.player_list) - if(M.stat != DEAD) - continue //we are not dead! - if(!(ROLE_ALIEN in M.client.prefs.be_special)) - continue //we don't want to be an alium - if(M.client.is_afk()) - continue //we are afk - if(M.mind && M.mind.current && M.mind.current.stat != DEAD) - continue //we have a live body we are tied to - candidates += M.ckey - if(candidates.len) - ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in sortKey(candidates) - else - to_chat(usr, span_danger("Error: create_xeno(): no suitable candidates.")) - if(!istext(ckey)) - return 0 - - var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Praetorian","Hunter","Sentinel","Drone","Larva") - var/obj/effect/landmark/spawn_here = GLOB.xeno_spawn.len ? pick(GLOB.xeno_spawn) : null - var/mob/living/carbon/alien/new_xeno - switch(alien_caste) - if("Queen") - new_xeno = new /mob/living/carbon/alien/humanoid/royal/queen(spawn_here) - if("Praetorian") - new_xeno = new /mob/living/carbon/alien/humanoid/royal/praetorian(spawn_here) - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(spawn_here) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(spawn_here) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(spawn_here) - if("Larva") - new_xeno = new /mob/living/carbon/alien/larva(spawn_here) - else - return 0 - if(!spawn_here) - SSjob.SendToLateJoin(new_xeno, FALSE) - - new_xeno.ckey = ckey - var/msg = span_notice("[key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste].") - message_admins(msg) - admin_ticket_log(new_xeno, msg) - return 1 - /* If a guy was gibbed and you want to revive him, this is a good way to do so. Works kind of like entering the game with a new character. Character receives a new mind if they didn't have one. @@ -357,43 +308,9 @@ Traitors and the like can also be revived with the previous role mostly intact. return if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something - //Check if they were an alien - if(G_found.mind.assigned_role == ROLE_ALIEN) - if(alert("This character appears to have been an alien. Would you like to respawn them as such?",,"Yes","No")=="Yes") - var/turf/T - if(GLOB.xeno_spawn.len) - T = pick(GLOB.xeno_spawn) - - var/mob/living/carbon/alien/new_xeno - switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were. - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(T) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(T) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(T) - if("Praetorian") - new_xeno = new /mob/living/carbon/alien/humanoid/royal/praetorian(T) - if("Queen") - new_xeno = new /mob/living/carbon/alien/humanoid/royal/queen(T) - else//If we don't know what special role they have, for whatever reason, or they're a larva. - create_xeno(G_found.ckey) - return - - if(!T) - SSjob.SendToLateJoin(new_xeno, FALSE) - - //Now to give them their mind back. - G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use - new_xeno.key = G_found.key - to_chat(new_xeno, "You have been fully respawned. Enjoy the game.") - var/msg = span_adminnotice("[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.") - message_admins(msg) - admin_ticket_log(new_xeno, msg) - return //all done. The ghost is auto-deleted //check if they were a monkey - else if(findtext(G_found.real_name,"monkey")) + if(findtext(G_found.real_name,"monkey")) if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes") var/mob/living/carbon/monkey/new_monkey = new SSjob.SendToLateJoin(new_monkey) @@ -1085,12 +1002,6 @@ Traitors and the like can also be revived with the previous role mostly intact. bluespace_artillery(target) if(ADMIN_PUNISHMENT_FIREBALL) new /obj/effect/temp_visual/target(get_turf(target)) - if(ADMIN_PUNISHMENT_ROD) - var/turf/T = get_turf(target) - var/startside = pick(GLOB.cardinals) - var/turf/startT = spaceDebrisStartLoc(startside, T.z) - var/turf/endT = spaceDebrisFinishLoc(startside, T.z) - new /obj/effect/immovablerod(startT, endT,target) if(ADMIN_PUNISHMENT_SUPPLYPOD_QUICK) var/target_path = input(usr,"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):" ,"Typepath","/obj/item/reagent_containers/food/snacks/grown/harebell") as null|text var/obj/structure/closet/supplypod/centcompod/pod = new() diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index bd2526cd88b..34bee414e72 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -220,61 +220,3 @@ new_borg.send_to_spawnpoint = FALSE R.mind.add_antag_datum(new_borg,creator_op.nuke_team) R.mind.special_role = "Syndicate Cyborg" - -///////////SLAUGHTER DEMON - -/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game - name = "vial of blood" - desc = "" - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - - var/shatter_msg = span_notice("I shatter the bottle, no turning back now!") - var/veil_msg = span_warning("I sense a dark presence lurking just beyond the veil...") - var/mob/living/demon_type = /mob/living/simple_animal/slaughter - var/antag_type = /datum/antagonist/slaughter - - -/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user) - if(!is_station_level(user.z)) - to_chat(user, span_warning("I should probably wait until you reach the station.")) - return - if(used) - return - var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src) - if(LAZYLEN(candidates)) - if(used || QDELETED(src)) - return - used = TRUE - var/mob/dead/observer/C = pick(candidates) - spawn_antag(C.client, get_turf(src), initial(demon_type.name),user.mind) - to_chat(user, shatter_msg) - to_chat(user, veil_msg) - playsound(user.loc, 'sound/blank.ogg', 100, TRUE) - qdel(src) - else - to_chat(user, span_warning("I can't seem to work up the nerve to shatter the bottle! Perhaps you should try again later.")) - - -/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) - var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter(T) - var/mob/living/simple_animal/slaughter/S = new demon_type(holder) - S.holder = holder - S.key = C.key - S.mind.assigned_role = S.name - S.mind.special_role = S.name - S.mind.add_antag_datum(antag_type) - to_chat(S, S.playstyle_string) - to_chat(S, "I are currently not currently in the same plane of existence as the station. \ - Ctrl+Click a blood pool to manifest.") - -/obj/item/antag_spawner/slaughter_demon/laughter - name = "vial of tickles" - desc = "" - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - color = "#FF69B4" // HOT PINK - - veil_msg = span_warning("I sense an adorable presence lurking just beyond the veil...") - demon_type = /mob/living/simple_animal/slaughter/laughter - antag_type = /datum/antagonist/slaughter/laughter diff --git a/code/modules/antagonists/abductor/abductee/abductee_objectives.dm b/code/modules/antagonists/abductor/abductee/abductee_objectives.dm deleted file mode 100644 index f1883196448..00000000000 --- a/code/modules/antagonists/abductor/abductee/abductee_objectives.dm +++ /dev/null @@ -1,54 +0,0 @@ -/datum/objective/abductee - completed = 1 - -/datum/objective/abductee/random - -/datum/objective/abductee/random/New() - explanation_text = pick(world.file2list("strings/abductee_objectives.txt")) - -/datum/objective/abductee/steal - explanation_text = "Steal all" - -/datum/objective/abductee/steal/New() - var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs")) - explanation_text+=" [target]." - -/datum/objective/abductee/paint - explanation_text = "The station is hideous. You must color it all" - -/datum/objective/abductee/paint/New() - var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood")) - explanation_text+= " [color]!" - -/datum/objective/abductee/speech - explanation_text = "Your brain is broken... you can only communicate in" - -/datum/objective/abductee/speech/New() - var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon", "three word sentences")) - explanation_text+= " [style]." - -/datum/objective/abductee/capture - explanation_text = "Capture" - -/datum/objective/abductee/capture/New() - var/list/jobs = SSjob.occupations.Copy() - for(var/X in jobs) - var/datum/job/J = X - if(J.current_positions < 1) - jobs -= J - if(jobs.len > 0) - var/datum/job/target = pick(jobs) - explanation_text += " a [target.title]." - else - explanation_text += " someone." - -/datum/objective/abductee/calling/New() - var/mob/dead/D = pick(GLOB.dead_mob_list) - if(D) - explanation_text = "You know that [D] has perished. Hold a seance to call [D.p_them()] from the spirit realm." - -/datum/objective/abductee/forbiddennumber - -/datum/objective/abductee/forbiddennumber/New() - var/number = rand(2,10) - explanation_text = "Ignore anything in a set of [number], they don't exist." diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm deleted file mode 100644 index 64c909e6574..00000000000 --- a/code/modules/antagonists/abductor/abductor.dm +++ /dev/null @@ -1,219 +0,0 @@ -#define ABDUCTOR_MAX_TEAMS 4 - -/datum/antagonist/abductor - name = "Abductor" - roundend_category = "abductors" - antagpanel_category = "Abductor" - job_rank = ROLE_ABDUCTOR - antag_hud_type = ANTAG_HUD_ABDUCTOR - antag_hud_name = "abductor" - show_in_antagpanel = FALSE //should only show subtypes - var/datum/team/abductor_team/team - var/sub_role - var/outfit - var/landmark_type - var/greet_text - - -/datum/antagonist/abductor/agent - name = "Abductor Agent" - sub_role = "Agent" - outfit = /datum/outfit/abductor/agent - landmark_type = /obj/effect/landmark/abductor/agent - greet_text = "Use my stealth technology and equipment to incapacitate humans for my scientist to retrieve." - show_in_antagpanel = TRUE - -/datum/antagonist/abductor/scientist - name = "Abductor Scientist" - sub_role = "Scientist" - outfit = /datum/outfit/abductor/scientist - landmark_type = /obj/effect/landmark/abductor/scientist - greet_text = "Use my experimental console and surgical equipment to monitor my agent and experiment upon abducted humans." - show_in_antagpanel = TRUE - -/datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team) - if(!new_team) - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - team = new_team - -/datum/antagonist/abductor/get_team() - return team - -/datum/antagonist/abductor/on_gain() - owner.special_role = "[name]" - owner.assigned_role = "[name]" - objectives += team.objectives - finalize_abductor() - ADD_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST) - return ..() - -/datum/antagonist/abductor/on_removal() - if(owner.current) - to_chat(owner.current,span_danger("I are no longer the [owner.special_role]!")) - owner.special_role = null - REMOVE_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST) - return ..() - -/datum/antagonist/abductor/greet() - to_chat(owner.current, span_notice("I are the [owner.special_role]!")) - to_chat(owner.current, span_notice("With the help of my teammate, kidnap and experiment on station crew members!")) - to_chat(owner.current, span_notice("[greet_text]")) - owner.announce_objectives() - -/datum/antagonist/abductor/proc/finalize_abductor() - //Equip - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/abductor) - var/obj/item/organ/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE) - T.mothership = "[team.name]" - - H.real_name = "[team.name] [sub_role]" - H.equipOutfit(outfit) - - //Teleport to ship - for(var/obj/effect/landmark/abductor/LM in GLOB.landmarks_list) - if(istype(LM, landmark_type) && LM.team_number == team.team_number) - H.forceMove(LM.loc) - break - - add_antag_hud(antag_hud_type, antag_hud_name, owner.current) - -/datum/antagonist/abductor/scientist/on_gain() - ADD_TRAIT(owner, TRAIT_ABDUCTOR_SCIENTIST_TRAINING, ABDUCTOR_ANTAGONIST) - ADD_TRAIT(owner, TRAIT_SURGEON, ABDUCTOR_ANTAGONIST) - . = ..() - -/datum/antagonist/abductor/scientist/on_removal() - REMOVE_TRAIT(owner, TRAIT_ABDUCTOR_SCIENTIST_TRAINING, ABDUCTOR_ANTAGONIST) - REMOVE_TRAIT(owner, TRAIT_SURGEON, ABDUCTOR_ANTAGONIST) - . = ..() - -/datum/antagonist/abductor/admin_add(datum/mind/new_owner,mob/admin) - var/list/current_teams = list() - for(var/datum/team/abductor_team/T in get_all_teams(/datum/team/abductor_team)) - current_teams[T.name] = T - var/choice = input(admin,"Add to which team ?") as null|anything in (current_teams + "new team") - if (choice == "new team") - team = new - else if(choice in current_teams) - team = current_teams[choice] - else - return - new_owner.add_antag_datum(src) - log_admin("[key_name(usr)] made [key_name(new_owner)] [name] on [choice]!") - message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner)] [name] on [choice] !") - -/datum/antagonist/abductor/get_admin_commands() - . = ..() - .["Equip"] = CALLBACK(src,PROC_REF(admin_equip)) - -/datum/antagonist/abductor/proc/admin_equip(mob/admin) - if(!ishuman(owner.current)) - to_chat(admin, span_warning("This only works on humans!")) - return - var/mob/living/carbon/human/H = owner.current - var/gear = alert(admin,"Agent or Scientist Gear","Gear","Agent","Scientist") - if(gear) - if(gear=="Agent") - H.equipOutfit(/datum/outfit/abductor/agent) - else - H.equipOutfit(/datum/outfit/abductor/scientist) - -/datum/team/abductor_team - member_name = "abductor" - var/team_number - var/list/datum/mind/abductees = list() - var/static/team_count = 1 - -/datum/team/abductor_team/New() - ..() - team_number = team_count++ - name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names - add_objective(new/datum/objective/experiment) - -/datum/team/abductor_team/is_solo() - return FALSE - -/datum/team/abductor_team/proc/add_objective(datum/objective/O) - O.team = src - O.update_explanation_text() - objectives += O - -/datum/team/abductor_team/roundend_report() - var/list/result = list() - - var/won = TRUE - for(var/datum/objective/O in objectives) - if(!O.check_completion()) - won = FALSE - if(won) - result += span_greentextbig("[name] team fulfilled its mission!") - else - result += span_redtextbig("[name] team failed its mission.") - - result += span_header("The abductors of [name] were:") - for(var/datum/mind/abductor_mind in members) - result += printplayer(abductor_mind) - result += printobjectives(objectives) - - return "
[result.Join("
")]
" - -/datum/antagonist/abductee - name = "Abductee" - roundend_category = "abductees" - antagpanel_category = "Abductee" - antag_hud_type = ANTAG_HUD_ABDUCTOR - antag_hud_name = "abductee" - -/datum/antagonist/abductee/on_gain() - give_objective() - . = ..() - -/datum/antagonist/abductee/greet() - to_chat(owner, span_warning("My mind snaps!")) - to_chat(owner, "I can't remember how you got here...") - owner.announce_objectives() - -/datum/antagonist/abductee/proc/give_objective() - var/mob/living/carbon/human/H = owner.current - if(istype(H)) - H.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY) - var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) - var/datum/objective/abductee/O = new objtype() - objectives += O - -/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - add_antag_hud(antag_hud_type, antag_hud_name, M) - -/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - remove_antag_hud(antag_hud_type, M) - - -// LANDMARKS -/obj/effect/landmark/abductor - var/team_number = 1 - -/obj/effect/landmark/abductor/agent - icon_state = "abductor_agent" -/obj/effect/landmark/abductor/scientist - icon_state = "abductor" - -// OBJECTIVES -/datum/objective/experiment - target_amount = 6 - -/datum/objective/experiment/New() - explanation_text = "Experiment on [target_amount] humans." - -/datum/objective/experiment/check_completion() - for(var/obj/machinery/abductor/experiment/E in GLOB.machines) - if(!istype(team, /datum/team/abductor_team)) - return FALSE - var/datum/team/abductor_team/T = team - if(E.team_number == T.team_number) - return E.points >= target_amount - return FALSE diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm deleted file mode 100644 index 43af3631576..00000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ /dev/null @@ -1,847 +0,0 @@ -#define VEST_STEALTH 1 -#define VEST_COMBAT 2 -#define GIZMO_SCAN 1 -#define GIZMO_MARK 2 -#define MIND_DEVICE_MESSAGE 1 -#define MIND_DEVICE_CONTROL 2 - -//AGENT VEST -/obj/item/clothing/suit/armor/abductor/vest - name = "agent vest" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "vest_stealth" - item_state = "armor" - blood_overlay_type = "armor" - armor = list("blunt" = 15, "slash" = 15, "stab" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) - actions_types = list(/datum/action/item_action/hands_free/activate) - allowed = list( - /obj/item/abductor, - /obj/item/abductor/baton, - /obj/item/melee/baton, - /obj/item/gun/energy, - /obj/item/restraints/handcuffs - ) - var/mode = VEST_STEALTH - var/stealth_active = 0 - var/combat_cooldown = 10 - var/datum/icon_snapshot/disguise - var/stealth_armor = list("blunt" = 15, "slash" = 15, "stab" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) - var/combat_armor = list("blunt" = 50, "slash" = 50, "stab" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90) - -/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() - if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)) - REMOVE_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) - else - ADD_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) - if(ismob(loc)) - to_chat(loc, span_notice("My vest is now [HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "locked" : "unlocked"].")) - -/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() - switch(mode) - if(VEST_STEALTH) - mode = VEST_COMBAT - DeactivateStealth() - armor = combat_armor - icon_state = "vest_combat" - if(VEST_COMBAT)// TO STEALTH - mode = VEST_STEALTH - armor = stealth_armor - icon_state = "vest_stealth" - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - H.update_inv_wear_suit() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() - -/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) - if(slot == SLOT_ARMOR) //we only give the mob the ability to activate the vest if he's actually wearing it. - return TRUE - -/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) - disguise = entry - -/obj/item/clothing/suit/armor/abductor/vest/proc/ActivateStealth() - if(disguise == null) - return - stealth_active = 1 - if(ishuman(loc)) - var/mob/living/carbon/human/M = loc - new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(M), M.dir) - M.name_override = disguise.name - M.icon = disguise.icon - M.icon_state = disguise.icon_state - M.cut_overlays() - M.add_overlay(disguise.overlays) - M.update_inv_hands() - -/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth() - if(!stealth_active) - return - stealth_active = 0 - if(ishuman(loc)) - var/mob/living/carbon/human/M = loc - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir) - M.name_override = null - M.cut_overlays() - M.regenerate_icons() - -/obj/item/clothing/suit/armor/abductor/vest/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - DeactivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/IsReflect() - DeactivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/ui_action_click() - switch(mode) - if(VEST_COMBAT) - Adrenaline() - if(VEST_STEALTH) - if(stealth_active) - DeactivateStealth() - else - ActivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() - if(ishuman(loc)) - if(combat_cooldown != initial(combat_cooldown)) - to_chat(loc, span_warning("Combat injection is still recharging.")) - return - var/mob/living/carbon/human/M = loc - M.adjustStaminaLoss(-75) - M.SetUnconscious(0) - M.SetStun(0) - M.SetKnockdown(0) - M.SetImmobilized(0) - M.SetParalyzed(0) - combat_cooldown = 0 - START_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/armor/abductor/vest/process() - combat_cooldown++ - if(combat_cooldown==initial(combat_cooldown)) - STOP_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/armor/abductor/Destroy() - STOP_PROCESSING(SSobj, src) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.vest == src) - C.vest = null - break - . = ..() - - -/obj/item/abductor - icon = 'icons/obj/abductor.dmi' - lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi' - -/obj/item/abductor/proc/AbductorCheck(mob/user) - if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) - return TRUE - if (istype(user) && user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) - return TRUE - to_chat(user, span_warning("I can't figure how this works!")) - return FALSE - -/obj/item/abductor/proc/ScientistCheck(mob/user) - var/training = HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) - var/sci_training = HAS_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) - - if(training && !sci_training) - to_chat(user, span_warning("You're not trained to use this!")) - . = FALSE - else if(!training && !sci_training) - to_chat(user, span_warning("I can't figure how this works!")) - . = FALSE - else - . = TRUE - -/obj/item/abductor/gizmo - name = "science tool" - desc = "" - icon_state = "gizmo_scan" - item_state = "silencer" - var/mode = GIZMO_SCAN - var/mob/living/marked = null - var/obj/machinery/abductor/console/console - -/obj/item/abductor/gizmo/attack_self(mob/user) - if(!ScientistCheck(user)) - return - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return - - if(mode == GIZMO_SCAN) - mode = GIZMO_MARK - icon_state = "gizmo_mark" - else - mode = GIZMO_SCAN - icon_state = "gizmo_scan" - to_chat(user, span_notice("I switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE")) - -/obj/item/abductor/gizmo/attack(mob/living/M, mob/user) - if(!ScientistCheck(user)) - return - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return - - switch(mode) - if(GIZMO_SCAN) - scan(M, user) - if(GIZMO_MARK) - mark(M, user) - - -/obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(flag) - return - if(!ScientistCheck(user)) - return - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return - - switch(mode) - if(GIZMO_SCAN) - scan(target, user) - if(GIZMO_MARK) - mark(target, user) - -/obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user) - if(ishuman(target)) - console.AddSnapshot(target) - to_chat(user, span_notice("I scan [target] and add [target.p_them()] to the database.")) - -/obj/item/abductor/gizmo/proc/mark(atom/target, mob/living/user) - if(marked == target) - to_chat(user, span_warning("This specimen is already marked!")) - return - if(isabductor(target) || iscow(target)) - marked = target - to_chat(user, span_notice("I mark [target] for future retrieval.")) - else - prepare(target,user) - -/obj/item/abductor/gizmo/proc/prepare(atom/target, mob/living/user) - if(get_dist(target,user)>1) - to_chat(user, span_warning("I need to be next to the specimen to prepare it for transport!")) - return - to_chat(user, span_notice("I begin preparing [target] for transport...")) - if(do_after(user, 100, target = target)) - marked = target - to_chat(user, span_notice("I finish preparing [target] for transport.")) - -/obj/item/abductor/gizmo/Destroy() - if(console) - console.gizmo = null - . = ..() - - -/obj/item/abductor/silencer - name = "abductor silencer" - desc = "" - icon_state = "silencer" - item_state = "gizmo" - -/obj/item/abductor/silencer/attack(mob/living/M, mob/user) - if(!AbductorCheck(user)) - return - radio_off(M, user) - -/obj/item/abductor/silencer/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(flag) - return - if(!AbductorCheck(user)) - return - radio_off(target, user) - -/obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) - if( !(user in (viewers(7,target))) ) - return - - var/turf/targloc = get_turf(target) - - var/mob/living/carbon/human/M - for(M in view(2,targloc)) - if(M == user) - continue - to_chat(user, span_notice("I silence [M]'s radio devices.")) - radio_off_mob(M) - -/obj/item/abductor/silencer/proc/radio_off_mob(mob/living/carbon/human/M) - var/list/all_items = M.GetAllContents() - - for(var/obj/I in all_items) - if(istype(I, /obj/item/radio/)) - var/obj/item/radio/r = I - r.listening = 0 - if(!istype(I, /obj/item/radio/headset)) - r.broadcasting = 0 //goddamned headset hacks - -/obj/item/abductor/mind_device - name = "mental interface device" - desc = "A dual-mode tool for directly communicating with sentient brains. It can be used to send a direct message to a target, \ - or to send a command to a test subject with a charged gland." - icon_state = "mind_device_message" - item_state = "silencer" - var/mode = MIND_DEVICE_MESSAGE - -/obj/item/abductor/mind_device/attack_self(mob/user) - if(!ScientistCheck(user)) - return - - if(mode == MIND_DEVICE_MESSAGE) - mode = MIND_DEVICE_CONTROL - icon_state = "mind_device_control" - else - mode = MIND_DEVICE_MESSAGE - icon_state = "mind_device_message" - to_chat(user, span_notice("I switch the device to [mode==MIND_DEVICE_MESSAGE? "TRANSMISSION": "COMMAND"] MODE")) - -/obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(!ScientistCheck(user)) - return - - switch(mode) - if(MIND_DEVICE_CONTROL) - mind_control(target, user) - if(MIND_DEVICE_MESSAGE) - mind_message(target, user) - -/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user) - if(iscarbon(target)) - var/mob/living/carbon/C = target - var/obj/item/organ/heart/gland/G = C.getorganslot("heart") - if(!istype(G)) - to_chat(user, span_warning("My target does not have an experimental gland!")) - return - if(!G.mind_control_uses) - to_chat(user, span_warning("My target's gland is spent!")) - return - if(G.active_mind_control) - to_chat(user, span_warning("My target is already under a mind-controlling influence!")) - return - - var/command = stripped_input(user, "Enter the command for my target to follow.\ - Uses Left: [G.mind_control_uses], Duration: [DisplayTimeText(G.mind_control_duration)]","Enter command") - - if(!command) - return - - if(QDELETED(user) || user.get_active_held_item() != src || loc != user) - return - - if(QDELETED(G)) - return - - if(C.anti_magic_check(FALSE, FALSE, TRUE, 0)) - to_chat(user, span_warning("My target seems to have some sort of tinfoil protection on, blocking the message from being sent!")) - return - - G.mind_control(command, user) - to_chat(user, span_notice("I send the command to my target.")) - -/obj/item/abductor/mind_device/proc/mind_message(atom/target, mob/living/user) - if(isliving(target)) - var/mob/living/L = target - if(L.stat == DEAD) - to_chat(user, span_warning("My target is dead!")) - return - var/message = stripped_input(user, "Write a message to send to my target's brain.","Enter message") - if(!message) - return - if(QDELETED(L) || L.stat == DEAD) - return - - to_chat(L, span_hear("I hear a voice in my head saying: [message]")) - to_chat(user, span_notice("I send the message to my target.")) - log_directed_talk(user, L, message, LOG_SAY, "abductor whisper") - - -/obj/item/firing_pin/abductor - name = "alien firing pin" - icon_state = "firing_pin_ayy" - desc = "This firing pin is slimy and warm; you can swear you feel it \ - constantly trying to mentally probe you." - fail_message = "\ - Firing error, please contact Command." - -/obj/item/firing_pin/abductor/pin_auth(mob/living/user) - . = isabductor(user) - -/obj/item/gun/energy/alien - name = "alien pistol" - desc = "" - ammo_type = list(/obj/item/ammo_casing/energy/declone) - pin = /obj/item/firing_pin/abductor - icon_state = "alienpistol" - item_state = "alienpistol" - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/gun/energy/shrink_ray - name = "shrink ray blaster" - desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \ - That or it's just space magic. Either way, it shrinks stuff." - ammo_type = list(/obj/item/ammo_casing/energy/shrink) - item_state = "shrink_ray" - icon_state = "shrink_ray" - fire_delay = 30 - selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds - trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them) - -/obj/item/paper/guides/antag/abductor - name = "Dissection Guide" - icon_state = "alienpaper_words" - info = {"Dissection for Dummies
- -
- 1.Acquire fresh specimen.
- 2.Put the specimen on operating table.
- 3.Apply surgical drapes, preparing for experimental dissection.
- 4.Apply scalpel to specimen's torso.
- 5.Clamp bleeders on specimen's torso with a hemostat.
- 6.Retract skin of specimen's torso with a retractor.
- 7.Apply scalpel again to specimen's torso.
- 8.Search through the specimen's torso with my hands to remove any superfluous organs.
- 9.Insert replacement gland (Retrieve one from gland storage).
- 10.Consider dressing the specimen back to not disturb the habitat.
- 11.Put the specimen in the experiment machinery.
- 12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
- 13.You will receive one supply credit, and the subject will be counted towards my quota.
-
-Congratulations! You are now trained for invasive xenobiology research!"} - -/obj/item/paper/guides/antag/abductor/update_icon() - return - -/obj/item/paper/guides/antag/abductor/AltClick() - return //otherwise it would fold into a paperplane. - -#define BATON_STUN 0 -#define BATON_SLEEP 1 -#define BATON_CUFF 2 -#define BATON_PROBE 3 -#define BATON_MODES 4 - -/obj/item/abductor/baton - name = "advanced baton" - desc = "" - var/mode = BATON_STUN - icon_state = "wonderprodStun" - item_state = "wonderprod" - slot_flags = ITEM_SLOT_BELT - force = 7 - w_class = WEIGHT_CLASS_NORMAL - actions_types = list(/datum/action/item_action/toggle_mode) - -/obj/item/abductor/baton/proc/toggle(mob/living/user=usr) - mode = (mode+1)%BATON_MODES - var/txt - switch(mode) - if(BATON_STUN) - txt = "stunning" - if(BATON_SLEEP) - txt = "sleep inducement" - if(BATON_CUFF) - txt = "restraining" - if(BATON_PROBE) - txt = "probing" - - to_chat(usr, span_notice("I switch the baton to [txt] mode.")) - update_icon() - -/obj/item/abductor/baton/update_icon() - switch(mode) - if(BATON_STUN) - icon_state = "wonderprodStun" - item_state = "wonderprodStun" - if(BATON_SLEEP) - icon_state = "wonderprodSleep" - item_state = "wonderprodSleep" - if(BATON_CUFF) - icon_state = "wonderprodCuff" - item_state = "wonderprodCuff" - if(BATON_PROBE) - icon_state = "wonderprodProbe" - item_state = "wonderprodProbe" - -/obj/item/abductor/baton/attack(mob/target, mob/living/user) - if(!AbductorCheck(user)) - return - - if(iscyborg(target)) - ..() - return - - if(!isliving(target)) - return - - var/mob/living/L = target - - user.do_attack_animation(L) - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) - playsound(H, 'sound/blank.ogg', 50, TRUE) - return FALSE - - switch (mode) - if(BATON_STUN) - StunAttack(L,user) - if(BATON_SLEEP) - SleepAttack(L,user) - if(BATON_CUFF) - CuffAttack(L,user) - if(BATON_PROBE) - ProbeAttack(L,user) - -/obj/item/abductor/baton/attack_self(mob/living/user) - toggle(user) - -/obj/item/abductor/baton/proc/StunAttack(mob/living/L,mob/living/user) - - L.lastattacker = user.real_name - L.lastattackerckey = user.ckey - - L.Paralyze(140) - L.apply_effect(EFFECT_STUTTER, 7) - SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) - - L.visible_message(span_danger("[user] has stunned [L] with [src]!"), \ - span_danger("[user] has stunned you with [src]!")) - playsound(src, 'sound/blank.ogg', 50, TRUE, -1) - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.forcesay(GLOB.hit_appends) - - log_combat(user, L, "stunned") - -/obj/item/abductor/baton/proc/SleepAttack(mob/living/L,mob/living/user) - if(L.incapacitated(TRUE, TRUE)) - if(L.anti_magic_check(FALSE, FALSE, TRUE)) - to_chat(user, span_warning("The specimen's tinfoil protection is interfering with the sleep inducement!")) - L.visible_message(span_danger("[user] tried to induced sleep in [L] with [src], but [L.p_their()] tinfoil protection [L.p_them()]!"), \ - span_danger("I feel a strange wave of heavy drowsiness wash over you, but my tinfoil protection deflects most of it!")) - L.drowsyness += 2 - return - L.visible_message(span_danger("[user] has induced sleep in [L] with [src]!"), \ - span_danger("I suddenly feel very drowsy!")) - playsound(src, 'sound/blank.ogg', 50, TRUE, -1) - L.Sleeping(1200) - log_combat(user, L, "put to sleep") - else - if(L.anti_magic_check(FALSE, FALSE, TRUE, 0)) - to_chat(user, span_warning("The specimen's tinfoil protection is completely blocking our sleep inducement methods!")) - L.visible_message(span_danger("[user] tried to induce sleep in [L] with [src], but [L.p_their()] tinfoil protection completely protected [L.p_them()]!"), \ - span_danger("Any sense of drowsiness is quickly diminished as my tinfoil protection deflects the effects!")) - return - L.drowsyness += 1 - to_chat(user, span_warning("Sleep inducement works fully only on stunned specimens! ")) - L.visible_message(span_danger("[user] tried to induce sleep in [L] with [src]!"), \ - span_danger("I suddenly feel drowsy!")) - -/obj/item/abductor/baton/proc/CuffAttack(mob/living/L,mob/living/user) - if(!iscarbon(L)) - return - var/mob/living/carbon/C = L - if(!C.handcuffed) - if(C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore()) - playsound(src, 'sound/blank.ogg', 30, TRUE, -2) - C.visible_message(span_danger("[user] begins restraining [C] with [src]!"), \ - span_danger("[user] begins shaping an energy field around my hands!")) - if(do_mob(user, C, 30) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())) - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/energy/used(C) - C.update_handcuffed() - to_chat(user, span_notice("I restrain [C].")) - log_combat(user, C, "handcuffed") - else - to_chat(user, span_warning("I fail to restrain [C].")) - else - to_chat(user, span_warning("[C] doesn't have two hands...")) - -/obj/item/abductor/baton/proc/ProbeAttack(mob/living/L,mob/living/user) - L.visible_message(span_danger("[user] probes [L] with [src]!"), \ - span_danger("[user] probes you!")) - - var/species = span_warning("Unknown species") - var/helptext = span_warning("Species unsuitable for experiments.") - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - species = span_notice("[H.dna.species.name]") - if(L.mind && L.mind.has_antag_datum(/datum/antagonist/changeling)) - species = span_warning("Changeling lifeform") - var/obj/item/organ/heart/gland/temp = locate() in H.internal_organs - if(temp) - helptext = span_warning("Experimental gland detected!") - else - if (L.getorganslot(ORGAN_SLOT_HEART)) - helptext = span_notice("Subject suitable for experiments.") - else - helptext = span_warning("Subject unsuitable for experiments.") - - to_chat(user, "Probing result:[species]") - to_chat(user, "[helptext]") - -/obj/item/restraints/handcuffs/energy - name = "hard-light energy field" - desc = "" - icon_state = "cuff" // Needs sprite - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - breakouttime = 450 - trashtype = /obj/item/restraints/handcuffs/energy/used - flags_1 = NONE - -/obj/item/restraints/handcuffs/energy/used - item_flags = DROPDEL - -/obj/item/restraints/handcuffs/energy/used/dropped(mob/user) - user.visible_message(span_danger("[user]'s [name] breaks in a discharge of energy!"), \ - span_danger("[user]'s [name] breaks in a discharge of energy!")) - var/datum/effect_system/spark_spread/S = new - S.set_up(4,0,user.loc) - S.start() - . = ..() - -/obj/item/abductor/baton/examine(mob/user) - . = ..() - switch(mode) - if(BATON_STUN) - . += span_warning("The baton is in stun mode.") - if(BATON_SLEEP) - . += span_warning("The baton is in sleep inducement mode.") - if(BATON_CUFF) - . += span_warning("The baton is in restraining mode.") - if(BATON_PROBE) - . += span_warning("The baton is in probing mode.") - -/obj/item/radio/headset/abductor - name = "alien headset" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "abductor_headset" - item_state = "abductor_headset" - keyslot2 = new /obj/item/encryptionkey/heads/captain - -/obj/item/radio/headset/abductor/Initialize(mapload) - . = ..() - make_syndie() - -/obj/item/radio/headset/abductor/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_HEAD)) - -/obj/item/radio/headset/abductor/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_SCREWDRIVER) - return // Stops humans from disassembling abductor headsets. - return ..() - -/obj/item/abductor_machine_beacon - name = "machine beacon" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "beacon" - w_class = WEIGHT_CLASS_TINY - var/obj/machinery/spawned_machine - -/obj/item/abductor_machine_beacon/attack_self(mob/user) - ..() - user.visible_message(span_notice("[user] places down [src] and activates it."), span_notice("I place down [src] and activate it.")) - user.dropItemToGround(src) - playsound(src, 'sound/blank.ogg', 50) - addtimer(CALLBACK(src, PROC_REF(try_spawn_machine)), 30) - -/obj/item/abductor_machine_beacon/proc/try_spawn_machine() - var/viable = FALSE - if(isfloorturf(loc)) - var/turf/T = loc - viable = TRUE - for(var/obj/thing in T.contents) - if(thing.density || ismachinery(thing) || isstructure(thing)) - viable = FALSE - if(viable) - playsound(src, 'sound/blank.ogg', 50, TRUE) - var/new_machine = new spawned_machine(loc) - visible_message(span_notice("[new_machine] warps on top of the beacon!")) - qdel(src) - else - playsound(src, 'sound/blank.ogg', 50) - -/obj/item/abductor_machine_beacon/chem_dispenser - name = "beacon - Reagent Synthesizer" - spawned_machine = /obj/machinery/chem_dispenser/abductor - -/obj/item/scalpel/alien - name = "alien scalpel" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/hemostat/alien - name = "alien hemostat" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/retractor/alien - name = "alien retractor" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/circular_saw/alien - name = "alien saw" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/surgicaldrill/alien - name = "alien drill" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/cautery/alien - name = "alien cautery" - desc = "Why would bloodless aliens have a tool to stop bleeding? \ - Unless..." - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/clothing/head/helmet/abductor - name = "agent headgear" - desc = "" - icon_state = "alienhelmet" - item_state = "alienhelmet" - blockTracking = TRUE - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -// Operating Table / Beds / Lockers - -/obj/structure/bed/abductor - name = "resting contraption" - desc = "" - icon = 'icons/obj/abductor.dmi' - buildstacktype = /obj/item/stack/sheet/mineral/abductor - icon_state = "bed" - -/obj/structure/table_frame/abductor - name = "alien table frame" - desc = "" - icon_state = "alien_frame" - framestack = /obj/item/stack/sheet/mineral/abductor - framestackamount = 1 - -/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WRENCH) - to_chat(user, span_notice("I start disassembling [src]...")) - I.play_tool_sound(src) - if(I.use_tool(src, user, 30)) - playsound(src, 'sound/blank.ogg', 50, TRUE) - for(var/i = 1, i <= framestackamount, i++) - new framestack(get_turf(src)) - qdel(src) - return - if(istype(I, /obj/item/stack/sheet/mineral/abductor)) - var/obj/item/stack/sheet/P = I - if(P.get_amount() < 1) - to_chat(user, span_warning("I need one alien alloy sheet to do this!")) - return - to_chat(user, span_notice("I start adding [P] to [src]...")) - if(do_after(user, 50, target = src)) - P.use(1) - new /obj/structure/table/abductor(src.loc) - qdel(src) - return - if(istype(I, /obj/item/stack/sheet/mineral/silver)) - var/obj/item/stack/sheet/P = I - if(P.get_amount() < 1) - to_chat(user, span_warning("I need one sheet of silver to do this!")) - return - to_chat(user, span_notice("I start adding [P] to [src]...")) - if(do_after(user, 50, target = src)) - P.use(1) - new /obj/structure/table/optable/abductor(src.loc) - qdel(src) - -/obj/structure/table/abductor - name = "alien table" - desc = "" - icon = 'icons/obj/smooth_structures/alien_table.dmi' - icon_state = "alien_table" - buildstack = /obj/item/stack/sheet/mineral/abductor - framestack = /obj/item/stack/sheet/mineral/abductor - buildstackamount = 1 - framestackamount = 1 - canSmoothWith = null - frame = /obj/structure/table_frame/abductor - -/obj/structure/table/optable/abductor - name = "alien operating table" - desc = "" - frame = /obj/structure/table_frame/abductor - buildstack = /obj/item/stack/sheet/mineral/silver - framestack = /obj/item/stack/sheet/mineral/abductor - buildstackamount = 1 - framestackamount = 1 - icon = 'icons/obj/abductor.dmi' - icon_state = "bed" - can_buckle = 1 - - var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico) - -/obj/structure/table/optable/abductor/Crossed(atom/movable/AM) - . = ..() - if(iscarbon(AM)) - START_PROCESSING(SSobj, src) - to_chat(AM, span_danger("I feel a series of tiny pricks!")) - -/obj/structure/table/optable/abductor/process() - . = PROCESS_KILL - for(var/mob/living/carbon/C in get_turf(src)) - . = TRUE - for(var/chemical in injected_reagents) - if(C.reagents.get_reagent_amount(chemical) < 1) - C.reagents.add_reagent(chemical, 1) - -/obj/structure/table/optable/abductor/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/closet/abductor - name = "alien locker" - desc = "" - icon_state = "abductor" - icon_door = "abductor" - can_weld_shut = FALSE - material_drop = /obj/item/stack/sheet/mineral/abductor - -/obj/structure/door_assembly/door_assembly_abductor - name = "alien airlock assembly" - icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' - base_name = "alien airlock" - overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' - airlock_type = /obj/machinery/door/airlock/abductor - material_type = /obj/item/stack/sheet/mineral/abductor - noglass = TRUE - -/obj/item/clothing/under/abductor - desc = "" - name = "alien jumpsuit" - icon = 'icons/obj/clothing/under/syndicate.dmi' - icon_state = "abductor" - item_state = "bl_suit" - mob_overlay_icon = 'icons/mob/clothing/under/syndicate.dmi' - armor = list("blunt" = 0, "slash" = 0, "stab" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) - can_adjust = 0 diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm deleted file mode 100644 index 2381dc2013c..00000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ /dev/null @@ -1,56 +0,0 @@ -/datum/outfit/abductor - name = "Abductor Basic" - uniform = /obj/item/clothing/under/abductor - shoes = /obj/item/clothing/shoes/combat - back = /obj/item/storage/backpack - ears = /obj/item/radio/headset/abductor - -/datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number) - var/datum/antagonist/abductor/A = H.mind.has_antag_datum(/datum/antagonist/abductor) - if(!team_number && A) - team_number = A.team.team_number - if(!team_number) - team_number = 1 - - var/obj/machinery/abductor/console/console = get_abductor_console(team_number) - if(console) - var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H - if(V) - console.AddVest(V) - ADD_TRAIT(V, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) - - var/obj/item/storage/backpack/B = locate() in H - if(B) - for(var/obj/item/abductor/gizmo/G in B.contents) - console.AddGizmo(G) - -/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(!visualsOnly) - link_to_console(H) - - -/datum/outfit/abductor/agent - name = "Abductor Agent" - head = /obj/item/clothing/head/helmet/abductor - suit = /obj/item/clothing/suit/armor/abductor/vest - suit_store = /obj/item/abductor/baton - belt = /obj/item/storage/belt/military/abductor/full - - backpack_contents = list( - /obj/item/gun/energy/alien = 1, - /obj/item/abductor/silencer = 1 - ) - -/datum/outfit/abductor/scientist - name = "Abductor Scientist" - - backpack_contents = list( - /obj/item/abductor/gizmo = 1 - ) - -/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(!visualsOnly) - var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H) - beamplant.implant(H) diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm deleted file mode 100644 index e14527a39aa..00000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ /dev/null @@ -1,40 +0,0 @@ -/* RETARDED -/datum/surgery_step/extract_organ - name = "remove heart" - accept_hand = 1 - time = 32 - var/obj/item/organ/IC = null - var/list/organ_types = list(/obj/item/organ/heart) - -/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - for(var/atom/A in target.internal_organs) - if(A.type in organ_types) - IC = A - break - user.visible_message(span_notice("[user] starts to remove [target]'s organs."), span_notice("I start to remove [target]'s organs...")) - -/datum/surgery_step/extract_organ/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(IC) - user.visible_message(span_notice("[user] pulls [IC] out of [target]'s [target_zone]!"), span_notice("I pull [IC] out of [target]'s [target_zone].")) - user.put_in_hands(IC) - IC.Remove(target) - return 1 - else - to_chat(user, span_warning("I don't find anything in [target]'s [target_zone]!")) - return 1 - -/datum/surgery_step/gland_insert - name = "insert gland" - implements = list(/obj/item/organ/heart/gland = 100) - time = 32 - -/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] starts to insert [tool] into [target]."), span_notice("I start to insert [tool] into [target]...")) - -/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] inserts [tool] into [target]."), span_notice("I insert [tool] into [target].")) - user.temporarilyRemoveItemFromInventory(tool, TRUE) - var/obj/item/organ/heart/gland/gland = tool - gland.Insert(target, 2) - return 1 -*/ diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm deleted file mode 100644 index e271efa3ccd..00000000000 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ /dev/null @@ -1,109 +0,0 @@ -/obj/item/organ/heart/gland - name = "fleshy mass" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "gland" - status = ORGAN_ROBOTIC - beating = TRUE - var/true_name = "baseline placebo referencer" - var/cooldown_low = 300 - var/cooldown_high = 300 - var/next_activation = 0 - var/uses // -1 For infinite - var/human_only = FALSE - var/active = FALSE - - var/mind_control_uses = 1 - var/mind_control_duration = 1800 - var/active_mind_control = FALSE - -/obj/item/organ/heart/gland/Initialize() - . = ..() - icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral")) - -/obj/item/organ/heart/gland/examine(mob/user) - . = ..() - if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user)) - . += span_notice("It is \a [true_name].") - -/obj/item/organ/heart/gland/proc/ownerCheck() - if(ishuman(owner)) - return TRUE - if(!human_only && iscarbon(owner)) - return TRUE - return FALSE - -/obj/item/organ/heart/gland/proc/Start() - active = 1 - next_activation = world.time + rand(cooldown_low,cooldown_high) - -/obj/item/organ/heart/gland/proc/update_gland_hud() - if(!owner) - return - var/image/holder = owner.hud_list[GLAND_HUD] - var/icon/I = icon(owner.icon, owner.icon_state, owner.dir) - holder.pixel_y = I.Height() - world.icon_size - if(active_mind_control) - holder.icon_state = "hudgland_active" - else if(mind_control_uses) - holder.icon_state = "hudgland_ready" - else - holder.icon_state = "hudgland_spent" - -/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user) - if(!ownerCheck() || !mind_control_uses || active_mind_control) - return FALSE - mind_control_uses-- - to_chat(owner, span_danger("I suddenly feel an irresistible compulsion to follow an order...")) - to_chat(owner, span_mind_control("[command]")) - active_mind_control = TRUE - message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") - update_gland_hud() - var/atom/movable/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) - mind_alert.command = command - addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration) - return TRUE - -/obj/item/organ/heart/gland/proc/clear_mind_control() - if(!ownerCheck() || !active_mind_control) - return FALSE - to_chat(owner, span_danger("I feel the compulsion fade, and you completely forget about your previous orders.")) - owner.clear_alert("mind_control") - active_mind_control = FALSE - return TRUE - -/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = 0) - active = 0 - if(initial(uses) == 1) - uses = initial(uses) - var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR] - hud.remove_from_hud(owner) - clear_mind_control() - ..() - -/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0) - ..() - if(special != 2 && uses) // Special 2 means abductor surgery - Start() - var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR] - hud.add_to_hud(owner) - update_gland_hud() - -/obj/item/organ/heart/gland/on_life() - if(!beating) - // alien glands are immune to stopping. - beating = TRUE - if(!active) - return - if(!ownerCheck()) - active = 0 - return - if(next_activation <= world.time) - activate() - uses-- - next_activation = world.time + rand(cooldown_low,cooldown_high) - if(!uses) - active = 0 - -/obj/item/organ/heart/gland/proc/activate() - return diff --git a/code/modules/antagonists/abductor/equipment/glands/access.dm b/code/modules/antagonists/abductor/equipment/glands/access.dm deleted file mode 100644 index 42b534dbd9a..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/access.dm +++ /dev/null @@ -1,19 +0,0 @@ -/obj/item/organ/heart/gland/access - true_name = "anagraphic electro-scrambler" - cooldown_low = 600 - cooldown_high = 1200 - uses = 1 - icon_state = "mindshock" - mind_control_uses = 3 - mind_control_duration = 900 - -/obj/item/organ/heart/gland/access/activate() - to_chat(owner, span_notice("I feel like a VIP for some reason.")) - RegisterSignal(owner, COMSIG_MOB_ALLOWED, PROC_REF(free_access)) - -/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O) - return TRUE - -/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0) - UnregisterSignal(owner, COMSIG_MOB_ALLOWED) - ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/blood.dm b/code/modules/antagonists/abductor/equipment/glands/blood.dm deleted file mode 100644 index f40896c0df0..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/blood.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/item/organ/heart/gland/blood - true_name = "pseudonuclear hemo-destabilizer" - cooldown_low = 1200 - cooldown_high = 1800 - uses = -1 - icon_state = "egg" - lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' - mind_control_uses = 3 - mind_control_duration = 1500 - -/obj/item/organ/heart/gland/blood/activate() - if(!ishuman(owner) || !owner.dna.species) - return - var/mob/living/carbon/human/H = owner - var/datum/species/species = H.dna.species - to_chat(H, span_warning("I feel your blood heat up for a moment.")) - species.exotic_blood = get_random_reagent_id() diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm deleted file mode 100644 index b651b45f6d1..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/chem.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/item/organ/heart/gland/chem - true_name = "intrinsic pharma-provider" - cooldown_low = 50 - cooldown_high = 50 - uses = -1 - icon_state = "viral" - mind_control_uses = 3 - mind_control_duration = 1200 - var/list/possible_reagents = list() - -/obj/item/organ/heart/gland/chem/Initialize() - . = ..() - for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin)) - possible_reagents += R - -/obj/item/organ/heart/gland/chem/activate() - var/chem_to_add = pick(possible_reagents) - owner.reagents.add_reagent(chem_to_add, 2) - owner.adjustToxLoss(-5, TRUE, TRUE) - ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm deleted file mode 100644 index 5943e1c8c71..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/egg.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/organ/heart/gland/egg - true_name = "roe/enzymatic synthesizer" - cooldown_low = 300 - cooldown_high = 400 - uses = -1 - icon_state = "egg" - lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' - mind_control_uses = 2 - mind_control_duration = 1800 - -/obj/item/organ/heart/gland/egg/activate() - owner.visible_message(span_alertalien("[owner] [pick(EGG_LAYING_MESSAGES)]")) - var/turf/T = owner.drop_location() - new /obj/item/reagent_containers/food/snacks/egg/gland(T) diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm deleted file mode 100644 index 6100ccc2b06..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ /dev/null @@ -1,26 +0,0 @@ -/obj/item/organ/heart/gland/electric - true_name = "electron accumulator/discharger" - cooldown_low = 800 - cooldown_high = 1200 - icon_state = "species" - uses = -1 - mind_control_uses = 2 - mind_control_duration = 900 - -/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) - ..() - ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") - -/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0) - REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") - ..() - -/obj/item/organ/heart/gland/electric/activate() - owner.visible_message(span_danger("[owner]'s skin starts emitting electric arcs!"),\ - span_warning("I feel electric energy building up inside you!")) - playsound(get_turf(owner), "sparks", 100, TRUE, -1) - addtimer(CALLBACK(src, PROC_REF(zap)), rand(30, 100)) - -/obj/item/organ/heart/gland/electric/proc/zap() - tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN) - playsound(get_turf(owner), 'sound/blank.ogg', 50, TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm deleted file mode 100644 index e8f3d140c1f..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ /dev/null @@ -1,178 +0,0 @@ -/obj/item/organ/heart/gland/heal - true_name = "organic replicator" - cooldown_low = 200 - cooldown_high = 400 - uses = -1 - human_only = TRUE - icon_state = "health" - mind_control_uses = 3 - mind_control_duration = 3000 - -/obj/item/organ/heart/gland/heal/activate() - if(!(owner.mob_biotypes & MOB_ORGANIC)) - return - - for(var/organ in owner.internal_organs) - if(istype(organ, /obj/item/organ/cyberimp)) - reject_implant(organ) - return - - var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER) - if((!liver/* && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)*/) || (liver && ((liver.damage > (liver.maxHealth / 2)) || (istype(liver, /obj/item/organ/liver/cybernetic))))) - replace_liver(liver) - return - - var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) - if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && (istype(lungs, /obj/item/organ/lungs/cybernetic)))) - replace_lungs(lungs) - return - - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) - if(!eyes || (eyes && ((HAS_TRAIT_FROM(owner, TRAIT_NEARSIGHT, EYE_DAMAGE)) || (HAS_TRAIT_FROM(owner, TRAIT_BLIND, EYE_DAMAGE)) || (istype(eyes, /obj/item/organ/eyes/robotic))))) - replace_eyes(eyes) - return - - var/obj/item/bodypart/limb - var/list/limb_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - for(var/zone in limb_list) - limb = owner.get_bodypart(zone) - if(!limb) - replace_limb(zone) - return - if((limb.get_damage() >= (limb.max_damage / 2)) || (limb.status == BODYPART_ROBOTIC)) - replace_limb(zone, limb) - return - - if(owner.getToxLoss() > 40) - replace_blood() - return - var/tox_amount = 0 - for(var/datum/reagent/toxin/T in owner.reagents.reagent_list) - tox_amount += owner.reagents.get_reagent_amount(T.type) - if(tox_amount > 10) - replace_blood() - return - if(owner.blood_volume < BLOOD_VOLUME_OKAY) - owner.blood_volume = BLOOD_VOLUME_NORMAL - to_chat(owner, span_warning("I feel my blood pulsing within you.")) - return - - var/obj/item/bodypart/chest/chest = owner.get_bodypart(BODY_ZONE_CHEST) - if((chest.get_damage() >= (chest.max_damage / 4)) || (chest.status == BODYPART_ROBOTIC)) - replace_chest(chest) - return - -/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant) - owner.visible_message(span_warning("[owner] vomits up his [implant.name]!"), span_danger("I suddenly vomit up my [implant.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) - implant.Remove(owner) - implant.forceMove(owner.drop_location()) - -/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver) - if(liver) - owner.visible_message(span_warning("[owner] vomits up his [liver.name]!"), span_danger("I suddenly vomit up my [liver.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) - liver.Remove(owner) - liver.forceMove(owner.drop_location()) - else - to_chat(owner, span_warning("I feel a weird rumble in my bowels...")) - - var/liver_type = /obj/item/organ/liver - if(owner?.dna?.species?.organs[ORGAN_SLOT_LIVER]) - liver_type = owner.dna.species.organs[ORGAN_SLOT_LIVER] - var/obj/item/organ/liver/new_liver = new liver_type() - new_liver.Insert(owner) - -/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs) - if(lungs) - owner.visible_message(span_warning("[owner] vomits up his [lungs.name]!"), span_danger("I suddenly vomit up my [lungs.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) - lungs.Remove(owner) - lungs.forceMove(owner.drop_location()) - else - to_chat(owner, span_warning("I feel a weird rumble inside my chest...")) - - var/lung_type = /obj/item/organ/lungs - if(owner.dna.species && owner.dna.species.mutantlungs) - lung_type = owner.dna.species.mutantlungs - var/obj/item/organ/lungs/new_lungs = new lung_type() - new_lungs.Insert(owner) - -/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes) - if(eyes) - owner.visible_message(span_warning("[owner]'s [eyes.name] fall out of their sockets!"), span_danger("My [eyes.name] fall out of their sockets!")) - playsound(owner, 'sound/blank.ogg', 50, TRUE) - eyes.Remove(owner) - eyes.forceMove(owner.drop_location()) - else - to_chat(owner, span_warning("I feel a weird rumble behind my eye sockets...")) - - addtimer(CALLBACK(src, PROC_REF(finish_replace_eyes)), rand(100, 200)) - -/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes() - var/eye_type = /obj/item/organ/eyes - if(owner.dna.species && owner.dna.species.organs[ORGAN_SLOT_EYES]) - eye_type = owner.dna.species.organs[ORGAN_SLOT_EYES] - var/obj/item/organ/eyes/new_eyes = new eye_type() - new_eyes.Insert(owner) - owner.visible_message(span_warning("A pair of new eyes suddenly inflates into [owner]'s eye sockets!"), span_danger("A pair of new eyes suddenly inflates into my eye sockets!")) - -/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb) - if(limb) - owner.visible_message(span_warning("[owner]'s [limb.name] suddenly detaches from [owner.p_their()] body!"), span_danger("My [limb.name] suddenly detaches from my body!")) - playsound(owner, "desceration", 50, TRUE, -1) - limb.drop_limb() - else - to_chat(owner, span_warning("I feel a weird tingle in my [parse_zone(body_zone)]... even if you don't have one.")) - - addtimer(CALLBACK(src, PROC_REF(finish_replace_limb), body_zone), rand(150, 300)) - -/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone) - owner.visible_message(span_warning("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!"), - span_danger("With a loud snap, my [parse_zone(body_zone)] rapidly grows back from my body!"), - span_warning("My hear a loud snap.")) - playsound(owner, 'sound/blank.ogg', 50, TRUE) - owner.regenerate_limb(body_zone) - -/obj/item/organ/heart/gland/heal/proc/replace_blood() - owner.visible_message(span_warning("[owner] starts vomiting huge amounts of blood!"), span_danger("I suddenly start vomiting huge amounts of blood!")) - keep_replacing_blood() - -/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood() - var/keep_going = FALSE - owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE) - owner.Stun(15) - owner.adjustToxLoss(-15, TRUE, TRUE) - - owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) - if(owner.blood_volume < BLOOD_VOLUME_NORMAL) - keep_going = TRUE - - if(owner.getToxLoss()) - keep_going = TRUE - for(var/datum/reagent/toxin/R in owner.reagents.reagent_list) - owner.reagents.remove_reagent(R.type, 4) - if(owner.reagents.has_reagent(R.type)) - keep_going = TRUE - if(keep_going) - addtimer(CALLBACK(src, PROC_REF(keep_replacing_blood)), 30) - -/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) - if(chest.status == BODYPART_ROBOTIC) - owner.visible_message(span_warning("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!"), span_danger("My [chest.name] rapidly expels its mechanical components, replacing them with flesh!")) - playsound(owner, 'sound/blank.ogg', 50, TRUE) - var/list/dirs = GLOB.alldirs.Copy() - for(var/i in 1 to 3) - var/obj/effect/decal/cleanable/robot_debris/debris = new(get_turf(owner)) - debris.streak(dirs) - else - owner.visible_message(span_warning("[owner]'s [chest.name] sheds off its damaged flesh, rapidly replacing it!"), span_warning("My [chest.name] sheds off its damaged flesh, rapidly replacing it!")) - playsound(owner, 'sound/blank.ogg', 50, TRUE) - var/list/dirs = GLOB.alldirs.Copy() - for(var/i in 1 to 3) - var/obj/effect/decal/cleanable/blood/gibs/gibs = new(get_turf(owner)) - gibs.streak(dirs) - - var/obj/item/bodypart/chest/new_chest = new(null) - new_chest.replace_limb(owner, TRUE) - qdel(chest) diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm deleted file mode 100644 index 381db2dc868..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm +++ /dev/null @@ -1,64 +0,0 @@ -/obj/item/organ/heart/gland/mindshock - true_name = "neural crosstalk uninhibitor" - cooldown_low = 400 - cooldown_high = 700 - uses = -1 - icon_state = "mindshock" - mind_control_uses = 1 - mind_control_duration = 6000 - var/list/mob/living/carbon/human/broadcasted_mobs = list() - -/obj/item/organ/heart/gland/mindshock/activate() - to_chat(owner, span_notice("I get a headache.")) - - var/turf/T = get_turf(owner) - for(var/mob/living/carbon/H in orange(4,T)) - if(H == owner) - continue - switch(pick(1,3)) - if(1) - to_chat(H, span_danger("I hear a loud buzz in your head, silencing your thoughts!")) - H.Stun(50) - if(2) - to_chat(H, span_warning("I hear an annoying buzz in your head.")) - H.confused += 15 - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160) - if(3) - H.hallucination += 60 - -/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user) - if(!ownerCheck() || !mind_control_uses || active_mind_control) - return FALSE - mind_control_uses-- - for(var/mob/M in oview(7, owner)) - if(!ishuman(M)) - continue - var/mob/living/carbon/human/H = M - if(H.stat) - continue - - broadcasted_mobs += H - to_chat(H, span_danger("I suddenly feel an irresistible compulsion to follow an order...")) - to_chat(H, span_mind_control("[command]")) - - message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]") - - var/atom/movable/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) - mind_alert.command = command - - if(LAZYLEN(broadcasted_mobs)) - active_mind_control = TRUE - addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration) - - update_gland_hud() - return TRUE - -/obj/item/organ/heart/gland/mindshock/clear_mind_control() - if(!active_mind_control || !LAZYLEN(broadcasted_mobs)) - return FALSE - for(var/M in broadcasted_mobs) - var/mob/living/carbon/human/H = M - to_chat(H, span_danger("I feel the compulsion fade, and you completely forget about your previous orders.")) - H.clear_alert("mind_control") - active_mind_control = FALSE - return TRUE diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm deleted file mode 100644 index 136d55fc92a..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm +++ /dev/null @@ -1,22 +0,0 @@ -/obj/item/organ/heart/gland/plasma - true_name = "effluvium sanguine-synonym emitter" - cooldown_low = 1200 - cooldown_high = 1800 - icon_state = "slime" - uses = -1 - mind_control_uses = 1 - mind_control_duration = 800 - -/obj/item/organ/heart/gland/plasma/activate() - to_chat(owner, span_warning("I feel bloated.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), owner, span_danger("A massive stomachache overcomes you.")), 150) - addtimer(CALLBACK(src, PROC_REF(vomit_plasma)), 200) - -/obj/item/organ/heart/gland/plasma/proc/vomit_plasma() - if(!owner) - return - owner.visible_message(span_danger("[owner] vomits a cloud of plasma!")) - var/turf/open/T = get_turf(owner) - if(istype(T)) - T.atmos_spawn_air("plasma=50;TEMP=[T20C]") - owner.vomit() diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm deleted file mode 100644 index d6a9152f4ca..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm +++ /dev/null @@ -1,47 +0,0 @@ -/obj/item/organ/heart/gland/quantum - true_name = "quantic de-observation matrix" - cooldown_low = 150 - cooldown_high = 150 - uses = -1 - icon_state = "emp" - mind_control_uses = 2 - mind_control_duration = 1200 - var/mob/living/carbon/entangled_mob - -/obj/item/organ/heart/gland/quantum/activate() - if(entangled_mob) - return - for(var/mob/M in oview(owner, 7)) - if(!iscarbon(M)) - continue - entangled_mob = M - addtimer(CALLBACK(src, PROC_REF(quantum_swap)), rand(600, 2400)) - return - -/obj/item/organ/heart/gland/quantum/proc/quantum_swap() - if(QDELETED(entangled_mob)) - entangled_mob = null - return - var/turf/T = get_turf(owner) - do_teleport(owner, get_turf(entangled_mob),null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM) - do_teleport(entangled_mob, T,null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM) - to_chat(owner, span_warning("I suddenly find myself somewhere else!")) - to_chat(entangled_mob, span_warning("I suddenly find myself somewhere else!")) - if(!active_mind_control) //Do not reset entangled mob while mind control is active - entangled_mob = null - -/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user) - if(..()) - if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD)) - to_chat(entangled_mob, span_danger("I suddenly feel an irresistible compulsion to follow an order...")) - to_chat(entangled_mob, span_mind_control("[command]")) - var/atom/movable/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) - mind_alert.command = command - message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]") - update_gland_hud() - -/obj/item/organ/heart/gland/quantum/clear_mind_control() - if(active_mind_control) - to_chat(entangled_mob, span_danger("I feel the compulsion fade, and you completely forget about your previous orders.")) - entangled_mob.clear_alert("mind_control") - ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm deleted file mode 100644 index c2ab03ea100..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/item/organ/heart/gland/slime - true_name = "gastric animation galvanizer" - cooldown_low = 600 - cooldown_high = 1200 - uses = -1 - icon_state = "slime" - mind_control_uses = 1 - mind_control_duration = 2400 - -/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) - ..() - owner.faction |= "slime" - owner.grant_language(/datum/language/slime) - -/obj/item/organ/heart/gland/slime/activate() - to_chat(owner, span_warning("I feel nauseated!")) - owner.vomit(20) - - var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") - Slime.Friends = list(owner) - Slime.Leader = owner diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm deleted file mode 100644 index ee4d5ed5b12..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/spider.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/organ/heart/gland/spiderman - true_name = "araneae cloister accelerator" - cooldown_low = 450 - cooldown_high = 900 - uses = -1 - icon_state = "spider" - mind_control_uses = 2 - mind_control_duration = 2400 - -/obj/item/organ/heart/gland/spiderman/activate() - to_chat(owner, span_warning("I feel something crawling in your skin.")) - owner.faction |= "spiders" - var/obj/structure/spider/spiderling/S = new(owner.drop_location()) - S.directive = "Protect your nest inside [owner.real_name]." diff --git a/code/modules/antagonists/abductor/equipment/glands/transform.dm b/code/modules/antagonists/abductor/equipment/glands/transform.dm deleted file mode 100644 index 544c9f0f5b5..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/transform.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/organ/heart/gland/transform - true_name = "anthropmorphic transmorphosizer" - cooldown_low = 900 - cooldown_high = 1800 - uses = -1 - human_only = TRUE - icon_state = "species" - mind_control_uses = 7 - mind_control_duration = 300 - -/obj/item/organ/heart/gland/transform/activate() - to_chat(owner, span_notice("I feel unlike myself.")) - randomize_human(owner) - var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly)) - owner.set_species(species) diff --git a/code/modules/antagonists/abductor/equipment/glands/trauma.dm b/code/modules/antagonists/abductor/equipment/glands/trauma.dm deleted file mode 100644 index 5a4b38ac895..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/trauma.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/item/organ/heart/gland/trauma - true_name = "white matter randomiser" - cooldown_low = 800 - cooldown_high = 1200 - uses = 5 - icon_state = "emp" - mind_control_uses = 3 - mind_control_duration = 1800 - -/obj/item/organ/heart/gland/trauma/activate() - to_chat(owner, span_warning("I feel a spike of pain in your head.")) - if(prob(33)) - owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) - else - if(prob(20)) - owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) - else - owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) diff --git a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm deleted file mode 100644 index ca263e837b9..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm +++ /dev/null @@ -1,12 +0,0 @@ -/obj/item/organ/heart/gland/ventcrawling - true_name = "pliant cartilage enabler" - cooldown_low = 1800 - cooldown_high = 2400 - uses = 1 - icon_state = "vent" - mind_control_uses = 4 - mind_control_duration = 1800 - -/obj/item/organ/heart/gland/ventcrawling/activate() - to_chat(owner, span_notice("I feel very stretchy.")) - owner.ventcrawler = VENTCRAWLER_ALWAYS diff --git a/code/modules/antagonists/abductor/equipment/glands/viral.dm b/code/modules/antagonists/abductor/equipment/glands/viral.dm deleted file mode 100644 index 66fe5ccf9cd..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/viral.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/item/organ/heart/gland/viral - true_name = "contamination incubator" - cooldown_low = 1800 - cooldown_high = 2400 - uses = 1 - icon_state = "viral" - mind_control_uses = 1 - mind_control_duration = 1800 - -/obj/item/organ/heart/gland/viral/activate() - to_chat(owner, span_warning("I feel sick.")) - var/datum/disease/advance/A = random_virus(pick(2,6),6) - A.carrier = TRUE - owner.ForceContractDisease(A, FALSE, TRUE) - -/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level) - if(max_symptoms > VIRUS_SYMPTOM_LIMIT) - max_symptoms = VIRUS_SYMPTOM_LIMIT - var/datum/disease/advance/A = new /datum/disease/advance() - var/list/datum/symptom/possible_symptoms = list() - for(var/symptom in subtypesof(/datum/symptom)) - var/datum/symptom/S = symptom - if(initial(S.level) > max_level) - continue - if(initial(S.level) <= 0) //unobtainable symptoms - continue - possible_symptoms += S - for(var/i in 1 to max_symptoms) - var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) - if(chosen_symptom) - var/datum/symptom/S = new chosen_symptom - A.symptoms += S - A.Refresh() //just in case someone already made and named the same disease - return A diff --git a/code/modules/antagonists/abductor/ice_abductor.dm b/code/modules/antagonists/abductor/ice_abductor.dm deleted file mode 100644 index d1b829297ca..00000000000 --- a/code/modules/antagonists/abductor/ice_abductor.dm +++ /dev/null @@ -1,12 +0,0 @@ -/obj/structure/fluff/iced_abductor ///Unless more non-machine ayy structures made, it will stay in fluff. - name = "Mysterious Block of Ice" - desc = "" - icon = 'icons/effects/freeze.dmi' - icon_state = "ice_ayy" - density = TRUE - deconstructible = FALSE - -/obj/structure/fluff/iced_abductor/Destroy() - var/turf/T = get_turf(src) - new /obj/effect/mob_spawn/human/abductor(T) - . = ..() diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm deleted file mode 100644 index 5c0878017d2..00000000000 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ /dev/null @@ -1,139 +0,0 @@ -/obj/machinery/computer/camera_advanced/abductor - name = "Human Observation Console" - var/team_number = 0 - networks = list("ss13", "abductor") - var/datum/action/innate/teleport_in/tele_in_action = new - var/datum/action/innate/teleport_out/tele_out_action = new - var/datum/action/innate/teleport_self/tele_self_action = new - var/datum/action/innate/vest_mode_swap/vest_mode_action = new - var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new - var/datum/action/innate/set_droppoint/set_droppoint_action = new - var/obj/machinery/abductor/console/console - lock_override = TRUE - - icon = 'icons/obj/abductor.dmi' - icon_state = "camera" - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - -/obj/machinery/computer/camera_advanced/abductor/CreateEye() - ..() - eyeobj.visible_icon = TRUE - eyeobj.icon = 'icons/mob/cameramob.dmi' - eyeobj.icon_state = "abductor_camera" - eyeobj.invisibility = INVISIBILITY_OBSERVER - -/obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user) - ..() - - if(tele_in_action) - tele_in_action.target = console.pad - tele_in_action.Grant(user) - actions += tele_in_action - - if(tele_out_action) - tele_out_action.target = console - tele_out_action.Grant(user) - actions += tele_out_action - - if(tele_self_action) - tele_self_action.target = console.pad - tele_self_action.Grant(user) - actions += tele_self_action - - if(vest_mode_action) - vest_mode_action.target = console - vest_mode_action.Grant(user) - actions += vest_mode_action - - if(vest_disguise_action) - vest_disguise_action.target = console - vest_disguise_action.Grant(user) - actions += vest_disguise_action - - if(set_droppoint_action) - set_droppoint_action.target = console - set_droppoint_action.Grant(user) - actions += set_droppoint_action - -/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H) - return HAS_TRAIT(H, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) - -/datum/action/innate/teleport_in - name = "Send To" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "beam_down" - -/datum/action/innate/teleport_in/Activate() - if(!target || !iscarbon(owner)) - return - var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - var/obj/machinery/abductor/pad/P = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - P.PadToLoc(remote_eye.loc) - -/datum/action/innate/teleport_out - name = "Retrieve" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "beam_up" - -/datum/action/innate/teleport_out/Activate() - if(!target || !iscarbon(owner)) - return - var/obj/machinery/abductor/console/console = target - - console.TeleporterRetrieve() - -/datum/action/innate/teleport_self - name = "Send Self" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "beam_down" - -/datum/action/innate/teleport_self/Activate() - if(!target || !iscarbon(owner)) - return - var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - var/obj/machinery/abductor/pad/P = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - P.MobToLoc(remote_eye.loc,C) - -/datum/action/innate/vest_mode_swap - name = "Switch Vest Mode" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "vest_mode" - -/datum/action/innate/vest_mode_swap/Activate() - if(!target || !iscarbon(owner)) - return - var/obj/machinery/abductor/console/console = target - console.FlipVest() - - -/datum/action/innate/vest_disguise_swap - name = "Switch Vest Disguise" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "vest_disguise" - -/datum/action/innate/vest_disguise_swap/Activate() - if(!target || !iscarbon(owner)) - return - var/obj/machinery/abductor/console/console = target - console.SelectDisguise(remote=1) - -/datum/action/innate/set_droppoint - name = "Set Experiment Release Point" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "set_drop" - -/datum/action/innate/set_droppoint/Activate() - if(!target || !iscarbon(owner)) - return - - var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - - var/obj/machinery/abductor/console/console = target - console.SetDroppoint(remote_eye.loc,owner) diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm deleted file mode 100644 index 09b4c2adb70..00000000000 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ /dev/null @@ -1,248 +0,0 @@ -/proc/get_abductor_console(team_number) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.team_number == team_number) - return C - -//Common - -/obj/machinery/abductor - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/team_number = 0 - -//Console - -/obj/machinery/abductor/console - name = "abductor console" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "console" - density = TRUE - var/obj/item/abductor/gizmo/gizmo - var/obj/item/clothing/suit/armor/abductor/vest/vest - var/obj/machinery/abductor/experiment/experiment - var/obj/machinery/abductor/pad/pad - var/obj/machinery/computer/camera_advanced/abductor/camera - var/list/datum/icon_snapshot/disguises = list() - -/obj/machinery/abductor/console/attack_hand(mob/user) - . = ..() - if(.) - return - if(!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) && !HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) - to_chat(user, span_warning("I start mashing alien buttons at random!")) - if(do_after(user,100, target = src)) - TeleporterSend() - return - user.set_machine(src) - var/dat = "" - dat += "

Abductsoft 3000

" - - if(experiment) - var/points = experiment.points - var/credits = experiment.credits - dat += "Collected Samples : [points]
" - dat += "Gear Credits: [credits]
" - dat += "Transfer data in exchange for supplies:
" - dat += "Advanced Baton (2 Credits)
" - dat += "Mental Interface Device (2 Credits)
" - dat += "Reagent Synthesizer (2 Credits)
" - dat += "Shrink Ray Blaster (2 Credits)
" - dat += "Agent Helmet
" - dat += "Agent Vest
" - dat += "Radio Silencer
" - dat += "Science Tool
" - dat += "Superlingual Matrix
" - else - dat += "NO EXPERIMENT MACHINE DETECTED
" - - if(pad) - dat += span_bad("Emergency Teleporter System.") - dat += span_bad("Consider using primary observation console first.") - dat += "Activate Teleporter
" - if(gizmo && gizmo.marked) - dat += "Retrieve Mark
" - else - dat += "Retrieve Mark
" - else - dat += "NO TELEPAD DETECTED
" - - if(vest) - dat += "

Agent Vest Mode


" - var/mode = vest.mode - if(mode == VEST_STEALTH) - dat += "Combat" - dat += span_linkoff("Stealth") - else - dat += span_linkoff("Combat") - dat += "Stealth" - - dat+="
" - dat += "Select Agent Vest Disguise
" - dat += "[HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "Unlock" : "Lock"] Vest
" - else - dat += span_bad("NO AGENT VEST DETECTED") - var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) - popup.set_content(dat) - popup.open() - -/obj/machinery/abductor/console/Topic(href, href_list) - if(..()) - return - - usr.set_machine(src) - if(href_list["teleporter_send"]) - TeleporterSend() - else if(href_list["teleporter_retrieve"]) - TeleporterRetrieve() - else if(href_list["flip_vest"]) - FlipVest() - else if(href_list["toggle_vest"]) - if(vest) - vest.toggle_nodrop() - else if(href_list["select_disguise"]) - SelectDisguise() - else if(href_list["dispense"]) - switch(href_list["dispense"]) - if("baton") - Dispense(/obj/item/abductor/baton,cost=2) - if("helmet") - Dispense(/obj/item/clothing/head/helmet/abductor) - if("silencer") - Dispense(/obj/item/abductor/silencer) - if("tool") - Dispense(/obj/item/abductor/gizmo) - if("vest") - Dispense(/obj/item/clothing/suit/armor/abductor/vest) - if("mind_device") - Dispense(/obj/item/abductor/mind_device,cost=2) - if("chem_dispenser") - Dispense(/obj/item/abductor_machine_beacon/chem_dispenser,cost=2) - if("tongue") - Dispense(/obj/item/organ/tongue/abductor) - if("shrink_ray") - Dispense(/obj/item/gun/energy/shrink_ray,cost=2) - updateUsrDialog() - -/obj/machinery/abductor/console/proc/TeleporterRetrieve() - if(pad && gizmo && gizmo.marked) - pad.Retrieve(gizmo.marked) - -/obj/machinery/abductor/console/proc/TeleporterSend() -// if(pad) -// pad.Send() - -/obj/machinery/abductor/console/proc/FlipVest() - if(vest) - vest.flip_mode() - -/obj/machinery/abductor/console/proc/SelectDisguise(remote = FALSE) - var/list/disguises2 = list() - for(var/name in disguises) - var/datum/icon_snapshot/snap = disguises[name] - var/image/dummy = image(snap.icon, src, snap.icon_state) - dummy.overlays = snap.overlays - disguises2[name] = dummy - - var/entry_name - if(remote) - entry_name = show_radial_menu(usr, camera.eyeobj, disguises2, tooltips = TRUE) - else - entry_name = show_radial_menu(usr, src, disguises2, require_near = TRUE, tooltips = TRUE) - - var/datum/icon_snapshot/chosen = disguises[entry_name] - if(chosen && vest && (remote || in_range(usr,src))) - vest.SetDisguise(chosen) - -/obj/machinery/abductor/console/proc/SetDroppoint(turf/open/location,user) - if(!istype(location)) - to_chat(user, span_warning("That place is not safe for the specimen.")) - return - - if(pad) - pad.teleport_target = location - to_chat(user, span_notice("Location marked as test subject release point.")) - - -/obj/machinery/abductor/console/Initialize(mapload) - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/abductor/console/LateInitialize() - if(!team_number) - return - - for(var/obj/machinery/abductor/pad/p in GLOB.machines) - if(p.team_number == team_number) - pad = p - break - - for(var/obj/machinery/abductor/experiment/e in GLOB.machines) - if(e.team_number == team_number) - experiment = e - e.console = src - - for(var/obj/machinery/computer/camera_advanced/abductor/c in GLOB.machines) - if(c.team_number == team_number) - camera = c - c.console = src - -/obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target) - if(target.anti_magic_check(FALSE, FALSE, TRUE, 0)) - say("Subject wearing specialized protective tinfoil gear, unable to get a proper scan!") - return - var/datum/icon_snapshot/entry = new - entry.name = target.name - entry.icon = target.icon - entry.icon_state = target.icon_state - entry.overlays = target.get_overlays_copy(list(HANDS_LAYER)) //ugh - //Update old disguise instead of adding new one - if(disguises[entry.name]) - disguises[entry.name] = entry - return - disguises[entry.name] = entry - -/obj/machinery/abductor/console/proc/AddGizmo(obj/item/abductor/gizmo/G) - if(G == gizmo && G.console == src) - return FALSE - - if(G.console) - G.console.gizmo = null - - gizmo = G - G.console = src - return TRUE - -/obj/machinery/abductor/console/proc/AddVest(obj/item/clothing/suit/armor/abductor/vest/V) - if(vest == V) - return FALSE - - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.vest == V) - C.vest = null - break - - vest = V - return TRUE - -/obj/machinery/abductor/console/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/abductor/gizmo) && AddGizmo(O)) - to_chat(user, span_notice("I link the tool to the console.")) - else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) - to_chat(user, span_notice("I link the vest to the console.")) - else - return ..() - - - -/obj/machinery/abductor/console/proc/Dispense(item,cost=1) - if(experiment && experiment.credits >= cost) - experiment.credits -=cost - say("Incoming supply!") - var/drop_location = loc - if(pad) - flick("alien-pad", pad) - drop_location = pad.loc - new item(drop_location) - - else - say("Insufficent data!") diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm deleted file mode 100644 index 01633d64e72..00000000000 --- a/code/modules/antagonists/abductor/machinery/dispenser.dm +++ /dev/null @@ -1,84 +0,0 @@ -/obj/machinery/abductor/gland_dispenser - name = "replacement organ storage" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "dispenser" - density = TRUE - var/list/gland_types - var/list/gland_colors - var/list/amounts - -/obj/machinery/abductor/gland_dispenser/proc/random_color() - //TODO : replace with presets or spectrum - return rgb(rand(0,255),rand(0,255),rand(0,255)) - -/obj/machinery/abductor/gland_dispenser/Initialize() - . = ..() - gland_types = subtypesof(/obj/item/organ/heart/gland) - gland_types = shuffle(gland_types) - gland_colors = new/list(gland_types.len) - amounts = new/list(gland_types.len) - for(var/i=1,i<=gland_types.len,i++) - gland_colors[i] = random_color() - amounts[i] = rand(1,5) - -/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user) - . = ..() - if(.) - return - if(!isabductor(user)) - return - user.set_machine(src) - var/box_css = {" - "} - var/dat = "" - var/item_count = 0 - for(var/i=1,i<=gland_colors.len,i++) - item_count++ - var/g_color = gland_colors[i] - var/amount = amounts[i] - dat += "[amount]" - if(item_count == 4) // Four boxes per line - dat +="

" - item_count = 0 - var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) - popup.add_head_content(box_css) - popup.set_content(dat) - popup.open() - return - -/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/organ/heart/gland)) - if(!user.transferItemToLoc(W, src)) - return - for(var/i=1,i<=gland_colors.len,i++) - if(gland_types[i] == W.type) - amounts[i]++ - else - return ..() - -/obj/machinery/abductor/gland_dispenser/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - - if(href_list["dispense"]) - Dispense(text2num(href_list["dispense"])) - updateUsrDialog() - -/obj/machinery/abductor/gland_dispenser/proc/Dispense(count) - if(amounts[count]>0) - amounts[count]-- - var/T = gland_types[count] - new T(get_turf(src)) diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm deleted file mode 100644 index dd82b6d3a5d..00000000000 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ /dev/null @@ -1,218 +0,0 @@ -/obj/machinery/abductor/experiment - name = "experimentation machine" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "experiment-open" - density = FALSE - state_open = TRUE - var/points = 0 - var/credits = 0 - var/list/history - var/list/abductee_minds - var/flash = " - || - " - var/obj/machinery/abductor/console/console - var/message_cooldown = 0 - var/breakout_time = 450 - -/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) - var/mob/living/L = user - if(user.stat || (isliving(user) && (!(L.mobility_flags & MOBILITY_STAND) || !(L.mobility_flags & MOBILITY_UI))) || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) - return - if(isabductor(target)) - return - close_machine(target) - -/obj/machinery/abductor/experiment/attack_hand(mob/user) - . = ..() - if(.) - return - - experimentUI(user) - -/obj/machinery/abductor/experiment/open_machine() - if(!state_open && !panel_open) - ..() - -/obj/machinery/abductor/experiment/close_machine(mob/target) - for(var/A in loc) - if(isabductor(A)) - return - if(state_open && !panel_open) - ..(target) - -/obj/machinery/abductor/experiment/relaymove(mob/user) - if(user.stat != CONSCIOUS) - return - if(message_cooldown <= world.time) - message_cooldown = world.time + 50 - to_chat(user, span_warning("[src]'s door won't budge!")) - -/obj/machinery/abductor/experiment/container_resist(mob/living/user) - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - user.visible_message(span_notice("I see [user] kicking against the door of [src]!"), \ - span_notice("I lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \ - span_hear("I hear a metallic creaking from [src].")) - if(do_after(user,(breakout_time), target = src)) - if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) - return - user.visible_message(span_warning("[user] successfully broke out of [src]!"), \ - span_notice("I successfully break out of [src]!")) - open_machine() - -/obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H) - var/icon/photo = null - var/g = (H.gender == FEMALE) ? "f" : "m" - if(H.dna.species.use_skintones) - photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]") - else - photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]") - photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY) - - var/icon/eyes - if(EYECOLOR in H.dna.species.species_traits) - eyes = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes") - eyes.Blend("#[H.eye_color]", ICON_MULTIPLY) - - if(eyes) - photo.Blend(eyes, ICON_OVERLAY) - - var/icon/splat = icon("icon" = 'icons/mob/dam_mob.dmi',"icon_state" = "chest30") - photo.Blend(splat,ICON_OVERLAY) - - return photo - -/obj/machinery/abductor/experiment/proc/experimentUI(mob/user) - var/dat - dat += "

Experiment

" - if(occupant) - var/obj/item/photo/P = new - P.picture = new - P.picture.picture_image = icon(dissection_icon(occupant), dir = SOUTH) - user << browse_rsc(P.picture.picture_image, "dissection_img") - dat += "
" - dat += "" //Avert your eyes - dat += "" - dat += "Probe
" - dat += "Dissect
" - dat += "Analyze
" - dat += "
" - else - dat += span_linkoff("Experiment ") - - if(!occupant) - dat += "

Machine Unoccupied

" - else - dat += "

Subject Status :

" - dat += "[occupant.name] => " - var/mob/living/mob_occupant = occupant - switch(mob_occupant.stat) - if(CONSCIOUS) - dat += span_good("Conscious") - if(UNCONSCIOUS) - dat += span_average("Unconscious") - else // DEAD - dat += span_bad("Deceased") - dat += "
" - dat += "[flash]" - dat += "
" - dat += "Scan" - dat += "Close" : "open=1'>Open"]" - var/datum/browser/popup = new(user, "experiment", "Probing Console", 300, 300) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.set_content(dat) - popup.open() - -/obj/machinery/abductor/experiment/Topic(href, href_list) - if(..() || usr == occupant) - return - usr.set_machine(src) - if(href_list["refresh"]) - updateUsrDialog() - return - if(href_list["open"]) - open_machine() - return - if(href_list["close"]) - close_machine() - return - if(occupant) - var/mob/living/mob_occupant = occupant - if(mob_occupant.stat != DEAD) - if(href_list["experiment"]) - flash = Experiment(occupant,href_list["experiment"],usr) - updateUsrDialog() - add_fingerprint(usr) - -/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type,mob/user) - LAZYINITLIST(history) - var/mob/living/carbon/human/H = occupant - - var/datum/antagonist/abductor/user_abductor = user.mind.has_antag_datum(/datum/antagonist/abductor) - if(!user_abductor) - return span_bad("Authorization failure. Contact mothership immidiately.") - - var/point_reward = 0 - if(H in history) - return span_bad("Specimen already in database.") - if(H.stat == DEAD) - say("Specimen deceased - please provide fresh sample.") - return span_bad("Specimen deceased.") - var/obj/item/organ/heart/gland/GlandTest = locate() in H.internal_organs - if(!GlandTest) - say("Experimental dissection not detected!") - return span_bad("No glands detected!") - if(H.mind != null && H.ckey != null) - LAZYINITLIST(abductee_minds) - LAZYADD(history, H) - LAZYADD(abductee_minds, H.mind) - say("Processing specimen...") - sleep(5) - switch(text2num(type)) - if(1) - to_chat(H, span_warning("I feel violated.")) - if(2) - to_chat(H, span_warning("I feel myself being sliced apart and put back together.")) - if(3) - to_chat(H, span_warning("I feel intensely watched.")) - sleep(5) - user_abductor.team.abductees += H.mind - H.mind.add_antag_datum(/datum/antagonist/abductee) - - for(var/obj/item/organ/heart/gland/G in H.internal_organs) - G.Start() - point_reward++ - if(point_reward > 0) - open_machine() - SendBack(H) - playsound(src.loc, 'sound/blank.ogg', 50, TRUE) - points += point_reward - credits += point_reward - return span_good("Experiment successful! [point_reward] new data-points collected.") - else - playsound(src.loc, 'sound/blank.ogg', 50, TRUE) - return span_bad("Experiment failed! No replacement organ detected.") - else - say("Brain activity nonexistent - disposing sample...") - open_machine() - SendBack(H) - return span_bad("Specimen braindead - disposed.") - return span_bad("ERROR") - - -/obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H) - H.Sleeping(160) - H.uncuff() - if(console && console.pad && console.pad.teleport_target) - H.forceMove(console.pad.teleport_target) - return - //Area not chosen / It's not safe area - teleport to arrivals - SSjob.SendToLateJoin(H, FALSE) - return - - -/obj/machinery/abductor/experiment/update_icon() - if(state_open) - icon_state = "experiment-open" - else - icon_state = "experiment" diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm deleted file mode 100644 index 20c838b6f41..00000000000 --- a/code/modules/antagonists/abductor/machinery/pad.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/machinery/abductor/pad - name = "Alien Telepad" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "alien-pad-idle" - var/turf/teleport_target - -/obj/machinery/abductor/pad/proc/Warp(mob/living/target) - if(!target.buckled) - target.forceMove(get_turf(src)) - -/obj/machinery/abductor/pad/proc/Send() - if(teleport_target == null) - teleport_target = GLOB.teleportlocs[pick(GLOB.teleportlocs)] - flick("alien-pad", src) - for(var/mob/living/target in loc) - target.forceMove(teleport_target) - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) - to_chat(target, span_warning("The instability of the warp leaves you disoriented!")) - target.Stun(60) - -/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target) - flick("alien-pad", src) - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) - Warp(target) - -/obj/machinery/abductor/pad/proc/doMobToLoc(place, atom/movable/target) - flick("alien-pad", src) - target.forceMove(place) - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) - -/obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target) - new /obj/effect/temp_visual/teleport_abductor(place) - addtimer(CALLBACK(src, PROC_REF(doMobToLoc), place, target), 80) - -/obj/machinery/abductor/pad/proc/doPadToLoc(place) - flick("alien-pad", src) - for(var/mob/living/target in get_turf(src)) - target.forceMove(place) - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) - -/obj/machinery/abductor/pad/proc/PadToLoc(place) - new /obj/effect/temp_visual/teleport_abductor(place) - addtimer(CALLBACK(src, PROC_REF(doPadToLoc), place), 80) - -/obj/effect/temp_visual/teleport_abductor - name = "Huh" - icon = 'icons/obj/abductor.dmi' - icon_state = "teleport" - duration = 80 - -/obj/effect/temp_visual/teleport_abductor/Initialize() - . = ..() - var/datum/effect_system/spark_spread/S = new - S.set_up(10,0,loc) - S.start() diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm deleted file mode 100644 index 43b2ce43a11..00000000000 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ /dev/null @@ -1,43 +0,0 @@ -/datum/action/changeling/headcrab - name = "Last Resort" - desc = "" - helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." - button_icon_state = "last_resort" - chemical_cost = 20 - dna_cost = 1 - req_human = 1 - -/datum/action/changeling/headcrab/sting_action(mob/user) - set waitfor = FALSE - if(alert("Are we sure we wish to kill ourself and create a headslug?",,"Yes", "No") == "No") - return - ..() - var/datum/mind/M = user.mind - var/list/organs = user.getorganszone(BODY_ZONE_HEAD, TRUE) - - for(var/obj/item/organ/I in organs) - I.Remove(user, 1) - - explosion(get_turf(user), 0, 0, 2, 0, TRUE) - for(var/mob/living/carbon/human/H in range(2,user)) - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) - to_chat(H, span_danger("I are blinded by a shower of blood!")) - H.Stun(20) - H.blur_eyes(20) - eyes?.applyOrganDamage(5) - H.confused += 3 - for(var/mob/living/silicon/S in range(2,user)) - to_chat(S, span_danger("My sensors are disabled by a shower of blood!")) - S.Paralyze(60) - var/turf = get_turf(user) - user.gib() - . = TRUE - sleep(5) // So it's not killed in explosion - var/mob/living/simple_animal/hostile/headcrab/crab = new(turf) - for(var/obj/item/organ/I in organs) - I.forceMove(crab) - crab.origin = M - if(crab.origin) - crab.origin.active = 1 - crab.origin.transfer_to(crab) - to_chat(crab, span_warning("I burst out of the remains of my former body in a shower of gore!")) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index aeaf3343793..e43f2af72a1 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -182,10 +182,6 @@ var/obj/structure/table/T = target T.deconstruct(FALSE) - else if(istype(target, /obj/machinery/computer)) - var/obj/machinery/computer/C = target - C.attack_alien(user) //muh copypasta - else if(istype(target, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/A = target diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index a3a14a36b7e..d5aaf6dc01e 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -12,7 +12,6 @@ to_chat(user, span_notice("We cleanse impurities from our form.")) ..() var/list/bad_organs = list( - user.getorgan(/obj/item/organ/body_egg), user.getorgan(/obj/item/organ/zombie_infection)) for(var/o in bad_organs) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 032196e425e..4e0c6067cec 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -537,7 +537,6 @@ /obj/item/restraints/handcuffs/energy/cult //For the shackling spell name = "shadow shackles" desc = "" - trashtype = /obj/item/restraints/handcuffs/energy/used item_flags = DROPDEL /obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 8681afc3b62..a464a33e1cd 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1008,17 +1008,9 @@ structure_check() searches for nearby cultist structures required for the invoca if(11 to 20) var/datum/round_event_control/radiation_storm/RS = new() RS.runEvent() - if(21 to 30) + if(21 to 50) var/datum/round_event_control/brand_intelligence/BI = new() BI.runEvent() - if(31 to 40) - var/datum/round_event_control/immovable_rod/R = new() - R.runEvent() - R.runEvent() - R.runEvent() - if(41 to 50) - var/datum/round_event_control/meteor_wave/MW = new() - MW.runEvent() if(51 to 60) var/datum/round_event_control/spider_infestation/SI = new() SI.runEvent() diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm deleted file mode 100644 index 370db73c2f1..00000000000 --- a/code/modules/antagonists/disease/disease_event.dm +++ /dev/null @@ -1,26 +0,0 @@ - -/datum/round_event_control/sentient_disease - name = "Spawn Sentient Disease" - typepath = /datum/round_event/ghost_role/sentient_disease - weight = 7 - max_occurrences = 1 - min_players = 5 - - -/datum/round_event/ghost_role/sentient_disease - role_name = "sentient disease" - -/datum/round_event/ghost_role/sentient_disease/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/observer/selected = pick_n_take(candidates) - - var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) - virus.key = selected.key - INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name)) - message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by an event.") - log_game("[key_name(virus)] was spawned as a sentient disease by an event.") - spawned_mobs += virus - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm deleted file mode 100644 index 4c186916131..00000000000 --- a/code/modules/antagonists/morph/morph.dm +++ /dev/null @@ -1,245 +0,0 @@ -#define MORPH_COOLDOWN 50 - -/mob/living/simple_animal/hostile/morph - name = "morph" - real_name = "morph" - desc = "" - speak_emote = list("gurgles") - emote_hear = list("gurgles") - icon = 'icons/mob/animal.dmi' - icon_state = "morph" - icon_living = "morph" - icon_dead = "morph_dead" - speed = 2 - a_intent = INTENT_HARM - stop_automated_movement = 1 - status_flags = CANPUSH - pass_flags = PASSTABLE - ventcrawler = VENTCRAWLER_ALWAYS - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxHealth = 150 - health = 150 - healable = 0 - obj_damage = 50 - melee_damage_lower = 20 - melee_damage_upper = 20 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - vision_range = 1 // Only attack when target is close - wander = FALSE - attack_verb_continuous = "glomps" - attack_verb_simple = "glomp" - attack_sound = 'sound/blank.ogg' - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2) - - var/morphed = FALSE - var/melee_damage_disguised = 0 - var/eat_while_disguised = FALSE - var/atom/movable/form = null - var/morph_time = 0 - var/static/list/blacklist_typecache = typecacheof(list( - /atom/movable/screen, - /obj/singularity, - /mob/living/simple_animal/hostile/morph, - /obj/effect)) - - var/playstyle_string = "I are a morph,
an abomination of science created primarily with changeling cells. \ - You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ - observers, and can only be performed once every five seconds. While morphed, you move faster, but do \ - less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \ - You can attack any item or dead creature to consume it - creatures will restore my health. \ - Finally, you can restore myself to my original form while morphed by shift-clicking myself.
" - -/mob/living/simple_animal/hostile/morph/examine(mob/user) - if(morphed) - . = form.examine(user) - if(get_dist(user,src)<=3) - . += span_warning("It doesn't look quite right...") - else - . = ..() - -/mob/living/simple_animal/hostile/morph/med_hud_set_health() - if(morphed && !isliving(form)) - var/image/holder = hud_list[HEALTH_HUD] - holder.icon_state = null - return //we hide medical hud while morphed - ..() - -/mob/living/simple_animal/hostile/morph/med_hud_set_status() - if(morphed && !isliving(form)) - var/image/holder = hud_list[STATUS_HUD] - holder.icon_state = null - return //we hide medical hud while morphed - ..() - -/mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it - return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A)) - -/mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A) - if(morphed && !eat_while_disguised) - to_chat(src, span_warning("I can not eat anything while you are disguised!")) - return FALSE - if(A && A.loc != src) - visible_message(span_warning("[src] swallows [A] whole!")) - A.forceMove(src) - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/morph/ShiftClickOn(atom/movable/A) - if(morph_time <= world.time && !stat) - if(A == src) - restore() - return - if(istype(A) && allowed(A)) - assume(A) - else - to_chat(src, span_warning("My chameleon skin is still repairing itself!")) - ..() - -/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target) - if(morphed) - to_chat(src, span_warning("I must restore to my original form first!")) - return - morphed = TRUE - form = target - - visible_message(span_warning("[src] suddenly twists and changes shape, becoming a copy of [target]!"), \ - span_notice("I twist my body and assume the form of [target].")) - appearance = target.appearance - copy_overlays(target) - alpha = max(alpha, 150) //fucking chameleons - transform = initial(transform) - pixel_y = initial(pixel_y) - pixel_x = initial(pixel_x) - - //Morphed is weaker - melee_damage_lower = melee_damage_disguised - melee_damage_upper = melee_damage_disguised - set_varspeed(0) - - morph_time = world.time + MORPH_COOLDOWN - med_hud_set_health() - med_hud_set_status() //we're an object honest - return - -/mob/living/simple_animal/hostile/morph/proc/restore() - if(!morphed) - to_chat(src, span_warning("You're already in my normal form!")) - return - morphed = FALSE - form = null - alpha = initial(alpha) - color = initial(color) - animate_movement = SLIDE_STEPS - maptext = null - - visible_message(span_warning("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!"), \ - span_notice("I reform to my normal body.")) - name = initial(name) - icon = initial(icon) - icon_state = initial(icon_state) - cut_overlays() - - //Baseline stats - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - set_varspeed(initial(speed)) - - morph_time = world.time + MORPH_COOLDOWN - med_hud_set_health() - med_hud_set_status() //we are not an object - -/mob/living/simple_animal/hostile/morph/death(gibbed) - if(morphed) - visible_message(span_warning("[src] twists and dissolves into a pile of green flesh!"), \ - span_danger("My skin ruptures! Your flesh breaks apart! No disguise can ward off de--")) - restore() - barf_contents() - ..() - -/mob/living/simple_animal/hostile/morph/proc/barf_contents() - for(var/atom/movable/AM in src) - AM.forceMove(loc) - if(prob(90)) - step(AM, pick(GLOB.alldirs)) - -/mob/living/simple_animal/hostile/morph/wabbajack_act(mob/living/new_mob) - barf_contents() - . = ..() - -/mob/living/simple_animal/hostile/morph/Aggro() // automated only - ..() - restore() - -/mob/living/simple_animal/hostile/morph/LoseAggro() - vision_range = initial(vision_range) - -/mob/living/simple_animal/hostile/morph/AIShouldSleep(list/possible_targets) - . = ..() - if(.) - var/list/things = list() - for(var/atom/movable/A in view(src)) - if(allowed(A)) - things += A - var/atom/movable/T = pick(things) - assume(T) - -/mob/living/simple_animal/hostile/morph/can_track(mob/living/user) - if(morphed) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/morph/AttackingTarget() - if(morphed && !melee_damage_disguised) - to_chat(src, span_warning("I can not attack while disguised!")) - return - if(isliving(target)) //Eat Corpses to regen health - var/mob/living/L = target - if(L.stat == DEAD) - if(do_after(src, 30, target = L)) - if(eat(L)) - adjustHealth(-50) - return - else if(isitem(target)) //Eat items just to be annoying - var/obj/item/I = target - if(!I.anchored) - if(do_after(src, 20, target = I)) - eat(I) - return - return ..() - -//Spawn Event - -/datum/round_event_control/morph - name = "Spawn Morph" - typepath = /datum/round_event/ghost_role/morph - weight = 0 //Admin only - max_occurrences = 1 - -/datum/round_event/ghost_role/morph - minimum_required = 1 - role_name = "morphling" - -/datum/round_event/ghost_role/morph/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = 1 - if(!GLOB.xeno_spawn) - return MAP_ERROR - var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(pick(GLOB.xeno_spawn)) - player_mind.transfer_to(S) - player_mind.assigned_role = "Morph" - player_mind.special_role = "Morph" - player_mind.add_antag_datum(/datum/antagonist/morph) - to_chat(S, S.playstyle_string) - SEND_SOUND(S, sound('sound/blank.ogg')) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a morph by an event.") - log_game("[key_name(S)] was spawned as a morph by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm deleted file mode 100644 index bad16389dec..00000000000 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ /dev/null @@ -1,190 +0,0 @@ -//////////////////The Monster - -/mob/living/simple_animal/slaughter - name = "slaughter demon" - real_name = "slaughter demon" - desc = "" - speak_emote = list("gurgles") - emote_hear = list("wails","screeches") - response_help_continuous = "thinks better of touching" - response_help_simple = "think better of touching" - response_disarm_continuous = "flails at" - response_disarm_simple = "flail at" - response_harm_continuous = "punches" - response_harm_simple = "punch" - icon = 'icons/mob/mob.dmi' - icon_state = "daemon" - icon_living = "daemon" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - speed = 1 - a_intent = INTENT_HARM - stop_automated_movement = 1 - status_flags = CANPUSH - attack_sound = 'sound/blank.ogg' - var/feast_sound = 'sound/blank.ogg' - deathsound = 'sound/blank.ogg' - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - faction = list("slaughter") - attack_verb_continuous = "wildly tears into" - attack_verb_simple = "wildly tear into" - maxHealth = 200 - health = 200 - healable = 0 - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - obj_damage = 50 - melee_damage_lower = 30 - melee_damage_upper = 30 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - bloodcrawl = BLOODCRAWL_EAT - var/playstyle_string = "I are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ - You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \ - Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \ - You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. " - - loot = list(/obj/effect/decal/cleanable/blood, \ - /obj/effect/decal/cleanable/blood/innards, \ - /obj/item/organ/heart/demon) - del_on_death = 1 - deathmessage = "screams in anger as it collapses into a puddle of viscera!" - -/mob/living/simple_animal/slaughter/Initialize() - . = ..() - var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new - AddSpell(bloodspell) - if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) - bloodspell.phased = TRUE - -/obj/effect/decal/cleanable/blood/innards - name = "pile of viscera" - desc = "" - gender = NEUTER - icon = 'icons/obj/surgery.dmi' - icon_state = "innards" - random_icon_states = null - -/mob/living/simple_animal/slaughter/phasein() - . = ..() - add_movespeed_modifier(MOVESPEED_ID_SLAUGHTER, update=TRUE, priority=100, multiplicative_slowdown=-1) - addtimer(CALLBACK(src, PROC_REF(remove_movespeed_modifier), MOVESPEED_ID_SLAUGHTER, TRUE), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - - -//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl -/obj/item/organ/heart/demon - name = "demon heart" - desc = "" - icon = 'icons/obj/surgery.dmi' - icon_state = "demon_heart-on" - decay_factor = 0 - -/obj/item/organ/heart/demon/update_icon() - return //always beating visually - -/obj/item/organ/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target) - if(M != user) - return ..() - user.visible_message(span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), \ - span_danger("An unnatural hunger consumes you. You raise [src] your mouth and devour it!")) - playsound(user, 'sound/blank.ogg', 50, TRUE) - for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) - if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl) - to_chat(user, span_warning("...and you don't feel any different.")) - qdel(src) - return - user.visible_message(span_warning("[user]'s eyes flare a deep crimson!"), \ - span_danger("I feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!")) - user.temporarilyRemoveItemFromInventory(src, TRUE) - src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E - -/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0) - ..() - if(M.mind) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) - -/obj/item/organ/heart/demon/Remove(mob/living/carbon/M, special = 0) - ..() - if(M.mind) - M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl) - -/obj/item/organ/heart/demon/Stop() - return 0 // Always beating. - -/mob/living/simple_animal/slaughter/laughter - // The laughter demon! It's everyone's best friend! It just wants to hug - // them so much, it wants to hug everyone at once! - name = "laughter demon" - real_name = "laughter demon" - desc = "" - speak_emote = list("giggles","titters","chuckles") - emote_hear = list("guffaws","laughs") - response_help_continuous = "hugs" - attack_verb_continuous = "wildly tickles" - attack_verb_simple = "wildly tickle" - - attack_sound = 'sound/blank.ogg' - feast_sound = 'sound/blank.ogg' - deathsound = 'sound/blank.ogg' - - icon_state = "bowmon" - icon_living = "bowmon" - deathmessage = "fades out, as all of its friends are released from its \ - prison of hugs." - loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"}) - - // Keep the people we hug! - var/list/consumed_mobs = list() - - playstyle_string = "I are a laughter \ - demon, a wonderful creature from another realm. You have a single \ - desire: To hug and tickle.
\ - You may use the \"Blood Crawl\" ability near blood pools to travel \ - through them, appearing and disappearing from the station at will. \ - Pulling a dead or unconscious mob while you enter a pool will pull \ - them in with you, allowing you to hug them and regain your health.
\ - You move quickly upon leaving a pool of blood, but the material world \ - will soon sap your strength and leave you sluggish.
\ - What makes you a little sad is that people seem to die when you tickle \ - them; but don't worry! When you die, everyone you hugged will be \ - released and fully healed, because in the end it's just a jape, \ - sibling!
" - -/mob/living/simple_animal/slaughter/laughter/Destroy() - release_friends() - . = ..() - -/mob/living/simple_animal/slaughter/laughter/ex_act(severity) - switch(severity) - if(1) - death() - if(2) - adjustBruteLoss(60) - if(3) - adjustBruteLoss(30) - -/mob/living/simple_animal/slaughter/laughter/proc/release_friends() - if(!consumed_mobs) - return - - for(var/mob/living/M in consumed_mobs) - if(!M) - continue - var/turf/T = find_safe_turf() - if(!T) - T = get_turf(src) - M.forceMove(T) - if(M.revive(full_heal = TRUE, admin_revive = TRUE)) - M.grab_ghost(force = TRUE) - playsound(T, feast_sound, 50, TRUE, -1) - to_chat(M, span_clown("I leave [src]'s warm embrace, and feel ready to take on the world.")) - -/mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(mob/living/victim) - if(consumed_mobs) - // Keep their corpse so rescue is possible - consumed_mobs += victim - else - // Be safe and just eject the corpse - victim.forceMove(get_turf(victim)) - victim.exit_blood_effect() - victim.visible_message(span_warning("[victim] falls out of the air, covered in blood, looking highly confused. And dead.")) diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm deleted file mode 100644 index 81f1e774674..00000000000 --- a/code/modules/antagonists/slaughter/slaughter_antag.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/antagonist/slaughter - name = "Slaughter demon" - show_name_in_check_antagonists = TRUE - var/objective_verb = "Kill" - var/datum/mind/summoner - job_rank = ROLE_ALIEN - show_in_antagpanel = FALSE - -/datum/antagonist/slaughter/on_gain() - forge_objectives() - . = ..() - -/datum/antagonist/slaughter/greet() - . = ..() - owner.announce_objectives() - -/datum/antagonist/slaughter/proc/forge_objectives() - if(summoner) - var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate - new_objective.owner = owner - new_objective.target = summoner - new_objective.explanation_text = "[objective_verb] [summoner.name], the one who summoned you." - objectives += new_objective - var/datum/objective/new_objective2 = new /datum/objective - new_objective2.owner = owner - new_objective2.explanation_text = "[objective_verb] everyone[summoner ? " else while you're at it":""]." - objectives += new_objective2 - -/datum/antagonist/slaughter/laughter - name = "Laughter demon" - objective_verb = "Hug and Tickle" diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm deleted file mode 100644 index ce59a2a2b11..00000000000 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/round_event_control/slaughter - name = "Spawn Slaughter Demon" - typepath = /datum/round_event/ghost_role/slaughter - weight = 1 //Very rare - max_occurrences = 1 - earliest_start = 1 HOURS - min_players = 20 - - - -/datum/round_event/ghost_role/slaughter - minimum_required = 1 - role_name = "slaughter demon" - -/datum/round_event/ghost_role/slaughter/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = 1 - - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) - if(isturf(L.loc)) - spawn_locs += L.loc - - if(!spawn_locs) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter((pick(spawn_locs))) - var/mob/living/simple_animal/slaughter/S = new (holder) - S.holder = holder - player_mind.transfer_to(S) - player_mind.assigned_role = "Slaughter Demon" - player_mind.special_role = "Slaughter Demon" - player_mind.add_antag_datum(/datum/antagonist/slaughter) - to_chat(S, S.playstyle_string) - to_chat(S, "I are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.") - SEND_SOUND(S, 'sound/blank.ogg') - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a slaughter demon by an event.") - log_game("[key_name(S)] was spawned as a slaughter demon by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm deleted file mode 100644 index 97aa277566e..00000000000 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ /dev/null @@ -1,672 +0,0 @@ -////Deactivated swarmer shell//// -/obj/item/deactivated_swarmer - name = "deactivated swarmer" - desc = "" - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_unactivated" - custom_materials = list(/datum/material/iron=10000, /datum/material/glass=4000) - -/obj/effect/mob_spawn/swarmer - name = "unactivated swarmer" - desc = "" - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_unactivated" - density = FALSE - anchored = FALSE - - mob_type = /mob/living/simple_animal/hostile/swarmer - mob_name = "a swarmer" - death = FALSE - roundstart = FALSE - flavour_text = {" - I are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate. - Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful. - Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage. - Objectives: - 1. Consume resources and replicate until there are no more resources left. - 2. Ensure that this location is fit for invasion at a later date; do not perform actions that would render it dangerous or inhospitable. - 3. Biological resources will be harvested at a later date; do not harm them. - "} - -/obj/effect/mob_spawn/swarmer/Initialize() - . = ..() - var/area/A = get_area(src) - if(A) - notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/blank.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) - -/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user) - . = ..() - if(.) - return - to_chat(user, span_notice("Picking up the swarmer may cause it to activate. You should be careful about this.")) - -/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_SCREWDRIVER && user.used_intent.type != INTENT_HARM) - user.visible_message(span_warning("[usr.name] deactivates [src]."), - span_notice("After some fiddling, you find a way to disable [src]'s power source."), - span_hear("I hear clicking.")) - new /obj/item/deactivated_swarmer(get_turf(src)) - qdel(src) - else - ..() - -////The Mob itself//// - -/mob/living/simple_animal/hostile/swarmer - name = "Swarmer" - unique_name = 1 - icon = 'icons/mob/swarmer.dmi' - desc = "" - speak_emote = list("tones") - initial_language_holder = /datum/language_holder/swarmer - bubble_icon = "swarmer" - mob_biotypes = MOB_ROBOTIC - health = 40 - maxHealth = 40 - status_flags = CANPUSH - icon_state = "swarmer" - icon_living = "swarmer" - icon_dead = "swarmer_unactivated" - icon_gib = null - wander = 0 - harm_intent_damage = 5 - minbodytemp = 0 - maxbodytemp = 500 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 0 - melee_damage_lower = 15 - melee_damage_upper = 15 - melee_damage_type = STAMINA - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD) - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - attack_verb_continuous = "shocks" - attack_verb_simple = "shock" - attack_sound = 'sound/blank.ogg' - friendly_verb_continuous = "pinches" - friendly_verb_simple = "pinch" - speed = 0 - faction = list("swarmer") - AIStatus = AI_OFF - pass_flags = PASSTABLE - mob_size = MOB_SIZE_TINY - ventcrawler = VENTCRAWLER_ALWAYS - ranged = 1 - projectiletype = /obj/projectile/beam/disabler - ranged_cooldown_time = 20 - projectilesound = 'sound/blank.ogg' - loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal) - del_on_death = 1 - deathmessage = "explodes with a sharp pop!" - light_color = LIGHT_COLOR_CYAN - hud_type = /datum/hud/swarmer - speech_span = SPAN_ROBOT - var/resources = 0 //Resource points, generated by consuming metal/glass - var/max_resources = 100 - -/mob/living/simple_animal/hostile/swarmer/Initialize() - . = ..() - verbs -= /mob/living/verb/pulled - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) - -/mob/living/simple_animal/hostile/swarmer/med_hud_set_health() - var/image/holder = hud_list[DIAG_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" - -/mob/living/simple_animal/hostile/swarmer/med_hud_set_status() - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "hudstat" - -/mob/living/simple_animal/hostile/swarmer/Stat() - ..() - if(statpanel("Status")) - stat("Resources:",resources) - -/mob/living/simple_animal/hostile/swarmer/emp_act() - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(health > 1) - adjustHealth(health-1) - else - death() - -/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O) - if(istype(O, /obj/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other - return TRUE - if(isswarmer(O)) - return TRUE - ..() - -////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// -/mob/living/simple_animal/hostile/swarmer/AttackingTarget() - if(!isliving(target)) - return target.swarmer_act(src) - else - return ..() - -/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A) - face_atom(A) - if(!isturf(loc)) - return - if(next_move > world.time) - return - if(!A.Adjacent(src)) - return - A.swarmer_act(src) - -/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE //return TRUE/FALSE whether or not an AI swarmer should try this swarmer_act() again, NOT whether it succeeded. - -/obj/effect/mob_spawn/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.Integrate(src) - return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances. - -/obj/effect/mob_spawn/swarmer/IntegrateAmount() - return 50 - -/turf/closed/indestructible/swarmer_act() - return FALSE - -/obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(resistance_flags & INDESTRUCTIBLE) - return FALSE - for(var/mob/living/L in contents) - if(!issilicon(L) && !isbrain(L)) - to_chat(S, span_warning("An organism has been detected inside this object. Aborting.")) - return FALSE - return ..() - -/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - return S.Integrate(src) - -/atom/movable/proc/IntegrateAmount() - return 0 - -/obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item - if(custom_materials) - if(custom_materials[getmaterialref(/datum/material/iron)] || custom_materials[getmaterialref(/datum/material/glass)]) - return 1 - return ..() - -/obj/item/gun/swarmer_act()//Stops you from eating the entire armory - return FALSE - -/turf/open/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor - return FALSE - -/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act() - return FALSE - -/obj/structure/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(S.AIStatus == AI_ON) - return FALSE - else - return ..() - -/obj/effect/swarmer_act() - return FALSE - -/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - qdel(src) - return TRUE - -/obj/structure/flora/swarmer_act() - return FALSE - -/turf/open/lava/swarmer_act() - if(!is_safe()) - new /obj/structure/lattice/catwalk/swarmer_catwalk(src) - return FALSE - -/obj/machinery/atmospherics/swarmer_act() - return FALSE - -/obj/structure/disposalpipe/swarmer_act() - return FALSE - -/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DismantleMachine(src) - return TRUE - -/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting.")) - S.target = null - return FALSE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")) - S.target = null - return FALSE - S.DisIntegrate(src) - return TRUE - -/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - toggle_cam(S, 0) - return TRUE - -/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine - S.DisIntegrate(src) - return TRUE - -/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("The volatile chemicals in this machine would destroy us. Aborting.")) - return FALSE - -/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This device's destruction would result in the extermination of everything in the area. Aborting.")) - return FALSE - -/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Searching... sensor malfunction! Target lost. Aborting.")) - return FALSE - -/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Destroying this object would cause a chain reaction. Aborting.")) - return FALSE - -/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting.")) - return FALSE - -/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("An inhospitable area may be created as a result of destroying this object. Aborting.")) - return FALSE - -/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.")) - return FALSE - -/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.")) - return FALSE - -/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting.")) - return FALSE - -/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This bluespace source will be important to us later. Aborting.")) - return FALSE - -/turf/closed/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(loc, /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting.")) - S.target = null - return TRUE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")) - S.target = null - return TRUE - return ..() - -/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting.")) - S.target = null - return TRUE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")) - S.target = null - return TRUE - return ..() - -/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource - to_chat(S, span_warning("This object does not contain enough materials to work with.")) - return FALSE - -/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Attempting to dismantle this machine would result in an immediate counterattack. Aborting.")) - return FALSE - -/obj/machinery/porta_turret_cover/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Attempting to dismantle this machine would result in an immediate counterattack. Aborting.")) - return FALSE - -/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisperseTarget(src) - return TRUE - -/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This biological resource is somehow resisting our bluespace transceiver. Aborting.")) - return FALSE - -/obj/machinery/droneDispenser/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This object is receiving unactivated swarmer shells to help us. Aborting.")) - return FALSE - -/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - . = ..() - var/turf/here = get_turf(src) - for(var/A in here.contents) - var/obj/structure/cable/C = A - if(istype(C)) - to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting.")) - return FALSE - -/obj/item/deactivated_swarmer/IntegrateAmount() - return 50 - -/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This object does not contain enough materials to work with.")) - return FALSE - -/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Destroying this object would cause a catastrophic chain reaction. Aborting.")) - return FALSE - -/obj/machinery/field/containment/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This object does not contain solid matter. Aborting.")) - return FALSE - -/obj/machinery/power/shieldwallgen/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Destroying this object would have an unpredictable effect on structure integrity. Aborting.")) - return FALSE - -/obj/machinery/shieldwall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This object does not contain solid matter. Aborting.")) - return FALSE - -////END CTRL CLICK FOR SWARMERS//// - -/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0) - if(!isturf(loc)) - to_chat(src, span_warning("This is not a suitable location for fabrication. We need more space.")) - if(resources >= fabrication_cost) - resources -= fabrication_cost - else - to_chat(src, span_warning("I do not have the necessary resources to fabricate this object.")) - return - return new fabrication_object(loc) - -/mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target) - var/resource_gain = target.IntegrateAmount() - if(resources + resource_gain > max_resources) - to_chat(src, span_warning("We cannot hold more materials!")) - return TRUE - if(resource_gain) - resources += resource_gain - do_attack_animation(target) - changeNext_move(CLICK_CD_MELEE) - var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target)) - I.pixel_x = target.pixel_x - I.pixel_y = target.pixel_y - I.pixel_z = target.pixel_z - if(istype(target, /obj/item/stack)) - var/obj/item/stack/S = target - S.use(1) - if(S.amount) - return TRUE - qdel(target) - return TRUE - else - to_chat(src, span_warning("[target] is incompatible with our internal matter recycler.")) - return FALSE - - -/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target) - new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) - do_attack_animation(target) - changeNext_move(CLICK_CD_MELEE) - target.ex_act(EXPLODE_LIGHT) - - -/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target) - if(target == src) - return - - if(!is_station_level(z) && !is_mining_level(z)) - to_chat(src, span_warning("Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.")) - return - - to_chat(src, span_info("Attempting to remove this being from our presence.")) - - if(!do_mob(src, target, 30)) - return - - var/turf/open/floor/F - F = find_safe_turf(zlevels = z, extended_safety_checks = TRUE) - - if(!F) - return - // If we're getting rid of a human, slap some energy cuffs on - // them to keep them away from us a little longer - - var/mob/living/carbon/human/H = target - if(ishuman(target) && (!H.handcuffed)) - H.handcuffed = new /obj/item/restraints/handcuffs/energy/used(H) - H.update_handcuffed() - log_combat(src, H, "handcuffed") - - var/datum/effect_system/spark_spread/S = new - S.set_up(4,0,get_turf(target)) - S.start() - playsound(src,'sound/blank.ogg',50,TRUE) - do_teleport(target, F, 0, channel = TELEPORT_CHANNEL_BLUESPACE) - -/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - if(!(flags & SHOCK_TESLA)) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target) - do_attack_animation(target) - to_chat(src, span_info("We begin to dismantle this machine. We will need to be uninterrupted.")) - var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target)) - D.pixel_x = target.pixel_x - D.pixel_y = target.pixel_y - D.pixel_z = target.pixel_z - if(do_mob(src, target, 100)) - to_chat(src, span_info("Dismantling complete.")) - var/atom/Tsec = target.drop_location() - new /obj/item/stack/sheet/metal(Tsec, 5) - for(var/obj/item/I in target.component_parts) - I.forceMove(Tsec) - var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) - N.pixel_x = target.pixel_x - N.pixel_y = target.pixel_y - N.pixel_z = target.pixel_z - target.dropContents() - if(istype(target, /obj/machinery/computer)) - var/obj/machinery/computer/C = target - if(C.circuit) - C.circuit.forceMove(Tsec) - qdel(target) - - -/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects - icon = 'icons/mob/swarmer.dmi' - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/swarmer/disintegration - icon_state = "disintegrate" - duration = 10 - -/obj/effect/temp_visual/swarmer/disintegration/Initialize() - . = ..() - playsound(loc, "sparks", 100, TRUE) - -/obj/effect/temp_visual/swarmer/dismantle - icon_state = "dismantle" - duration = 25 - -/obj/effect/temp_visual/swarmer/integrate - icon_state = "integrate" - duration = 5 - -/obj/structure/swarmer //Default swarmer effect object visual feedback - name = "swarmer ui" - desc = null - gender = NEUTER - icon = 'icons/mob/swarmer.dmi' - icon_state = "ui_light" - layer = MOB_LAYER - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - light_color = LIGHT_COLOR_CYAN - max_integrity = 30 - anchored = TRUE - var/lon_range = 1 - -/obj/structure/swarmer/Initialize(mapload) - . = ..() - set_light(lon_range) - -/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(src, 'sound/blank.ogg', 80, TRUE) - if(BURN) - playsound(src, 'sound/blank.ogg', 100, TRUE) - -/obj/structure/swarmer/emp_act() - . = ..() - if(. & EMP_PROTECT_SELF) - return - qdel(src) - -/obj/structure/swarmer/trap - name = "swarmer trap" - desc = "" - icon_state = "trap" - max_integrity = 10 - density = FALSE - -/obj/structure/swarmer/trap/Crossed(atom/movable/AM) - if(isliving(AM)) - var/mob/living/L = AM - if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) - playsound(loc,'sound/blank.ogg',50, TRUE, -1) - L.electrocute_act(0, src, 1, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION) - if(iscyborg(L)) - L.Paralyze(100) - qdel(src) - ..() - -/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap() - set name = "Create trap" - set category = "Swarmer" - set desc = "" - if(locate(/obj/structure/swarmer/trap) in loc) - to_chat(src, span_warning("There is already a trap here. Aborting.")) - return - Fabricate(/obj/structure/swarmer/trap, 5) - - -/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade() - set name = "Create barricade" - set category = "Swarmer" - set desc = "" - if(locate(/obj/structure/swarmer/blockade) in loc) - to_chat(src, span_warning("There is already a blockade here. Aborting.")) - return - if(resources < 5) - to_chat(src, span_warning("We do not have the resources for this!")) - return - if(do_mob(src, src, 10)) - Fabricate(/obj/structure/swarmer/blockade, 5) - - -/obj/structure/swarmer/blockade - name = "swarmer blockade" - desc = "" - icon_state = "barricade" - light_range = MINIMUM_USEFUL_LIGHT_RANGE - max_integrity = 50 - -/obj/structure/swarmer/blockade/CanPass(atom/movable/O) - if(isswarmer(O)) - return TRUE - if(istype(O, /obj/projectile/beam/disabler)) - return TRUE - -/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer() - set name = "Replicate" - set category = "Swarmer" - set desc = "" - to_chat(src, span_info("We are attempting to replicate ourselves. We will need to stand still until the process is complete.")) - if(resources < 50) - to_chat(src, span_warning("We do not have the resources for this!")) - return - if(!isturf(loc)) - to_chat(src, span_warning("This is not a suitable location for replicating ourselves. We need more room.")) - return - if(do_mob(src, src, 100)) - var/createtype = SwarmerTypeToCreate() - if(createtype && Fabricate(createtype, 50)) - playsound(loc,'sound/blank.ogg',50, TRUE, -1) - - -/mob/living/simple_animal/hostile/swarmer/proc/SwarmerTypeToCreate() - return /obj/effect/mob_spawn/swarmer - - -/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf() - set name = "Self Repair" - set category = "Swarmer" - set desc = "" - if(!isturf(loc)) - return - to_chat(src, span_info("Attempting to repair damage to our body, stand by...")) - if(do_mob(src, src, 100)) - adjustHealth(-100) - to_chat(src, span_info("We successfully repaired ourselves.")) - -/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() - if(!light_range) - set_light(3) - else - set_light(0) - -/mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg) - var/rendered = "Swarm communication - [src] [say_quote(msg)]" - for(var/i in GLOB.mob_list) - var/mob/M = i - if(isswarmer(M)) - to_chat(M, rendered) - if(isobserver(M)) - var/link = FOLLOW_LINK(M, src) - to_chat(M, "[link] [rendered]") - -/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() - var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact") - // TODO get swarmers their own colour rather than just boldtext - if(message) - swarmer_chat(message) diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm deleted file mode 100644 index 40e6f4ea061..00000000000 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ /dev/null @@ -1,28 +0,0 @@ -/datum/round_event_control/spawn_swarmer - name = "Spawn Swarmer Shell" - typepath = /datum/round_event/spawn_swarmer - weight = 7 - max_occurrences = 1 //Only once okay fam - earliest_start = 30 MINUTES - min_players = 15 - - -/datum/round_event/spawn_swarmer - -/datum/round_event/spawn_swarmer/start() - if(find_swarmer()) - return 0 - if(!GLOB.the_gateway) - return 0 - new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway)) - if(prob(25)) //25% chance to announce it to the crew - var/swarmer_report = span_bigbold("[command_name()] High-Priority Update") - swarmer_report += "

Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come through." - print_command_report(swarmer_report, announce=TRUE) - -/datum/round_event/spawn_swarmer/proc/find_swarmer() - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(istype(L, /mob/living/simple_animal/hostile/swarmer) && L.client) //If there is a swarmer with an active client, we've found our swarmer - return 1 - return 0 diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index f2821cb7ffd..65909b4393a 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -110,10 +110,6 @@ name = "Spell Cards" spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards -/datum/spellbook_entry/rod_form - name = "Rod Form" - spell_type = /obj/effect/proc_holder/spell/targeted/rod_form - /datum/spellbook_entry/magicm name = "Magic Missile" spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile @@ -392,27 +388,6 @@ if(.) new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user)) -/datum/spellbook_entry/item/bloodbottle - name = "Bottle of Blood" - desc = "" - item_path = /obj/item/antag_spawner/slaughter_demon - limit = 3 - category = "Assistance" - -/datum/spellbook_entry/item/hugbottle - name = "Bottle of Tickles" - desc = "A bottle of magically infused fun, the smell of which will \ - attract adorable extradimensional beings when broken. These beings \ - are similar to slaughter demons, but they do not permamently kill \ - their victims, instead putting them in an extradimensional hugspace, \ - to be released on the demon's death. Chaotic, but not ultimately \ - damaging. The crew's reaction to the other hand could be very \ - destructive." - item_path = /obj/item/antag_spawner/slaughter_demon/laughter - cost = 1 //non-destructive; it's just a jape, sibling! - limit = 3 - category = "Assistance" - /datum/spellbook_entry/item/mjolnir name = "Mjolnir" desc = "" @@ -614,18 +589,6 @@ if(!isnull(CT.limit)) CT.limit++ qdel(O) - else if(istype(O, /obj/item/antag_spawner/slaughter_demon)) - to_chat(user, span_notice("On second thought, maybe summoning a demon is a bad idea. You refund your points.")) - if(istype(O, /obj/item/antag_spawner/slaughter_demon/laughter)) - uses += 1 - for(var/datum/spellbook_entry/item/hugbottle/HB in entries) - if(!isnull(HB.limit)) - HB.limit++ - else - uses += 2 - for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) - if(!isnull(BB.limit)) - BB.limit++ qdel(O) /obj/item/spellbook/proc/GetCategoryHeader(category) diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm deleted file mode 100644 index 455164e9064..00000000000 --- a/code/modules/antagonists/xeno/xeno.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/team/xeno - name = "Aliens" - -//Simply lists them. -/datum/team/xeno/roundend_report() - var/list/parts = list() - parts += span_header("The [name] were:") - parts += printplayerlist(members) - return "
[parts.Join("
")]
" - -/datum/antagonist/xeno - name = "Xenomorph" - job_rank = ROLE_ALIEN - show_in_antagpanel = FALSE - prevent_roundtype_conversion = FALSE - var/datum/team/xeno/xeno_team - -/datum/antagonist/xeno/create_team(datum/team/xeno/new_team) - if(!new_team) - for(var/datum/antagonist/xeno/X in GLOB.antagonists) - if(!X.owner || !X.xeno_team) - continue - xeno_team = X.xeno_team - return - xeno_team = new - else - if(!istype(new_team)) - CRASH("Wrong xeno team type provided to create_team") - xeno_team = new_team - -/datum/antagonist/xeno/get_team() - return xeno_team - -//XENO -/mob/living/carbon/alien/mind_initialize() - ..() - if(!mind.has_antag_datum(/datum/antagonist/xeno)) - mind.add_antag_datum(/datum/antagonist/xeno) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 7491cf8ae75..b894ca761d2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -112,17 +112,8 @@ if(ismonkey(occupant)) // Monkey occupant_overlay = image(CRYOMOBS, "monkey") - else if(isalienadult(occupant)) - if(isalienroyal(occupant)) // Queen and prae - occupant_overlay = image(CRYOMOBS, "alienq") - else if(isalienhunter(occupant)) // Hunter - occupant_overlay = image(CRYOMOBS, "alienh") - else if(isaliensentinel(occupant)) // Sentinel - occupant_overlay = image(CRYOMOBS, "aliens") - else // Drone or other - occupant_overlay = image(CRYOMOBS, "aliend") - - else if(ishuman(occupant) || islarva(occupant) || (isanimal(occupant) && !ismegafauna(occupant))) // Mobs that are smaller than cryotube + + else if(ishuman(occupant) || (isanimal(occupant) && !ismegafauna(occupant))) // Mobs that are smaller than cryotube occupant_overlay = image(occupant.icon, occupant.icon_state) occupant_overlay.copy_overlays(occupant) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index dc172fbc9dd..7287dbee21e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -283,16 +283,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/can_crawl_through() return !welded -/obj/machinery/atmospherics/components/unary/vent_pump/attack_alien(mob/user) - if(!welded || !(do_after(user, 20, target = src))) - return - user.visible_message(span_warning("[user] furiously claws at [src]!"), span_notice("I manage to clear away the stuff blocking the vent."), span_hear("I hear loud scraping noises.")) - welded = FALSE - update_icon() - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) - pipe_vision_img.plane = ABOVE_HUD_PLANE - playsound(loc, 'sound/blank.ogg', 100, TRUE) - /obj/machinery/atmospherics/components/unary/vent_pump/high_volume name = "large air vent" power_channel = EQUIP diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index b5c628c297f..30315ec97f1 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -295,17 +295,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through() return !welded -/obj/machinery/atmospherics/components/unary/vent_scrubber/attack_alien(mob/user) - if(!welded || !(do_after(user, 20, target = src))) - return - user.visible_message(span_warning("[user] furiously claws at [src]!"), span_notice("I manage to clear away the stuff blocking the scrubber."), span_hear("I hear loud scraping noises.")) - welded = FALSE - update_icon() - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) - pipe_vision_img.plane = ABOVE_HUD_PLANE - playsound(loc, 'sound/blank.ogg', 100, TRUE) - - /obj/machinery/atmospherics/components/unary/vent_scrubber/layer1 piping_layer = 1 icon_state = "scrub_map-1" diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index e800eef4453..af8472be0ef 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -253,12 +253,6 @@ /obj/effect/mob_spawn/slime/equip(mob/living/simple_animal/slime/S) S.colour = mobcolour -/obj/effect/mob_spawn/facehugger/create(ckey) //Creates a squashed facehugger - var/obj/item/clothing/mask/facehugger/O = new(src.loc) //variable O is a new facehugger at the location of the landmark - O.name = src.name - O.Die() //call the facehugger's death proc - qdel(src) - /obj/effect/mob_spawn/mouse name = "sleeper" mob_type = /mob/living/simple_animal/mouse diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index c9e2fc8c8ba..523a43095c0 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -520,7 +520,6 @@ /obj/item/twohanded/fireaxe = 25, /obj/item/organ/brain/alien = 17, /obj/item/twohanded/dualsaber = 15, - /obj/item/organ/heart/demon = 7, /obj/item/gun/ballistic/automatic/c20r/unrestricted = 16, /obj/item/gun/magic/wand/resurrection/inert = 15, /obj/item/gun/magic/wand/resurrection = 10, diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index c61cddf4650..41057c38348 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -39,9 +39,6 @@ /obj/structure/signpost/attack_hulk(mob/user) return -/obj/structure/signpost/attack_larva(mob/user) - return interact(user) - /obj/structure/signpost/attack_robot(mob/user) if (Adjacent(user)) return interact(user) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index 72fc59d085f..475b8a1bd3c 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -98,8 +98,6 @@ /obj/structure/speaking_tile/attack_hulk(mob/user) return -/obj/structure/speaking_tile/attack_larva(mob/user) - return interact(user) /obj/structure/speaking_tile/attack_ai(mob/user) return interact(user) diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm deleted file mode 100644 index c3c4d16fe5f..00000000000 --- a/code/modules/cargo/bounties/assistant.dm +++ /dev/null @@ -1,204 +0,0 @@ -/datum/bounty/item/assistant/strange_object - name = "Strange Object" - description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away." - reward = 1200 - wanted_types = list(/obj/item/relic) - -/datum/bounty/item/assistant/scooter - name = "Scooter" - description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up." - reward = 1080 // the mat hoffman - wanted_types = list(/obj/vehicle/ridden/scooter) - include_subtypes = FALSE - -/datum/bounty/item/assistant/skateboard - name = "Skateboard" - description = "Nanotrasen has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up." - reward = 900 // the tony hawk - wanted_types = list(/obj/vehicle/ridden/scooter/skateboard, /obj/item/melee/skateboard) - -/datum/bounty/item/assistant/stunprod - name = "Stunprod" - description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it." - reward = 1300 - wanted_types = list(/obj/item/melee/baton/cattleprod) - -/datum/bounty/item/assistant/soap - name = "Soap" - description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/soap) - -/datum/bounty/item/assistant/spear - name = "Spears" - description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears." - reward = 2000 - required_count = 5 - wanted_types = list(/obj/item/twohanded/spear) - -/datum/bounty/item/assistant/toolbox - name = "Toolboxes" - description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution." - reward = 2000 - required_count = 6 - wanted_types = list(/obj/item/storage/toolbox) - -/datum/bounty/item/assistant/statue - name = "Statue" - description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible." - reward = 2000 - wanted_types = list(/obj/structure/statue) - -/datum/bounty/item/assistant/clown_box - name = "Clown Box" - description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." - reward = 1500 - wanted_types = list(/obj/item/storage/box/clown) - -/datum/bounty/item/assistant/cheesiehonkers - name = "Cheesie Honkers" - description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!" - reward = 1200 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/cheesiehonkers) - -/datum/bounty/item/assistant/baseball_bat - name = "Baseball Bat" - description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream." - reward = 2000 - required_count = 5 - wanted_types = list(/obj/item/melee/baseball_bat) - -/datum/bounty/item/assistant/extendohand - name = "Extendo-Hand" - description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out." - reward = 2500 - wanted_types = list(/obj/item/extendohand) - -/datum/bounty/item/assistant/donut - name = "Donuts" - description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale." - reward = 3000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donut) - -/datum/bounty/item/assistant/donkpocket - name = "Donk-Pockets" - description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately." - reward = 3000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket) - -/datum/bounty/item/assistant/briefcase - name = "Briefcase" - description = "Central Command will be holding a business convention this year. Ship a few briefcases in support." - reward = 2500 - required_count = 5 - wanted_types = list(/obj/item/storage/briefcase, /obj/item/storage/secure/briefcase) - -/datum/bounty/item/assistant/sunglasses - name = "Sunglasses" - description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this." - reward = 3000 - required_count = 2 - wanted_types = list(/obj/item/clothing/glasses/sunglasses) - -/datum/bounty/item/assistant/monkey_hide - name = "Monkey Hide" - description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it." - reward = 1500 - wanted_types = list(/obj/item/stack/sheet/animalhide/monkey) - -/datum/bounty/item/assistant/shard - name = "Shards" - description = "A killer clown has been stalking CentCom, and staff have been unable to catch her because she's not wearing shoes. Please ship some shards so that a booby trap can be constructed." - reward = 1500 - required_count = 15 - wanted_types = list(/obj/item/shard) - -/datum/bounty/item/assistant/comfy_chair - name = "Comfy Chairs" - description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him." - reward = 1500 - required_count = 5 - wanted_types = list(/obj/structure/chair/comfy) - -/datum/bounty/item/assistant/shadyjims - name = "Shady Jim's" - description = "There's an irate officer at CentCom demanding that he receive a box of Shady Jim's cigarettes. Please ship one. He's starting to make threats." - reward = 500 - wanted_types = list(/obj/item/storage/fancy/cigarettes/cigpack_shadyjims) - -/datum/bounty/item/assistant/potted_plants - name = "Potted Plants" - description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants." - reward = 2000 - required_count = 8 - wanted_types = list(/obj/item/twohanded/required/kirbyplants) - -/datum/bounty/item/assistant/earmuffs - name = "Earmuffs" - description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." - reward = 1000 - wanted_types = list(/obj/item/clothing/ears/earmuffs) - -/datum/bounty/item/assistant/handcuffs - name = "Handcuffs" - description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." - reward = 1000 - required_count = 5 - wanted_types = list(/obj/item/restraints/handcuffs) - -/datum/bounty/item/assistant/monkey_cubes - name = "Monkey Cubes" - description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube) - -/datum/bounty/item/assistant/chainsaw - name = "Chainsaw" - description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please." - reward = 2500 - wanted_types = list(/obj/item/twohanded/required/chainsaw) - -/datum/bounty/item/assistant/ied - name = "IED" - description = "Nanotrasen's maximum security prison at CentCom is undergoing personnel training. Ship a handful of IEDs to serve as a training tools." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/grenade/iedcasing) - -/datum/bounty/item/assistant/corgimeat - name = "Raw Corgi Meat" - description = "The Syndicate recently stole all of CentCom's Corgi meat. Ship out a replacement immediately." - reward = 3000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi) - -/datum/bounty/item/assistant/corgifarming - name = "Corgi Hides" - description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine." - reward = 30000 //that's a lot of dead dogs - required_count = 12 - wanted_types = list(/obj/item/stack/sheet/animalhide/corgi) - -/datum/bounty/item/assistant/action_figures - name = "Action Figures" - description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." - reward = 4000 - required_count = 5 - wanted_types = list(/obj/item/toy/figure) - -/datum/bounty/item/assistant/tail_whip - name = "Nine Tails whip" - description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." - reward = 4000 - wanted_types = list(/obj/item/melee/chainofcommand/tailwhip) - -/datum/bounty/item/assistant/dead_mice - name = "Dead Mice" - description = "Station 14 ran out of freeze-dried mice. Ship some fresh ones so their janitor doesn't go on strike." - reward = 5000 - required_count = 5 - wanted_types = list(/obj/item/reagent_containers/food/snacks/deadmouse) diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm deleted file mode 100644 index 285132a1c26..00000000000 --- a/code/modules/cargo/bounties/chef.dm +++ /dev/null @@ -1,131 +0,0 @@ -/datum/bounty/item/chef/birthday_cake - name = "Birthday Cake" - description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" - reward = 4000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday) - -/datum/bounty/item/chef/soup - name = "Soup" - description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/soup) - -/datum/bounty/item/chef/popcorn - name = "Popcorn Bags" - description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn) - -/datum/bounty/item/chef/onionrings - name = "Onion Rings" - description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings) - -/datum/bounty/item/chef/icecreamsandwich - name = "Ice Cream Sandwiches" - description = "Upper management has been screaming non-stop for ice cream. Please send some." - reward = 4000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/icecreamsandwich) - -/datum/bounty/item/chef/bread - name = "Bread" - description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions." - reward = 1000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread) - -/datum/bounty/item/chef/pie - name = "Pie" - description = "3.14159? No! CentCom management wants edible pie! Ship a whole one." - reward = 3142 - wanted_types = list(/obj/item/reagent_containers/food/snacks/pie) - -/datum/bounty/item/chef/salad - name = "Salad or Rice Bowls" - description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/salad) - -/datum/bounty/item/chef/carrotfries - name = "Carrot Fries" - description = "Night sight can mean life or death! A shipment of carrot fries is the order." - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries) - -/datum/bounty/item/chef/superbite - name = "Super Bite Burger" - description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him." - reward = 12000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/burger/superbite) - -/datum/bounty/item/chef/poppypretzel - name = "Poppy Pretzel" - description = "Central Command needs a reason to fire their HR head. Send over a poppy pretzel to force a failed drug test." - reward = 3000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/poppypretzel) - -/datum/bounty/item/chef/cubancarp - name = "Cuban Carp" - description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp) - -/datum/bounty/item/chef/hotdog - name = "Hot Dog" - description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog) - -/datum/bounty/item/chef/eggplantparm - name = "Eggplant Parmigianas" - description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!" - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm) - -/datum/bounty/item/chef/muffin - name = "Muffins" - description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/muffin) - -/datum/bounty/item/chef/chawanmushi - name = "Chawanmushi" - description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/chawanmushi) - -/datum/bounty/item/chef/kebab - name = "Kebabs" - description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises." - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab) - -/datum/bounty/item/chef/soylentgreen - name = "Soylent Green" - description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus." - reward = 5000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/soylentgreen) - -/datum/bounty/item/chef/pancakes - name = "Pancakes" - description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen." - reward = 5000 - required_count = 13 - wanted_types = list(/obj/item/reagent_containers/food/snacks/pancakes) - -/datum/bounty/item/chef/nuggies - name = "Chicken Nuggets" - description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?" - reward = 4000 - required_count = 6 - wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget) - diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm deleted file mode 100644 index 77687977d7f..00000000000 --- a/code/modules/cargo/bounties/engineering.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/bounty/item/engineering/gas - name = "Full Tank of Pluoxium" - description = "CentCom RnD is researching extra compact internals. Ship us a tank full of Pluoxium and you'll be compensated." - reward = 7500 - wanted_types = list(/obj/item/tank) - var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type = /datum/gas/pluoxium - -/datum/bounty/item/engineering/gas/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/item/tank/T = O - if(!T.air_contents.gases[gas_type]) - return FALSE - return T.air_contents.gases[gas_type][MOLES] >= moles_required - -/datum/bounty/item/engineering/gas/nitryl_tank - name = "Full Tank of Nitryl" - description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." - gas_type = /datum/gas/nitryl - -/datum/bounty/item/engineering/gas/tritium_tank - name = "Full Tank of Tritium" - description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium." - gas_type = /datum/gas/tritium - -/datum/bounty/item/engineering/energy_ball - name = "Contained Tesla Ball" - description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper." - reward = 75000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle - wanted_types = list(/obj/singularity/energy_ball) - -/datum/bounty/item/engineering/energy_ball/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/singularity/energy_ball/T = O - return !T.miniball diff --git a/code/modules/cargo/bounties/item.dm b/code/modules/cargo/bounties/item.dm deleted file mode 100644 index b2586d7c5ba..00000000000 --- a/code/modules/cargo/bounties/item.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/bounty/item - var/required_count = 1 - var/shipped_count = 0 - var/list/wanted_types // Types accepted for the bounty. - var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type. - var/list/exclude_types // Types excluded. - -/datum/bounty/item/New() - ..() - wanted_types = typecacheof(wanted_types) - exclude_types = typecacheof(exclude_types) - -/datum/bounty/item/completion_string() - return {"[shipped_count]/[required_count]"} - -/datum/bounty/item/can_claim() - return ..() && shipped_count >= required_count - -/datum/bounty/item/applies_to(obj/O) - if(!include_subtypes && !(O.type in wanted_types)) - return FALSE - if(include_subtypes && (!is_type_in_typecache(O, wanted_types) || is_type_in_typecache(O, exclude_types))) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_count < required_count - -/datum/bounty/item/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O,/obj/item/stack)) - var/obj/item/stack/O_is_a_stack = O - shipped_count += O_is_a_stack.amount - else - shipped_count += 1 - -/datum/bounty/item/compatible_with(datum/other_bounty) - return type != other_bounty.type - diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm deleted file mode 100644 index 62c846ea96a..00000000000 --- a/code/modules/cargo/bounties/mech.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/bounty/item/mech/New() - ..() - description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment." - -/datum/bounty/item/mech/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O, /obj/mecha)) - var/obj/mecha/M = O - M.wreckage = null // So the mech doesn't explode. - ..() - -/datum/bounty/item/mech/mark_high_priority(scale_reward) - return ..(max(scale_reward * 0.7, 1.2)) - -/datum/bounty/item/mech/ripleymkii - name = "APLU MK-II \"Ripley\"" - reward = 13000 - wanted_types = list(/obj/mecha/working/ripley/mkii) - -/datum/bounty/item/mech/firefighter - name = "APLU \"Firefighter\"" - reward = 18000 - wanted_types = list(/obj/mecha/working/ripley/firefighter) - -/datum/bounty/item/mech/odysseus - name = "Odysseus" - reward = 11000 - wanted_types = list(/obj/mecha/medical/odysseus) - -/datum/bounty/item/mech/gygax - name = "Gygax" - reward = 28000 - wanted_types = list(/obj/mecha/combat/gygax) - -/datum/bounty/item/mech/durand - name = "Durand" - reward = 20000 - wanted_types = list(/obj/mecha/combat/durand) - -/datum/bounty/item/mech/phazon - name = "Phazon" - reward = 50000 - wanted_types = list(/obj/mecha/combat/phazon) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm deleted file mode 100644 index d1397759695..00000000000 --- a/code/modules/cargo/bounties/medical.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/bounty/item/medical/heart - name = "Heart" - description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto!" - reward = 3000 - wanted_types = list(/obj/item/organ/heart) - -/datum/bounty/item/medical/lung - name = "Lungs" - description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/lungs) - -/datum/bounty/item/medical/appendix - name = "Appendix" - description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay." - reward = 5000 //there are no synthetic appendixes - wanted_types = list(/obj/item/organ/appendix) - -/datum/bounty/item/medical/ears - name = "Ears" - description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/ears) - -/datum/bounty/item/medical/liver - name = "Livers" - description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you?" - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/liver) - -/datum/bounty/item/medical/eye - name = "Organic Eyes" - description = "Station 5's Research Director Willem is requesting a few pairs of non-robotic eyes. Don't ask questions, just ship them." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/eyes) - exclude_types = list(/obj/item/organ/eyes/robotic) - -/datum/bounty/item/medical/tongue - name = "Tongues" - description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/tongue) - -/datum/bounty/item/medical/lizard_tail - name = "Lizard Tail" - description = "The Wizard Federation has made off with Nanotrasen's supply of lizard tails. While CentCom is dealing with the wizards, can the station spare a tail of their own?" - reward = 3000 - wanted_types = list(/obj/item/organ/tail/lizard) - -/datum/bounty/item/medical/cat_tail - name = "Cat Tail" - description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?" - reward = 3000 - wanted_types = list(/obj/item/organ/tail/cat) diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm deleted file mode 100644 index 1b8b46734fe..00000000000 --- a/code/modules/cargo/bounties/mining.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/bounty/item/mining/goliath_steaks - name = "Lava-Cooked Goliath Steaks" - description = "Admiral Pavlov has gone on hunger strike ever since the canteen started serving only monkey and monkey byproducts. She is demanding lava-cooked Goliath steaks." - reward = 5000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/steak/goliath) - -/datum/bounty/item/mining/goliath_boat - name = "Goliath Hide Boat" - description = "Commander Menkov wants to participate in the annual Lavaland Regatta. He is asking your shipwrights to build the swiftest boat known to man." - reward = 10000 - wanted_types = list(/obj/vehicle/ridden/lavaboat) - -/datum/bounty/item/mining/bone_oar - name = "Bone Oars" - description = "Commander Menkov requires oars to participate in the annual Lavaland Regatta. Ship a pair over." - reward = 4000 - required_count = 2 - wanted_types = list(/obj/item/oar) - -/datum/bounty/item/mining/bone_axe - name = "Bone Axe" - description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement." - reward = 7500 - wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe) - -/datum/bounty/item/mining/bone_armor - name = "Bone Armor" - description = "Station 14 has volunteered their lizard crew for ballistic armor testing. Ship over some bone armor." - reward = 5000 - wanted_types = list(/obj/item/clothing/suit/armor/bone) - -/datum/bounty/item/mining/skull_helmet - name = "Skull Helmet" - description = "Station 42's Head of Security has her birthday tomorrow! We want to suprise her with a fashionable skull helmet." - reward = 4000 - wanted_types = list(/obj/item/clothing/head/helmet/skull) - -/datum/bounty/item/mining/bone_talisman - name = "Bone Talismans" - description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing." - reward = 7500 - required_count = 3 - wanted_types = list(/obj/item/clothing/accessory/talisman) - -/datum/bounty/item/mining/bone_dagger - name = "Bone Daggers" - description = "Central Command's canteen is undergoing budget cuts. Ship over some bone daggers so our Chef can keep working." - reward = 5000 - required_count = 3 - wanted_types = list(/obj/item/kitchen/knife/combat/bone) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm deleted file mode 100644 index 11a166548a3..00000000000 --- a/code/modules/cargo/bounties/reagent.dm +++ /dev/null @@ -1,258 +0,0 @@ -/datum/bounty/reagent - var/required_volume = 10 - var/shipped_volume = 0 - var/datum/reagent/wanted_reagent - -/datum/bounty/reagent/completion_string() - return {"[round(shipped_volume)]/[required_volume] Units"} - -/datum/bounty/reagent/can_claim() - return ..() && shipped_volume >= required_volume - -/datum/bounty/reagent/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers)) - return FALSE - if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type)) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_volume < required_volume - -/datum/bounty/reagent/ship(obj/O) - if(!applies_to(O)) - return - shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type) - if(shipped_volume > required_volume) - shipped_volume = required_volume - -/datum/bounty/reagent/compatible_with(other_bounty) - if(!istype(other_bounty, /datum/bounty/reagent)) - return TRUE - var/datum/bounty/reagent/R = other_bounty - return wanted_reagent.type != R.wanted_reagent.type - -/datum/bounty/reagent/simple_drink - name = "Simple Drink" - reward = 1500 - -/datum/bounty/reagent/simple_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/antifreeze,\ - /datum/reagent/consumable/ethanol/andalusia,\ - /datum/reagent/consumable/tea/arnold_palmer,\ - /datum/reagent/consumable/ethanol/b52,\ - /datum/reagent/consumable/ethanol/bananahonk,\ - /datum/reagent/consumable/ethanol/beepsky_smash,\ - /datum/reagent/consumable/ethanol/between_the_sheets,\ - /datum/reagent/consumable/ethanol/bilk,\ - /datum/reagent/consumable/ethanol/black_russian,\ - /datum/reagent/consumable/ethanol/bloody_mary,\ - /datum/reagent/consumable/ethanol/brave_bull,\ - /datum/reagent/consumable/ethanol/martini,\ - /datum/reagent/consumable/ethanol/cuba_libre,\ - /datum/reagent/consumable/ethanol/eggnog,\ - /datum/reagent/consumable/ethanol/erikasurprise,\ - /datum/reagent/consumable/ethanol/ginfizz,\ - /datum/reagent/consumable/ethanol/gintonic,\ - /datum/reagent/consumable/ethanol/grappa,\ - /datum/reagent/consumable/ethanol/grog,\ - /datum/reagent/consumable/ethanol/hooch,\ - /datum/reagent/consumable/ethanol/iced_beer,\ - /datum/reagent/consumable/ethanol/irishcarbomb,\ - /datum/reagent/consumable/ethanol/manhattan,\ - /datum/reagent/consumable/ethanol/margarita,\ - /datum/reagent/consumable/ethanol/gargle_blaster,\ - /datum/reagent/consumable/ethanol/rum_coke,\ - /datum/reagent/consumable/ethanol/screwdrivercocktail,\ - /datum/reagent/consumable/ethanol/snowwhite,\ - /datum/reagent/consumable/soy_latte,\ - /datum/reagent/consumable/cafe_latte,\ - /datum/reagent/consumable/ethanol/syndicatebomb,\ - /datum/reagent/consumable/ethanol/tequila_sunrise,\ - /datum/reagent/consumable/ethanol/manly_dorf,\ - /datum/reagent/consumable/ethanol/thirteenloko,\ - /datum/reagent/consumable/triple_citrus,\ - /datum/reagent/consumable/ethanol/vodkamartini,\ - /datum/reagent/consumable/ethanol/whiskeysoda,\ - /datum/reagent/consumable/ethanol/beer/green,\ - /datum/reagent/consumable/ethanol/demonsblood,\ - /datum/reagent/consumable/ethanol/crevice_spike,\ - /datum/reagent/consumable/ethanol/singulo,\ - /datum/reagent/consumable/ethanol/whiskey_sour) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is thirsty! Send a shipment of [name] to CentCom to quench the company's thirst." - reward += rand(0, 2) * 500 - -/datum/bounty/reagent/complex_drink - name = "Complex Drink" - reward = 4000 - -/datum/bounty/reagent/complex_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/atomicbomb,\ - /datum/reagent/consumable/ethanol/bacchus_blessing,\ - /datum/reagent/consumable/ethanol/bastion_bourbon,\ - /datum/reagent/consumable/ethanol/booger,\ - /datum/reagent/consumable/ethanol/hippies_delight,\ - /datum/reagent/consumable/ethanol/drunkenblumpkin,\ - /datum/reagent/consumable/ethanol/fetching_fizz,\ - /datum/reagent/consumable/ethanol/goldschlager,\ - /datum/reagent/consumable/ethanol/manhattan_proj,\ - /datum/reagent/consumable/ethanol/narsour,\ - /datum/reagent/consumable/ethanol/neurotoxin,\ - /datum/reagent/consumable/ethanol/patron,\ - /datum/reagent/consumable/ethanol/quadruple_sec,\ - /datum/reagent/consumable/bluecherryshake,\ - /datum/reagent/consumable/doctor_delight,\ - /datum/reagent/consumable/ethanol/silencer,\ - /datum/reagent/consumable/ethanol/peppermint_patty,\ - /datum/reagent/consumable/ethanol/aloe,\ - /datum/reagent/consumable/pumpkin_latte) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize." - reward += rand(0, 4) * 500 - -/datum/bounty/reagent/chemical_simple - name = "Simple Chemical" - reward = 4000 - required_volume = 30 - -/datum/bounty/reagent/chemical_simple/New() - // Chemicals that can be mixed by a single skilled Chemist. - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/leporazine,\ - /datum/reagent/medicine/clonexadone,\ - /datum/reagent/medicine/mine_salve,\ - /datum/reagent/medicine/C2/convermol,\ - /datum/reagent/medicine/ephedrine,\ - /datum/reagent/medicine/diphenhydramine,\ - /datum/reagent/drug/space_drugs,\ - /datum/reagent/drug/crank,\ - /datum/reagent/gunpowder,\ - /datum/reagent/napalm,\ - /datum/reagent/firefighting_foam,\ - /datum/reagent/consumable/mayonnaise,\ - /datum/reagent/toxin/itching_powder,\ - /datum/reagent/toxin/cyanide,\ - /datum/reagent/toxin/heparin,\ - /datum/reagent/medicine/pen_acid,\ - /datum/reagent/medicine/atropine,\ - /datum/reagent/drug/aranesp,\ - /datum/reagent/drug/krokodil,\ - /datum/reagent/drug/methamphetamine,\ - /datum/reagent/teslium,\ - /datum/reagent/toxin/anacea,\ - /datum/reagent/pax) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 4) * 500 //4000 to 6000 credits - -/datum/bounty/reagent/chemical_complex - name = "Rare Chemical" - reward = 6000 - required_volume = 20 - -/datum/bounty/reagent/chemical_complex/New() - // Reagents that require interaction with multiple departments or are a pain to mix. Lower required_volume since acquiring 30u of some is unrealistic - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/pyroxadone,\ - /datum/reagent/medicine/rezadone,\ - /datum/reagent/medicine/regen_jelly,\ - /datum/reagent/drug/bath_salts,\ - /datum/reagent/hair_dye,\ - /datum/reagent/consumable/honey,\ - /datum/reagent/consumable/frostoil,\ - /datum/reagent/toxin/slimejelly,\ - /datum/reagent/teslium/energized_jelly,\ - /datum/reagent/toxin/mimesbane,\ - /datum/reagent/medicine/strange_reagent,\ - /datum/reagent/nitroglycerin,\ - /datum/reagent/medicine/rezadone,\ - /datum/reagent/toxin/zombiepowder,\ - /datum/reagent/toxin/ghoulpowder,\ - /datum/reagent/mulligan) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is paying premium for the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 5) * 750 //6000 to 9750 credits - -/datum/bounty/pill - /// quantity of the pills needed, this value acts as minimum, gets randomized on new() - var/required_ammount = 80 - /// counter for pills sent - var/shipped_ammount = 0 - /// reagent requested - var/datum/reagent/wanted_reagent - /// minimum volume of chemical needed, gets randomized on new() - var/wanted_vol = 30 - -/datum/bounty/pill/completion_string() - return {"[shipped_ammount]/[required_ammount] pills"} - -/datum/bounty/pill/can_claim() - return ..() && shipped_ammount >= required_ammount - -/datum/bounty/pill/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers/pill)) - return FALSE - if(O?.reagents.get_reagent_amount(wanted_reagent.type) >= wanted_vol) - return TRUE - return FALSE - -/datum/bounty/pill/ship(obj/O) - if(!applies_to(O)) - return - shipped_ammount += 1 - if(shipped_ammount > required_ammount) - shipped_ammount = required_ammount - -/datum/bounty/pill/compatible_with(other_bounty) - if(!istype(other_bounty, /datum/bounty/pill/simple_pill)) - return TRUE - var/datum/bounty/pill/simple_pill/P = other_bounty - return (wanted_reagent.type == P.wanted_reagent.type) && (wanted_vol == P.wanted_vol) - -/datum/bounty/pill/simple_pill - name = "Simple Pill" - reward = 10000 - -/datum/bounty/pill/simple_pill/New() - //reagent that are possible to be chem factory'd - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/spaceacillin,\ - /datum/reagent/medicine/C2/instabitaluri,\ - /datum/reagent/medicine/pen_acid,\ - /datum/reagent/medicine/atropine,\ - /datum/reagent/medicine/cryoxadone,\ - /datum/reagent/medicine/salbutamol,\ - /datum/reagent/medicine/rhigoxane,\ - /datum/reagent/medicine/trophazole,\ - /datum/reagent/drug/methamphetamine,\ - /datum/reagent/drug/crank,\ - /datum/reagent/nitrous_oxide,\ - /datum/reagent/barbers_aid,\ - /datum/reagent/pax,\ - /datum/reagent/flash_powder,\ - /datum/reagent/phlogiston,\ - /datum/reagent/firefighting_foam) - - var/datum/reagent/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = "[wanted_reagent.name] pills" - required_ammount += rand(1,60) - wanted_vol += rand(1,20) - description = "CentCom requires [required_ammount] of [name] containing at least [wanted_vol] each. Ship a container of it to be rewarded." - reward += rand(1, 5) * 3000 diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm deleted file mode 100644 index 33f334ac472..00000000000 --- a/code/modules/cargo/bounties/science.dm +++ /dev/null @@ -1,66 +0,0 @@ -/datum/bounty/item/science/boh - name = "Bag of Holding" - description = "Nanotrasen would make good use of high-capacity backpacks. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/storage/backpack/holding) - -/datum/bounty/item/science/tboh - name = "Trash Bag of Holding" - description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/storage/backpack/holding) - -/datum/bounty/item/science/bluespace_syringe - name = "Bluespace Syringe" - description = "Nanotrasen would make good use of high-capacity syringes. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/reagent_containers/syringe/bluespace) - -/datum/bounty/item/science/bluespace_body_bag - name = "Bluespace Body Bag" - description = "Nanotrasen would make good use of high-capacity body bags. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/bodybag/bluespace) - -/datum/bounty/item/science/nightvision_goggles - name = "Night Vision Goggles" - description = "An electrical storm has busted all the lights at CentCom. While management is waiting for replacements, perhaps some night vision goggles can be shipped?" - reward = 10000 - wanted_types = list(/obj/item/clothing/glasses/night, /obj/item/clothing/glasses/meson/night, /obj/item/clothing/glasses/hud/health/night, /obj/item/clothing/glasses/hud/security/night, /obj/item/clothing/glasses/hud/diagnostic/night) - -/datum/bounty/item/science/experimental_welding_tool - name = "Experimental Welding Tool" - description = "A recent accident has left most of CentCom's welding tools exploded. Ship replacements to be rewarded." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/weldingtool/experimental) - -/datum/bounty/item/science/cryostasis_beaker - name = "Cryostasis Beaker" - description = "Chemists at Central Command have discovered a new chemical that can only be held in cryostasis beakers. The only problem is they don't have any! Rectify this to receive payment." - reward = 10000 - wanted_types = list(/obj/item/reagent_containers/glass/beaker/noreact) - -/datum/bounty/item/science/diamond_drill - name = "Diamond Mining Drill" - description = "Central Command is willing to pay three months salary in exchange for one diamond mining drill." - reward = 15000 - wanted_types = list(/obj/item/pickaxe/drill/diamonddrill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill) - -/datum/bounty/item/science/floor_buffer - name = "Floor Buffer Upgrade" - description = "One of CentCom's janitors made a small fortune betting on carp races. Now they'd like to commission an upgrade to their floor buffer." - reward = 10000 - wanted_types = list(/obj/item/janiupgrade) - -/datum/bounty/item/science/advanced_mop - name = "Advanced Mop" - description = "Excuse me. I'd like to request $17 for a push broom rebristling. Either that, or an advanced mop." - reward = 10000 - wanted_types = list(/obj/item/mop/advanced) - -/datum/bounty/item/science/advanced_egun - name = "Advanced Energy Gun" - description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay." - reward = 10000 - wanted_types = list(/obj/item/gun/energy/e_gun/nuclear) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm deleted file mode 100644 index bcf7b89f3af..00000000000 --- a/code/modules/cargo/bounties/security.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/bounty/item/security/riotshotgun - name = "Riot Shotguns" - description = "Hooligans have boarded CentCom! Ship riot shotguns quick, or things are going to get dirty." - reward = 5000 - required_count = 2 - wanted_types = list(/obj/item/gun/ballistic/shotgun/riot) - -/datum/bounty/item/security/recharger - name = "Rechargers" - description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/machinery/recharger) diff --git a/code/modules/cargo/bounties/slime.dm b/code/modules/cargo/bounties/slime.dm deleted file mode 100644 index 4aa0797c700..00000000000 --- a/code/modules/cargo/bounties/slime.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/bounty/item/slime - reward = 3000 - -/datum/bounty/item/slime/New() - ..() - description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it." - reward += rand(0, 4) * 500 - -/datum/bounty/item/slime/green - name = "Green Slime Extract" - wanted_types = list(/obj/item/slime_extract/green) - -/datum/bounty/item/slime/pink - name = "Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/pink) - -/datum/bounty/item/slime/gold - name = "Gold Slime Extract" - wanted_types = list(/obj/item/slime_extract/gold) - -/datum/bounty/item/slime/oil - name = "Oil Slime Extract" - wanted_types = list(/obj/item/slime_extract/oil) - -/datum/bounty/item/slime/black - name = "Black Slime Extract" - wanted_types = list(/obj/item/slime_extract/black) - -/datum/bounty/item/slime/lightpink - name = "Light Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/lightpink) - -/datum/bounty/item/slime/adamantine - name = "Adamantine Slime Extract" - wanted_types = list(/obj/item/slime_extract/adamantine) - -/datum/bounty/item/slime/rainbow - name = "Rainbow Slime Extract" - wanted_types = list(/obj/item/slime_extract/rainbow) diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm deleted file mode 100644 index cbbf36c6710..00000000000 --- a/code/modules/cargo/bounties/special.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/bounty/item/alien_organs - name = "Alien Organs" - description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated." - reward = 25000 - required_count = 3 - wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo, /obj/item/organ/liver/alien, /obj/item/organ/tongue/alien, /obj/item/organ/eyes/night_vision/alien) - -/datum/bounty/item/syndicate_documents - name = "Syndicate Documents" - description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives." - reward = 15000 - wanted_types = list(/obj/item/documents/syndicate, /obj/item/documents/photocopy) - -/datum/bounty/item/syndicate_documents/applies_to(obj/O) - if(!..()) - return FALSE - if(istype(O, /obj/item/documents/photocopy)) - var/obj/item/documents/photocopy/Copy = O - return (Copy.copy_type && ispath(Copy.copy_type, /obj/item/documents/syndicate)) - return TRUE - -/datum/bounty/item/adamantine - name = "Adamantine" - description = "Nanotrasen's anomalous materials division is in desparate need for Adamantine. Send them a large shipment and we'll make it worth your while." - reward = 35000 - required_count = 10 - wanted_types = list(/obj/item/stack/sheet/mineral/adamantine) - -/datum/bounty/item/trash - name = "Trash" - description = "Recently a group of janitors have run out of trash to clean up, without any trash Centcom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation." - reward = 1000 - required_count = 10 - wanted_types = list(/obj/item/trash) - -/datum/bounty/more_bounties - name = "More Bounties" - description = "Complete enough bounties and CentCom will issue new ones!" - reward = 5 // number of bounties - var/required_bounties = 5 - -/datum/bounty/more_bounties/can_claim() - return ..() && completed_bounty_count() >= required_bounties - -/datum/bounty/more_bounties/completion_string() - return "[min(required_bounties, completed_bounty_count())]/[required_bounties] Bounties" - -/datum/bounty/more_bounties/reward_string() - return "Up to [reward] new bounties" - -/datum/bounty/more_bounties/claim() - if(can_claim()) - claimed = TRUE - for(var/i = 0; i < reward; ++i) - try_add_bounty(random_bounty()) diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm deleted file mode 100644 index 8f078a2668b..00000000000 --- a/code/modules/cargo/bounties/virus.dm +++ /dev/null @@ -1,81 +0,0 @@ -/datum/bounty/virus - reward = 5000 - var/shipped = FALSE - var/stat_value = 0 - var/stat_name = "" - -/datum/bounty/virus/New() - ..() - stat_value = rand(4, 11) - if(rand(3) == 1) - stat_value *= -1 - name = "Virus ([stat_name] of [stat_value])" - description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus." - reward += rand(0, 4) * 500 - -/datum/bounty/virus/completion_string() - return shipped ? "Shipped" : "Not Shipped" - -/datum/bounty/virus/can_claim() - return ..() && shipped - -/datum/bounty/virus/applies_to(obj/O) - if(shipped) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - if(!istype(O, /obj/item/reagent_containers || !O.reagents || !O.reagents.reagent_list)) - return FALSE - var/datum/reagent/blood/B = locate() in O.reagents.reagent_list - if(!B) - return FALSE - for(var/V in B.get_diseases()) - if(!istype(V, /datum/disease/advance)) - continue - if(accepts_virus(V)) - return TRUE - return FALSE - -/datum/bounty/virus/ship(obj/O) - if(!applies_to(O)) - return - shipped = TRUE - -/datum/bounty/virus/compatible_with(datum/other_bounty) - if(!istype(other_bounty, /datum/bounty/virus)) - return TRUE - var/datum/bounty/virus/V = other_bounty - return type != V.type || stat_value != V.stat_value - - -/datum/bounty/virus/proc/accepts_virus(V) - return TRUE - -/datum/bounty/virus/resistance - stat_name = "resistance" - -/datum/bounty/virus/resistance/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalResistance() == stat_value - -/datum/bounty/virus/stage_speed - stat_name = "stage speed" - -/datum/bounty/virus/stage_speed/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalStageSpeed() == stat_value - -/datum/bounty/virus/stealth - stat_name = "stealth" - -/datum/bounty/virus/stealth/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalStealth() == stat_value - -/datum/bounty/virus/transmit - stat_name = "transmissible" - -/datum/bounty/virus/transmit/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalTransmittable() == stat_value - diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm deleted file mode 100644 index 118cd038144..00000000000 --- a/code/modules/cargo/bounty.dm +++ /dev/null @@ -1,180 +0,0 @@ -GLOBAL_LIST_EMPTY(bounties_list) - -/datum/bounty - var/name - var/description - var/reward = 1000 // In credits. - var/claimed = FALSE - var/high_priority = FALSE - -// Displayed on bounty UI screen. -/datum/bounty/proc/completion_string() - return "" - -// Displayed on bounty UI screen. -/datum/bounty/proc/reward_string() - return "[reward] Credits" - -/datum/bounty/proc/can_claim() - return !claimed - -// Called when the claim button is clicked. Override to provide fancy rewards. -/datum/bounty/proc/claim() - if(can_claim()) - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - D.adjust_money(reward) - claimed = TRUE - -// If an item sent in the cargo shuttle can satisfy the bounty. -/datum/bounty/proc/applies_to(obj/O) - return FALSE - -// Called when an object is shipped on the cargo shuttle. -/datum/bounty/proc/ship(obj/O) - return - -// When randomly generating the bounty list, duplicate bounties must be avoided. -// This proc is used to determine if two bounties are duplicates, or incompatible in general. -/datum/bounty/proc/compatible_with(other_bounty) - return TRUE - -/datum/bounty/proc/mark_high_priority(scale_reward = 2) - if(high_priority) - return - high_priority = TRUE - reward = round(reward * scale_reward) - -// This proc is called when the shuttle docks at CentCom. -// It handles items shipped for bounties. -/proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE) - if(!GLOB.bounties_list.len) - setup_bounties() - - var/list/matched_one = FALSE - for(var/thing in reverseRange(AM.GetAllContents())) - var/matched_this = FALSE - for(var/datum/bounty/B in GLOB.bounties_list) - if(B.applies_to(thing)) - matched_one = TRUE - matched_this = TRUE - if(!dry_run) - B.ship(thing) - if(!dry_run && matched_this) - qdel(thing) - return matched_one - -// Returns FALSE if the bounty is incompatible with the current bounties. -/proc/try_add_bounty(datum/bounty/new_bounty) - if(!new_bounty || !new_bounty.name || !new_bounty.description) - return FALSE - for(var/i in GLOB.bounties_list) - var/datum/bounty/B = i - if(!B.compatible_with(new_bounty) || !new_bounty.compatible_with(B)) - return FALSE - GLOB.bounties_list += new_bounty - return TRUE - -// Returns a new bounty of random type, but does not add it to GLOB.bounties_list. -/proc/random_bounty() - switch(rand(1, 13)) - if(1) - var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) - return new subtype - if(2) - var/subtype = pick(subtypesof(/datum/bounty/item/mech)) - return new subtype - if(3) - var/subtype = pick(subtypesof(/datum/bounty/item/chef)) - return new subtype - if(4) - var/subtype = pick(subtypesof(/datum/bounty/item/security)) - return new subtype - if(5) - if(rand(2) == 1) - return new /datum/bounty/reagent/simple_drink - return new /datum/bounty/reagent/complex_drink - if(6) - if(rand(2) == 1) - return new /datum/bounty/reagent/chemical_simple - return new /datum/bounty/reagent/chemical_complex - if(7) - var/subtype = pick(subtypesof(/datum/bounty/virus)) - return new subtype - if(8) - var/subtype = pick(subtypesof(/datum/bounty/item/science)) - return new subtype - if(9) - var/subtype = pick(subtypesof(/datum/bounty/item/slime)) - return new subtype - if(10) - var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) - return new subtype - if(11) - var/subtype = pick(subtypesof(/datum/bounty/item/mining)) - return new subtype - if(12) - var/subtype = pick(subtypesof(/datum/bounty/item/medical)) - return new subtype - -// Called lazily at startup to populate GLOB.bounties_list with random bounties. -/proc/setup_bounties() - - var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes! - - /********************************Subtype Gens********************************/ - var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2, - /datum/bounty/item/mech = 1, - /datum/bounty/item/chef = 2, - /datum/bounty/item/security = 1, - /datum/bounty/virus = 1, - /datum/bounty/item/engineering = 1, - /datum/bounty/item/mining = 2, - /datum/bounty/item/medical = 2) - - for(var/the_type in easy_add_list_subtypes) - for(var/i in 1 to easy_add_list_subtypes[the_type]) - pick = pick(subtypesof(the_type)) - try_add_bounty(new pick) - - /********************************Strict Type Gens********************************/ - var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1, - /datum/bounty/reagent/complex_drink = 1, - /datum/bounty/reagent/chemical_simple = 1, - /datum/bounty/reagent/chemical_complex = 1, - /datum/bounty/pill/simple_pill = 1) - - for(var/the_strict_type in easy_add_list_strict_types) - for(var/i in 1 to easy_add_list_strict_types[the_strict_type]) - try_add_bounty(new the_strict_type) - - /********************************Dynamic Gens********************************/ - - for(var/i in 0 to 1) - if(prob(50)) - pick = pick(subtypesof(/datum/bounty/item/slime)) - else - pick = pick(subtypesof(/datum/bounty/item/science)) - try_add_bounty(new pick) - - /********************************Cutoff for Non-Low Priority Bounties********************************/ - var/datum/bounty/B = pick(GLOB.bounties_list) - B.mark_high_priority() - - /********************************Low Priority Gens********************************/ - var/list/low_priority_strict_type_list = list( /datum/bounty/item/alien_organs, - /datum/bounty/item/syndicate_documents, - /datum/bounty/item/adamantine, - /datum/bounty/item/trash, - /datum/bounty/more_bounties) - - for(var/low_priority_bounty in low_priority_strict_type_list) - try_add_bounty(new low_priority_bounty) - -/proc/completed_bounty_count() - var/count = 0 - for(var/i in GLOB.bounties_list) - var/datum/bounty/B = i - if(B.claimed) - ++count - return count diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm deleted file mode 100644 index ff869ed4686..00000000000 --- a/code/modules/cargo/bounty_console.dm +++ /dev/null @@ -1,96 +0,0 @@ -#define PRINTER_TIMEOUT 10 - - - -/obj/machinery/computer/bounty - name = "Nanotrasen bounty console" - desc = "" - icon_screen = "bounty" - circuit = /obj/item/circuitboard/computer/bounty - light_color = "#E2853D"//orange - var/printer_ready = 0 //cooldown var - -/obj/machinery/computer/bounty/Initialize() - . = ..() - printer_ready = world.time + PRINTER_TIMEOUT - -/obj/machinery/computer/bounty/proc/print_paper() - new /obj/item/paper/bounty_printout(loc) - -/obj/item/paper/bounty_printout - name = "paper - Bounties" - -/obj/item/paper/bounty_printout/Initialize() - . = ..() - info = "

Nanotrasen Cargo Bounties


" - update_icon() - - for(var/datum/bounty/B in GLOB.bounties_list) - if(B.claimed) - continue - info += {"

[B.name]

-
  • Reward: [B.reward_string()]
  • -
  • Completed: [B.completion_string()]
"} - -/obj/machinery/computer/bounty/ui_interact(mob/user) - . = ..() - - if(!GLOB.bounties_list.len) - setup_bounties() - - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - var/list/dat = list({"Refresh - Print Paper -

Credits: [D.account_balance]

- - "}) - for(var/datum/bounty/B in GLOB.bounties_list) - if(B.claimed) - dat += "" - else if(B.can_claim()) - dat += "" - else - dat += "" - - if(B.high_priority) - dat += {" - - "} - else - dat += {" - - "} - dat += "" - if(B.claimed) - dat += "" - else if(B.can_claim()) - dat += "" - else - dat += "" - dat += "" - dat += "
NameDescriptionRewardCompletionStatus
[B.name]High Priority: [B.description][B.reward_string()][B.name][B.description][B.reward_string()][B.completion_string()]ClaimedClaimUnclaimed
" - dat = dat.Join() - var/datum/browser/popup = new(user, "bounties", "Nanotrasen Bounties", 700, 600) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/computer/bounty/Topic(href, href_list) - if(..()) - return - - switch(href_list["choice"]) - if("Print") - if(printer_ready < world.time) - printer_ready = world.time + PRINTER_TIMEOUT - print_paper() - - if("Claim") - var/datum/bounty/B = locate(href_list["d_rec"]) in GLOB.bounties_list - if(B) - B.claim() - - if(href_list["refresh"]) - playsound(src, "terminal_type", 25, FALSE) - - updateUsrDialog() diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm deleted file mode 100644 index 47a7d66ba31..00000000000 --- a/code/modules/cargo/console.dm +++ /dev/null @@ -1,246 +0,0 @@ -/obj/machinery/computer/cargo - name = "supply console" - desc = "" - icon_screen = "supply" - circuit = /obj/item/circuitboard/computer/cargo - ui_x = 780 - ui_y = 750 - - var/requestonly = FALSE - var/contraband = FALSE - var/self_paid = FALSE - var/safety_warning = "For safety reasons, the automated supply shuttle \ - cannot transport live organisms, human remains, classified nuclear weaponry, \ - homing beacons or machinery housing any form of artificial intelligence." - var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible." - /// radio used by the console to send messages on supply channel - var/obj/item/radio/headset/radio - /// var that tracks message cooldown - var/message_cooldown - - light_color = "#E2853D"//orange - -/obj/machinery/computer/cargo/request - name = "supply request console" - desc = "" - icon_screen = "request" - circuit = /obj/item/circuitboard/computer/cargo/request - requestonly = TRUE - -/obj/machinery/computer/cargo/Initialize() - . = ..() - radio = new /obj/item/radio/headset/headset_cargo(src) - var/obj/item/circuitboard/computer/cargo/board = circuit - contraband = board.contraband - if (board.obj_flags & EMAGGED) - obj_flags |= EMAGGED - else - obj_flags &= ~EMAGGED - -/obj/machinery/computer/cargo/Destroy() - QDEL_NULL(radio) - ..() - -/obj/machinery/computer/cargo/proc/get_export_categories() - . = EXPORT_CARGO - if(contraband) - . |= EXPORT_CONTRABAND - if(obj_flags & EMAGGED) - . |= EXPORT_EMAG - -/obj/machinery/computer/cargo/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - user.visible_message(span_warning("[user] swipes a suspicious card through [src]!"), - span_notice("I adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) - - obj_flags |= EMAGGED - contraband = TRUE - - // This also permamently sets this on the circuit board - var/obj/item/circuitboard/computer/cargo/board = circuit - board.contraband = TRUE - board.obj_flags |= EMAGGED - update_static_data(user) - -/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ - datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "cargo", name, ui_x, ui_y, master_ui, state) - ui.open() - -/obj/machinery/computer/cargo/ui_data() - var/list/data = list() - data["location"] = SSshuttle.supply.getStatusText() - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - data["points"] = D.account_balance - data["away"] = SSshuttle.supply.getDockedId() == "supply_away" - data["self_paid"] = self_paid - data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE - var/message = "Remember to stamp and send back the supply manifests." - if(SSshuttle.centcom_message) - message = SSshuttle.centcom_message - if(SSshuttle.supplyBlocked) - message = blockade_warning - data["message"] = message - data["cart"] = list() - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - data["cart"] += list(list( - "object" = SO.pack.name, - "cost" = SO.pack.cost, - "id" = SO.id, - "orderer" = SO.orderer, - "paid" = !isnull(SO.paying_account) //paid by requester - )) - - data["requests"] = list() - for(var/datum/supply_order/SO in SSshuttle.requestlist) - data["requests"] += list(list( - "object" = SO.pack.name, - "cost" = SO.pack.cost, - "orderer" = SO.orderer, - "reason" = SO.reason, - "id" = SO.id - )) - - return data - -/obj/machinery/computer/cargo/ui_static_data(mob/user) - var/list/data = list() - data["requestonly"] = requestonly - data["supplies"] = list() - for(var/pack in SSshuttle.supply_packs) - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] - if(!data["supplies"][P.group]) - data["supplies"][P.group] = list( - "name" = P.group, - "packs" = list() - ) - if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly) - continue - data["supplies"][P.group]["packs"] += list(list( - "name" = P.name, - "cost" = P.cost, - "id" = pack, - "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. - "small_item" = P.small_item, - "access" = P.access - )) - return data - -/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) - if(..()) - return - switch(action) - if("send") - if(!SSshuttle.supply.canMove()) - say(safety_warning) - return - if(SSshuttle.supplyBlocked) - say(blockade_warning) - return - if(SSshuttle.supply.getDockedId() == "supply_home") - SSshuttle.supply.export_categories = get_export_categories() - SSshuttle.moveShuttle("supply", "supply_away", TRUE) - say("The supply shuttle is departing.") - investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO) - else - investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO) - say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") - SSshuttle.moveShuttle("supply", "supply_home", TRUE) - . = TRUE - if("add") - var/id = text2path(params["id"]) - var/datum/supply_pack/pack = SSshuttle.supply_packs[id] - if(!istype(pack)) - return - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly) - return - - var/name = "*None Provided*" - var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name - rank = "Silicon" - - var/datum/bank_account/account - if(self_paid && ishuman(usr)) - var/mob/living/carbon/human/H = usr - var/obj/item/card/id/id_card = H.get_idcard(TRUE) - if(!istype(id_card)) - say("No ID card detected.") - return - account = id_card.registered_account - if(!istype(account)) - say("Invalid bank account.") - return - - var/reason = "" - if(requestonly && !self_paid) - reason = stripped_input("Reason:", name, "") - if(isnull(reason) || ..()) - return - - var/turf/T = get_turf(src) - var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account) - SO.generateRequisition(T) - if(requestonly && !self_paid) - SSshuttle.requestlist += SO - else - SSshuttle.shoppinglist += SO - if(self_paid) - say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") - if(requestonly && message_cooldown < world.time) - radio.talk_into(src, "A new order has been requested.", RADIO_CHANNEL_SUPPLY) - message_cooldown = world.time + 30 SECONDS - . = TRUE - if("remove") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - if(SO.id == id) - SSshuttle.shoppinglist -= SO - . = TRUE - break - if("clear") - SSshuttle.shoppinglist.Cut() - . = TRUE - if("approve") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) - if(SO.id == id) - SSshuttle.requestlist -= SO - SSshuttle.shoppinglist += SO - . = TRUE - break - if("deny") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) - if(SO.id == id) - SSshuttle.requestlist -= SO - . = TRUE - break - if("denyall") - SSshuttle.requestlist.Cut() - . = TRUE - if("toggleprivate") - self_paid = !self_paid - . = TRUE - if(.) - post_signal("supply") - -/obj/machinery/computer/cargo/proc/post_signal(command) - - var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) - - if(!frequency) - return - - var/datum/signal/status_signal = new(list("command" = command)) - frequency.post_signal(src, status_signal) diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm deleted file mode 100644 index 8a43e8a4a63..00000000000 --- a/code/modules/cargo/export_scanner.dm +++ /dev/null @@ -1,45 +0,0 @@ -/obj/item/export_scanner - name = "export scanner" - desc = "" - icon = 'icons/obj/device.dmi' - icon_state = "export_scanner" - item_state = "radio" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - item_flags = NOBLUDGEON - w_class = WEIGHT_CLASS_SMALL - siemens_coefficient = 1 - var/obj/machinery/computer/cargo/cargo_console = null - -/obj/item/export_scanner/examine(user) - . = ..() - if(!cargo_console) - . += span_notice("[src] is not currently linked to a cargo console.") - -/obj/item/export_scanner/afterattack(obj/O, mob/user, proximity) - . = ..() - if(!istype(O) || !proximity) - return - - if(istype(O, /obj/machinery/computer/cargo)) - var/obj/machinery/computer/cargo/C = O - if(!C.requestonly) - cargo_console = C - to_chat(user, span_notice("Scanner linked to [C].")) - else if(!istype(cargo_console)) - to_chat(user, span_warning("I must link [src] to a cargo console first!")) - else - // Before you fix it: - // yes, checking manifests is a part of intended functionality. - - var/datum/export_report/ex = export_item_and_contents(O, cargo_console.get_export_categories(), dry_run=TRUE) - var/price = 0 - for(var/x in ex.total_amount) - price += ex.total_value[x] - - if(price) - to_chat(user, span_notice("Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""].")) - else - to_chat(user, span_warning("Scanned [O], no export value.")) - if(bounty_ship_item_and_contents(O, dry_run=TRUE)) - to_chat(user, span_notice("Scanned item is eligible for one or more bounties.")) diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index e6fda5f6b10..897b59552f8 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -14,8 +14,3 @@ cost = 150 unit_name = "solar panel control board" export_types = list(/obj/item/circuitboard/computer/solar_control) - -/datum/export/swarmer - cost = 2000 - unit_name = "deactivated alien deconstruction drone" - export_types = list(/obj/item/deactivated_swarmer) diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 1c666a4db4d..b8a490b823b 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -48,11 +48,6 @@ unit_name = "gondola hide" export_types = list(/obj/item/stack/sheet/animalhide/gondola) -/datum/export/stack/skin/xeno - cost = 500 - unit_name = "alien hide" - export_types = list(/obj/item/stack/sheet/animalhide/xeno) - // Common materials. // For base materials, see materials.dm @@ -92,10 +87,3 @@ cost = 0.2 unit_name = "cable piece" export_types = list(/obj/item/stack/cable_coil) - -// Weird Stuff - -/datum/export/stack/abductor - cost = 1000 - message = "of alien alloy" - export_types = list(/obj/item/stack/sheet/mineral/abductor) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm deleted file mode 100644 index 1f948723e16..00000000000 --- a/code/modules/cargo/expressconsole.dm +++ /dev/null @@ -1,215 +0,0 @@ -#define MAX_EMAG_ROCKETS 8 -#define BEACON_COST 500 -#define SP_LINKED 1 -#define SP_READY 2 -#define SP_LAUNCH 3 -#define SP_UNLINK 4 -#define SP_UNREADY 5 - -/obj/machinery/computer/cargo/express - name = "express supply console" - desc = "This console allows the user to purchase a package \ - with 1/40th of the delivery time: made possible by NanoTrasen's new \"1500mm Orbital Railgun\".\ - All sales are near instantaneous - please choose carefully" - icon_screen = "supply_express" - circuit = /obj/item/circuitboard/computer/cargo/express - ui_x = 600 - ui_y = 700 - blockade_warning = "Bluespace instability detected. Delivery impossible." - req_access = list(ACCESS_QM) - - var/message - var/printed_beacons = 0 //number of beacons printed. Used to determine beacon names. - var/list/meme_pack_data - var/obj/item/supplypod_beacon/beacon //the linked supplypod beacon - var/area/landingzone = /area/quartermaster/storage //where we droppin boys - var/podType = /obj/structure/closet/supplypod - var/cooldown = 0 //cooldown to prevent printing supplypod beacon spam - var/locked = TRUE //is the console locked? unlock with ID - var/usingBeacon = FALSE //is the console in beacon mode? exists to let beacon know when a pod may come in - -/obj/machinery/computer/cargo/express/Initialize() - . = ..() - packin_up() - -/obj/machinery/computer/cargo/express/Destroy() - if(beacon) - beacon.unlink_console() - return ..() - -/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params) - if((istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) && allowed(user)) - locked = !locked - to_chat(user, span_notice("I [locked ? "lock" : "unlock"] the interface.")) - return - else if(istype(W, /obj/item/disk/cargo/bluespace_pod)) - podType = /obj/structure/closet/supplypod/bluespacepod//doesnt effect circuit board, making reversal possible - to_chat(user, span_notice("I insert the disk into [src], allowing for advanced supply delivery vehicles.")) - qdel(W) - return TRUE - else if(istype(W, /obj/item/supplypod_beacon)) - var/obj/item/supplypod_beacon/sb = W - if (sb.express_console != src) - sb.link_console(src, user) - return TRUE - else - to_chat(user, span_alert("[src] is already linked to [sb].")) - ..() - -/obj/machinery/computer/cargo/express/emag_act(mob/living/user) - if(obj_flags & EMAGGED) - return - user.visible_message(span_warning("[user] swipes a suspicious card through [src]!"), - span_notice("I change the routing protocols, allowing the Supply Pod to land anywhere on the station.")) - obj_flags |= EMAGGED - // This also sets this on the circuit board - var/obj/item/circuitboard/computer/cargo/board = circuit - board.obj_flags |= EMAGGED - packin_up() - -/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry - meme_pack_data = list() // sorry for what? - for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all - if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice - meme_pack_data[P.group] = list( // it gets cheaper when I return it - "name" = P.group, // mmhm - "packs" = list() // sometimes, I return it so much, I rip the manifest - ) // see, my quartermaster taught me a few things too - if((P.hidden) || (P.special)) // like, how not to rip the manifest - continue// by using someone else's crate - if(!(obj_flags & EMAGGED) && P.contraband) // will you show me? - continue // i'd be right happy to - meme_pack_data[P.group]["packs"] += list(list( - "name" = P.name, - "cost" = P.cost, - "id" = pack, - "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. - )) - -/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state. - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "cargo_express", name, ui_x, ui_y, master_ui, state) - ui.open() - -/obj/machinery/computer/cargo/express/ui_data(mob/user) - var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location? - var/list/data = list() - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - data["points"] = D.account_balance - data["locked"] = locked//swipe an ID to unlock - data["siliconUser"] = user.has_unlimited_silicon_privilege - data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui - data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay? - data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? - data["canBuyBeacon"] = cooldown <= 0 && D.account_balance >= BEACON_COST - data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary - data["hasBeacon"] = beacon != null//is there a linked beacon? - data["beaconName"] = beacon ? beacon.name : "No Beacon Found" - data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons - data["supplies"] = list() - message = "Sales are near-instantaneous - please choose carefully." - if(SSshuttle.supplyBlocked) - message = blockade_warning - if(usingBeacon && !beacon) - message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed - else if (usingBeacon && !canBeacon) - message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf - if(obj_flags & EMAGGED) - message = "(&!#@ERROR: ROUTING_#PROTOCOL MALF(*CT#ON. $UG%ESTE@ ACT#0N: !^/PULS3-%E)ET CIR*)ITB%ARD." - data["message"] = message - if(!meme_pack_data) - packin_up() - stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]") - data["supplies"] = meme_pack_data - if (cooldown > 0)//cooldown used for printing beacons - cooldown-- - return data - -/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui) - switch(action) - if("LZCargo") - usingBeacon = FALSE - if (beacon) - beacon.update_status(SP_UNREADY) //ready light on beacon will turn off - if("LZBeacon") - usingBeacon = TRUE - if (beacon) - beacon.update_status(SP_READY) //turns on the beacon's ready light - if("printBeacon") - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - if(D.adjust_money(-BEACON_COST)) - cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam - var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location()) - C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc) - printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1 - beacon.name = "Supply Pod Beacon #[printed_beacons]" - - - if("add")//Generate Supply Order first - var/id = text2path(params["id"]) - var/datum/supply_pack/pack = SSshuttle.supply_packs[id] - if(!istype(pack)) - return - var/name = "*None Provided*" - var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name - rank = "Silicon" - var/reason = "" - var/list/empty_turfs - var/datum/supply_order/SO = new(pack, name, rank, ckey, reason) - var/points_to_check - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - points_to_check = D.account_balance - if(!(obj_flags & EMAGGED)) - if(SO.pack.cost <= points_to_check) - var/LZ - if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay - LZ = get_turf(beacon) - beacon.update_status(SP_LAUNCH) - else if (!usingBeacon)//find a suitable supplypod landing zone in cargobay - landingzone = GLOB.areas_by_type[/area/quartermaster/storage] - if (!landingzone) - WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.") - landingzone = get_area(src) - for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone - if(is_blocked_turf(T)) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs && empty_turfs.len) - LZ = pick(empty_turfs) - if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call - D.adjust_money(-SO.pack.cost) - new /obj/effect/DPtarget(LZ, podType, SO) - . = TRUE - update_icon() - else - if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^) - landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone - for(var/turf/open/floor/T in landingzone.contents) - if(is_blocked_turf(T)) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs && empty_turfs.len) - D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS))) - - SO.generateRequisition(get_turf(src)) - for(var/i in 1 to MAX_EMAG_ROCKETS) - var/LZ = pick(empty_turfs) - LAZYREMOVE(empty_turfs, LZ) - new /obj/effect/DPtarget(LZ, podType, SO) - . = TRUE - update_icon() - CHECK_TICK diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packsrogue/_pack.dm similarity index 100% rename from code/modules/cargo/packs.dm rename to code/modules/cargo/packsrogue/_pack.dm diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm deleted file mode 100644 index 192a4f93b0b..00000000000 --- a/code/modules/cargo/supplypod_beacon.dm +++ /dev/null @@ -1,95 +0,0 @@ -/obj/item/supplypod_beacon - name = "Supply Pod Beacon" - desc = "" - icon = 'icons/obj/device.dmi' - icon_state = "supplypod_beacon" - item_state = "radio" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - w_class = WEIGHT_CLASS_SMALL - var/obj/machinery/computer/cargo/express/express_console - var/linked = FALSE - var/ready = FALSE - var/launched = FALSE - -/obj/item/supplypod_beacon/proc/update_status(consoleStatus) - switch(consoleStatus) - if (SP_LINKED) - linked = TRUE - playsound(src,'sound/blank.ogg',50,FALSE) - if (SP_READY) - ready = TRUE - if (SP_LAUNCH) - launched = TRUE - playsound(src,'sound/blank.ogg',50,FALSE) - playsound(src,'sound/blank.ogg',50,FALSE) - addtimer(CALLBACK(src, PROC_REF(endLaunch)), 33)//wait 3.3 seconds (time it takes for supplypod to land), then update icon - if (SP_UNLINK) - linked = FALSE - playsound(src,'sound/blank.ogg',50,FALSE) - if (SP_UNREADY) - ready = FALSE - update_icon() - -/obj/item/supplypod_beacon/update_icon() - cut_overlays() - if (launched) - add_overlay("sp_green") - else if (ready) - add_overlay("sp_yellow") - else if (linked) - add_overlay("sp_orange") - -/obj/item/supplypod_beacon/proc/endLaunch() - launched = FALSE - update_status() - -/obj/item/supplypod_beacon/examine(user) - . = ..() - if(!express_console) - . += span_notice("[src] is not currently linked to an Express Supply console.") - else - . += span_notice("Alt-click to unlink it from the Express Supply console.") - -/obj/item/supplypod_beacon/Destroy() - if(express_console) - express_console.beacon = null - return ..() - -/obj/item/supplypod_beacon/proc/unlink_console() - if(express_console) - express_console.beacon = null - express_console = null - update_status(SP_UNLINK) - update_status(SP_UNREADY) - -/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user) - if (C.beacon)//if new console has a beacon, then... - C.beacon.unlink_console()//unlink the old beacon from new console - if (express_console)//if this beacon has an express console - express_console.beacon = null//remove the connection the expressconsole has from beacons - express_console = C//set the linked console var to the console - express_console.beacon = src//out with the old in with the news - update_status(SP_LINKED) - if (express_console.usingBeacon) - update_status(SP_READY) - to_chat(user, span_notice("[src] linked to [C].")) - -/obj/item/supplypod_beacon/AltClick(mob/user) - if (!user.canUseTopic(src, !issilicon(user))) - return - if (express_console) - unlink_console() - else - to_chat(user, span_alert("There is no linked console.")) - -/obj/item/supplypod_beacon/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/pen)) //give a tag that is visible from the linked express console - var/new_beacon_name = stripped_input(user, "What would you like the tag to be?") - if(!user.canUseTopic(src, BE_CLOSE)) - return - if(new_beacon_name) - name += " ([tag])" - return - else - return ..() diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index da2dc13b135..3bc72d5c145 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -338,7 +338,7 @@ chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/suit chameleon_action.chameleon_name = "Suit" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor, /obj/item/clothing/suit/changeling), only_root_path = TRUE) + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/changeling), only_root_path = TRUE) chameleon_action.initialize_disguises() /obj/item/clothing/suit/chameleon/emp_act(severity) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 511f44222ea..ae065407ee3 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -374,7 +374,7 @@ if(occupants.len >= max_occupants) to_chat(user, span_warning("[src] are full!")) return - if(istype(target, /mob/living/simple_animal/hostile/retaliate/poison/snake) || istype(target, /mob/living/simple_animal/hostile/headcrab) || istype(target, /mob/living/carbon/alien/larva)) + if(istype(target, /mob/living/simple_animal/hostile/retaliate/poison/snake)) occupants += target target.forceMove(src) to_chat(user, span_notice("[target] slithers into [src].")) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 7194250467e..dde38853f34 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -473,15 +473,6 @@ icon_state = "gothcoat" item_state = "gothcoat" -/obj/item/clothing/suit/xenos - name = "xenos suit" - desc = "" - icon_state = "xenos" - item_state = "xenos_helm" - body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - allowed = list(/obj/item/clothing/mask/facehugger/toy) - /obj/item/clothing/suit/nemes name = "pharoah tunic" desc = "" diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm deleted file mode 100644 index 6f239f7aa22..00000000000 --- a/code/modules/events/abductor.dm +++ /dev/null @@ -1,35 +0,0 @@ -/datum/round_event_control/abductor - name = "Abductors" - typepath = /datum/round_event/ghost_role/abductor - weight = 10 - max_occurrences = 1 - min_players = 20 - gamemode_blacklist = list("nuclear","wizard","revolution") - -/datum/round_event/ghost_role/abductor - minimum_required = 2 - role_name = "abductor team" - fakeable = FALSE //Nothing to fake here - -/datum/round_event/ghost_role/abductor/spawn_role() - var/list/mob/dead/observer/candidates = get_candidates(ROLE_ABDUCTOR, null, ROLE_ABDUCTOR) - - if(candidates.len < 2) - return NOT_ENOUGH_PLAYERS - - var/mob/living/carbon/human/agent = makeBody(pick_n_take(candidates)) - var/mob/living/carbon/human/scientist = makeBody(pick_n_take(candidates)) - - var/datum/team/abductor_team/T = new - if(T.team_number > ABDUCTOR_MAX_TEAMS) - return MAP_ERROR - - log_game("[key_name(scientist)] has been selected as [T.name] abductor scientist.") - log_game("[key_name(agent)] has been selected as [T.name] abductor agent.") - - scientist.mind.add_antag_datum(/datum/antagonist/abductor/scientist, T) - agent.mind.add_antag_datum(/datum/antagonist/abductor/agent, T) - - spawned_mobs += list(agent, scientist) - - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm deleted file mode 100644 index 26c5812b46c..00000000000 --- a/code/modules/events/alien_infestation.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/round_event_control/alien_infestation - name = "Alien Infestation" - typepath = /datum/round_event/ghost_role/alien_infestation - weight = 5 - - min_players = 10 - -/datum/round_event_control/alien_infestation/canSpawnEvent() - . = ..() - if(!.) - return . - - for(var/mob/living/carbon/alien/A in GLOB.player_list) - if(A.stat != DEAD) - return FALSE - -/datum/round_event/ghost_role/alien_infestation - announceWhen = 400 - - minimum_required = 1 - role_name = "alien larva" - - // 50% chance of being incremented by one - var/spawncount = 1 - fakeable = TRUE - - -/datum/round_event/ghost_role/alien_infestation/setup() - announceWhen = rand(announceWhen, announceWhen + 50) - if(prob(50)) - spawncount++ - -/datum/round_event/ghost_role/alien_infestation/announce(fake) - var/living_aliens = FALSE - for(var/mob/living/carbon/alien/A in GLOB.player_list) - if(A.stat != DEAD) - living_aliens = TRUE - - if(living_aliens || fake) - priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/blank.ogg') - - -/datum/round_event/ghost_role/alien_infestation/spawn_role() - var/list/vents = list() - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines) - if(QDELETED(temp_vent)) - continue - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] - if(!temp_vent_parent) - continue//no parent vent - //Stops Aliens getting stuck in small networks. - //See: Security, Virology - if(temp_vent_parent.other_atmosmch.len > 20) - vents += temp_vent - - if(!vents.len) - message_admins("An event attempted to spawn an alien but no suitable vents were found. Shutting down.") - return MAP_ERROR - - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - while(spawncount > 0 && vents.len && candidates.len) - var/obj/vent = pick_n_take(vents) - var/client/C = pick_n_take(candidates) - - var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - new_xeno.key = C.key - - spawncount-- - message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by an event.") - log_game("[key_name(new_xeno)] was spawned as an alien by an event.") - spawned_mobs += new_xeno - - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm deleted file mode 100644 index eb7edcafbf8..00000000000 --- a/code/modules/events/dust.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/round_event_control/space_dust - name = "Minor Space Dust" - typepath = /datum/round_event/space_dust - weight = 200 - max_occurrences = 1000 - earliest_start = 0 MINUTES - alert_observers = FALSE - -/datum/round_event/space_dust - startWhen = 1 - endWhen = 2 - fakeable = FALSE - -/datum/round_event/space_dust/start() - spawn_meteors(1, GLOB.meteorsC) - -/datum/round_event_control/sandstorm - name = "Sandstorm" - typepath = /datum/round_event/sandstorm - weight = 0 - max_occurrences = 0 - earliest_start = 0 MINUTES - -/datum/round_event/sandstorm - startWhen = 1 - endWhen = 150 // ~5 min - announceWhen = 0 - fakeable = FALSE - -/datum/round_event/sandstorm/tick() - spawn_meteors(10, GLOB.meteorsC) diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm deleted file mode 100644 index fd7f6349ad4..00000000000 --- a/code/modules/events/fugitive_spawning.dm +++ /dev/null @@ -1,115 +0,0 @@ -/datum/round_event_control/fugitives - name = "Spawn Fugitives" - typepath = /datum/round_event/ghost_role/fugitives - max_occurrences = 1 - min_players = 20 - earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on. - gamemode_blacklist = list("nuclear") - -/datum/round_event/ghost_role/fugitives - minimum_required = 1 - role_name = "fugitive" - fakeable = FALSE - -/datum/round_event/ghost_role/fugitives/spawn_role() - var/list/possible_spawns = list()//Some xeno spawns are in some spots that will instantly kill the refugees, like atmos - for(var/turf/X in GLOB.xeno_spawn) - if(istype(X.loc, /area/maintenance)) - possible_spawns += X - if(!possible_spawns.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - var/turf/landing_turf = pick(possible_spawns) - var/list/possible_backstories = list() - var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR) - if(candidates.len >= 1) //solo refugees - if(prob(30)) - possible_backstories.Add("waldo") //less common as it comes with magicks and is kind of immershun shattering - if(candidates.len >= 4)//group refugees - possible_backstories.Add("prisoner", "cultist", "synth") - if(!possible_backstories.len) - return NOT_ENOUGH_PLAYERS - - var/backstory = pick(possible_backstories) - var/member_size = 3 - var/leader - switch(backstory) - if("synth") - leader = pick_n_take(candidates) - if("waldo") - member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later - var/list/members = list() - var/list/spawned_mobs = list() - if(isnull(leader)) - member_size++ //if there is no leader role, then the would be leader is a normal member of the team. - - for(var/i in 1 to member_size) - members += pick_n_take(candidates) - - for(var/mob/dead/selected in members) - var/mob/living/carbon/human/S = gear_fugitive(selected, landing_turf, backstory) - spawned_mobs += S - if(!isnull(leader)) - gear_fugitive_leader(leader, landing_turf, backstory) - -//after spawning - playsound(src, 'sound/blank.ogg', 50, TRUE) - new /obj/item/storage/toolbox/mechanical(landing_turf) //so they can actually escape maint - addtimer(CALLBACK(src, PROC_REF(spawn_hunters)), 10 MINUTES) - role_name = "fugitive hunter" - return SUCCESSFUL_SPAWN - -/datum/round_event/ghost_role/fugitives/proc/gear_fugitive(mob/dead/selected, turf/landing_turf, backstory) //spawns normal fugitive - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - var/mob/living/carbon/human/S = new(landing_turf) - player_mind.transfer_to(S) - player_mind.assigned_role = "Fugitive" - player_mind.special_role = "Fugitive" - player_mind.add_antag_datum(/datum/antagonist/fugitive) - var/datum/antagonist/fugitive/fugitiveantag = player_mind.has_antag_datum(/datum/antagonist/fugitive) - INVOKE_ASYNC(fugitiveantag, TYPE_PROC_REF(/datum/antagonist/fugitive, greet), backstory) //some fugitives have a sleep on their greet, so we don't want to stop the entire antag granting proc with fluff - - switch(backstory) - if("prisoner") - S.equipOutfit(/datum/outfit/prisoner) - if("cultist") - S.equipOutfit(/datum/outfit/yalp_cultist) - if("waldo") - S.equipOutfit(/datum/outfit/waldo) - if("synth") - S.equipOutfit(/datum/outfit/synthetic) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Fugitive by an event.") - log_game("[key_name(S)] was spawned as a Fugitive by an event.") - spawned_mobs += S - return S - - //special spawn for one member. it can be used for a special mob or simply to give one normal member special items. -/datum/round_event/ghost_role/fugitives/proc/gear_fugitive_leader(mob/dead/leader, turf/landing_turf, backstory) - var/datum/mind/player_mind = new /datum/mind(leader.key) - player_mind.active = TRUE - //if you want to add a fugitive with a special leader in the future, make this switch with the backstory - var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory) - var/obj/item/choice_beacon/augments/A = new(S) - S.put_in_hands(A) - new /obj/item/autosurgeon(landing_turf) - -//security team gets called in after 10 minutes of prep to find the refugees -/datum/round_event/ghost_role/fugitives/proc/spawn_hunters() - var/backstory = pick("space cop", "russian", "bounty hunter") - var/datum/map_template/shuttle/ship - if(backstory == "space cop") - ship = new /datum/map_template/shuttle/hunter/space_cop - else if (backstory == "russian") - ship = new /datum/map_template/shuttle/hunter/russian - else - ship = new /datum/map_template/shuttle/hunter/bounty - var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) - var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) - var/z = SSmapping.empty_space.z_value - var/turf/T = locate(x,y,z) - if(!T) - CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in") - if(!ship.load(T)) - CRASH("Loading [backstory] ship failed!") - priority_announce("Unidentified ship detected near the station.") diff --git a/code/modules/events/high_priority_bounty.dm b/code/modules/events/high_priority_bounty.dm deleted file mode 100644 index ffdcd8840b7..00000000000 --- a/code/modules/events/high_priority_bounty.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/round_event_control/high_priority_bounty - name = "High Priority Bounty" - typepath = /datum/round_event/high_priority_bounty - max_occurrences = 3 - weight = 20 - earliest_start = 10 - -/datum/round_event/high_priority_bounty/announce(fake) - priority_announce("Central Command has issued a high-priority cargo bounty. Details have been sent to all bounty consoles.", "Nanotrasen Bounty Program") - -/datum/round_event/high_priority_bounty/start() - var/datum/bounty/B - for(var/attempts = 0; attempts < 50; ++attempts) - B = random_bounty() - if(!B) - continue - B.mark_high_priority(3) - if(try_add_bounty(B)) - break - diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm deleted file mode 100644 index a9b99e858dd..00000000000 --- a/code/modules/events/immovable_rod.dm +++ /dev/null @@ -1,165 +0,0 @@ -/* -Immovable rod random event. -The rod will spawn at some location outside the station, and travel in a straight line to the opposite side of the station -Everything solid in the way will be ex_act()'d -In my current plan for it, 'solid' will be defined as anything with density == 1 - ---NEOFite -*/ - -/datum/round_event_control/immovable_rod - name = "Immovable Rod" - typepath = /datum/round_event/immovable_rod - min_players = 15 - max_occurrences = 5 - var/atom/special_target - - -/datum/round_event_control/immovable_rod/admin_setup() - if(!check_rights(R_FUN)) - return - - var/aimed = alert("Aimed at current location?","Sniperod", "Yes", "No") - if(aimed == "Yes") - special_target = get_turf(usr) - -/datum/round_event/immovable_rod - announceWhen = 5 - -/datum/round_event/immovable_rod/announce(fake) - priority_announce("What the fuck was that?!", "General Alert") - -/datum/round_event/immovable_rod/start() - var/datum/round_event_control/immovable_rod/C = control - var/startside = pick(GLOB.cardinals) - var/z = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) - var/turf/startT = spaceDebrisStartLoc(startside, z) - var/turf/endT = spaceDebrisFinishLoc(startside, z) - var/atom/rod = new /obj/effect/immovablerod(startT, endT, C.special_target) - announce_to_ghosts(rod) - -/obj/effect/immovablerod - name = "immovable rod" - desc = "" - icon = 'icons/obj/objects.dmi' - icon_state = "immrod" - throwforce = 100 - move_force = INFINITY - move_resist = INFINITY - pull_force = INFINITY - density = TRUE - anchored = TRUE - flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - var/mob/living/wizard - var/z_original = 0 - var/destination - var/notify = TRUE - var/atom/special_target - -/obj/effect/immovablerod/New(atom/start, atom/end, aimed_at) - ..() - SSaugury.register_doom(src, 2000) - z_original = z - destination = end - special_target = aimed_at - GLOB.poi_list += src - - var/special_target_valid = FALSE - if(special_target) - var/turf/T = get_turf(special_target) - if(T.z == z_original) - special_target_valid = TRUE - if(special_target_valid) - walk_towards(src, special_target, 1) - else if(end && end.z==z_original) - walk_towards(src, destination, 1) - -/obj/effect/immovablerod/Topic(href, href_list) - if(href_list["orbit"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - ghost.ManualFollow(src) - -/obj/effect/immovablerod/Destroy() - GLOB.poi_list -= src - . = ..() - -/obj/effect/immovablerod/Moved() - if((z != z_original) || (loc == destination)) - qdel(src) - if(special_target && loc == get_turf(special_target)) - complete_trajectory() - return ..() - -/obj/effect/immovablerod/proc/complete_trajectory() - //We hit what we wanted to hit, time to go - special_target = null - destination = get_edge_target_turf(src, dir) - walk(src,0) - walk_towards(src, destination, 1) - -/obj/effect/immovablerod/ex_act(severity, target) - return 0 - -/obj/effect/immovablerod/singularity_act() - return - -/obj/effect/immovablerod/singularity_pull() - return - -/obj/effect/immovablerod/Bump(atom/clong) - if(prob(10)) - playsound(src, 'sound/blank.ogg', 50, TRUE) - audible_message(span_danger("I hear a CLANG!")) - - if(clong && prob(25)) - x = clong.x - y = clong.y - - if(special_target && clong == special_target) - complete_trajectory() - - if(isturf(clong) || isobj(clong)) - if(clong.density) - clong.ex_act(EXPLODE_HEAVY) - - else if(isliving(clong)) - penetrate(clong) - else if(istype(clong, type)) - var/obj/effect/immovablerod/other = clong - visible_message("[src] collides with [other]!\ - ") - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(2, get_turf(src)) - smoke.start() - qdel(src) - qdel(other) - -/obj/effect/immovablerod/proc/penetrate(mob/living/L) - L.visible_message(span_danger("[L] is penetrated by an immovable rod!") , span_danger("The rod penetrates you!") , span_danger("I hear a CLANG!")) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.adjustBruteLoss(160) - if(L && (L.density || prob(10))) - L.ex_act(EXPLODE_HEAVY) - -/obj/effect/immovablerod/attack_hand(mob/living/user) - if(ishuman(user)) - var/mob/living/carbon/human/U = user - if(U.job in list("Research Director")) - playsound(src, 'sound/blank.ogg', 100, TRUE) - for(var/mob/M in urange(8, src)) - if(!M.stat) - shake_camera(M, 2, 3) - if(wizard) - U.visible_message(span_boldwarning("[src] transforms into [wizard] as [U] suplexes them!"), span_warning("As you grab [src], it suddenly turns into [wizard] as you suplex them!")) - to_chat(wizard, span_boldwarning("You're suddenly jolted out of rod-form as [U] somehow manages to grab you, slamming you into the ground!")) - wizard.Stun(60) - wizard.apply_damage(25, BRUTE) - qdel(src) - else - U.client.give_award(/datum/award/achievement/misc/feat_of_strength, U) //rod-form wizards would probably make this a lot easier to get so keep it to regular rods only - U.visible_message(span_boldwarning("[U] suplexes [src] into the ground!"), span_warning("I suplex [src] into the ground!")) - new /obj/structure/festivus/anchored(drop_location()) - new /obj/effect/anomaly/flux(drop_location()) - qdel(src) diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm deleted file mode 100644 index 7fb00124a94..00000000000 --- a/code/modules/events/major_dust.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/round_event_control/meteor_wave/major_dust - name = "Major Space Dust" - typepath = /datum/round_event/meteor_wave/major_dust - weight = 8 - -/datum/round_event/meteor_wave/major_dust - wave_name = "space dust" - -/datum/round_event/meteor_wave/major_dust/announce(fake) - var/reason = pick( - "The station is passing through a debris cloud, expect minor damage \ - to external fittings and fixtures.", - "Nanotrasen Superweapons Division is testing a new prototype \ - [pick("field","projection","nova","super-colliding","reactive")] \ - [pick("cannon","artillery","tank","cruiser","\[REDACTED\]")], \ - some mild debris is expected.", - "A neighbouring station is throwing rocks at you. (Perhaps they've \ - grown tired of your messages.)") - priority_announce(pick(reason), "Collision Alert") diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm deleted file mode 100644 index b5b9eeb0aaa..00000000000 --- a/code/modules/events/meateor_wave.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/round_event_control/meteor_wave/meaty - name = "Meteor Wave: Meaty" - typepath = /datum/round_event/meteor_wave/meaty - weight = 2 - max_occurrences = 1 - -/datum/round_event/meteor_wave/meaty - wave_name = "meaty" - -/datum/round_event/meteor_wave/meaty/announce(fake) - priority_announce("Meaty ores have been detected on collision course with the station.", "Oh crap, get the mop.",'sound/blank.ogg') diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm deleted file mode 100644 index 503d7ce1534..00000000000 --- a/code/modules/events/meteor_wave.dm +++ /dev/null @@ -1,71 +0,0 @@ -// Normal strength - -/datum/round_event_control/meteor_wave - name = "Meteor Wave: Normal" - typepath = /datum/round_event/meteor_wave - weight = 4 - min_players = 15 - max_occurrences = 3 - earliest_start = 25 MINUTES - -/datum/round_event/meteor_wave - startWhen = 6 - endWhen = 66 - announceWhen = 1 - var/list/wave_type - var/wave_name = "normal" - -/datum/round_event/meteor_wave/New() - ..() - if(!wave_type) - determine_wave_type() - -/datum/round_event/meteor_wave/proc/determine_wave_type() - if(!wave_name) - wave_name = pickweight(list( - "normal" = 50, - "threatening" = 40, - "catastrophic" = 10)) - switch(wave_name) - if("normal") - wave_type = GLOB.meteors_normal - if("threatening") - wave_type = GLOB.meteors_threatening - if("catastrophic") - wave_type = GLOB.meteors_catastrophic - if("meaty") - wave_type = GLOB.meteorsB - if("space dust") - wave_type = GLOB.meteorsC - else - WARNING("Wave name of [wave_name] not recognised.") - kill() - -/datum/round_event/meteor_wave/announce(fake) - priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/blank.ogg') - -/datum/round_event/meteor_wave/tick() - if(ISMULTIPLE(activeFor, 3)) - spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm - -/datum/round_event_control/meteor_wave/threatening - name = "Meteor Wave: Threatening" - typepath = /datum/round_event/meteor_wave/threatening - weight = 5 - min_players = 20 - max_occurrences = 3 - earliest_start = 35 MINUTES - -/datum/round_event/meteor_wave/threatening - wave_name = "threatening" - -/datum/round_event_control/meteor_wave/catastrophic - name = "Meteor Wave: Catastrophic" - typepath = /datum/round_event/meteor_wave/catastrophic - weight = 7 - min_players = 25 - max_occurrences = 3 - earliest_start = 45 MINUTES - -/datum/round_event/meteor_wave/catastrophic - wave_name = "catastrophic" diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm deleted file mode 100644 index 5da52d6fc03..00000000000 --- a/code/modules/events/nightmare.dm +++ /dev/null @@ -1,43 +0,0 @@ -/datum/round_event_control/nightmare - name = "Spawn Nightmare" - typepath = /datum/round_event/ghost_role/nightmare - max_occurrences = 1 - min_players = 20 - -/datum/round_event/ghost_role/nightmare - minimum_required = 1 - role_name = "nightmare" - fakeable = FALSE - -/datum/round_event/ghost_role/nightmare/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - - var/list/spawn_locs = list() - for(var/X in GLOB.xeno_spawn) - var/turf/T = X - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - spawn_locs += T - - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/mob/living/carbon/human/S = new ((pick(spawn_locs))) - player_mind.transfer_to(S) - player_mind.assigned_role = "Nightmare" - player_mind.special_role = "Nightmare" - player_mind.add_antag_datum(/datum/antagonist/nightmare) - S.set_species(/datum/species/shadow/nightmare) - playsound(S, 'sound/blank.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by an event.") - log_game("[key_name(S)] was spawned as a Nightmare by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm deleted file mode 100644 index 7cb39576f07..00000000000 --- a/code/modules/events/sentience.dm +++ /dev/null @@ -1,112 +0,0 @@ -GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( - /mob/living/simple_animal/pet, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/hostile/lizard, - /mob/living/simple_animal/sloth, - /mob/living/simple_animal/mouse/brown/Tom, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/chicken, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/retaliate/bat, - /mob/living/simple_animal/hostile/carp/cayenne, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/hostile/retaliate/poison/snake, - /mob/living/simple_animal/hostile/retaliate/goose/vomit, - /mob/living/simple_animal/bot/mulebot, - /mob/living/simple_animal/bot/secbot/beepsky -))) - -/datum/round_event_control/sentience - name = "Random Human-level Intelligence" - typepath = /datum/round_event/ghost_role/sentience - weight = 10 - - -/datum/round_event/ghost_role/sentience - minimum_required = 1 - role_name = "random animal" - var/animals = 1 - var/one = "one" - fakeable = TRUE - -/datum/round_event/ghost_role/sentience/announce(fake) - var/sentience_report = "" - - var/data = pick("scans from our long-range sensors", "our sophisticated probabilistic models", "our omnipotence", "the communications traffic on your station", "energy emissions we detected", "\[REDACTED\]") - var/pets = pick("animals/bots", "bots/animals", "pets", "simple animals", "lesser lifeforms", "\[REDACTED\]") - var/strength = pick("human", "moderate", "lizard", "security", "command", "clown", "low", "very low", "\[REDACTED\]") - - sentience_report += "Based on [data], we believe that [one] of the station's [pets] has developed [strength] level intelligence, and the ability to communicate." - - priority_announce(sentience_report,"[command_name()] Medium-Priority Update") - -/datum/round_event/ghost_role/sentience/spawn_role() - var/list/mob/dead/observer/candidates - candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - - // find our chosen mob to breathe life into - // Mobs have to be simple animals, mindless, on station, and NOT holograms. - // prioritize starter animals that people will recognise - - - var/list/potential = list() - - var/list/hi_pri = list() - var/list/low_pri = list() - - for(var/mob/living/simple_animal/L in GLOB.alive_mob_list) - var/turf/T = get_turf(L) - if(!T || !is_station_level(T.z)) - continue - if((L in GLOB.player_list) || L.mind || (L.flags_1 & HOLOGRAM_1)) - continue - if(is_type_in_typecache(L, GLOB.high_priority_sentience)) - hi_pri += L - else - low_pri += L - - shuffle_inplace(hi_pri) - shuffle_inplace(low_pri) - - potential = hi_pri + low_pri - - if(!potential.len) - return WAITING_FOR_SOMETHING - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/spawned_animals = 0 - while(spawned_animals < animals && candidates.len && potential.len) - var/mob/living/simple_animal/SA = popleft(potential) - var/mob/dead/observer/SG = pick_n_take(candidates) - - spawned_animals++ - - SA.key = SG.key - - SA.grant_all_languages(TRUE) - - SA.sentience_act() - - SA.maxHealth = max(SA.maxHealth, 200) - SA.health = SA.maxHealth - SA.del_on_death = FALSE - - spawned_mobs += SA - - to_chat(SA, span_danger("Hello world!")) - to_chat(SA, "Due to freak radiation and/or chemicals \ - and/or lucky chance, you have gained human level intelligence \ - and the ability to speak and understand human language!") - - return SUCCESSFUL_SPAWN - -/datum/round_event_control/sentience/all - name = "Station-wide Human-level Intelligence" - typepath = /datum/round_event/ghost_role/sentience/all - weight = 0 - -/datum/round_event/ghost_role/sentience/all - one = "all" - animals = INFINITY // as many as there are ghosts and animals - // cockroach pride, station wide diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm deleted file mode 100644 index d1315856d92..00000000000 --- a/code/modules/events/space_dragon.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/round_event_control/space_dragon - name = "Spawn Space Dragon" - typepath = /datum/round_event/ghost_role/space_dragon - max_occurrences = 1 - weight = 8 - earliest_start = 70 MINUTES - min_players = 20 - -/datum/round_event/ghost_role/space_dragon - minimum_required = 1 - role_name = "Space Dragon" - announceWhen = 10 - -/datum/round_event/ghost_role/space_dragon/announce(fake) - priority_announce("It appears a lifeform with magical traces is approaching [station_name()], please stand-by.", "Lifesign Alert") - -/datum/round_event/ghost_role/space_dragon/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) - spawn_locs += (C.loc) - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/dragon/space_dragon/S = new ((pick(spawn_locs))) - player_mind.transfer_to(S) - player_mind.assigned_role = "Space Dragon" - player_mind.special_role = "Space Dragon" - player_mind.add_antag_datum(/datum/antagonist/space_dragon) - playsound(S, 'sound/blank.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by an event.") - log_game("[key_name(S)] was spawned as a Space Dragon by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN - diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 7fdca3bd677..a0954387c5f 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -408,9 +408,6 @@ SM.on_hit(src, user) user_unbuckle_mob(user,user) -/obj/structure/spacevine/attack_alien(mob/living/user) - eat(user) - /datum/spacevine_controller var/list/obj/structure/spacevine/vines var/obj/structure/flora/roguetree/evil/tree diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index e007c9c0d4c..0614fefdb57 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -177,8 +177,6 @@ gibtype = C.gib_type if(ismonkey(C)) typeofskin = /obj/item/stack/sheet/animalhide/monkey - else if(isalien(C)) - typeofskin = /obj/item/stack/sheet/animalhide/xeno var/occupant_volume if(occupant?.reagents) occupant_volume = occupant.reagents.total_volume diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 2fd6087dfa8..5fd6aa2e74c 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -18,7 +18,7 @@ //if they are holding or wearing a card that has access, that works if(check_access(H.get_active_held_item()) || src.check_access(H.wear_ring)) return TRUE - else if(ismonkey(M) || isalienadult(M)) + else if(ismonkey(M)) var/mob/living/carbon/george = M //they can only hold things :( if(check_access(george.get_active_held_item())) diff --git a/code/modules/jobs/job_types/old/cargo_technician.dm b/code/modules/jobs/job_types/old/cargo_technician.dm index 3eb1dfcfd72..fd4144716ff 100644 --- a/code/modules/jobs/job_types/old/cargo_technician.dm +++ b/code/modules/jobs/job_types/old/cargo_technician.dm @@ -25,5 +25,3 @@ belt = /obj/item/pda/cargo ears = /obj/item/radio/headset/headset_cargo uniform = /obj/item/clothing/under/rank/cargo/tech - l_hand = /obj/item/export_scanner - diff --git a/code/modules/mining/equipment/vendor_items.dm b/code/modules/mining/equipment/vendor_items.dm deleted file mode 100644 index f4e57ab5b9d..00000000000 --- a/code/modules/mining/equipment/vendor_items.dm +++ /dev/null @@ -1,14 +0,0 @@ -/**********************Mining Equipment Vendor Items**************************/ -//misc stuff you can buy from the vendor that has special code but doesn't really need its own file - -/**********************Facehugger toy**********************/ -/obj/item/clothing/mask/facehugger/toy - item_state = "facehugger_inactive" - desc = "" - throwforce = 0 - real = 0 - sterile = 1 - tint = 3 //Makes it feel more authentic when it latches on - -/obj/item/clothing/mask/facehugger/toy/Die() - return diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 603bb64ea52..f894f794816 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -18,7 +18,6 @@ new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), - new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400), new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 914a2e22720..ab2a10bc3bf 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -93,12 +93,7 @@ /mob/living/proc/bloodcrawl_consume(mob/living/victim) to_chat(src, span_danger("I begin to feast on [victim]... You can not move while you are doing this.")) - var/sound - if(istype(src, /mob/living/simple_animal/slaughter)) - var/mob/living/simple_animal/slaughter/SD = src - sound = SD.feast_sound - else - sound = 'sound/blank.ogg' + var/sound = 'sound/blank.ogg' for(var/i in 1 to 3) playsound(get_turf(src),sound, 50, TRUE) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm deleted file mode 100644 index a519b575e68..00000000000 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ /dev/null @@ -1,150 +0,0 @@ -/mob/living/carbon/alien - name = "alien" - icon = 'icons/mob/alien.dmi' - gender = FEMALE //All xenos are girls!! - dna = null - faction = list(ROLE_ALIEN) - ventcrawler = VENTCRAWLER_ALWAYS - sight = SEE_MOBS - see_in_dark = 4 - verb_say = "hisses" - initial_language_holder = /datum/language_holder/alien - bubble_icon = "alien" - type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno - - var/obj/item/card/id/wear_ring = null // Fix for station bounced radios -- Skie - var/has_fine_manipulation = 0 - var/move_delay_add = 0 // movement delay to add - - status_flags = CANUNCONSCIOUS|CANPUSH - - var/heat_protection = 0.5 - var/leaping = 0 - gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs - unique_name = 1 - - var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?") - -/mob/living/carbon/alien/Initialize() - verbs += /mob/living/proc/mob_sleep - verbs += /mob/living/proc/lay_down - - create_bodyparts() //initialize bodyparts - - create_internal_organs() - - . = ..() - -/mob/living/carbon/alien/create_internal_organs() - internal_organs += new /obj/item/organ/brain/alien - internal_organs += new /obj/item/organ/alien/hivenode - internal_organs += new /obj/item/organ/tongue/alien - internal_organs += new /obj/item/organ/eyes/night_vision/alien - internal_organs += new /obj/item/organ/liver/alien - internal_organs += new /obj/item/organ/ears - ..() - -/mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums - return -10 - -/mob/living/carbon/alien/handle_environment(datum/gas_mixture/environment) - if(!environment) - return - - var/loc_temp = get_temperature(environment) - - // Aliens are now weak to fire. - - //After then, it reacts to the surrounding atmosphere based on your thermal protection - if(!on_fire) // If you're on fire, ignore local air temperature - if(loc_temp > bodytemperature) - //Place is hotter than we are - var/thermal_protection = heat_protection //This returns a 0 - 1 value, which corresponds to the percentage of heat protection. - if(thermal_protection < 1) - adjust_bodytemperature((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR)) - else - adjust_bodytemperature(1 * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR)) - - if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) - //Body temperature is too hot. - throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire) - switch(bodytemperature) - if(360 to 400) - apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) - if(400 to 460) - apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) - if(460 to INFINITY) - if(on_fire) - apply_damage(HEAT_DAMAGE_LEVEL_3, BURN) - else - apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) - else - clear_alert("alien_fire") - -/mob/living/carbon/alien/reagent_check(datum/reagent/R) //can metabolize all reagents - return 0 - -/mob/living/carbon/alien/IsAdvancedToolUser() - return has_fine_manipulation - -/mob/living/carbon/alien/Stat() - ..() - - if(statpanel("Status")) - stat(null, "Intent: [a_intent]") - -/mob/living/carbon/alien/getTrail() - if(getBruteLoss() < 200) - return pick (list("xltrails_1", "xltrails2")) - else - return pick (list("xttrails_1", "xttrails2")) -/*---------------------------------------- -Proc: AddInfectionImages() -Des: Gives the client of the alien an image on each infected mob. -----------------------------------------*/ -/mob/living/carbon/alien/proc/AddInfectionImages() - if (client) - for (var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(HAS_TRAIT(L, TRAIT_XENO_HOST)) - var/obj/item/organ/body_egg/alien_embryo/A = L.getorgan(/obj/item/organ/body_egg/alien_embryo) - if(A) - var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[A.stage]") - client.images += I - return - - -/*---------------------------------------- -Proc: RemoveInfectionImages() -Des: Removes all infected images from the alien. -----------------------------------------*/ -/mob/living/carbon/alien/proc/RemoveInfectionImages() - if (client) - for(var/image/I in client.images) - if(dd_hasprefix_case(I.icon_state, "infected")) - qdel(I) - return - -/mob/living/carbon/alien/canBeHandcuffed() - return 1 - -/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0) - return initial(pixel_y) - -/mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno) - to_chat(src, span_noticealien("I begin to evolve!")) - visible_message(span_alertalien("[src] begins to twist and contort!")) - new_xeno.setDir(dir) - if(!alien_name_regex.Find(name)) - new_xeno.name = name - new_xeno.real_name = real_name - if(mind) - mind.transfer_to(new_xeno) - var/datum/component/nanites/nanites = GetComponent(/datum/component/nanites) - if(nanites) - new_xeno.AddComponent(/datum/component/nanites, nanites.nanite_volume) - SEND_SIGNAL(new_xeno, COMSIG_NANITE_SYNC, nanites) - qdel(src) - -/mob/living/carbon/alien/can_hold_items() - return has_fine_manipulation diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm deleted file mode 100644 index c1efb53f33e..00000000000 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ /dev/null @@ -1,129 +0,0 @@ - -/mob/living/carbon/alien/get_eye_protection() - return ..() + 2 //potential cyber implants + natural eye protection - -/mob/living/carbon/alien/get_ear_protection() - return 2 //no ears - -/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum, d_type = "blunt") - ..(AM, skipcatch = TRUE, hitpush = FALSE) - - -/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. -As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble. -In all, this is a lot like the monkey code. /N -*/ -/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M) - if(isturf(loc) && istype(loc.loc, /area/start)) - to_chat(M, "No attacking people at spawn, you jackass.") - return - - switch(M.used_intent.type) - - if (INTENT_HELP) - set_resting(FALSE) - AdjustStun(-60) - AdjustKnockdown(-60) - AdjustImmobilized(-60) - AdjustParalyzed(-60) - AdjustUnconscious(-60) - AdjustSleeping(-100) - visible_message(span_notice("[M.name] nuzzles [src] trying to wake [p_them()] up!")) - - if (INTENT_GRAB) - grabbedby(M) - - else - if(health > 0) - M.do_attack_animation(src, ATTACK_EFFECT_BITE) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - visible_message(span_danger("[M.name] bites [src]!"), \ - span_danger("[M.name] bites you!"), span_hear("I hear a chomp!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I bite [src]!")) - adjustBruteLoss(1) - log_combat(M, src, "attacked") - updatehealth() - else - to_chat(M, span_warning("[name] is too injured for that.")) - - -/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L) - return attack_alien(L) - - -/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M) - if(..()) //to allow surgery to return properly. - return 0 - - switch(M.used_intent.type) - if(INTENT_HELP) - help_shake_act(M) - if(INTENT_GRAB) - grabbedby(M) - if (INTENT_HARM) - M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - return 1 - if(INTENT_DISARM) - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return 1 - return 0 - - -/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M) - if(..()) - if (stat != DEAD) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(rand(1, 3), BRUTE, affecting) - - -/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M) - . = ..() - if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - switch(M.melee_damage_type) - if(BRUTE) - adjustBruteLoss(damage) - if(BURN) - adjustFireLoss(damage) - if(TOX) - adjustToxLoss(damage) - if(OXY) - adjustOxyLoss(damage) - if(CLONE) - adjustCloneLoss(damage) - if(STAMINA) - adjustStaminaLoss(damage) - -/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(10, 40) - adjustBruteLoss(damage) - log_combat(M, src, "attacked") - updatehealth() - -/mob/living/carbon/alien/ex_act(severity, target, origin) - if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) - return - ..() - switch (severity) - if (EXPLODE_DEVASTATE) - gib() - return - - if (EXPLODE_HEAVY) - take_overall_damage(60, 60) - adjustEarDamage(30,120) - - if(EXPLODE_LIGHT) - take_overall_damage(30,0) - if(prob(50)) - Unconscious(20) - adjustEarDamage(15,60) - -/mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) - return 0 - -/mob/living/carbon/alien/acid_act(acidpwr, acid_volume) - return 0//aliens are immune to acid. diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm deleted file mode 100644 index 452b162da21..00000000000 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ /dev/null @@ -1,13 +0,0 @@ - -/mob/living/carbon/alien/getToxLoss() - return 0 - -/mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) //alien immune to tox damage - return FALSE - -//aliens are immune to stamina damage. -/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE) - return - -/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1) - return diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm deleted file mode 100644 index 718186c9078..00000000000 --- a/code/modules/mob/living/carbon/alien/death.dm +++ /dev/null @@ -1,14 +0,0 @@ -/mob/living/carbon/alien/spawn_gibs(with_bodyparts) - if(with_bodyparts) - new /obj/effect/gibspawner/xeno(drop_location(), src) - else - new /obj/effect/gibspawner/xeno/bodypartless(drop_location(), src) - -/mob/living/carbon/alien/gib_animation() - new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a") - -/mob/living/carbon/alien/spawn_dust() - new /obj/effect/decal/remains/xeno(loc) - -/mob/living/carbon/alien/dust_animation() - new /obj/effect/temp_visual/dust_animation(loc, "dust-a") diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm deleted file mode 100644 index 95bb95b04d7..00000000000 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/emote/living/alien - mob_type_allowed_typecache = list(/mob/living/carbon/alien) - -/datum/emote/living/alien/gnarl - key = "gnarl" - key_third_person = "gnarls" - message = "gnarls and shows its teeth..." - -/datum/emote/living/alien/hiss - key = "hiss" - key_third_person = "hisses" - message_alien = "hisses." - message_larva = "hisses softly." - -/datum/emote/living/alien/hiss/get_sound(mob/living/user) - if(isalienadult(user)) - return "hiss" - -/datum/emote/living/alien/roar - key = "roar" - key_third_person = "roars" - message_alien = "roars." - message_larva = "softly roars." - emote_type = EMOTE_AUDIBLE - vary = TRUE - -/datum/emote/living/alien/roar/get_sound(mob/living/user) - if(isalienadult(user)) - return 'sound/blank.ogg' diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm deleted file mode 100644 index e3f428cd91c..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ /dev/null @@ -1,336 +0,0 @@ -/*NOTES: -These are general powers. Specific powers are stored under the appropriate alien creature type. -*/ - -/*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit. -Doesn't work on other aliens/AI.*/ - - -/obj/effect/proc_holder/alien - name = "Alien Power" - panel = "Alien" - var/plasma_cost = 0 - var/check_turf = FALSE - has_action = TRUE - base_action = /datum/action/spell_action/alien - action_icon = 'icons/mob/actions/actions_xeno.dmi' - action_icon_state = "spell_default" - action_background_icon_state = "bg_alien" - -/obj/effect/proc_holder/alien/Initialize() - . = ..() - action = new(src) - -/obj/effect/proc_holder/alien/Click() - if(!iscarbon(usr)) - return 1 - var/mob/living/carbon/user = usr - if(cost_check(check_turf,user)) - if(fire(user) && user) // Second check to prevent runtimes when evolving - user.adjustPlasma(-plasma_cost) - return 1 - -/obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user) - return - -/obj/effect/proc_holder/alien/on_lose(mob/living/carbon/user) - return - -/obj/effect/proc_holder/alien/fire(mob/living/carbon/user) - return 1 - -/obj/effect/proc_holder/alien/get_panel_text() - . = ..() - if(plasma_cost > 0) - return "[plasma_cost]" - -/obj/effect/proc_holder/alien/proc/cost_check(check_turf = FALSE, mob/living/carbon/user, silent = FALSE) - if(user.stat) - if(!silent) - to_chat(user, span_noticealien("I must be conscious to do this.")) - return FALSE - if(user.getPlasma() < plasma_cost) - if(!silent) - to_chat(user, span_noticealien("Not enough plasma stored.")) - return FALSE - if(check_turf && (!isturf(user.loc) || isspaceturf(user.loc))) - if(!silent) - to_chat(user, span_noticealien("Bad place for a garden!")) - return FALSE - return TRUE - -/obj/effect/proc_holder/alien/proc/check_vent_block(mob/living/user) - var/obj/machinery/atmospherics/components/unary/atmos_thing = locate() in user.loc - if(atmos_thing) - var/rusure = alert(user, "Laying eggs and shaping resin here would block access to [atmos_thing]. Do you want to continue?", "Blocking Atmospheric Component", "Yes", "No") - if(rusure != "Yes") - return FALSE - return TRUE - -/obj/effect/proc_holder/alien/plant - name = "Plant Weeds" - desc = "" - plasma_cost = 50 - check_turf = TRUE - action_icon_state = "alien_plant" - -/obj/effect/proc_holder/alien/plant/fire(mob/living/carbon/user) - if(locate(/obj/structure/alien/weeds/node) in get_turf(user)) - to_chat(user, span_warning("There's already a weed node here!")) - return 0 - user.visible_message(span_alertalien("[user] has planted some alien weeds!")) - new/obj/structure/alien/weeds/node(user.loc) - return 1 - -/obj/effect/proc_holder/alien/whisper - name = "Whisper" - desc = "" - plasma_cost = 10 - action_icon_state = "alien_whisper" - -/obj/effect/proc_holder/alien/whisper/fire(mob/living/carbon/user) - var/list/options = list() - for(var/mob/living/Ms in oview(user)) - options += Ms - var/mob/living/M = input("Select who to whisper to:","Whisper to?",null) as null|mob in sortNames(options) - if(!M) - return 0 - if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) - to_chat(user, span_noticealien("As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.")) - return FALSE - var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) - if(msg) - if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) - to_chat(user, span_notice("As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.")) - return - log_directed_talk(user, M, msg, LOG_SAY, tag="alien whisper") - to_chat(M, "I hear a strange, alien voice in your head...[msg]") - to_chat(user, span_noticealien("I said: \"[msg]\" to [M]")) - for(var/ded in GLOB.dead_mob_list) - if(!isobserver(ded)) - continue - var/follow_link_user = FOLLOW_LINK(ded, user) - var/follow_link_whispee = FOLLOW_LINK(ded, M) - to_chat(ded, "[follow_link_user] [user] Alien Whisper --> [follow_link_whispee] [M] [msg]") - else - return 0 - return 1 - -/obj/effect/proc_holder/alien/transfer - name = "Transfer Plasma" - desc = "" - plasma_cost = 0 - action_icon_state = "alien_transfer" - -/obj/effect/proc_holder/alien/transfer/fire(mob/living/carbon/user) - var/list/mob/living/carbon/aliens_around = list() - for(var/mob/living/carbon/A in oview(user)) - if(A.getorgan(/obj/item/organ/alien/plasmavessel)) - aliens_around.Add(A) - var/mob/living/carbon/M = input("Select who to transfer to:","Transfer plasma to?",null) as mob in sortNames(aliens_around) - if(!M) - return 0 - var/amount = input("Amount:", "Transfer Plasma to [M]") as num|null - if (amount) - amount = min(abs(round(amount)), user.getPlasma()) - if (get_dist(user,M) <= 1) - M.adjustPlasma(amount) - user.adjustPlasma(-amount) - to_chat(M, span_noticealien("[user] has transferred [amount] plasma to you.")) - to_chat(user, span_noticealien("I transfer [amount] plasma to [M].")) - else - to_chat(user, span_noticealien("I need to be closer!")) - return - -/obj/effect/proc_holder/alien/acid - name = "Corrosive Acid" - desc = "" - plasma_cost = 200 - action_icon_state = "alien_acid" - -/obj/effect/proc_holder/alien/acid/on_gain(mob/living/carbon/user) - user.verbs.Add(/mob/living/carbon/proc/corrosive_acid) - -/obj/effect/proc_holder/alien/acid/on_lose(mob/living/carbon/user) - user.verbs.Remove(/mob/living/carbon/proc/corrosive_acid) - -/obj/effect/proc_holder/alien/acid/proc/corrode(atom/target,mob/living/carbon/user = usr) - if(target in oview(1,user)) - if(target.acid_act(200, 100)) - user.visible_message(span_alertalien("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!")) - return 1 - else - to_chat(user, span_noticealien("I cannot dissolve this object.")) - - - return 0 - else - to_chat(src, span_noticealien("[target] is too far away.")) - return 0 - - -/obj/effect/proc_holder/alien/acid/fire(mob/living/carbon/alien/user) - var/O = input("Select what to dissolve:","Dissolve",null) as obj|turf in oview(1,user) - if(!O || user.incapacitated()) - return 0 - else - return corrode(O,user) - -/mob/living/carbon/proc/corrosive_acid(O as obj|turf in oview(1)) // right click menu verb ugh - set name = "Corrosive Acid" - - if(!iscarbon(usr)) - return - var/mob/living/carbon/user = usr - var/obj/effect/proc_holder/alien/acid/A = locate() in user.abilities - if(!A) - return - if(user.getPlasma() > A.plasma_cost && A.corrode(O)) - user.adjustPlasma(-A.plasma_cost) - -/obj/effect/proc_holder/alien/neurotoxin - name = "Spit Neurotoxin" - desc = "" - action_icon_state = "alien_neurotoxin_0" - active = FALSE - -/obj/effect/proc_holder/alien/neurotoxin/fire(mob/living/carbon/user) - var/message - if(active) - message = span_notice("I empty your neurotoxin gland.") - remove_ranged_ability(message) - else - message = span_notice("I prepare your neurotoxin gland. Left-click to fire at a target!") - add_ranged_ability(user, message, TRUE) - -/obj/effect/proc_holder/alien/neurotoxin/update_icon() - action.button_icon_state = "alien_neurotoxin_[active]" - action.UpdateButtonIcon() - -/obj/effect/proc_holder/alien/neurotoxin/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return - var/p_cost = 50 - if(!iscarbon(ranged_ability_user) || ranged_ability_user.stat) - remove_ranged_ability() - return - - var/mob/living/carbon/user = ranged_ability_user - - if(user.getPlasma() < p_cost) - to_chat(user, span_warning("I need at least [p_cost] plasma to spit.")) - remove_ranged_ability() - return - - var/turf/T = user.loc - var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction - if(!isturf(U) || !isturf(T)) - return FALSE - - user.visible_message(span_danger("[user] spits neurotoxin!"), span_alertalien("I spit neurotoxin.")) - var/obj/projectile/bullet/neurotoxin/A = new /obj/projectile/bullet/neurotoxin(user.loc) - A.preparePixelProjectile(target, user, params) - A.fire() - user.newtonian_move(get_dir(U, T)) - user.adjustPlasma(-p_cost) - - return TRUE - -/obj/effect/proc_holder/alien/neurotoxin/on_lose(mob/living/carbon/user) - remove_ranged_ability() - -/obj/effect/proc_holder/alien/neurotoxin/add_ranged_ability(mob/living/user,msg,forced) - ..() - if(isalienadult(user)) - var/mob/living/carbon/alien/humanoid/A = user - A.drooling = 1 - A.update_icons() - -/obj/effect/proc_holder/alien/neurotoxin/remove_ranged_ability(msg) - if(isalienadult(ranged_ability_user)) - var/mob/living/carbon/alien/humanoid/A = ranged_ability_user - A.drooling = 0 - A.update_icons() - ..() - -/obj/effect/proc_holder/alien/resin - name = "Secrete Resin" - desc = "" - plasma_cost = 55 - check_turf = TRUE - var/list/structures = list( - "resin wall" = /obj/structure/alien/resin/wall, - "resin membrane" = /obj/structure/alien/resin/membrane, - "resin nest" = /obj/structure/bed/nest) - - action_icon_state = "alien_resin" - -/obj/effect/proc_holder/alien/resin/fire(mob/living/carbon/user) - if(locate(/obj/structure/alien/resin) in user.loc) - to_chat(user, span_warning("There is already a resin structure there!")) - return FALSE - - if(!check_vent_block(user)) - return FALSE - - var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in structures - if(!choice) - return FALSE - if (!cost_check(check_turf,user)) - return FALSE - to_chat(user, span_notice("I shape a [choice].")) - user.visible_message(span_notice("[user] vomits up a thick purple substance and begins to shape it.")) - - choice = structures[choice] - new choice(user.loc) - return TRUE - -/obj/effect/proc_holder/alien/sneak - name = "Sneak" - desc = "" - active = 0 - - action_icon_state = "alien_sneak" - -/obj/effect/proc_holder/alien/sneak/fire(mob/living/carbon/alien/humanoid/user) - if(!active) - user.alpha = 75 //Still easy to see in lit areas with bright tiles, almost invisible on resin. - user.sneaking = 1 - active = 1 - to_chat(user, span_noticealien("I blend into the shadows...")) - else - user.alpha = initial(user.alpha) - user.sneaking = 0 - active = 0 - to_chat(user, span_noticealien("I reveal yourself!")) - - -/mob/living/carbon/proc/getPlasma() - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) - if(!vessel) - return 0 - return vessel.storedPlasma - - -/mob/living/carbon/proc/adjustPlasma(amount) - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) - if(!vessel) - return 0 - vessel.storedPlasma = max(vessel.storedPlasma + amount,0) - vessel.storedPlasma = min(vessel.storedPlasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0 - for(var/X in abilities) - var/obj/effect/proc_holder/alien/APH = X - if(APH.has_action) - APH.action.UpdateButtonIcon() - return 1 - -/mob/living/carbon/alien/adjustPlasma(amount) - . = ..() - updatePlasmaDisplay() - -/mob/living/carbon/proc/usePlasma(amount) - if(getPlasma() >= amount) - adjustPlasma(-amount) - return 1 - - return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm deleted file mode 100644 index 65d4ff1c881..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ /dev/null @@ -1,43 +0,0 @@ -/mob/living/carbon/alien/humanoid/drone - name = "alien drone" - caste = "d" - maxHealth = 125 - health = 125 - icon_state = "aliend" - -/mob/living/carbon/alien/humanoid/drone/Initialize() - AddAbility(new/obj/effect/proc_holder/alien/evolve(null)) - . = ..() - -/mob/living/carbon/alien/humanoid/drone/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid - ..() - -/obj/effect/proc_holder/alien/evolve - name = "Evolve to Praetorian" - desc = "" - plasma_cost = 500 - - action_icon_state = "alien_evolve_drone" - -/obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/humanoid/user) - var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode) - if(!node) //Players are Murphy's Law. We may not expect there to ever be a living xeno with no hivenode, but they _WILL_ make it happen. - to_chat(user, span_danger("Without the hivemind, you can't possibly hold the responsibility of leadership!")) - return 0 - if(node.recent_queen_death) - to_chat(user, span_danger("My thoughts are still too scattered to take up the position of leadership.")) - return 0 - - if(!isturf(user.loc)) - to_chat(user, span_warning("I can't evolve here!")) - return 0 - if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal)) - var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc) - user.alien_evolve(new_xeno) - return 1 - else - to_chat(user, span_warning("We already have a living royal!")) - return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm deleted file mode 100644 index 7d857e83eee..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ /dev/null @@ -1,95 +0,0 @@ -/mob/living/carbon/alien/humanoid/hunter - name = "alien hunter" - caste = "h" - maxHealth = 125 - health = 125 - icon_state = "alienh" - var/atom/movable/screen/leap_icon = null - -/mob/living/carbon/alien/humanoid/hunter/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/small - ..() - -//Hunter verbs - -/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = 1) - leap_on_click = !leap_on_click - leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]" - update_icons() - if(message) - to_chat(src, span_noticealien("I will now [leap_on_click ? "leap at":"slash at"] enemies!")) - else - return - -/mob/living/carbon/alien/humanoid/hunter/ClickOn(atom/A, params) - face_atom(A) - if(leap_on_click) - leap_at(A) - else - ..() - -#define MAX_ALIEN_LEAP_DIST 7 - -/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A) - if((mobility_flags & (MOBILITY_MOVE | MOBILITY_STAND)) != (MOBILITY_MOVE | MOBILITY_STAND) || leaping) - return - - if(pounce_cooldown > world.time) - to_chat(src, span_alertalien("I are too fatigued to pounce right now!")) - return - - if(!has_gravity() || !A.has_gravity()) - to_chat(src, span_alertalien("It is unsafe to leap without gravity!")) - //It's also extremely buggy visually, so it's balance+bugfix - return - - else //Maybe uses plasma in the future, although that wouldn't make any sense... - leaping = 1 - weather_immunities += "lava" - update_icons() - throw_at(A, MAX_ALIEN_LEAP_DIST, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end))) - -/mob/living/carbon/alien/humanoid/hunter/proc/leap_end() - leaping = 0 - weather_immunities -= "lava" - update_icons() - -/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - - if(!leaping) - return ..() - - pounce_cooldown = world.time + pounce_cooldown_time - if(hit_atom) - if(isliving(hit_atom)) - var/mob/living/L = hit_atom - var/blocked = FALSE - if(ishuman(hit_atom)) - var/mob/living/carbon/human/H = hit_atom - if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK)) - blocked = TRUE - if(!blocked) - L.visible_message(span_danger("[src] pounces on [L]!"), span_danger("[src] pounces on you!")) - L.Paralyze(100) - sleep(2)//Runtime prevention (infinite bump() calls on hulks) - step_towards(src,L) - else - Paralyze(40, 1, 1) - - toggle_leap(0) - else if(hit_atom.density && !hit_atom.CanPass(src)) - visible_message(span_danger("[src] smashes into [hit_atom]!"), span_alertalien("[src] smashes into [hit_atom]!")) - Paralyze(40, 1, 1) - - if(leaping) - leaping = FALSE - update_icons() - update_mobility() - - -/mob/living/carbon/alien/humanoid/float(on) - if(leaping) - return - ..() - - diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm deleted file mode 100644 index eedcbc6b3f0..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ /dev/null @@ -1,42 +0,0 @@ -/mob/living/carbon/alien/humanoid/royal/praetorian - name = "alien praetorian" - caste = "p" - maxHealth = 250 - health = 250 - icon_state = "alienp" - -/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize() - real_name = name - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) - AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve()) - . = ..() - -/mob/living/carbon/alien/humanoid/royal/praetorian/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin - ..() - -/obj/effect/proc_holder/alien/royal/praetorian/evolve - name = "Evolve" - desc = "" - plasma_cost = 500 - - action_icon_state = "alien_evolve_praetorian" - -/obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/humanoid/user) - var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode) - if(!node) //Just in case this particular Praetorian gets violated and kept by the RD as a replacement for Lamarr. - to_chat(user, span_warning("Without the hivemind, you would be unfit to rule as queen!")) - return 0 - if(node.recent_queen_death) - to_chat(user, span_warning("I are still too burdened with guilt to evolve into a queen.")) - return 0 - if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen)) - var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc) - user.alien_evolve(new_xeno) - return 1 - else - to_chat(user, span_warning("We already have an alive queen!")) - return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm deleted file mode 100644 index 7c6443cfae7..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ /dev/null @@ -1,16 +0,0 @@ -/mob/living/carbon/alien/humanoid/sentinel - name = "alien sentinel" - caste = "s" - maxHealth = 150 - health = 150 - icon_state = "aliens" - -/mob/living/carbon/alien/humanoid/sentinel/Initialize() - AddAbility(new /obj/effect/proc_holder/alien/sneak) - . = ..() - -/mob/living/carbon/alien/humanoid/sentinel/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin - ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm deleted file mode 100644 index a70600b81ef..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/death.dm +++ /dev/null @@ -1,22 +0,0 @@ -/mob/living/carbon/alien/humanoid/death(gibbed) - if(stat == DEAD) - return - - . = ..() - - update_icons() - status_flags |= CANPUSH - -//When the alien queen dies, all others must pay the price for letting her die. -/mob/living/carbon/alien/humanoid/royal/queen/death(gibbed) - if(stat == DEAD) - return - - for(var/mob/living/carbon/C in GLOB.alive_mob_list) - if(C == src) //Make sure not to proc it on ourselves. - continue - var/obj/item/organ/alien/hivenode/node = C.getorgan(/obj/item/organ/alien/hivenode) - if(istype(node)) // just in case someone would ever add a diffirent node to hivenode slot - node.queen_death() - - return ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm deleted file mode 100644 index 5ad9fcaac7d..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ /dev/null @@ -1,116 +0,0 @@ -/mob/living/carbon/alien/humanoid - name = "alien" - icon_state = "alien" - pass_flags = PASSTABLE - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 5, /obj/item/stack/sheet/animalhide/xeno = 1) - base_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM) - limb_destroyer = 1 - hud_type = /datum/hud/human - var/obj/item/r_store = null - var/obj/item/l_store = null - var/caste = "" - var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files. - var/leap_on_click = 0 - var/pounce_cooldown = 0 - var/pounce_cooldown_time = 30 - var/custom_pixel_x_offset = 0 //for admin fuckery. - var/custom_pixel_y_offset = 0 - var/sneaking = 0 //For sneaky-sneaky mode and appropriate slowdown - var/drooling = 0 //For Neruotoxic spit overlays - deathsound = 'sound/blank.ogg' - bodyparts = list(/obj/item/bodypart/chest/alien, /obj/item/bodypart/head/alien, /obj/item/bodypart/l_arm/alien, - /obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien) - -/mob/living/carbon/alien/humanoid/Initialize() - . = ..() - AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -3) - -/mob/living/carbon/alien/humanoid/restrained(ignore_grab) - return handcuffed - -/mob/living/carbon/alien/humanoid/show_inv(mob/user) - user.set_machine(src) - var/list/dat = list() - dat += {" -
- [name] -
"} - for(var/i in 1 to held_items.len) - var/obj/item/I = get_item_for_held_index(i) - dat += "
[get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]" - dat += "
Empty Pouches" - - if(handcuffed) - dat += "
Handcuffed" - if(legcuffed) - dat += "
Legcuffed" - - dat += {" -
-
Close - "} - user << browse(dat.Join(), "window=mob[REF(src)];size=325x500") - onclose(user, "mob[REF(src)]") - - -/mob/living/carbon/alien/humanoid/Topic(href, href_list) - //strip panel - if(href_list["pouches"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) - visible_message(span_danger("[usr] tries to empty [src]'s pouches."), \ - span_danger("[usr] tries to empty your pouches.")) - if(do_mob(usr, src, POCKET_STRIP_DELAY * 0.5)) - dropItemToGround(r_store) - dropItemToGround(l_store) - - ..() - - -/mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I) - playsound(src, 'sound/blank.ogg', 40, TRUE, TRUE) //Alien roars when starting to break free - ..(I, cuff_break = INSTANT_CUFFBREAK) - -/mob/living/carbon/alien/humanoid/resist_grab(moving_resist) - if(pulledby.grab_state) - visible_message(span_danger("[src] breaks free of [pulledby]'s grip!"), \ - span_danger("I break free of [pulledby]'s grip!")) - pulledby.stop_pulling() - . = 0 - -/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) - if(leaping) - return -32 - else if(custom_pixel_y_offset) - return custom_pixel_y_offset - else - return initial(pixel_y) - -/mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0) - if(leaping) - return -32 - else if(custom_pixel_x_offset) - return custom_pixel_x_offset - else - return initial(pixel_x) - -/mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones) - return 0.8 - -/mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno) - drop_all_held_items() - ..() - -//For alien evolution/promotion/queen finder procs. Checks for an active alien of that type -/proc/get_alien_type(alienpath) - for(var/mob/living/carbon/alien/humanoid/A in GLOB.alive_mob_list) - if(!istype(A, alienpath)) - continue - if(!A.key || A.stat == DEAD) //Only living aliens with a ckey are valid. - continue - return A - return FALSE - - -/mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) - if(breath && breath.total_moles() > 0 && !sneaking) - playsound(get_turf(src), pick('sound/blank.ogg'), 50, FALSE, -5) - ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm deleted file mode 100644 index b3f345e7985..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ /dev/null @@ -1,68 +0,0 @@ - - -/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(!.) - return - adjustBruteLoss(15) - var/hitverb = "hit" - if(mob_size < MOB_SIZE_LARGE) - safe_throw_at(get_edge_target_turf(src, get_dir(user, src)), 2, 1, user) - hitverb = "slam" - playsound(loc, "punch", 25, TRUE, -1) - visible_message(span_danger("[user] [hitverb]s [src]!"), \ - span_danger("[user] [hitverb]s you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("I [hitverb] [src]!")) - -/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M) - if(..()) - switch(M.used_intent.type) - if (INTENT_HARM) - var/damage = rand(1, 9) - if (prob(90)) - playsound(loc, "punch", 25, TRUE, -1) - visible_message(span_danger("[M] punches [src]!"), \ - span_danger("[M] punches you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I punch [src]!")) - if ((stat != DEAD) && (damage > 9 || prob(5)))//Regular humans have a very small chance of knocking an alien down. - Unconscious(40) - visible_message(span_danger("[M] knocks [src] down!"), \ - span_danger("[M] knocks you down!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), null, M) - to_chat(M, span_danger("I knock [src] down!")) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(damage, BRUTE, affecting) - log_combat(M, src, "attacked") - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s punch misses [src]!"), \ - span_danger("I avoid [M]'s punch!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("My punch misses [src]!")) - - if (INTENT_DISARM) - if (!(mobility_flags & MOBILITY_STAND)) - if (prob(5)) - Unconscious(40) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - log_combat(M, src, "pushed") - visible_message(span_danger("[M] pushes [src] down!"), \ - span_danger("[M] pushes you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), null, M) - to_chat(M, span_danger("I push [src] down!")) - else - if (prob(50)) - dropItemToGround(get_active_held_item(), silent = FALSE) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - visible_message(span_danger("[M] disarms [src]!"), \ - span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I disarm [src]!")) - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] fails to disarm [src]!"),\ - span_danger("[M] fails to disarm you!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("I fail to disarm [src]!")) - - - -/mob/living/carbon/alien/humanoid/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!no_effect && !visual_effect_icon) - visual_effect_icon = ATTACK_EFFECT_CLAW - ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm deleted file mode 100644 index 9628545b3cc..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm +++ /dev/null @@ -1,5 +0,0 @@ -/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - . = ..() - if(!. || !I) - return - diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm deleted file mode 100644 index fd6a73ae7bf..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ /dev/null @@ -1,18 +0,0 @@ - - -/mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm deleted file mode 100644 index d4bcc8febaa..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ /dev/null @@ -1,139 +0,0 @@ -/mob/living/carbon/alien/humanoid/royal - //Common stuffs for Praetorian and Queen - icon = 'icons/mob/alienqueen.dmi' - status_flags = 0 - ventcrawler = VENTCRAWLER_NONE //pull over that ass too fat - unique_name = 0 - pixel_x = -16 - bubble_icon = "alienroyal" - mob_size = MOB_SIZE_LARGE - layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles - pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3) - - var/alt_inhands_file = 'icons/mob/alienqueen.dmi' - -/mob/living/carbon/alien/humanoid/royal/can_inject() - return 0 - -/mob/living/carbon/alien/humanoid/royal/queen - name = "alien queen" - caste = "q" - maxHealth = 400 - health = 400 - icon_state = "alienq" - var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen() - -/mob/living/carbon/alien/humanoid/royal/queen/Initialize() - //there should only be one queen - for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in GLOB.carbon_list) - if(Q == src) - continue - if(Q.stat == DEAD) - continue - if(Q.client) - name = "alien princess ([rand(1, 999)])" //if this is too cutesy feel free to change it/remove it. - break - - real_name = src.name - - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) - AddAbility(new/obj/effect/proc_holder/alien/royal/queen/promote()) - smallsprite.Grant(src) - return ..() - -/mob/living/carbon/alien/humanoid/royal/queen/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large/queen - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin - internal_organs += new /obj/item/organ/alien/eggsac - ..() - -//Queen verbs -/obj/effect/proc_holder/alien/lay_egg - name = "Lay Egg" - desc = "" - plasma_cost = 75 - check_turf = TRUE - action_icon_state = "alien_egg" - -/obj/effect/proc_holder/alien/lay_egg/fire(mob/living/carbon/user) - if(!check_vent_block(user)) - return FALSE - - if(locate(/obj/structure/alien/egg) in get_turf(user)) - to_chat(user, span_alertalien("There's already an egg here.")) - return FALSE - - user.visible_message(span_alertalien("[user] has laid an egg!")) - new /obj/structure/alien/egg(user.loc) - return TRUE - -//Button to let queen choose her praetorian. -/obj/effect/proc_holder/alien/royal/queen/promote - name = "Create Royal Parasite" - desc = "" - plasma_cost = 500 //Plasma cost used on promotion, not spawning the parasite. - - action_icon_state = "alien_queen_promote" - - - -/obj/effect/proc_holder/alien/royal/queen/promote/fire(mob/living/carbon/alien/user) - var/obj/item/queenpromote/prom - if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/)) - to_chat(user, span_noticealien("I already have a Praetorian!")) - return 0 - else - for(prom in user) - to_chat(user, span_noticealien("I discard [prom].")) - qdel(prom) - return 0 - - prom = new (user.loc) - if(!user.put_in_active_hand(prom, 1)) - to_chat(user, span_warning("I must empty your hands before preparing the parasite.")) - return 0 - else //Just in case telling the player only once is not enough! - to_chat(user, span_noticealien("Use the royal parasite on one of your children to promote her to Praetorian!")) - return 0 - -/obj/item/queenpromote - name = "\improper royal parasite" - desc = "" - icon_state = "alien_medal" - item_flags = ABSTRACT | DROPDEL - icon = 'icons/mob/alien.dmi' - -/obj/item/queenpromote/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - -/obj/item/queenpromote/attack(mob/living/M, mob/living/carbon/alien/humanoid/user) - if(!isalienadult(M) || isalienroyal(M)) - to_chat(user, span_noticealien("I may only use this with your adult, non-royal children!")) - return - if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/)) - to_chat(user, span_noticealien("I already have a Praetorian!")) - return - - var/mob/living/carbon/alien/humanoid/A = M - if(A.stat == CONSCIOUS && A.mind && A.key) - if(!user.usePlasma(500)) - to_chat(user, span_noticealien("I must have 500 plasma stored to use this!")) - return - - to_chat(A, span_noticealien("The queen has granted you a promotion to Praetorian!")) - user.visible_message(span_alertalien("[A] begins to expand, twist and contort!")) - var/mob/living/carbon/alien/humanoid/royal/praetorian/new_prae = new (A.loc) - A.mind.transfer_to(new_prae) - qdel(A) - qdel(src) - return - else - to_chat(user, span_warning("This child must be alert and responsive to become a Praetorian!")) - -/obj/item/queenpromote/attack_self(mob/user) - to_chat(user, span_noticealien("I discard [src].")) - qdel(src) diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm deleted file mode 100644 index 0297f593579..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ /dev/null @@ -1,94 +0,0 @@ - -/mob/living/carbon/alien/humanoid/update_icons() - cut_overlays() - for(var/I in overlays_standing) - add_overlay(I) - - var/asleep = IsSleeping() - if(stat == DEAD) - //If we mostly took damage from fire - if(getFireLoss() > 125) - icon_state = "alien[caste]_husked" - else - icon_state = "alien[caste]_dead" - - else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsParalyzed()) - icon_state = "alien[caste]_unconscious" - else if(leap_on_click) - icon_state = "alien[caste]_pounce" - - else if(!(mobility_flags & MOBILITY_STAND)) - icon_state = "alien[caste]_sleep" - else if(mob_size == MOB_SIZE_LARGE) - icon_state = "alien[caste]" - if(drooling) - add_overlay("alienspit_[caste]") - else - icon_state = "alien[caste]" - if(drooling) - add_overlay("alienspit") - - if(leaping) - if(alt_icon == initial(alt_icon)) - var/old_icon = icon - icon = alt_icon - alt_icon = old_icon - icon_state = "alien[caste]_leap" - pixel_x = -32 - pixel_y = -32 - else - if(alt_icon != initial(alt_icon)) - var/old_icon = icon - icon = alt_icon - alt_icon = old_icon - pixel_x = get_standard_pixel_x_offset(mobility_flags & MOBILITY_STAND) - pixel_y = get_standard_pixel_y_offset(mobility_flags & MOBILITY_STAND) - update_inv_hands() - update_inv_handcuffed() - -/mob/living/carbon/alien/humanoid/regenerate_icons() - if(!..()) - // update_icons() //Handled in update_transform(), leaving this here as a reminder - update_transform() - -/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. - if(lying) - lying = 90 //Anything else looks retarded - ..() - update_icons() - -/mob/living/carbon/alien/humanoid/update_inv_handcuffed() - remove_overlay(HANDCUFF_LAYER) - var/cuff_icon = "aliencuff" - var/dmi_file = 'icons/mob/alien.dmi' - - if(mob_size == MOB_SIZE_LARGE) - cuff_icon = "aliencuff_[caste]" - dmi_file = 'icons/mob/alienqueen.dmi' - - if(handcuffed) - overlays_standing[HANDCUFF_LAYER] = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER) - apply_overlay(HANDCUFF_LAYER) - -//Royals have bigger sprites, so inhand things must be handled differently. -/mob/living/carbon/alien/humanoid/royal/update_inv_hands() - ..() - remove_overlay(HANDS_LAYER) - var/list/hands = list() - - var/obj/item/l_hand = get_item_for_held_index(1) - if(l_hand) - var/itm_state = l_hand.item_state - if(!itm_state) - itm_state = l_hand.icon_state - hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER) - - var/obj/item/r_hand = get_item_for_held_index(2) - if(r_hand) - var/itm_state = r_hand.item_state - if(!itm_state) - itm_state = r_hand.icon_state - hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER) - - overlays_standing[HANDS_LAYER] = hands - apply_overlay(HANDS_LAYER) diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm deleted file mode 100644 index 8fd6329a0c1..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ /dev/null @@ -1,22 +0,0 @@ -/mob/living/carbon/alien/larva/death(gibbed) - if(stat == DEAD) - return - - . = ..() - - update_icons() - -/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts) - if(with_bodyparts) - new /obj/effect/gibspawner/larva(drop_location(), src) - else - new /obj/effect/gibspawner/larva/bodypartless(drop_location(), src) - -/mob/living/carbon/alien/larva/gib_animation() - new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l") - -/mob/living/carbon/alien/larva/spawn_dust() - new /obj/effect/decal/remains/xeno(loc) - -/mob/living/carbon/alien/larva/dust_animation() - new /obj/effect/temp_visual/dust_animation(loc, "dust-l") diff --git a/code/modules/mob/living/carbon/alien/larva/inventory.dm b/code/modules/mob/living/carbon/alien/larva/inventory.dm deleted file mode 100644 index 23c461aa83c..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/inventory.dm +++ /dev/null @@ -1,3 +0,0 @@ -//can't unequip since it can't equip anything -/mob/living/carbon/alien/larva/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - return diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm deleted file mode 100644 index 84b9b4aefd1..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ /dev/null @@ -1,69 +0,0 @@ -/mob/living/carbon/alien/larva - name = "alien larva" - real_name = "alien larva" - icon_state = "larva0" - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - density = FALSE - hud_type = /datum/hud/larva - - maxHealth = 25 - health = 25 - - var/amount_grown = 0 - var/max_grown = 100 - var/time_of_birth - - rotate_on_lying = 0 - bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva) - - -//This is fine right now, if we're adding organ specific damage this needs to be updated -/mob/living/carbon/alien/larva/Initialize() - - AddAbility(new/obj/effect/proc_holder/alien/hide(null)) - AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null)) - . = ..() - -/mob/living/carbon/alien/larva/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/small/tiny - ..() - -//This needs to be fixed -/mob/living/carbon/alien/larva/Stat() - ..() - if(statpanel("Status")) - stat(null, "Progress: [amount_grown]/[max_grown]") - -/mob/living/carbon/alien/larva/adjustPlasma(amount) - if(stat != DEAD && amount > 0) - amount_grown = min(amount_grown + 1, max_grown) - ..(amount) - -//can't equip anything -/mob/living/carbon/alien/larva/attack_ui(slot_id) - return - -/mob/living/carbon/alien/larva/restrained(ignore_grab) - . = 0 - -// new damage icon system -// now constructs damage icon for each organ from mask * damage field - - -/mob/living/carbon/alien/larva/show_inv(mob/user) - return - -/mob/living/carbon/alien/larva/toggle_throw_mode() - return - -/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) - return - -/mob/living/carbon/alien/larva/stripPanelUnequip(obj/item/what, mob/who) - to_chat(src, span_warning("I don't have the dexterity to do this!")) - return - -/mob/living/carbon/alien/larva/stripPanelEquip(obj/item/what, mob/who) - to_chat(src, span_warning("I don't have the dexterity to do this!")) - return diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm deleted file mode 100644 index 19ce8a4ac9d..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm +++ /dev/null @@ -1,33 +0,0 @@ - - -/mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M) - if(..()) - var/damage = rand(1, 9) - if (prob(90)) - playsound(loc, "punch", 25, TRUE, -1) - log_combat(M, src, "attacked") - visible_message(span_danger("[M] kicks [src]!"), \ - span_danger("[M] kicks you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I kick [src]!")) - if ((stat != DEAD) && (damage > 4.9)) - Unconscious(rand(100,200)) - - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(damage, BRUTE, affecting) - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s kick misses [src]!"), \ - span_danger("I avoid [M]'s kick!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("My kick misses [src]!")) - -/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(!.) - return - adjustBruteLoss(5 + rand(1,9)) - new /datum/forced_movement(src, get_step_away(user,src, 30), 1) - -/mob/living/carbon/alien/larva/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!no_effect && !visual_effect_icon) - visual_effect_icon = ATTACK_EFFECT_BITE - ..() diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm deleted file mode 100644 index 57ede2038e3..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ /dev/null @@ -1,32 +0,0 @@ - - -/mob/living/carbon/alien/larva/Life() - set invisibility = 0 - if (notransform) - return - if(..() && !IS_IN_STASIS(src)) //not dead and not in stasis - // GROW! - if(amount_grown < max_grown) - amount_grown++ - update_icons() - - -/mob/living/carbon/alien/larva/update_stat() - if(status_flags & GODMODE) - return - if(stat != DEAD) - if(health<= -maxHealth || !getorgan(/obj/item/organ/brain)) - death() - return - if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || health <= crit_threshold) - if(stat == CONSCIOUS) - stat = UNCONSCIOUS - become_blind(UNCONSCIOUS_BLIND) - update_mobility() - else - if(stat == UNCONSCIOUS) - stat = CONSCIOUS - cure_blind(UNCONSCIOUS_BLIND) - set_resting(FALSE) - update_damage_hud() - update_health_hud() diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm deleted file mode 100644 index 0bf22c25dc2..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ /dev/null @@ -1,63 +0,0 @@ -/obj/effect/proc_holder/alien/hide - name = "Hide" - desc = "" - plasma_cost = 0 - - action_icon_state = "alien_hide" - -/obj/effect/proc_holder/alien/hide/fire(mob/living/carbon/alien/user) - if(user.stat != CONSCIOUS) - return - - if (user.layer != ABOVE_NORMAL_TURF_LAYER) - user.layer = ABOVE_NORMAL_TURF_LAYER - user.visible_message(span_name("[user] scurries to the ground!"), \ - span_noticealien("I are now hiding.")) - else - user.layer = MOB_LAYER - user.visible_message(span_notice("[user] slowly peeks up from the ground..."), \ - span_noticealien("I stop hiding.")) - return 1 - - -/obj/effect/proc_holder/alien/larva_evolve - name = "Evolve" - desc = "" - plasma_cost = 0 - - action_icon_state = "alien_evolve_larva" - -/obj/effect/proc_holder/alien/larva_evolve/fire(mob/living/carbon/alien/user) - if(!islarva(user)) - return - var/mob/living/carbon/alien/larva/L = user - - if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ? - to_chat(user, span_warning("I cannot evolve when you are cuffed!")) - return - - if(L.amount_grown >= L.max_grown) //TODO ~Carn - to_chat(L, span_name("I are growing into a beautiful alien! It is time to choose a caste.")) - to_chat(L, span_info("There are three to choose from:")) - to_chat(L, span_name("Hunters are the most agile caste, tasked with hunting for hosts. They are faster than a human and can even pounce, but are not much tougher than a drone.")) - to_chat(L, span_name("Sentinels are tasked with protecting the hive. With their ranged spit, invisibility, and high health, they make formidable guardians and acceptable secondhand hunters.")) - to_chat(L, span_name("Drones are the weakest and slowest of the castes, but can grow into a praetorian and then queen if no queen exists, and are vital to maintaining a hive with their resin secretion abilities.")) - var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") - - if(user.incapacitated()) //something happened to us while we were choosing. - return - - var/mob/living/carbon/alien/humanoid/new_xeno - switch(alien_caste) - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(L.loc) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(L.loc) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(L.loc) - - L.alien_evolve(new_xeno) - return 0 - else - to_chat(user, span_warning("I are not fully grown!")) - return 0 diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm deleted file mode 100644 index 983544e8c72..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm +++ /dev/null @@ -1,31 +0,0 @@ - -/mob/living/carbon/alien/larva/regenerate_icons() - cut_overlays() - update_icons() - -/mob/living/carbon/alien/larva/update_icons() - var/state = 0 - if(amount_grown > 80) - state = 2 - else if(amount_grown > 50) - state = 1 - - if(stat == DEAD) - icon_state = "larva[state]_dead" - else if(handcuffed || legcuffed) //This should be an overlay. Who made this an icon_state? - icon_state = "larva[state]_cuff" - else if(!(mobility_flags & MOBILITY_STAND)) - icon_state = "larva[state]_sleep" - else if(IsStun()) - icon_state = "larva[state]_stun" - else - icon_state = "larva[state]" - -/mob/living/carbon/alien/larva/update_transform() //All this is handled in update_icons() - ..() - return update_icons() - -/mob/living/carbon/alien/larva/update_inv_handcuffed() - update_icons() //larva icon_state changes if cuffed/uncuffed. - - diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm deleted file mode 100644 index 0dc31d8b5e1..00000000000 --- a/code/modules/mob/living/carbon/alien/life.dm +++ /dev/null @@ -1,54 +0,0 @@ -/mob/living/carbon/alien/Life() - findQueen() - return..() - -/mob/living/carbon/alien/check_breath(datum/gas_mixture/breath) - if(status_flags & GODMODE) - return - - if(!breath || (breath.total_moles() == 0)) - //Aliens breathe in vaccuum - return 0 - - var/toxins_used = 0 - var/tox_detect_threshold = 0.02 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - var/list/breath_gases = breath.gases - - breath.assert_gases(/datum/gas/plasma, /datum/gas/oxygen) - - //Partial pressure of the toxins in our breath - var/Toxins_pp = (breath_gases[/datum/gas/plasma][MOLES]/breath.total_moles())*breath_pressure - - if(Toxins_pp > tox_detect_threshold) // Detect toxins in air - adjustPlasma(breath_gases[/datum/gas/plasma][MOLES]*250) - throw_alert("alien_tox", /atom/movable/screen/alert/alien_tox) - - toxins_used = breath_gases[/datum/gas/plasma][MOLES] - - else - clear_alert("alien_tox") - - //Breathe in toxins and out oxygen - breath_gases[/datum/gas/plasma][MOLES] -= toxins_used - breath_gases[/datum/gas/oxygen][MOLES] += toxins_used - - breath.garbage_collect() - - //BREATH TEMPERATURE - handle_breath_temperature(breath) - -/mob/living/carbon/alien/handle_status_effects() - ..() - //natural reduction of movement delay due to stun. - if(move_delay_add > 0) - move_delay_add = max(0, move_delay_add - rand(1, 2)) - -/mob/living/carbon/alien/handle_changeling() - return - -/mob/living/carbon/alien/handle_fire()//Aliens on fire code - . = ..() - if(.) //if the mob isn't on fire anymore - return - adjust_bodytemperature(BODYTEMP_HEATING_MAX) //If you're on fire, you heat up! diff --git a/code/modules/mob/living/carbon/alien/login.dm b/code/modules/mob/living/carbon/alien/login.dm deleted file mode 100644 index 5c177fbb622..00000000000 --- a/code/modules/mob/living/carbon/alien/login.dm +++ /dev/null @@ -1,4 +0,0 @@ -/mob/living/carbon/alien/Login() - ..() - AddInfectionImages() - return diff --git a/code/modules/mob/living/carbon/alien/logout.dm b/code/modules/mob/living/carbon/alien/logout.dm deleted file mode 100644 index f25b21f0cca..00000000000 --- a/code/modules/mob/living/carbon/alien/logout.dm +++ /dev/null @@ -1,4 +0,0 @@ -/mob/living/carbon/alien/Logout() - ..() - RemoveInfectionImages() - return diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm deleted file mode 100644 index 6ebe7a5a011..00000000000 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ /dev/null @@ -1,192 +0,0 @@ -/obj/item/organ/alien - icon_state = "xgibmid2" - var/list/alien_powers = list() - -/obj/item/organ/alien/Initialize() - . = ..() - for(var/A in alien_powers) - if(ispath(A)) - alien_powers -= A - alien_powers += new A(src) - -/obj/item/organ/alien/Destroy() - QDEL_LIST(alien_powers) - return ..() - -/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0) - ..() - for(var/obj/effect/proc_holder/alien/P in alien_powers) - M.AddAbility(P) - - -/obj/item/organ/alien/Remove(mob/living/carbon/M, special = 0) - for(var/obj/effect/proc_holder/alien/P in alien_powers) - M.RemoveAbility(P) - ..() - -/obj/item/organ/alien/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - - -/obj/item/organ/alien/plasmavessel - name = "plasma vessel" - icon_state = "plasma" - w_class = WEIGHT_CLASS_NORMAL - zone = BODY_ZONE_CHEST - slot = "plasmavessel" - alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer) - - var/storedPlasma = 100 - var/max_plasma = 250 - var/heal_rate = 5 - var/plasma_rate = 10 - -/obj/item/organ/alien/plasmavessel/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/plasma, storedPlasma/10) - return S - -/obj/item/organ/alien/plasmavessel/large - name = "large plasma vessel" - icon_state = "plasma_large" - w_class = WEIGHT_CLASS_BULKY - storedPlasma = 200 - max_plasma = 500 - plasma_rate = 15 - -/obj/item/organ/alien/plasmavessel/large/queen - plasma_rate = 20 - -/obj/item/organ/alien/plasmavessel/small - name = "small plasma vessel" - icon_state = "plasma_small" - w_class = WEIGHT_CLASS_SMALL - storedPlasma = 100 - max_plasma = 150 - plasma_rate = 5 - -/obj/item/organ/alien/plasmavessel/small/tiny - name = "tiny plasma vessel" - icon_state = "plasma_tiny" - w_class = WEIGHT_CLASS_TINY - max_plasma = 100 - alien_powers = list(/obj/effect/proc_holder/alien/transfer) - -/obj/item/organ/alien/plasmavessel/on_life() - //If there are alien weeds on the ground then heal if needed or give some plasma - if(locate(/obj/structure/alien/weeds) in owner.loc) - if(owner.health >= owner.maxHealth) - owner.adjustPlasma(plasma_rate) - else - var/heal_amt = heal_rate - if(!isalien(owner)) - heal_amt *= 0.2 - owner.adjustPlasma(plasma_rate*0.5) - owner.adjustBruteLoss(-heal_amt) - owner.adjustFireLoss(-heal_amt) - owner.adjustOxyLoss(-heal_amt) - owner.adjustCloneLoss(-heal_amt) - else - owner.adjustPlasma(plasma_rate * 0.1) - -/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) - ..() - if(isalien(M)) - var/mob/living/carbon/alien/A = M - A.updatePlasmaDisplay() - -/obj/item/organ/alien/plasmavessel/Remove(mob/living/carbon/M, special = 0) - ..() - if(isalien(M)) - var/mob/living/carbon/alien/A = M - A.updatePlasmaDisplay() - -#define QUEEN_DEATH_DEBUFF_DURATION 2400 - -/obj/item/organ/alien/hivenode - name = "hive node" - icon_state = "hivenode" - zone = BODY_ZONE_HEAD - slot = "hivenode" - w_class = WEIGHT_CLASS_TINY - var/recent_queen_death = 0 //Indicates if the queen died recently, aliens are heavily weakened while this is active. - alien_powers = list(/obj/effect/proc_holder/alien/whisper) - -/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0) - ..() - M.faction |= ROLE_ALIEN - ADD_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune") - -/obj/item/organ/alien/hivenode/Remove(mob/living/carbon/M, special = 0) - M.faction -= ROLE_ALIEN - REMOVE_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune") - ..() - -//When the alien queen dies, all aliens suffer a penalty as punishment for failing to protect her. -/obj/item/organ/alien/hivenode/proc/queen_death() - if(!owner|| owner.stat == DEAD) - return - if(isalien(owner)) //Different effects for aliens than humans - to_chat(owner, span_danger("My Queen has been struck down!")) - to_chat(owner, span_danger("I are struck with overwhelming agony! You feel confused, and my connection to the hivemind is severed.")) - owner.emote("roar") - owner.Stun(200) //Actually just slows them down a bit. - - else if(ishuman(owner)) //Humans, being more fragile, are more overwhelmed by the mental backlash. - to_chat(owner, span_danger("I feel a splitting pain in my head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!")) - owner.emote("scream") - owner.Paralyze(100) - - owner.jitteriness += 30 - owner.confused += 30 - owner.stuttering += 30 - - recent_queen_death = 1 - owner.throw_alert("alien_noqueen", /atom/movable/screen/alert/alien_vulnerable) - addtimer(CALLBACK(src, PROC_REF(clear_queen_death)), QUEEN_DEATH_DEBUFF_DURATION) - - -/obj/item/organ/alien/hivenode/proc/clear_queen_death() - if(QDELETED(src)) //In case the node is deleted - return - recent_queen_death = 0 - if(!owner) //In case the xeno is butchered or subjected to surgery after death. - return - to_chat(owner, span_noticealien("The pain of the queen's death is easing. You begin to hear the hivemind again.")) - owner.clear_alert("alien_noqueen") - -#undef QUEEN_DEATH_DEBUFF_DURATION - -/obj/item/organ/alien/resinspinner - name = "resin spinner" - icon_state = "stomach-x" - zone = BODY_ZONE_PRECISE_MOUTH - slot = "resinspinner" - alien_powers = list(/obj/effect/proc_holder/alien/resin) - - -/obj/item/organ/alien/acid - name = "acid gland" - icon_state = "acid" - zone = BODY_ZONE_PRECISE_MOUTH - slot = "acidgland" - alien_powers = list(/obj/effect/proc_holder/alien/acid) - - -/obj/item/organ/alien/neurotoxin - name = "neurotoxin gland" - icon_state = "neurotox" - zone = BODY_ZONE_PRECISE_MOUTH - slot = "neurotoxingland" - alien_powers = list(/obj/effect/proc_holder/alien/neurotoxin) - - -/obj/item/organ/alien/eggsac - name = "egg sac" - icon_state = "eggsac" - zone = BODY_ZONE_PRECISE_GROIN - slot = "eggsac" - w_class = WEIGHT_CLASS_BULKY - alien_powers = list(/obj/effect/proc_holder/alien/lay_egg) diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm deleted file mode 100644 index 1ad0a1e7ffd..00000000000 --- a/code/modules/mob/living/carbon/alien/say.dm +++ /dev/null @@ -1,23 +0,0 @@ -/mob/living/proc/alien_talk(message, shown_name = real_name) - src.log_talk(message, LOG_SAY) - message = trim(message) - if(!message) - return - - var/message_a = say_quote(message) - var/rendered = "Hivemind, [shown_name] [message_a]" - for(var/mob/S in GLOB.player_list) - if(!S.stat && S.hivecheck()) - to_chat(S, rendered) - if(S in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(S, src) - to_chat(S, "[link] [rendered]") - -/mob/living/carbon/alien/humanoid/royal/queen/alien_talk(message, shown_name = name) - shown_name = "[shown_name]" - ..(message, shown_name) - -/mob/living/carbon/hivecheck() - var/obj/item/organ/alien/hivenode/N = getorgan(/obj/item/organ/alien/hivenode) - if(N && !N.recent_queen_death) //Mob has alien hive node and is not under the dead queen special effect. - return N diff --git a/code/modules/mob/living/carbon/alien/screen.dm b/code/modules/mob/living/carbon/alien/screen.dm deleted file mode 100644 index 4d90fd4b325..00000000000 --- a/code/modules/mob/living/carbon/alien/screen.dm +++ /dev/null @@ -1,33 +0,0 @@ - -/mob/living/carbon/alien/proc/updatePlasmaDisplay() - if(hud_used) //clientless aliens - hud_used.alien_plasma_display.maptext = "
[round(getPlasma())]
" - -/mob/living/carbon/alien/larva/updatePlasmaDisplay() - return - -/mob/living/carbon/alien/proc/findQueen() - if(hud_used) - hud_used.alien_queen_finder.cut_overlays() - var/mob/queen = get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen) - if(!queen) - return - var/turf/Q = get_turf(queen) - var/turf/A = get_turf(src) - if(Q.z != A.z) //The queen is on a different Z level, we cannot sense that far. - return - var/Qdir = get_dir(src, Q) - var/Qdist = get_dist(src, Q) - var/finder_icon = "finder_center" //Overlay showed when adjacent to or on top of the queen! - switch(Qdist) - if(2 to 7) - finder_icon = "finder_near" - if(8 to 20) - finder_icon = "finder_med" - if(21 to INFINITY) - finder_icon = "finder_far" - var/image/finder_eye = image('icons/mob/screen_alien.dmi', finder_icon, dir = Qdir) - hud_used.alien_queen_finder.add_overlay(finder_eye) - -/mob/living/carbon/alien/humanoid/royal/queen/findQueen() - return //Queen already knows where she is. Hopefully. diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm deleted file mode 100644 index be63194f159..00000000000 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ /dev/null @@ -1,129 +0,0 @@ -// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability -// It functions almost identically (see code/datums/diseases/alien_embryo.dm) -/obj/item/organ/body_egg/alien_embryo - name = "alien embryo" - icon = 'icons/mob/alien.dmi' - icon_state = "larva0_dead" - var/stage = 0 - var/bursting = FALSE - -/obj/item/organ/body_egg/alien_embryo/on_find(mob/living/finder) - ..() - if(stage < 4) - to_chat(finder, span_notice("It's small and weak, barely the size of a foetus.")) - else - to_chat(finder, span_notice("It's grown quite large, and writhes slightly as you look at it.")) - if(prob(10)) - AttemptGrow(0) - -/obj/item/organ/body_egg/alien_embryo/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - -/obj/item/organ/body_egg/alien_embryo/on_life() - . = ..() - switch(stage) - if(2, 3) - if(prob(2)) - owner.emote("sneeze") - if(prob(2)) - owner.emote("cough") - if(prob(2)) - to_chat(owner, span_danger("My throat feels sore.")) - if(prob(2)) - to_chat(owner, span_danger("Mucous runs down the back of my throat.")) - if(4) - if(prob(2)) - owner.emote("sneeze") - if(prob(2)) - owner.emote("cough") - if(prob(4)) - to_chat(owner, span_danger("My muscles ache.")) - if(prob(20)) - owner.take_bodypart_damage(1) - if(prob(4)) - to_chat(owner, span_danger("My stomach hurts.")) - if(prob(20)) - owner.adjustToxLoss(1) - if(5) - to_chat(owner, span_danger("I feel something tearing its way out of my stomach...")) - owner.adjustToxLoss(10) - -/obj/item/organ/body_egg/alien_embryo/egg_process() - if(stage < 5 && prob(3)) - stage++ - INVOKE_ASYNC(src, PROC_REF(RefreshInfectionImage)) - - if(stage == 5 && prob(50)) - AttemptGrow() - - - -/obj/item/organ/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success=TRUE) - if(!owner || bursting) - return - - bursting = TRUE - - var/list/candidates = pollGhostCandidates("Do you want to play as an alien larva that will burst out of [owner]?", ROLE_ALIEN, null, ROLE_ALIEN, 100, POLL_IGNORE_ALIEN_LARVA) - - if(QDELETED(src) || QDELETED(owner)) - return - - if(!candidates.len || !owner) - bursting = FALSE - stage = 4 - return - - var/mob/dead/observer/ghost = pick(candidates) - - var/mutable_appearance/overlay = mutable_appearance('icons/mob/alien.dmi', "burst_lie") - owner.add_overlay(overlay) - - var/atom/xeno_loc = get_turf(owner) - var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) - new_xeno.key = ghost.key - SEND_SOUND(new_xeno, sound('sound/blank.ogg',0,0,0,100)) //To get the player's attention - new_xeno.mobility_flags = NONE //so we don't move during the bursting animation - new_xeno.notransform = 1 - new_xeno.invisibility = INVISIBILITY_MAXIMUM - - sleep(6) - - if(QDELETED(src) || QDELETED(owner)) - return - - if(new_xeno) - new_xeno.mobility_flags = MOBILITY_FLAGS_DEFAULT - new_xeno.notransform = 0 - new_xeno.invisibility = 0 - - if(gib_on_success) - new_xeno.visible_message(span_danger("[new_xeno] bursts out of [owner] in a shower of gore!"), span_danger("I exit [owner], my previous host."), span_hear("I hear organic matter ripping and tearing!")) - owner.gib(TRUE) - else - new_xeno.visible_message(span_danger("[new_xeno] wriggles out of [owner]!"), span_danger("I exit [owner], my previous host.")) - owner.adjustBruteLoss(40) - owner.cut_overlay(overlay) - qdel(src) - - -/*---------------------------------------- -Proc: AddInfectionImages(C) -Des: Adds the infection image to all aliens for this embryo -----------------------------------------*/ -/obj/item/organ/body_egg/alien_embryo/AddInfectionImages() - for(var/mob/living/carbon/alien/alien in GLOB.player_list) - var/I = image('icons/mob/alien.dmi', loc = owner, icon_state = "infected[stage]") - alien.client.images += I - -/*---------------------------------------- -Proc: RemoveInfectionImage(C) -Des: Removes all images from the mob infected by this embryo -----------------------------------------*/ -/obj/item/organ/body_egg/alien_embryo/RemoveInfectionImages() - for(var/mob/living/carbon/alien/alien in GLOB.player_list) - for(var/image/I in alien.client.images) - if(dd_hasprefix_case(I.icon_state, "infected") && I.loc == owner) - qdel(I) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm deleted file mode 100644 index 44a00bd3c5f..00000000000 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ /dev/null @@ -1,271 +0,0 @@ - - -//TODO: Make these simple_animals - -#define MIN_IMPREGNATION_TIME 100 //time it takes to impregnate someone -#define MAX_IMPREGNATION_TIME 150 - -#define MIN_ACTIVE_TIME 200 //time between being dropped and going idle -#define MAX_ACTIVE_TIME 400 - -/obj/item/clothing/mask/facehugger - name = "alien" - desc = "" - icon = 'icons/mob/alien.dmi' - icon_state = "facehugger" - item_state = "facehugger" - w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4 - clothing_flags = MASKINTERNALS - throw_range = 5 - tint = 3 - flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH - layer = MOB_LAYER - max_integrity = 100 - - var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case - - var/sterile = FALSE - var/real = TRUE //0 for the toy, 1 for real. Sure I could istype, but fuck that. - var/strength = 5 - - var/attached = 0 - -/obj/item/clothing/mask/facehugger/lamarr - name = "Lamarr" - sterile = 1 - -/obj/item/clothing/mask/facehugger/dead - icon_state = "facehugger_dead" - item_state = "facehugger_inactive" - stat = DEAD - -/obj/item/clothing/mask/facehugger/impregnated - icon_state = "facehugger_impregnated" - item_state = "facehugger_impregnated" - stat = DEAD - -/obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - ..() - if(obj_integrity < 90) - Die() - -/obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, params) - return O.attack_obj(src, user) - -/obj/item/clothing/mask/facehugger/attack_alien(mob/user) //can be picked up by aliens - return attack_hand(user) - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/item/clothing/mask/facehugger/attack_hand(mob/user) - if((stat == CONSCIOUS && !sterile) && !isalien(user)) - if(Leap(user)) - return - . = ..() - -/obj/item/clothing/mask/facehugger/attack(mob/living/M, mob/user) - ..() - if(user.transferItemToLoc(src, get_turf(M))) - Leap(M) - -/obj/item/clothing/mask/facehugger/examine(mob/user) - . = ..() - if(!real)//So that giant red text about probisci doesn't show up. - return - switch(stat) - if(DEAD,UNCONSCIOUS) - . += span_boldannounce("[src] is not moving.") - if(CONSCIOUS) - . += span_boldannounce("[src] seems to be active!") - if (sterile) - . += span_boldannounce("It looks like the proboscis has been removed.") - - -/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - Die() - -/obj/item/clothing/mask/facehugger/equipped(mob/M) - . = ..() - Attach(M) - -/obj/item/clothing/mask/facehugger/Crossed(atom/target) - HasProximity(target) - return - -/obj/item/clothing/mask/facehugger/on_found(mob/finder) - if(stat == CONSCIOUS) - return HasProximity(finder) - return 0 - -/obj/item/clothing/mask/facehugger/HasProximity(atom/movable/AM as mob|obj) - if(CanHug(AM) && Adjacent(AM)) - return Leap(AM) - return 0 - -/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) - if(!..()) - return - if(stat == CONSCIOUS) - icon_state = "[initial(icon_state)]_thrown" - addtimer(CALLBACK(src, PROC_REF(clear_throw_icon_state)), 15) - -/obj/item/clothing/mask/facehugger/proc/clear_throw_icon_state() - if(icon_state == "[initial(icon_state)]_thrown") - icon_state = "[initial(icon_state)]" - -/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - ..() - if(stat == CONSCIOUS) - icon_state = "[initial(icon_state)]" - Leap(hit_atom) - -/obj/item/clothing/mask/facehugger/proc/valid_to_attach(mob/living/M) - // valid targets: carbons except aliens and devils - // facehugger state early exit checks - if(stat != CONSCIOUS) - return FALSE - if(attached) - return FALSE - if(iscarbon(M)) - // disallowed carbons - if(isalien(M) || istruedevil(M)) - return FALSE - var/mob/living/carbon/target = M - // gotta have a head to be implanted (no changelings or sentient plants) - if(!target.get_bodypart(BODY_ZONE_HEAD)) - return FALSE - // gotta be able to have the xeno implanted - if(HAS_TRAIT(M, TRAIT_XENO_IMMUNE)) - return FALSE - // carbon, has head, not alien or devil, has no hivenode or embryo: valid - return TRUE - - return FALSE - -/obj/item/clothing/mask/facehugger/proc/Leap(mob/living/M) - if(!valid_to_attach(M)) - return FALSE - if(iscarbon(M)) - var/mob/living/carbon/target = M - if(target.wear_mask && istype(target.wear_mask, /obj/item/clothing/mask/facehugger)) - return FALSE - // passed initial checks - time to leap! - M.visible_message(span_danger("[src] leaps at [M]'s face!"), \ - span_danger("[src] leaps at your face!")) - - // probiscis-blocker handling - if(iscarbon(M)) - var/mob/living/carbon/target = M - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.is_mouth_covered(head_only = 1)) - H.visible_message(span_danger("[src] smashes against [H]'s [H.head]!"), \ - span_danger("[src] smashes against your [H.head]!")) - Die() - return FALSE - - if(target.wear_mask) - var/obj/item/clothing/W = target.wear_mask - if(target.dropItemToGround(W)) - target.visible_message(span_danger("[src] tears [W] off of [target]'s face!"), \ - span_danger("[src] tears [W] off of your face!")) - target.equip_to_slot_if_possible(src, SLOT_WEAR_MASK, 0, 1, 1) - return TRUE // time for a smoke - -/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M) - if(!valid_to_attach(M)) - return - // early returns and validity checks done: attach. - attached++ - //ensure we detach once we no longer need to be attached - addtimer(CALLBACK(src, PROC_REF(detach)), MAX_IMPREGNATION_TIME) - - - if(!sterile) - M.take_bodypart_damage(strength,0) //done here so that humans in helmets take damage - M.Unconscious(MAX_IMPREGNATION_TIME/0.3) //something like 25 ticks = 20 seconds with the default settings - - GoIdle() //so it doesn't jump the people that tear it off - - addtimer(CALLBACK(src, PROC_REF(Impregnate), M), rand(MIN_IMPREGNATION_TIME, MAX_IMPREGNATION_TIME)) - -/obj/item/clothing/mask/facehugger/proc/detach() - attached = 0 - -/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target) - if(!target || target.stat == DEAD) //was taken off or something - return - - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.wear_mask != src) - return - - if(!sterile) - target.visible_message(span_danger("[src] falls limp after violating [target]'s face!"), \ - span_danger("[src] falls limp after violating your face!")) - - Die() - icon_state = "[initial(icon_state)]_impregnated" - - var/obj/item/bodypart/chest/LC = target.get_bodypart(BODY_ZONE_CHEST) - if((!LC || LC.status != BODYPART_ROBOTIC) && !target.getorgan(/obj/item/organ/body_egg/alien_embryo)) - new /obj/item/organ/body_egg/alien_embryo(target) - var/turf/T = get_turf(target) - log_game("[key_name(target)] was impregnated by a facehugger at [loc_name(T)]") - - else - target.visible_message(span_danger("[src] violates [target]'s face!"), \ - span_danger("[src] violates your face!")) - -/obj/item/clothing/mask/facehugger/proc/GoActive() - if(stat == DEAD || stat == CONSCIOUS) - return - - stat = CONSCIOUS - icon_state = "[initial(icon_state)]" - -/obj/item/clothing/mask/facehugger/proc/GoIdle() - if(stat == DEAD || stat == UNCONSCIOUS) - return - - stat = UNCONSCIOUS - icon_state = "[initial(icon_state)]_inactive" - - addtimer(CALLBACK(src, PROC_REF(GoActive)), rand(MIN_ACTIVE_TIME, MAX_ACTIVE_TIME)) - -/obj/item/clothing/mask/facehugger/proc/Die() - if(stat == DEAD) - return - - icon_state = "[initial(icon_state)]_dead" - item_state = "facehugger_inactive" - stat = DEAD - - visible_message(span_danger("[src] curls up into a ball!")) - -/proc/CanHug(mob/living/M) - if(!istype(M)) - return 0 - if(M.stat == DEAD) - return 0 - if(M.getorgan(/obj/item/organ/alien/hivenode)) - return 0 - - if(ismonkey(M)) - return 1 - - var/mob/living/carbon/C = M - if(ishuman(C) && !(SLOT_WEAR_MASK in C.dna.species.no_equip)) - var/mob/living/carbon/human/H = C - if(H.is_mouth_covered(head_only = 1)) - return 0 - return 1 - return 0 - -#undef MIN_ACTIVE_TIME -#undef MAX_ACTIVE_TIME - -#undef MIN_IMPREGNATION_TIME -#undef MAX_IMPREGNATION_TIME diff --git a/code/modules/mob/living/carbon/alien/status_procs.dm b/code/modules/mob/living/carbon/alien/status_procs.dm deleted file mode 100644 index 7fd1d318723..00000000000 --- a/code/modules/mob/living/carbon/alien/status_procs.dm +++ /dev/null @@ -1,20 +0,0 @@ -//Here are the procs used to modify status effects of a mob. -//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, -// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. - -/////////////////////////////////// STUN //////////////////////////////////// - -/mob/living/carbon/alien/Stun(amount, updating = 1, ignore_canstun = 0) - . = ..() - if(!.) - move_delay_add = min(move_delay_add + round(amount / 2), 10) //a maximum delay of 10 - -/mob/living/carbon/alien/SetStun(amount, updating = 1, ignore_canstun = 0) - . = ..() - if(!.) - move_delay_add = min(move_delay_add + round(amount / 2), 10) - -/mob/living/carbon/alien/AdjustStun(amount, updating = 1, ignore_canstun = 0) - . = ..() - if(!.) - move_delay_add = CLAMP(move_delay_add + round(amount/2), 0, 10) diff --git a/code/modules/mob/living/carbon/alien/update_icons.dm b/code/modules/mob/living/carbon/alien/update_icons.dm deleted file mode 100644 index 468dca35400..00000000000 --- a/code/modules/mob/living/carbon/alien/update_icons.dm +++ /dev/null @@ -1,11 +0,0 @@ - - - -/mob/living/carbon/alien/update_damage_overlays() //aliens don't have damage overlays. - return - -/mob/living/carbon/alien/update_body() // we don't use the bodyparts or body layers for aliens. - return - -/mob/living/carbon/alien/update_body_parts()//we don't use the bodyparts layer for aliens. - return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 136544af21c..f49410b29b6 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -546,9 +546,6 @@ /mob/living/carbon/Stat() ..() if(statpanel("Status")) - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) - if(vessel) - stat(null, "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]") if(locate(/obj/item/assembly/health) in src) stat(null, "Health: [health]") add_abilities_to_panel() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1abb44fe6c2..58ef1c8b6d4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -763,7 +763,6 @@ VV_DROPDOWN_OPTION(VV_HK_MAKE_MONKEY, "Make Monkey") VV_DROPDOWN_OPTION(VV_HK_MAKE_CYBORG, "Make Cyborg") VV_DROPDOWN_OPTION(VV_HK_MAKE_SLIME, "Make Slime") - VV_DROPDOWN_OPTION(VV_HK_MAKE_ALIEN, "Make Alien") VV_DROPDOWN_OPTION(VV_HK_SET_SPECIES, "Set Species") VV_DROPDOWN_OPTION(VV_HK_PURRBATION, "Toggle Purrbation") @@ -858,12 +857,6 @@ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return usr.client.holder.Topic("vv_override", list("makerobot"=href_list[VV_HK_TARGET])) - if(href_list[VV_HK_MAKE_ALIEN]) - if(!check_rights(R_SPAWN)) - return - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - usr.client.holder.Topic("vv_override", list("makealien"=href_list[VV_HK_TARGET])) if(href_list[VV_HK_MAKE_SLIME]) if(!check_rights(R_SPAWN)) return diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ce3bc301135..ce3bee14737 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -313,68 +313,6 @@ apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "slash", damage = damage)) return 1 -/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M) - if(check_shields(M, 0, "the M.name")) - visible_message(span_danger("[M] attempts to touch [src]!"), \ - span_danger("[M] attempts to touch you!"), span_hear("I hear a swoosh!"), null, M) - to_chat(M, span_warning("I attempt to touch [src]!")) - return 0 - - if(..()) - if(M.used_intent.type == INTENT_HARM) - if (wear_pants) - wear_pants.add_fingerprint(M) - var/damage = prob(90) ? 20 : 0 - if(!damage) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - visible_message(span_danger("[M] lunges at [src]!"), \ - span_danger("[M] lunges at you!"), span_hear("I hear a swoosh!"), null, M) - to_chat(M, span_danger("I lunge at [src]!")) - return 0 - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "slash","","",10) - - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] slashes at [src]!"), \ - span_danger("[M] slashes at you!"), span_hear("I hear a sickening sound of a slice!"), null, M) - to_chat(M, span_danger("I slash at [src]!")) - log_combat(M, src, "attacked") - if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful - return 1 - apply_damage(damage, BRUTE, affecting, armor_block) - - if(M.used_intent.type == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead. - var/obj/item/I = get_active_held_item() - if(I && dropItemToGround(I)) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] disarms [src]!"), \ - span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), null, M) - to_chat(M, span_danger("I disarm [src]!")) - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - Paralyze(100) - log_combat(M, src, "tackled") - visible_message(span_danger("[M] tackles [src] down!"), \ - span_danger("[M] tackles you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), null, M) - to_chat(M, span_danger("I tackle [src] down!")) - - -/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L) - - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(check_shields(L, damage, "the [L.name]")) - return 0 - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "stab") - apply_damage(damage, BRUTE, affecting, armor_block) - /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 6a8a12b302d..323e4398ed1 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -273,17 +273,6 @@ C.weather_immunities -= "ash" C.weather_immunities -= "lava" -//Fast and regenerates... but can only speak like an abductor -/datum/species/golem/alloy - name = "Alien Alloy Golem" - id = "alloy golem" - fixed_mut_color = "333" - meat = /obj/item/stack/sheet/mineral/abductor - speedmod = 1 //faster - info_text = "As an Alloy Golem, you are made of advanced alien materials: you are faster and regenerate over time. You are, however, only able to be heard by other alloy golems." - prefix = "Alien" - special_names = list("Outsider", "Technology", "Watcher", "Stranger") //ominous and unknown - //Regenerates because self-repairing super-advanced alien tech /datum/species/golem/alloy/spec_life(mob/living/carbon/human/H) if(H.stat == DEAD) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 2e42e703056..04bc58eaa4e 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -17,16 +17,6 @@ var/dmg = rand(1, 5) apply_damage(dmg, BRUTE, affecting) -/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - apply_damage(damage, BRUTE, affecting) - /mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M) if(..()) //To allow surgery to return properly. return @@ -79,57 +69,6 @@ span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) to_chat(M, span_danger("I disarm [src]!")) -/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if (M.used_intent.type == INTENT_HARM) - if ((prob(95) && health > 0)) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - if(AmountUnconscious() < 300) - Unconscious(rand(200, 300)) - visible_message(span_danger("[M] wounds [name]!"), \ - span_danger("[M] wounds you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I wound [name]!")) - else - visible_message(span_danger("[M] slashes [name]!"), \ - span_danger("[M] slashes you!"), span_hear("I hear a sickening sound of a slice!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I slash [name]!")) - - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - log_combat(M, src, "attacked") - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful - return 1 - apply_damage(damage, BRUTE, affecting) - - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s lunge misses [name]!"), \ - span_danger("I avoid [M]'s lunge!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("My lunge misses [name]!")) - - if (M.used_intent.type == INTENT_DISARM) - var/obj/item/I = null - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - if(prob(95)) - Paralyze(20) - visible_message(span_danger("[M] tackles [name] down!"), \ - span_danger("[M] tackles you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I tackle [name] down!")) - else - I = get_active_held_item() - if(dropItemToGround(I)) - visible_message(span_danger("[M] disarms [name]!"), \ - span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I disarm [name]!")) - else - I = null - log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") - updatehealth() - /mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M) . = ..() diff --git a/code/modules/mob/living/carbon/spirit/spirit_defense.dm b/code/modules/mob/living/carbon/spirit/spirit_defense.dm index faa69499d07..4a5e7457221 100644 --- a/code/modules/mob/living/carbon/spirit/spirit_defense.dm +++ b/code/modules/mob/living/carbon/spirit/spirit_defense.dm @@ -17,16 +17,6 @@ var/dmg = rand(1, 5) apply_damage(dmg, BRUTE, affecting) -/mob/living/carbon/spirit/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - apply_damage(damage, BRUTE, affecting) - /mob/living/carbon/spirit/attack_hand(mob/living/carbon/human/M) if(..()) //To allow surgery to return properly. return @@ -92,58 +82,6 @@ span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) to_chat(M, span_danger("I disarm [src]!")) -/mob/living/carbon/spirit/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if (M.used_intent.type == INTENT_HARM) - if ((prob(95) && health > 0)) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - if(AmountUnconscious() < 300) - Unconscious(rand(200, 300)) - visible_message(span_danger("[M] wounds [name]!"), \ - span_danger("[M] wounds you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I wound [name]!")) - else - visible_message(span_danger("[M] slashes [name]!"), \ - span_danger("[M] slashes you!"), span_hear("I hear a sickening sound of a slice!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I slash [name]!")) - - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - log_combat(M, src, "attacked") - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful - return 1 - apply_damage(damage, BRUTE, affecting) - - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s lunge misses [name]!"), \ - span_danger("I avoid [M]'s lunge!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("My lunge misses [name]!")) - - if (M.used_intent.type == INTENT_DISARM) - var/obj/item/I = null - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - if(prob(95)) - Paralyze(20) - visible_message(span_danger("[M] tackles [name] down!"), \ - span_danger("[M] tackles you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I tackle [name] down!")) - else - I = get_active_held_item() - if(dropItemToGround(I)) - visible_message(span_danger("[M] disarms [name]!"), \ - span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I disarm [name]!")) - else - I = null - log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") - updatehealth() - - /mob/living/carbon/spirit/attack_animal(mob/living/simple_animal/M) . = ..() if(.) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 3bdbcc05581..262d7de6fa6 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -256,8 +256,6 @@ message = "gasps out their last breath." message_robot = "shudders violently for a moment before falling still, its eyes slowly darkening." message_AI = "screeches, its screen flickering as its systems slowly halt." - message_alien = "lets out a waning guttural screech, and collapses onto the floor..." - message_larva = "lets out a sickly hiss of air and falls limply to the floor..." message_monkey = "lets out a faint chimper as it collapses and stops moving..." message_simple = "falls limp." stat_allowed = UNCONSCIOUS diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4f42e0b8918..7f7ff9add58 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -424,54 +424,6 @@ span_danger("I avoid [M.name]'s bite!"), span_hear("I hear the sound of jaws snapping shut!"), COMBAT_MESSAGE_RANGE, M) to_chat(M, span_warning("My bite misses [src]!")) return FALSE - -/mob/living/attack_larva(mob/living/carbon/alien/larva/L) - switch(L.used_intent.type) - if(INTENT_HELP) - visible_message(span_notice("[L.name] rubs its head against [src]."), \ - span_notice("[L.name] rubs its head against you."), null, null, L) - to_chat(L, span_notice("I rub my head against [src].")) - return FALSE - - else - if(HAS_TRAIT(L, TRAIT_PACIFISM)) - to_chat(L, span_warning("I don't want to hurt anyone!")) - return - - L.do_attack_animation(src) - if(prob(90)) - log_combat(L, src, "attacked") - visible_message(span_danger("[L.name] bites [src]!"), \ - span_danger("[L.name] bites you!"), span_hear("I hear a chomp!"), COMBAT_MESSAGE_RANGE, L) - to_chat(L, span_danger("I bite [src]!")) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - return TRUE - else - visible_message(span_danger("[L.name]'s bite misses [src]!"), \ - span_danger("I avoid [L.name]'s bite!"), span_hear("I hear the sound of jaws snapping shut!"), COMBAT_MESSAGE_RANGE, L) - to_chat(L, span_warning("My bite misses [src]!")) - return FALSE - -/mob/living/attack_alien(mob/living/carbon/alien/humanoid/M) - switch(M.used_intent.type) - if (INTENT_HELP) - visible_message(span_notice("[M] caresses [src] with its scythe-like arm."), \ - span_notice("[M] caresses you with its scythe-like arm."), null, null, M) - to_chat(M, span_notice("I caress [src] with my scythe-like arm.")) - return FALSE - if (INTENT_GRAB) - grabbedby(M) - return FALSE - if(INTENT_HARM) - if(HAS_TRAIT(M, TRAIT_PACIFISM)) - to_chat(M, span_warning("I don't want to hurt anyone!")) - return FALSE - M.do_attack_animation(src) - return TRUE - if(INTENT_DISARM) - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return TRUE - /mob/living/attack_hulk(mob/living/carbon/human/user) ..() if(HAS_TRAIT(user, TRAIT_PACIFISM)) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 326f5136299..a6bbe96aee6 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -4,13 +4,6 @@ spark_system.start() return ..() - -/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) - if(!SSticker.HasRoundStarted()) - to_chat(M, "You cannot attack people before the game has started.") - return - ..() - /mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user) return //immune to slimes diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 2c1d6c1826e..2319d78306c 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -17,27 +17,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real spark_system.start() return ..() -/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M) - if (M.used_intent.type == INTENT_DISARM) - if(mobility_flags & MOBILITY_STAND) - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - var/obj/item/I = get_active_held_item() - if(I) - uneq_active() - visible_message(span_danger("[M] disarmed [src]!"), \ - span_danger("[M] has disabled [src]'s active module!"), null, COMBAT_MESSAGE_RANGE) - log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") - else - Stun(40) - step(src,get_dir(M,src)) - log_combat(M, src, "pushed") - visible_message(span_danger("[M] has forced back [src]!"), \ - span_danger("[M] has forced back [src]!"), null, COMBAT_MESSAGE_RANGE) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - else - ..() - return - /mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime shock flash_act() diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 7ff4dcd7aef..2ebd06a9e45 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -5,26 +5,6 @@ /mob/living/silicon/get_ear_protection()//no ears return 2 -/mob/living/silicon/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent - var/damage = 20 - if (prob(90)) - log_combat(M, src, "attacked") - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] slashes at [src]!"), \ - span_danger("[M] slashes at you!"), null, null, M) - to_chat(M, span_danger("I slash at [src]!")) - if(prob(8)) - flash_act(affect_silicon = 1) - log_combat(M, src, "attacked") - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s swipe misses [src]!"), \ - span_danger("I avoid [M]'s swipe!"), null, null, M) - to_chat(M, span_warning("My swipe misses [src]!")) - /mob/living/silicon/attack_animal(mob/living/simple_animal/M) . = ..() if(.) @@ -53,10 +33,6 @@ /mob/living/silicon/attack_paw(mob/living/user) return attack_hand(user) -/mob/living/silicon/attack_larva(mob/living/carbon/alien/larva/L) - if(L.used_intent.type == INTENT_HELP) - visible_message(span_notice("[L.name] rubs its head against [src].")) - /mob/living/silicon/attack_hulk(mob/living/carbon/human/user) . = ..() if(!.) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 4588c891399..21a61db7e92 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -150,32 +150,6 @@ playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) -/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if(M.used_intent.type == INTENT_DISARM) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] [response_disarm_continuous] [name]!"), \ - span_danger("[M] [response_disarm_continuous] you!"), null, COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I [response_disarm_simple] [name]!")) - log_combat(M, src, "disarmed") - else - var/damage = rand(15, 30) - visible_message(span_danger("[M] slashes at [src]!"), \ - span_danger("You're slashed at by [M]!"), null, COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I slash at [src]!")) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - attack_threshold_check(damage) - log_combat(M, src, "attacked") - return 1 - -/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L) - . = ..() - if(. && stat != DEAD) //successful larva bite - var/damage = rand(5, 10) - . = attack_threshold_check(damage) - if(.) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M) . = ..() if(.) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 84cbfeb01bb..742a7ae448c 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -338,12 +338,6 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, new /obj/effect/decal/cleanable/oil(loc) ..() -/mob/living/simple_animal/bot/honkbot/attack_alien(mob/living/carbon/alien/user as mob) - ..() - if(!isalien(target)) - target = user - mode = BOT_HUNT - /mob/living/simple_animal/bot/honkbot/Crossed(atom/movable/AM) if(ismob(AM) && (on)) //only if its online if(prob(30)) //you're far more likely to trip on a honkbot diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 00d1941337a..ec5b0df06f5 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -477,12 +477,6 @@ Auto Patrol: []"}, new /obj/effect/decal/cleanable/oil(loc) ..() -/mob/living/simple_animal/bot/secbot/attack_alien(mob/living/carbon/alien/user as mob) - ..() - if(!isalien(target)) - target = user - mode = BOT_HUNT - /mob/living/simple_animal/bot/secbot/Crossed(atom/movable/AM) if(has_gravity() && ismob(AM) && target) var/mob/living/carbon/C = AM diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 4b239f73d84..e26dc02c910 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -203,18 +203,3 @@ back = /obj/item/storage/backpack/satchel/med id = /obj/item/card/id glasses = /obj/item/clothing/glasses/hud/health - -/obj/effect/mob_spawn/human/corpse/bee_terrorist - name = "BLF Operative" - outfit = /datum/outfit/bee_terrorist - -/datum/outfit/bee_terrorist - name = "BLF Operative" - uniform = /obj/item/clothing/under/color/yellow - suit = /obj/item/clothing/suit/hooded/bee_costume - shoes = /obj/item/clothing/shoes/sneakers/yellow - gloves = /obj/item/clothing/gloves/color/yellow - ears = /obj/item/radio/headset - id = /obj/item/card/id - mask = /obj/item/clothing/mask/rat/bee - diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm deleted file mode 100644 index 46479b3ccb7..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ /dev/null @@ -1,87 +0,0 @@ -#define EGG_INCUBATION_TIME 120 - -/mob/living/simple_animal/hostile/headcrab - name = "headslug" - desc = "" - icon_state = "headcrab" - icon_living = "headcrab" - icon_dead = "headcrab_dead" - gender = NEUTER - health = 50 - maxHealth = 50 - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_sound = 'sound/blank.ogg' - faction = list("creature") - robust_searching = 1 - stat_attack = DEAD - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - speak_emote = list("squeaks") - ventcrawler = VENTCRAWLER_ALWAYS - var/datum/mind/origin - var/egg_lain = 0 - -/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) - var/obj/item/organ/body_egg/changeling_egg/egg = new(victim) - egg.Insert(victim) - if(origin) - egg.origin = origin - else if(mind) // Let's make this a feature - egg.origin = mind - for(var/obj/item/organ/I in src) - I.forceMove(egg) - visible_message(span_warning("[src] plants something in [victim]'s flesh!"), \ - span_danger("We inject our egg into [victim]'s body!")) - egg_lain = 1 - -/mob/living/simple_animal/hostile/headcrab/AttackingTarget() - . = ..() - if(. && !egg_lain && iscarbon(target) && !ismonkey(target)) - // Changeling egg can survive in aliens! - var/mob/living/carbon/C = target - if(C.stat == DEAD) - if(HAS_TRAIT(C, TRAIT_XENO_HOST)) - to_chat(src, span_danger("A foreign presence repels us from this body. Perhaps we should try to infest another?")) - return - Infect(target) - to_chat(src, span_danger("With our egg laid, our death approaches rapidly...")) - addtimer(CALLBACK(src, PROC_REF(death)), 100) - -/obj/item/organ/body_egg/changeling_egg - name = "changeling egg" - desc = "" - var/datum/mind/origin - var/time - -/obj/item/organ/body_egg/changeling_egg/egg_process() - // Changeling eggs grow in dead people - time++ - if(time >= EGG_INCUBATION_TIME) - Pop() - Remove(owner) - qdel(src) - -/obj/item/organ/body_egg/changeling_egg/proc/Pop() - var/mob/living/carbon/monkey/M = new(owner) - - for(var/obj/item/organ/I in src) - I.Insert(M, 1) - - if(origin && (origin.current ? (origin.current.stat == DEAD) : origin.get_ghost())) - origin.transfer_to(M) - var/datum/antagonist/changeling/C = origin.has_antag_datum(/datum/antagonist/changeling) - if(!C) - C = origin.add_antag_datum(/datum/antagonist/changeling/xenobio) - if(C.can_absorb_dna(owner)) - C.add_new_profile(owner) - - var/datum/action/changeling/humanform/hf = new - C.purchasedpowers += hf - C.regain_powers() - M.key = origin.key - owner.gib() - -#undef EGG_INCUBATION_TIME diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 2ba5017c88d..87644b5f73c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -541,8 +541,6 @@ Difficulty: Very Hard florachance = 20 if("ayy lmao") //Beneficial, turns stuff into alien alloy which is useful to cargo and research. Also repairs atmos. NewTerrainFloors = /turf/open/floor/plating/abductor - NewTerrainWalls = /turf/closed/wall/mineral/abductor - NewTerrainChairs = /obj/structure/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline. NewTerrainTables = /obj/structure/table/abductor /obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm deleted file mode 100644 index 4f84a5082e5..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ /dev/null @@ -1,288 +0,0 @@ -/* - -Swarmer Beacon - -A strange machine appears anywhere a normal lavaland mob can it produces a swarmer at a rate of -1/15 seconds, until there are GetTotalAISwarmerCap()/2 swarmers, after this it is up to the swarmers themselves to -increase their population (it will repopulate them should they fall under GetTotalAISwarmerCap()/2 again) - -tl;dr A million of the little hellraisers spawn (controlled by AI) and try to eat mining - -Loot: Not much, besides a shit load of artificial bluespace crystals, Oh and mining doesn't get eaten -that's a plus I suppose. - -Difficulty: Special - -*/ - -GLOBAL_LIST_EMPTY(AISwarmers) -GLOBAL_LIST_EMPTY(AISwarmersByType)//AISwarmersByType[.../resource] = list(1st, 2nd, nth), AISwarmersByType[../ranged] = list(1st, 2nd, nth) etc. -GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swarmer/ai/resource = 30, /mob/living/simple_animal/hostile/swarmer/ai/ranged_combat = 20, /mob/living/simple_animal/hostile/swarmer/ai/melee_combat = 10)) - - -//returns a type of AI swarmer that is NOT at max cap -//type order is shuffled, to prevent bias -/proc/GetUncappedAISwarmerType() - var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai) - LAZYINITLIST(GLOB.AISwarmersByType) - for(var/t in shuffle(swarmerTypes)) - var/list/amount = GLOB.AISwarmersByType[t] - if(!amount || amount.len < GLOB.AISwarmerCapsByType[t]) - return t - - -//Total of all subtype caps -/proc/GetTotalAISwarmerCap() - var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai) - . = 0 - LAZYINITLIST(GLOB.AISwarmersByType) - for(var/t in swarmerTypes) - . += GLOB.AISwarmerCapsByType[t] - - -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/swarmer_swarm_beacon - name = "swarmer beacon" - desc = "" - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_console" - health = 750 - maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe - mob_biotypes = MOB_ROBOTIC - gps_name = "Hungry Signal" - achievement_type = /datum/award/achievement/boss/swarmer_beacon_kill - crusher_achievement_type = /datum/award/achievement/boss/swarmer_beacon_crusher - score_achievement_type = /datum/award/score/swarmer_beacon_score - faction = list("mining", "boss", "swarmer") - weather_immunities = list("lava","ash") - stop_automated_movement = TRUE - wander = FALSE - layer = BELOW_MOB_LAYER - AIStatus = AI_OFF - del_on_death = TRUE - var/swarmer_spawn_cooldown = 0 - var/swarmer_spawn_cooldown_amt = 150 //Deciseconds between the swarmers we spawn - var/call_help_cooldown = 0 - var/call_help_cooldown_amt = 150 //Deciseconds between calling swarmers to help us when attacked - var/static/list/swarmer_caps - - -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/swarmer_swarm_beacon/Initialize() - . = ..() - swarmer_caps = GLOB.AISwarmerCapsByType //for admin-edits - for(var/ddir in GLOB.cardinals) - new /obj/structure/swarmer/blockade (get_step(src, ddir)) - var/mob/living/simple_animal/hostile/swarmer/ai/resource/R = new(loc) - step(R, ddir) //Step the swarmers, instead of spawning them there, incase the turf is solid - - -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/swarmer_swarm_beacon/Life() - . = ..() - if(.) - var/createtype = GetUncappedAISwarmerType() - if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5)) - swarmer_spawn_cooldown = world.time + swarmer_spawn_cooldown_amt - new createtype(loc) - - -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && world.time > call_help_cooldown) - call_help_cooldown = world.time + call_help_cooldown_amt - summon_backup(25) //long range, only called max once per 15 seconds, so it's not deathlag - - -//SWARMER AI -//AI versions of the swarmer mini-antag -//This is an Abstract Base, it re-enables AI, but does not give the swarmer any goals/targets -/mob/living/simple_animal/hostile/swarmer/ai - wander = 1 - faction = list("swarmer", "mining") - weather_immunities = list("ash") //wouldn't be fun otherwise - AIStatus = AI_ON - -/mob/living/simple_animal/hostile/swarmer/ai/Initialize() - . = ..() - ToggleLight() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity - LAZYINITLIST(GLOB.AISwarmersByType[type]) - GLOB.AISwarmers += src - GLOB.AISwarmersByType[type] += src - - -/mob/living/simple_animal/hostile/swarmer/ai/Destroy() - GLOB.AISwarmers -= src - GLOB.AISwarmersByType[type] -= src - return ..() - - -/mob/living/simple_animal/hostile/swarmer/ai/SwarmerTypeToCreate() - return GetUncappedAISwarmerType() - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action() - . = ..() - if(.) - if(!stop_automated_movement) - if(health < maxHealth*0.25) - StartAction(100) - RepairSelf() - return - - -/mob/living/simple_animal/hostile/swarmer/ai/Move(atom/newloc) - if(newloc) - if(newloc.z == z) //so these actions are Z-specific - if(islava(newloc)) - var/turf/open/lava/L = newloc - if(!L.is_safe()) - StartAction(20) - new /obj/structure/lattice/catwalk/swarmer_catwalk(newloc) - return FALSE - - if(ischasm(newloc) && !throwing) - throw_at(get_edge_target_turf(src, get_dir(src, newloc)), 7 , 3, src, FALSE) //my planet needs me - return FALSE - - return ..() - - -/mob/living/simple_animal/hostile/swarmer/ai/proc/StartAction(deci = 0) - stop_automated_movement = TRUE - AIStatus = AI_OFF - addtimer(CALLBACK(src, PROC_REF(EndAction)), deci) - - -/mob/living/simple_animal/hostile/swarmer/ai/proc/EndAction() - stop_automated_movement = FALSE - AIStatus = AI_ON - - - - -//RESOURCE SWARMER: -//Similar to the original Player-Swarmers, these dismantle things to obtain the metal inside -//They then use this medal to produce more swarmers or traps/barricades - -/mob/living/simple_animal/hostile/swarmer/ai/resource - search_objects = 1 - attack_all_objects = TRUE //attempt to nibble everything - lose_patience_timeout = 150 - var/static/list/sharedWanted = typecacheof(list(/turf/closed/mineral, /turf/closed/wall)) //eat rocks and walls - var/static/list/sharedIgnore = list() - -//This handles viable things to eat/attack -//Place specific cases of AI derpiness here -//Most can be left to the automatic Gain/LosePatience() system -/mob/living/simple_animal/hostile/swarmer/ai/resource/CanAttack(atom/the_target) - - //SPECIFIC CASES: - //Smash fulltile windows before grilles - if(istype(the_target, /obj/structure/grille)) - for(var/obj/structure/window/rogueWindow in get_turf(the_target)) - if(rogueWindow.fulltile) //done this way because the subtypes are weird. - the_target = rogueWindow - break - - //GENERAL CASES: - if(is_type_in_typecache(the_target, sharedIgnore)) //always ignore - return FALSE - if(is_type_in_typecache(the_target, sharedWanted)) //always eat - return TRUE - - return ..() //else, have a nibble, see if it's food - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/OpenFire(atom/A) - if(isliving(A)) //don't shoot rocks, sillies. - ..() - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/AttackingTarget() - if(target.swarmer_act(src)) - add_type_to_wanted(target.type) - return TRUE - else - add_type_to_ignore(target.type) - return FALSE - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action() - . = ..() - if(.) - if(!stop_automated_movement) - if(GLOB.AISwarmers.len < GetTotalAISwarmerCap() && resources >= 50) - StartAction(100) //so they'll actually sit still and use the verbs - CreateSwarmer() - return - - if(resources > 5) - if(prob(5)) //lower odds, as to prioritise reproduction - StartAction(10) //not a typo - CreateBarricade() - return - if(prob(5)) - CreateTrap() - return - - -//So swarmers can learn what is and isn't food -/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_wanted(typepath) - if(!sharedWanted[typepath])// this and += is faster than |= - sharedWanted += typecacheof(typepath) - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_ignore(typepath) - if(!sharedIgnore[typepath]) - sharedIgnore += typecacheof(typepath) - - -//RANGED SWARMER -/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat - icon_state = "swarmer_ranged" - icon_living = "swarmer_ranged" - projectiletype = /obj/projectile/beam/laser - projectilesound = 'sound/blank.ogg' - check_friendly_fire = TRUE //you're supposed to protect the resource swarmers, you poop - retreat_distance = 3 - minimum_distance = 3 - -/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat/Aggro() - ..() - summon_backup(15, TRUE) //Exact matching, so that goliaths don't come to aid the swarmers, that'd be silly - - -//MELEE SWARMER -/mob/living/simple_animal/hostile/swarmer/ai/melee_combat - icon_state = "swarmer_melee" - icon_living = "swarmer_melee" - health = 60 - maxHealth = 60 - ranged = FALSE - -/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/Aggro() - ..() - summon_backup(15, TRUE) - - -/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/AttackingTarget() - if(isliving(target)) - if(prob(35)) - StartAction(30) - DisperseTarget(target) - else - var/mob/living/L = target - L.attack_animal(src) - L.electrocute_act(10, src, flags = SHOCK_NOGLOVES) - return TRUE - else - return ..() - - - - -//SWARMER CATWALKS -//Used so they can survive lavaland better -/obj/structure/lattice/catwalk/swarmer_catwalk - name = "swarmer catwalk" - desc = "" - icon = 'icons/obj/smooth_structures/swarmer_catwalk.dmi' - icon_state = "swarmer_catwalk" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index e032996cc7e..48b36645108 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -118,10 +118,6 @@ IGNORE_PROC_IF_NOT_TARGET(attack_hulk) IGNORE_PROC_IF_NOT_TARGET(attack_paw) -IGNORE_PROC_IF_NOT_TARGET(attack_alien) - -IGNORE_PROC_IF_NOT_TARGET(attack_larva) - IGNORE_PROC_IF_NOT_TARGET(attack_animal) IGNORE_PROC_IF_NOT_TARGET(attack_slime) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 57af3603a36..61617dccc3d 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -233,7 +233,7 @@ attack_verb_continuous = "ferociously mauls" attack_verb_simple = "ferociously maul" environment_smash = ENVIRONMENT_SMASH_NONE - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam, /obj/item/soap) attack_reagent = /datum/reagent/peaceborg/confuse /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer @@ -283,7 +283,7 @@ melee_damage_upper = 20 attack_verb_continuous = "awkwardly flails at" attack_verb_simple = "awkwardly flail at" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob name = "Something that was once a clown" @@ -297,5 +297,5 @@ speed = 20 attack_verb_continuous = "bounces off of" attack_verb_simple = "bounce off of" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) attack_reagent = /datum/reagent/toxin/mindbreaker diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 9e1cb037b88..df451c21262 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -297,9 +297,6 @@ /mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/monkey/M) return attack_hand(M) -/mob/living/simple_animal/parrot/attack_alien(mob/living/carbon/alien/M) - return attack_hand(M) - //Simple animals /mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/M) . = ..() //goodbye immortal parrots diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index b9556fe9a6f..655ea47ebac 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -361,11 +361,11 @@ else for(var/mob/living/carbon/C in targets) if(!Discipline && prob(5)) - if(ishuman(C) || isalienadult(C)) + if(ishuman(C)) Target = C break - if(islarva(C) || ismonkey(C)) + if(ismonkey(C)) Target = C break diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 4fabb34def4..fbbf3f64e69 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -313,10 +313,6 @@ if(..()) //successful monkey bite. attacked += 10 -/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - attacked += 10 - /mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user) . = ..() if(!.) @@ -374,12 +370,6 @@ if(..()) //successful attack attacked += 10 -/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - attacked += 10 - discipline_slime(M) - - /mob/living/simple_animal/slime/attackby(obj/item/W, mob/living/user, params) if(stat == DEAD && !user.cmode) var/list/possible_steps = list() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e8f6d6b6956..eb88a681684 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -432,37 +432,6 @@ . = R qdel(src) -//human -> alien -/mob/living/carbon/human/proc/Alienize() - if (notransform) - return - notransform = TRUE - mobility_flags = NONE - for(var/obj/item/W in src) - dropItemToGround(W) - regenerate_icons() - icon = null - invisibility = INVISIBILITY_MAXIMUM - for(var/t in bodyparts) - qdel(t) - - var/alien_caste = pick("Hunter","Sentinel","Drone") - var/mob/living/carbon/alien/humanoid/new_xeno - switch(alien_caste) - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) - - new_xeno.a_intent = INTENT_HARM - new_xeno.key = key - - to_chat(new_xeno, "I are now an alien.") - . = new_xeno - qdel(src) - /mob/living/carbon/human/proc/slimeize(reproduce as num) if (notransform) return diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index c5ed328bcab..2197c152612 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -115,9 +115,7 @@ to_chat(usr, span_notice("I feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "[ass.p_their()]"] clothes on.") ) break else if(toner >= 5 && !busy && check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. - if(isalienadult(ass) || istype(ass, /mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. - temp_img = icon('icons/ass/assalien.png') - else if(ishuman(ass)) //Suit checks are in check_ass + if(ishuman(ass)) //Suit checks are in check_ass temp_img = icon(ass.gender == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png') else if(isdrone(ass)) //Drones are hot temp_img = icon('icons/ass/assdrone.png') diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 2cc3cb43c67..23003fcbfb9 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1360,8 +1360,6 @@ if(!prob(prb)) return 0 do_sparks(5, TRUE, src) - if(isalien(user)) - return 0 if(electrocute_mob(user, src, src, 1, TRUE)) return 1 else diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index adb29485848..079db6d9f45 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -67,9 +67,6 @@ /obj/singularity/attack_paw(mob/user) consume(user) -/obj/singularity/attack_alien(mob/user) - consume(user) - /obj/singularity/attack_animal(mob/user) consume(user) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index e1bd94e09fd..69efed87566 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -574,9 +574,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/attack_paw(mob/user) dust_mob(user, cause = "monkey attack") -/obj/machinery/power/supermatter_crystal/attack_alien(mob/user) - dust_mob(user, cause = "alien attack") - /obj/machinery/power/supermatter_crystal/attack_animal(mob/living/simple_animal/S) var/murder if(!S.melee_damage_upper && !S.melee_damage_lower) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index fc4a506397f..d46293a7a73 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -189,10 +189,7 @@ var/splatter_dir = dir if(starting) splatter_dir = get_dir(starting, target_loca) - if(isalien(L)) - new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) - else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) if(prob(33)) L.add_splatter_floor(target_loca) @@ -575,7 +572,7 @@ if(!direct_target) //If they're able to 1. stand or 2. use items or 3. move, AND they are not softcrit, they are not stunned enough to dodge projectiles passing over. //If they're dead they shouldn't be getting hit by indirect fire - if((CHECK_BITFIELD(L.mobility_flags, MOBILITY_USE | MOBILITY_STAND | MOBILITY_MOVE) && L.stat == CONSCIOUS) || L.stat == DEAD) + if((CHECK_BITFIELD(L.mobility_flags, MOBILITY_USE | MOBILITY_STAND | MOBILITY_MOVE) && L.stat == CONSCIOUS) || L.stat == DEAD) return FALSE return TRUE diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 8c5169cf1ea..8488acf969f 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -184,7 +184,7 @@ var/mob/living/new_mob - var/randomize = pick("monkey","robot","slime","xeno","humanoid","animal") + var/randomize = pick("monkey","robot","slime","humanoid","animal") switch(randomize) if("monkey") new_mob = new /mob/living/carbon/monkey(M.loc) @@ -210,14 +210,6 @@ if("slime") new_mob = new /mob/living/simple_animal/slime/random(M.loc) - if("xeno") - var/Xe - if(M.ckey) - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/carbon/alien/humanoid/sentinel) - else - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/simple_animal/hostile/alien/sentinel) - new_mob = new Xe(M.loc) - if("animal") var/path = pick(/mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/bear, @@ -233,8 +225,6 @@ /mob/living/simple_animal/hostile/carp/ranged/chaos, /mob/living/simple_animal/hostile/retaliate/rogue/asteroid/basilisk/watcher, /mob/living/simple_animal/hostile/retaliate/rogue/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/headcrab, - /mob/living/simple_animal/hostile/morph, /mob/living/simple_animal/hostile/stickman, /mob/living/simple_animal/hostile/stickman/dog, /mob/living/simple_animal/hostile/retaliate/rogue/megafauna/dragon/lesser, diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index d7e50b595db..e4ee605aee1 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -4,9 +4,3 @@ damage = 5 damage_type = TOX paralyze = 100 - -/obj/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) - if(isalien(target)) - paralyze = 0 - nodamage = TRUE - return ..() diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 7992d3222f3..bca1fb92b27 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -961,16 +961,13 @@ mix_sound = 'sound/items/fillbottle.ogg' id = /datum/reagent/consumable/Acoffee required_temp = 374 - results = list(/datum/reagent/consumable/Acoffee = 24) - required_reagents = list(/datum/reagent/consumable/acorn_powder = 4, /datum/reagent/water = 20) - - /datum/chemical_reaction/alch/acoffee/on_reaction(var/mob/user, var/obj/item/reagent_containers/container, var/total_volume) - ..() - if(container) - // Remove all leftover water - var/datum/reagent/R - for(R in container.reagents.reagent_list) - if(istype(R, /datum/reagent/water)) - container.reagents.remove_reagent(/datum/reagent/water, R.volume) + results = list(/datum/reagent/consumable/Acoffee = 6) + required_reagents = list(/datum/reagent/consumable/acorn_powder = 1, /datum/reagent/water = 5) + +/datum/chemical_reaction/alch/acoffee/on_reaction(var/mob/user, var/obj/item/reagent_containers/container, var/total_volume) + . = ..() + if(container) + // Remove all leftover water + container.reagents.del_reagent(/datum/reagent/water) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index ba8e7211be8..599fc6dbacf 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -736,16 +736,6 @@ if(method != TOUCH) L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) -/datum/reagent/gluttonytoxin - name = "Gluttony's Blessing" - description = "An advanced corruptive toxin produced by something terrible." - color = "#5EFF3B" //RGB: 94, 255, 59 - can_synth = FALSE - taste_description = "decay" - -/datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume) - L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE) - /datum/reagent/serotrotium name = "Serotrotium" description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." @@ -1169,17 +1159,6 @@ if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) L.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE) -/datum/reagent/xenomicrobes - name = "Xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - color = "#535E66" // rgb: 83, 94, 102 - can_synth = FALSE - taste_description = "sludge" - -/datum/reagent/xenomicrobes/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) - if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - L.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE) - /datum/reagent/fungalspores name = "Tubercle bacillus Cosmosis microbes" description = "Active fungal spores." @@ -1493,10 +1472,6 @@ taste_description = "bitterness" taste_mult = 1.5 -/datum/reagent/stable_plasma/on_mob_life(mob/living/carbon/C) - C.adjustPlasma(10) - ..() - /datum/reagent/iodine name = "Iodine" description = "Commonly added to table salt as a nutrient. On its own it tastes far less pleasing." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index d8d36ac3d9f..180ee66926b 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -64,7 +64,6 @@ /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2*REM) - C.adjustPlasma(20) return ..() /datum/reagent/toxin/plasma/on_temp_change() diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 9bef2d049bc..e1dd2bd169f 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -45,9 +45,6 @@ to_chat(user, span_notice("I transfer [trans] unit\s of the solution.")) update_icon() return - else if(isalien(target)) //hiss-hiss has no eyes! - to_chat(target, span_danger("[target] does not seem to have any eyes!")) - return target.visible_message(span_danger("[user] squirts something into [target]'s eyes!"), \ span_danger("[user] squirts something into your eyes!")) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 5cddf0d4c4b..37140665964 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -25,7 +25,7 @@ /obj/item/reagent_containers/spray/afterattack(atom/A, mob/user) . = ..() - if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics)) + if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart)) return if((A.is_drainable() && !A.is_refillable()) && get_dist(src,A) <= 1 && can_fill_from_container) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 006146411da..c6211e8186b 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -232,13 +232,6 @@ volume = 1 list_reagents = list(/datum/reagent/mulligan = 1) -/obj/item/reagent_containers/syringe/gluttony - name = "Gluttony's Blessing" - desc = "" - amount_per_transfer_from_this = 1 - volume = 1 - list_reagents = list(/datum/reagent/gluttonytoxin = 1) - /obj/item/reagent_containers/syringe/bluespace name = "bluespace syringe" desc = "" diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index f15c88b42ba..12839899186 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -208,30 +208,6 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/board/cargo - name = "Computer Design (Supply Console)" - desc = "" - id = "cargo" - build_path = /obj/item/circuitboard/computer/cargo - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/board/cargorequest - name = "Computer Design (Supply Request Console)" - desc = "" - id = "cargorequest" - build_path = /obj/item/circuitboard/computer/cargo/request - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/board/bounty - name = "Computer Design (Bounty Console)" - desc = "" - id = "bounty" - build_path = /obj/item/circuitboard/computer/bounty - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_CARGO - /datum/design/board/mining name = "Computer Design (Outpost Status Display)" desc = "" diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index b77f6c9bd37..3f5489d7e6f 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -2,15 +2,6 @@ ///////////////////////////////////////// /////////////////Mining////////////////// ///////////////////////////////////////// -/datum/design/cargo_express - name = "Computer Design (Express Supply Console)"//shes beautiful - desc = ""//who? - id = "cargoexpress"//the coder reading this - build_type = IMPRINTER - materials = list(/datum/material/glass = 1000) - build_path = /obj/item/circuitboard/computer/cargo/express - category = list("Mining Designs") - departmental_flags = DEPARTMENTAL_FLAG_CARGO /datum/design/bluespace_pod name = "Supply Drop Pod Upgrade Disk" diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm index 617ef4b1ae1..fec12d2c9f8 100644 --- a/code/modules/research/designs/smelting_designs.dm +++ b/code/modules/research/designs/smelting_designs.dm @@ -60,13 +60,3 @@ category = list("initial", "Stock Parts") departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING maxstack = 50 - -/datum/design/alienalloy - name = "Alien Alloy" - desc = "" - id = "alienalloy" - build_type = PROTOLATHE | SMELTER - materials = list(/datum/material/iron = 4000, /datum/material/plasma = 4000) - build_path = /obj/item/stack/sheet/mineral/abductor - category = list("Stock Parts") - departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index f03cedaaa86..4a3579ecd75 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -138,67 +138,3 @@ materials = list(/datum/material/iron = 5000, /datum/material/silver = 2500, /datum/material/plasma = 5000, /datum/material/titanium = 2000, /datum/material/diamond = 2000) category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -///////////////////////////////////////// -/////////Alien Surgical Tools//////////// -///////////////////////////////////////// - -/datum/design/alienscalpel - name = "Alien Scalpel" - desc = "" - id = "alien_scalpel" - build_path = /obj/item/scalpel/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/alienhemostat - name = "Alien Hemostat" - desc = "" - id = "alien_hemostat" - build_path = /obj/item/hemostat/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/alienretractor - name = "Alien Retractor" - desc = "" - id = "alien_retractor" - build_path = /obj/item/retractor/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/aliensaw - name = "Alien Circular Saw" - desc = "" - id = "alien_saw" - build_path = /obj/item/circular_saw/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 10000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/aliendrill - name = "Alien Drill" - desc = "" - id = "alien_drill" - build_path = /obj/item/surgicaldrill/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 10000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/aliencautery - name = "Alien Cautery" - desc = "" - id = "alien_cautery" - build_path = /obj/item/cautery/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 3990b0c2287..88150749da6 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1000,49 +1000,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000, TECHWEB_POINT_TYPE_NANITES = 4000) export_price = 15000 -////////////////////////Alien technology//////////////////////// -/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech - id = "alientech" - display_name = "Alien Technology" - description = "Things used by the greys." - prereq_ids = list("biotech","engineering") - boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, - /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - export_price = 20000 - hidden = TRUE - design_ids = list("alienalloy") - -/datum/techweb_node/alientech/on_research() //Unlocks the Zeta shuttle for purchase - SSshuttle.shuttle_purchase_requirements_met |= SHUTTLE_UNLOCK_ALIENTECH - -/datum/techweb_node/alien_bio - id = "alien_bio" - display_name = "Alien Biological Tools" - description = "Advanced biological tools." - prereq_ids = list("alientech", "adv_biotech") - design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery") - boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, - /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 20000 - hidden = TRUE - -/datum/techweb_node/alien_engi - id = "alien_engi" - display_name = "Alien Engineering" - description = "Alien engineering tools" - prereq_ids = list("alientech", "adv_engi") - design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool") - boost_item_paths = list(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, - /obj/item/gun/energy/shrink_ray) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 20000 - hidden = TRUE - /datum/techweb_node/syndicate_basic id = "syndicate_basic" display_name = "Illegal Technology" diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 84378de8f27..8df5f4b1c09 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -58,7 +58,6 @@ /obj/item/stack/sheet/mineral/bananium = /datum/species/golem/bananium, /obj/item/stack/sheet/mineral/titanium = /datum/species/golem/titanium, /obj/item/stack/sheet/mineral/plastitanium = /datum/species/golem/plastitanium, - /obj/item/stack/sheet/mineral/abductor = /datum/species/golem/alloy, /obj/item/stack/sheet/mineral/wood = /datum/species/golem/wood, /obj/item/stack/sheet/bluespace_crystal = /datum/species/golem/bluespace, /obj/item/stack/sheet/runed_metal = /datum/species/golem/runic, diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index a09ccea3ee9..77efbd61e37 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -88,10 +88,7 @@ return TRUE else to_chat(H, span_warning("You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.")) - if(istype(mover, /mob/living/simple_animal/hostile/morph)) - return TRUE - else - return FALSE + return FALSE /obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin. name = "pride's mirror" diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index b2a5e30fea5..13c56c45de3 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -266,9 +266,6 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) /turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user) promptExit(user) -/turf/closed/indestructible/hoteldoor/attack_larva(mob/user) - promptExit(user) - /turf/closed/indestructible/hoteldoor/attack_slime(mob/user) promptExit(user) diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index 90209bb3b73..b597ccf9080 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -29,7 +29,6 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/gun/ballistic/automatic/m90, - /obj/item/gun/energy/alien, /obj/item/gun/energy/e_gun/dragnet, /obj/item/gun/energy/e_gun/turret, /obj/item/gun/energy/pulse/carbine, diff --git a/code/modules/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/rod_form.dm deleted file mode 100644 index 567377dbc48..00000000000 --- a/code/modules/spells/spell_types/rod_form.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/rod_form - name = "Rod Form" - desc = "" - clothes_req = TRUE - human_req = FALSE - charge_max = 250 - cooldown_min = 100 - range = -1 - include_user = TRUE - invocation = "CLANG!" - invocation_type = "shout" - action_icon_state = "immrod" - -/obj/effect/proc_holder/spell/targeted/rod_form/cast(list/targets,mob/user = usr) - var/area/A = get_area(user) - if(istype(A, /area/wizard_station)) - to_chat(user, span_warning("I know better than to trash Wizard Federation property. Best wait until you leave to use [src].")) - return - for(var/mob/living/M in targets) - var/turf/start = get_turf(M) - var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(start, M.dir, (15 + spell_level * 3))) - W.wizard = M - W.max_distance += spell_level * 3 //You travel farther when you upgrade the spell - W.damage_bonus += spell_level * 20 //You do more damage when you upgrade the spell - W.start_turf = start - M.forceMove(W) - M.notransform = TRUE - M.status_flags |= GODMODE - -//Wizard Version of the Immovable Rod - -/obj/effect/immovablerod/wizard - var/max_distance = 13 - var/damage_bonus = 0 - var/turf/start_turf - notify = FALSE - -/obj/effect/immovablerod/wizard/Move() - if(get_dist(start_turf, get_turf(src)) >= max_distance) - qdel(src) - ..() - -/obj/effect/immovablerod/wizard/Destroy() - if(wizard) - wizard.status_flags &= ~GODMODE - wizard.notransform = FALSE - wizard.forceMove(get_turf(src)) - return ..() - -/obj/effect/immovablerod/wizard/penetrate(mob/living/L) - if(L.anti_magic_check()) - L.visible_message(span_danger("[src] hits [L], but it bounces back, then vanishes!") , span_danger("[src] hits you... but it bounces back, then vanishes!") , span_danger("I hear a weak, sad, CLANG.")) - qdel(src) - return - L.visible_message(span_danger("[L] is penetrated by an immovable rod!") , span_danger("The rod penetrates you!") , span_danger("I hear a CLANG!")) - L.adjustBruteLoss(70 + damage_bonus) diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm deleted file mode 100644 index 93085351d82..00000000000 --- a/code/modules/station_goals/shield.dm +++ /dev/null @@ -1,182 +0,0 @@ -//Station Shield -// A chain of satellites encircles the station -// Satellites be actived to generate a shield that will block unorganic matter from passing it. -/datum/station_goal/station_shield - name = "Station Shield" - var/coverage_goal = 500 - -/datum/station_goal/station_shield/get_report() - return {"The station is located in a zone full of space debris. - We have a prototype shielding system you must deploy to reduce collision-related accidents. - - You can order the satellites and control systems at cargo. - "} - - -/datum/station_goal/station_shield/on_report() - //Unlock -// var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat] -// P.special_enabled = TRUE - -// P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat_control] -// P.special_enabled = TRUE - -/datum/station_goal/station_shield/check_completion() - if(..()) - return TRUE - if(get_coverage() >= coverage_goal) - return TRUE - return FALSE - -/datum/station_goal/proc/get_coverage() - var/list/coverage = list() - for(var/obj/machinery/satellite/meteor_shield/A in GLOB.machines) - if(!A.active || !is_station_level(A.z)) - continue - coverage |= view(A.kill_range,A) - return coverage.len - -/obj/machinery/computer/sat_control - name = "satellite control" - desc = "" - circuit = /obj/item/circuitboard/computer/sat_control - ui_x = 400 - ui_y = 305 - - var/notice - -/obj/machinery/computer/sat_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "sat_control", name, ui_x, ui_y, master_ui, state) - ui.open() - -/obj/machinery/computer/sat_control/ui_act(action, params) - if(..()) - return - switch(action) - if("toggle") - toggle(text2num(params["id"])) - . = TRUE - -/obj/machinery/computer/sat_control/proc/toggle(id) - for(var/obj/machinery/satellite/S in GLOB.machines) - if(S.id == id && S.z == z) - S.toggle() - -/obj/machinery/computer/sat_control/ui_data() - var/list/data = list() - - data["satellites"] = list() - for(var/obj/machinery/satellite/S in GLOB.machines) - data["satellites"] += list(list( - "id" = S.id, - "active" = S.active, - "mode" = S.mode - )) - data["notice"] = notice - - - var/datum/station_goal/station_shield/G = locate() in SSticker.mode.station_goals - if(G) - data["meteor_shield"] = 1 - data["meteor_shield_coverage"] = G.get_coverage() - data["meteor_shield_coverage_max"] = G.coverage_goal - return data - - -/obj/machinery/satellite - name = "\improper Defunct Satellite" - desc = "" - icon = 'icons/obj/machines/satellite.dmi' - icon_state = "sat_inactive" - anchored = FALSE - density = TRUE - use_power = FALSE - var/mode = "NTPROBEV0.8" - var/active = FALSE - var/static/gid = 0 - var/id = 0 - -/obj/machinery/satellite/Initialize() - . = ..() - id = gid++ - -/obj/machinery/satellite/interact(mob/user) - toggle(user) - -/obj/machinery/satellite/proc/toggle(mob/user) - if(!active && !isinspace()) - if(user) - to_chat(user, span_warning("I can only activate [src] in space.")) - return FALSE - if(user) - to_chat(user, span_notice("I [active ? "deactivate": "activate"] [src].")) - active = !active - if(active) - animate(src, pixel_y = 2, time = 10, loop = -1) - anchored = TRUE - else - animate(src, pixel_y = 0, time = 10) - anchored = FALSE - update_icon() - -/obj/machinery/satellite/update_icon() - icon_state = active ? "sat_active" : "sat_inactive" - -/obj/machinery/satellite/multitool_act(mob/living/user, obj/item/I) - ..() - to_chat(user, span_notice("// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[(obj_flags & EMAGGED) ? "DEBUG_MODE //" : ""]")) - return TRUE - -/obj/machinery/satellite/meteor_shield - name = "\improper Meteor Shield Satellite" - desc = "" - mode = "M-SHIELD" - speed_process = TRUE - var/kill_range = 14 - -/obj/machinery/satellite/meteor_shield/proc/space_los(meteor) - for(var/turf/T in getline(src,meteor)) - if(!isspaceturf(T)) - return FALSE - return TRUE - -/obj/machinery/satellite/meteor_shield/process() - if(!active) - return - for(var/obj/effect/meteor/M in GLOB.meteor_list) - if(M.z != z) - continue - if(get_dist(M,src) > kill_range) - continue - if(!(obj_flags & EMAGGED) && space_los(M)) - Beam(get_turf(M),icon_state="sat_beam",time=5,maxdistance=kill_range) - qdel(M) - -/obj/machinery/satellite/meteor_shield/toggle(user) - if(!..(user)) - return FALSE - if(obj_flags & EMAGGED) - if(active) - change_meteor_chance(2) - else - change_meteor_chance(0.5) - -/obj/machinery/satellite/meteor_shield/proc/change_meteor_chance(mod) - var/datum/round_event_control/E = locate(/datum/round_event_control/meteor_wave) in SSevents.control - if(E) - E.weight *= mod - -/obj/machinery/satellite/meteor_shield/Destroy() - . = ..() - if(active && (obj_flags & EMAGGED)) - change_meteor_chance(0.5) - -/obj/machinery/satellite/meteor_shield/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - to_chat(user, span_notice("I access the satellite's debug mode, increasing the chance of meteor strikes.")) - if(active) - change_meteor_chance(2) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index e5f58872841..a7e7328c43f 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -299,10 +299,6 @@ if(!brute && !burn && !stamina) return FALSE - switch(animal_origin) - if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take double burn //nothing can burn with so much snowflake code around - burn *= 2 - //cap at maxdamage if(brute_dam + brute > max_damage) brute_dam = max_damage @@ -682,25 +678,11 @@ icon_state = "default_monkey_chest" animal_origin = MONKEY_BODYPART -/obj/item/bodypart/chest/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_chest" - dismemberable = 0 - max_damage = 500 - animal_origin = ALIEN_BODYPART - /obj/item/bodypart/chest/devil dismemberable = 0 max_damage = 5000 animal_origin = DEVIL_BODYPART -/obj/item/bodypart/chest/larva - icon = 'icons/mob/animal_parts.dmi' - icon_state = "larva_chest" - dismemberable = 0 - max_damage = 50 - animal_origin = LARVA_BODYPART - /obj/item/bodypart/l_arm name = "left arm" desc = "" @@ -753,14 +735,6 @@ px_x = -5 px_y = -3 -/obj/item/bodypart/l_arm/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_l_arm" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 100 - animal_origin = ALIEN_BODYPART /obj/item/bodypart/l_arm/devil dismemberable = 0 @@ -819,15 +793,6 @@ px_x = 5 px_y = -3 -/obj/item/bodypart/r_arm/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_r_arm" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 100 - animal_origin = ALIEN_BODYPART - /obj/item/bodypart/r_arm/devil dismemberable = 0 max_damage = 5000 @@ -875,15 +840,6 @@ animal_origin = MONKEY_BODYPART px_y = 4 -/obj/item/bodypart/l_leg/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_l_leg" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 100 - animal_origin = ALIEN_BODYPART - /obj/item/bodypart/l_leg/devil dismemberable = 0 max_damage = 5000 @@ -932,14 +888,6 @@ animal_origin = MONKEY_BODYPART px_y = 4 -/obj/item/bodypart/r_leg/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_r_leg" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 100 - animal_origin = ALIEN_BODYPART /obj/item/bodypart/r_leg/devil dismemberable = 0 diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index a014bed3b33..a5ac871c404 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -196,13 +196,7 @@ //Applies the debrained overlay if there is no brain if(!brain) var/image/debrain_overlay = image(layer = -HAIR_LAYER, dir = SOUTH) - if(animal_origin == ALIEN_BODYPART) - debrain_overlay.icon = 'icons/mob/animal_parts.dmi' - debrain_overlay.icon_state = "debrained_alien" - else if(animal_origin == LARVA_BODYPART) - debrain_overlay.icon = 'icons/mob/animal_parts.dmi' - debrain_overlay.icon_state = "debrained_larva" - else if(!(NOBLOOD in species_flags_list)) + if(!(NOBLOOD in species_flags_list)) debrain_overlay.icon = 'icons/mob/human_face.dmi' debrain_overlay.icon_state = "debrained" . += debrain_overlay @@ -228,25 +222,7 @@ icon_state = "default_monkey_head" animal_origin = MONKEY_BODYPART -/obj/item/bodypart/head/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_head" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 500 - animal_origin = ALIEN_BODYPART - /obj/item/bodypart/head/devil dismemberable = 0 max_damage = 5000 animal_origin = DEVIL_BODYPART - -/obj/item/bodypart/head/larva - icon = 'icons/mob/animal_parts.dmi' - icon_state = "larva_head" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 50 - animal_origin = LARVA_BODYPART diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index a3ab91c92d1..42f3b8c7041 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -52,8 +52,6 @@ return TRUE return FALSE -/mob/living/carbon/alien/larva/has_left_hand() - return 1 /mob/proc/has_right_hand(check_disabled = TRUE) @@ -66,9 +64,6 @@ return TRUE return FALSE -/mob/living/carbon/alien/larva/has_right_hand() - return 1 - //Limb numbers @@ -90,10 +85,6 @@ /mob/proc/get_arm_ignore() return 0 -/mob/living/carbon/alien/larva/get_arm_ignore() - return 1 //so we can still handcuff larvas. - - /mob/proc/get_num_legs(check_disabled = TRUE) return 2 @@ -112,8 +103,6 @@ /mob/proc/get_leg_ignore() return FALSE -/mob/living/carbon/alien/larva/get_leg_ignore() - return TRUE /mob/living/carbon/human/get_leg_ignore() if(movement_type & (FLYING | FLOATING)) @@ -125,22 +114,12 @@ /mob/living/carbon/get_missing_limbs() var/list/full = list( - BODY_ZONE_HEAD, - BODY_ZONE_CHEST, - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - ) - for(var/zone in full) - if(get_bodypart(zone)) - full -= zone - return full - -/mob/living/carbon/alien/larva/get_missing_limbs() - var/list/full = list( - BODY_ZONE_HEAD, + BODY_ZONE_HEAD, BODY_ZONE_CHEST, + BODY_ZONE_R_ARM, + BODY_ZONE_L_ARM, + BODY_ZONE_R_LEG, + BODY_ZONE_L_LEG, ) for(var/zone in full) if(get_bodypart(zone)) @@ -152,24 +131,12 @@ /mob/living/carbon/get_disabled_limbs() var/list/full = list( - BODY_ZONE_HEAD, - BODY_ZONE_CHEST, - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - ) - var/list/disabled = list() - for(var/zone in full) - var/obj/item/bodypart/affecting = get_bodypart(zone) - if(affecting && affecting.disabled) - disabled += zone - return disabled - -/mob/living/carbon/alien/larva/get_disabled_limbs() - var/list/full = list( - BODY_ZONE_HEAD, + BODY_ZONE_HEAD, BODY_ZONE_CHEST, + BODY_ZONE_R_ARM, + BODY_ZONE_L_ARM, + BODY_ZONE_R_LEG, + BODY_ZONE_L_LEG, ) var/list/disabled = list() for(var/zone in full) @@ -221,42 +188,6 @@ L.change_bodypart_status(BODYPART_ROBOTIC) . = L -/mob/living/carbon/alien/larva/newBodyPart(zone, robotic, fixed_icon) - var/obj/item/bodypart/L - switch(zone) - if(BODY_ZONE_HEAD) - L = new /obj/item/bodypart/head/larva() - if(BODY_ZONE_CHEST) - L = new /obj/item/bodypart/chest/larva() - if(L) - L.update_limb(fixed_icon, src) - if(robotic) - L.change_bodypart_status(BODYPART_ROBOTIC) - . = L - -/mob/living/carbon/alien/humanoid/newBodyPart(zone, robotic, fixed_icon) - var/obj/item/bodypart/L - switch(zone) - if(BODY_ZONE_L_ARM) - L = new /obj/item/bodypart/l_arm/alien() - if(BODY_ZONE_R_ARM) - L = new /obj/item/bodypart/r_arm/alien() - if(BODY_ZONE_HEAD) - L = new /obj/item/bodypart/head/alien() - if(BODY_ZONE_L_LEG) - L = new /obj/item/bodypart/l_leg/alien() - if(BODY_ZONE_R_LEG) - L = new /obj/item/bodypart/r_leg/alien() - if(BODY_ZONE_CHEST) - L = new /obj/item/bodypart/chest/alien() - if(L) - L.update_limb(fixed_icon, src) - if(robotic) - L.change_bodypart_status(BODYPART_ROBOTIC) - . = L - - - /mob/living/carbon/proc/Digitigrade_Leg_Swap(swap_back) var/body_plan_changed = FALSE for(var/X in bodyparts) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 0c437b23500..5719f7d1c04 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -189,12 +189,6 @@ if(environment && environment.return_pressure() > 30) return 1 - // Priority 2: use plasma from internal plasma storage. - // (just in case someone would ever use this implant system to make cyber-alien ops with jetpacks and taser arms) - if(owner.getPlasma() >= num*100) - owner.adjustPlasma(-num*100) - return 1 - // Priority 3: use internals tank. var/obj/item/tank/I = owner.internal if(I && I.air_contents && I.air_contents.total_moles() > num) diff --git a/roguetown.dme b/roguetown.dme index 74c4bef8b0d..e1f5a168424 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -233,8 +233,6 @@ #include "code\_onclick\hud\action_button.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alien.dm" -#include "code\_onclick\hud\alien_larva.dm" #include "code\_onclick\hud\blob_overmind.dm" #include "code\_onclick\hud\blobbernauthud.dm" #include "code\_onclick\hud\clickdelay.dm" @@ -263,7 +261,6 @@ #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\slime.dm" #include "code\_onclick\hud\spirit.dm" -#include "code\_onclick\hud\swarmer.dm" #include "code\controllers\admin.dm" #include "code\controllers\controller.dm" #include "code\controllers\failsafe.dm" @@ -877,8 +874,6 @@ #include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" #include "code\game\gamemodes\monkey\monkey.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\revolution\revolution.dm" @@ -909,7 +904,6 @@ #include "code\game\machinery\dish_drive.dm" #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\droneDispenser.dm" #include "code\game\machinery\exp_cloner.dm" #include "code\game\machinery\fat_sucker.dm" #include "code\game\machinery\firealarm.dm" @@ -1118,7 +1112,6 @@ #include "code\game\objects\items\airlock_painter.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\body_egg.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\candle.dm" #include "code\game\objects\items\cardboard_cutouts.dm" @@ -1242,7 +1235,6 @@ #include "code\game\objects\items\grenades\spawnergrenade.dm" #include "code\game\objects\items\grenades\syndieminibomb.dm" #include "code\game\objects\items\implants\implant.dm" -#include "code\game\objects\items\implants\implant_abductor.dm" #include "code\game\objects\items\implants\implant_chem.dm" #include "code\game\objects\items\implants\implant_clown.dm" #include "code\game\objects\items\implants\implant_exile.dm" @@ -1355,7 +1347,6 @@ #include "code\game\objects\items\tools\wirecutters.dm" #include "code\game\objects\items\tools\wrench.dm" #include "code\game\objects\structures\ai_core.dm" -#include "code\game\objects\structures\aliens.dm" #include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barsigns.dm" #include "code\game\objects\structures\bearpelt.dm" @@ -1424,7 +1415,6 @@ #include "code\game\objects\structures\well.dm" #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\beds_chairs\alien_nest.dm" #include "code\game\objects\structures\beds_chairs\bed.dm" #include "code\game\objects\structures\beds_chairs\chair.dm" #include "code\game\objects\structures\beds_chairs\pew.dm" @@ -1604,33 +1594,6 @@ #include "code\modules\antagonists\_common\antag_hud.dm" #include "code\modules\antagonists\_common\antag_spawner.dm" #include "code\modules\antagonists\_common\antag_team.dm" -#include "code\modules\antagonists\abductor\abductor.dm" -#include "code\modules\antagonists\abductor\ice_abductor.dm" -#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_gear.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_outfits.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_surgery.dm" -#include "code\modules\antagonists\abductor\equipment\gland.dm" -#include "code\modules\antagonists\abductor\equipment\glands\access.dm" -#include "code\modules\antagonists\abductor\equipment\glands\blood.dm" -#include "code\modules\antagonists\abductor\equipment\glands\chem.dm" -#include "code\modules\antagonists\abductor\equipment\glands\egg.dm" -#include "code\modules\antagonists\abductor\equipment\glands\electric.dm" -#include "code\modules\antagonists\abductor\equipment\glands\heal.dm" -#include "code\modules\antagonists\abductor\equipment\glands\mindshock.dm" -#include "code\modules\antagonists\abductor\equipment\glands\plasma.dm" -#include "code\modules\antagonists\abductor\equipment\glands\quantum.dm" -#include "code\modules\antagonists\abductor\equipment\glands\slime.dm" -#include "code\modules\antagonists\abductor\equipment\glands\spider.dm" -#include "code\modules\antagonists\abductor\equipment\glands\transform.dm" -#include "code\modules\antagonists\abductor\equipment\glands\trauma.dm" -#include "code\modules\antagonists\abductor\equipment\glands\ventcrawl.dm" -#include "code\modules\antagonists\abductor\equipment\glands\viral.dm" -#include "code\modules\antagonists\abductor\machinery\camera.dm" -#include "code\modules\antagonists\abductor\machinery\console.dm" -#include "code\modules\antagonists\abductor\machinery\dispenser.dm" -#include "code\modules\antagonists\abductor\machinery\experiment.dm" -#include "code\modules\antagonists\abductor\machinery\pad.dm" #include "code\modules\antagonists\ashwalker\ashwalker.dm" #include "code\modules\antagonists\blob\blob.dm" #include "code\modules\antagonists\blob\blob_mobs.dm" @@ -1674,7 +1637,6 @@ #include "code\modules\antagonists\changeling\powers\digitalcamo.dm" #include "code\modules\antagonists\changeling\powers\fakedeath.dm" #include "code\modules\antagonists\changeling\powers\fleshmend.dm" -#include "code\modules\antagonists\changeling\powers\headcrab.dm" #include "code\modules\antagonists\changeling\powers\hivemind.dm" #include "code\modules\antagonists\changeling\powers\humanform.dm" #include "code\modules\antagonists\changeling\powers\lesserform.dm" @@ -1709,7 +1671,6 @@ #include "code\modules\antagonists\disease\disease_abilities.dm" #include "code\modules\antagonists\disease\disease_datum.dm" #include "code\modules\antagonists\disease\disease_disease.dm" -#include "code\modules\antagonists\disease\disease_event.dm" #include "code\modules\antagonists\disease\disease_mob.dm" #include "code\modules\antagonists\ert\ert.dm" #include "code\modules\antagonists\fugitive\fugitive.dm" @@ -1720,7 +1681,6 @@ #include "code\modules\antagonists\highlander\highlander.dm" #include "code\modules\antagonists\magic_servant\servant.dm" #include "code\modules\antagonists\monkey\monkey.dm" -#include "code\modules\antagonists\morph\morph.dm" #include "code\modules\antagonists\morph\morph_antag.dm" #include "code\modules\antagonists\nightmare\nightmare.dm" #include "code\modules\antagonists\ninja\ninja.dm" @@ -1762,13 +1722,8 @@ #include "code\modules\antagonists\roguetown\villain\werewolf\werewolf_transformation.dm" #include "code\modules\antagonists\santa\santa.dm" #include "code\modules\antagonists\separatist\separatist.dm" -#include "code\modules\antagonists\slaughter\slaughter.dm" -#include "code\modules\antagonists\slaughter\slaughter_antag.dm" -#include "code\modules\antagonists\slaughter\slaughterevent.dm" #include "code\modules\antagonists\space_dragon\space_dragon.dm" #include "code\modules\antagonists\survivalist\survivalist.dm" -#include "code\modules\antagonists\swarmer\swarmer.dm" -#include "code\modules\antagonists\swarmer\swarmer_event.dm" #include "code\modules\antagonists\traitor\datum_traitor.dm" #include "code\modules\antagonists\traitor\syndicate_contract.dm" #include "code\modules\antagonists\traitor\equipment\contractor.dm" @@ -1781,7 +1736,6 @@ #include "code\modules\antagonists\wizard\equipment\artefact.dm" #include "code\modules\antagonists\wizard\equipment\soulstone.dm" #include "code\modules\antagonists\wizard\equipment\spellbook.dm" -#include "code\modules\antagonists\xeno\xeno.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" #include "code\modules\assembly\doorcontrol.dm" @@ -1882,31 +1836,11 @@ #include "code\modules\buildmode\submodes\mapgen.dm" #include "code\modules\buildmode\submodes\throwing.dm" #include "code\modules\buildmode\submodes\variable_edit.dm" -#include "code\modules\cargo\bounty.dm" -#include "code\modules\cargo\bounty_console.dm" #include "code\modules\cargo\centcom_podlauncher.dm" -#include "code\modules\cargo\console.dm" -#include "code\modules\cargo\export_scanner.dm" #include "code\modules\cargo\exports.dm" -#include "code\modules\cargo\expressconsole.dm" #include "code\modules\cargo\gondolapod.dm" #include "code\modules\cargo\order.dm" -#include "code\modules\cargo\packs.dm" #include "code\modules\cargo\supplypod.dm" -#include "code\modules\cargo\supplypod_beacon.dm" -#include "code\modules\cargo\bounties\assistant.dm" -#include "code\modules\cargo\bounties\chef.dm" -#include "code\modules\cargo\bounties\engineering.dm" -#include "code\modules\cargo\bounties\item.dm" -#include "code\modules\cargo\bounties\mech.dm" -#include "code\modules\cargo\bounties\medical.dm" -#include "code\modules\cargo\bounties\mining.dm" -#include "code\modules\cargo\bounties\reagent.dm" -#include "code\modules\cargo\bounties\science.dm" -#include "code\modules\cargo\bounties\security.dm" -#include "code\modules\cargo\bounties\slime.dm" -#include "code\modules\cargo\bounties\special.dm" -#include "code\modules\cargo\bounties\virus.dm" #include "code\modules\cargo\exports\gear.dm" #include "code\modules\cargo\exports\large_objects.dm" #include "code\modules\cargo\exports\lavaland.dm" @@ -1916,6 +1850,7 @@ #include "code\modules\cargo\exports\sheets.dm" #include "code\modules\cargo\exports\tools.dm" #include "code\modules\cargo\exports\weapons.dm" +#include "code\modules\cargo\packsrogue\_pack.dm" #include "code\modules\cargo\packsrogue\_rogue.dm" #include "code\modules\cargo\packsrogue\apparel.dm" #include "code\modules\cargo\packsrogue\armor.dm" @@ -2083,8 +2018,6 @@ #include "code\modules\error_handler\error_handler.dm" #include "code\modules\error_handler\error_viewer.dm" #include "code\modules\events\_event.dm" -#include "code\modules\events\abductor.dm" -#include "code\modules\events\alien_infestation.dm" #include "code\modules\events\anomaly.dm" #include "code\modules\events\anomaly_bluespace.dm" #include "code\modules\events\anomaly_flux.dm" @@ -2102,31 +2035,21 @@ #include "code\modules\events\creep_awakening.dm" #include "code\modules\events\devil.dm" #include "code\modules\events\disease_outbreak.dm" -#include "code\modules\events\dust.dm" #include "code\modules\events\electrical_storm.dm" #include "code\modules\events\fake_virus.dm" #include "code\modules\events\false_alarm.dm" -#include "code\modules\events\fugitive_spawning.dm" #include "code\modules\events\ghost_role.dm" #include "code\modules\events\grid_check.dm" #include "code\modules\events\heart_attack.dm" -#include "code\modules\events\high_priority_bounty.dm" -#include "code\modules\events\immovable_rod.dm" #include "code\modules\events\ion_storm.dm" -#include "code\modules\events\major_dust.dm" #include "code\modules\events\mass_hallucination.dm" -#include "code\modules\events\meateor_wave.dm" -#include "code\modules\events\meteor_wave.dm" #include "code\modules\events\mice_migration.dm" -#include "code\modules\events\nightmare.dm" #include "code\modules\events\operative.dm" #include "code\modules\events\pirates.dm" #include "code\modules\events\portal_storm.dm" #include "code\modules\events\prison_break.dm" #include "code\modules\events\processor_overload.dm" #include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\sentience.dm" -#include "code\modules\events\space_dragon.dm" #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\spontaneous_appendicitis.dm" @@ -2491,7 +2414,6 @@ #include "code\modules\mining\equipment\regenerative_core.dm" #include "code\modules\mining\equipment\resonator.dm" #include "code\modules\mining\equipment\survival_pod.dm" -#include "code\modules\mining\equipment\vendor_items.dm" #include "code\modules\mining\equipment\wormhole_jaunter.dm" #include "code\modules\mining\laborcamp\laborshuttle.dm" #include "code\modules\mining\laborcamp\laborstacker.dm" @@ -2598,40 +2520,6 @@ #include "code\modules\mob\living\carbon\status_procs.dm" #include "code\modules\mob\living\carbon\stress.dm" #include "code\modules\mob\living\carbon\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_defense.dm" -#include "code\modules\mob\living\carbon\alien\damage_procs.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\emote.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\login.dm" -#include "code\modules\mob\living\carbon\alien\logout.dm" -#include "code\modules\mob\living\carbon\alien\organs.dm" -#include "code\modules\mob\living\carbon\alien\say.dm" -#include "code\modules\mob\living\carbon\alien\screen.dm" -#include "code\modules\mob\living\carbon\alien\status_procs.dm" -#include "code\modules\mob\living\carbon\alien\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\death.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\praetorian.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" -#include "code\modules\mob\living\carbon\alien\larva\death.dm" -#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\powers.dm" -#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" -#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" #include "code\modules\mob\living\carbon\human\damage_procs.dm" #include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\dummy.dm" @@ -2836,7 +2724,6 @@ #include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm" #include "code\modules\mob\living\simple_animal\guardian\types\standard.dm" #include "code\modules\mob\living\simple_animal\guardian\types\support.dm" -#include "code\modules\mob\living\simple_animal\hostile\alien.dm" #include "code\modules\mob\living\simple_animal\hostile\bear.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm" #include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" @@ -2845,7 +2732,6 @@ #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\goose.dm" -#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" @@ -2884,7 +2770,6 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\sif.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" @@ -3495,7 +3380,6 @@ #include "code\modules\spells\spell_types\personality_commune.dm" #include "code\modules\spells\spell_types\projectile.dm" #include "code\modules\spells\spell_types\rightandwrong.dm" -#include "code\modules\spells\spell_types\rod_form.dm" #include "code\modules\spells\spell_types\santa.dm" #include "code\modules\spells\spell_types\shadow_walk.dm" #include "code\modules\spells\spell_types\shapeshift.dm" @@ -3510,7 +3394,6 @@ #include "code\modules\spells\spell_types\voice_of_god.dm" #include "code\modules\spells\spell_types\wizard.dm" #include "code\modules\station_goals\bsa.dm" -#include "code\modules\station_goals\shield.dm" #include "code\modules\station_goals\station_goal.dm" #include "code\modules\surgery\_surgery.dm" #include "code\modules\surgery\_surgery_step.dm" From ed09288a05273caf1229c1b6ec0ade291489ae89 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Fri, 29 Nov 2024 21:32:32 +0300 Subject: [PATCH 103/192] more shit --- code/__DEFINES/traits.dm | 1 + .../sexcon/sex_actions/deviant/ear_sex.dm | 2 +- .../datums/sexcon/sex_actions/oral/blowjob.dm | 2 +- code/datums/sexcon/sexcon.dm | 5 ++-- code/datums/status_effects/rogue/debuff.dm | 13 +++++++++-- .../objects/items/rogueweapons/rmb_intents.dm | 4 +--- .../jobs/job_types/roguetown/church/priest.dm | 1 + .../xenobiology/crossbreeding/_potions.dm | 4 ++-- code/testing.dm | 1 - .../code/datums/traits/unspecial.dm | 9 +++++++ .../items/rogueweapons/reagent_coating.dm | 22 ++++++++++++++++++ .../icons/roguetown/items/surgery.dmi | Bin 0 -> 1308 bytes 12 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm create mode 100644 modular_stonehedge/licensed-eaglephntm/icons/roguetown/items/surgery.dmi diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ae36529faec..bcb1a2c674e 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -102,6 +102,7 @@ #define TRAIT_LEPROSY "Leprosy" #define TRAIT_NUDE_SLEEPER "Picky Sleeper" #define TRAIT_ENDOWMENT "Enchanted Endowment" // should apply +3 CON -2 END -1 SPD, restricts most armor and using bows/crossbows, slows getting up. +#define TRAIT_ENDOWMENTLITE "Natural Endowment" // no drawback version. // PATRON CURSE TRAITS #define TRAIT_CURSE "Curse" //source diff --git a/code/datums/sexcon/sex_actions/deviant/ear_sex.dm b/code/datums/sexcon/sex_actions/deviant/ear_sex.dm index f3f6b24bf6a..349526d9ae5 100644 --- a/code/datums/sexcon/sex_actions/deviant/ear_sex.dm +++ b/code/datums/sexcon/sex_actions/deviant/ear_sex.dm @@ -50,7 +50,7 @@ user.sexcon.perform_sex_action(user, 2, 0, TRUE) if(user.sexcon.check_active_ejaculation()) user.visible_message(span_love("[user] cums into [target]'s ear!")) - user.sexcon.cum_into(oral = TRUE) //so they just get ingested direct + user.sexcon.cum_into() var/datum/sex_controller/sc = user.sexcon diff --git a/code/datums/sexcon/sex_actions/oral/blowjob.dm b/code/datums/sexcon/sex_actions/oral/blowjob.dm index ccb38727e90..dd0ba16d427 100644 --- a/code/datums/sexcon/sex_actions/oral/blowjob.dm +++ b/code/datums/sexcon/sex_actions/oral/blowjob.dm @@ -60,7 +60,7 @@ target.sexcon.cum_onto() else target.visible_message(span_lovebold("[target] cums into [user]'s mouth!")) - target.sexcon.cum_into() + target.sexcon.cum_into(oral = TRUE) /datum/sex_action/blowjob/on_finish(mob/living/user, mob/living/target) ..() diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index 4186ff720ff..19a54b8d0f5 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -246,7 +246,7 @@ var/cum_to_take = CLAMP((testes.reagents.maximum_volume/2), 1, testes.reagents.total_volume) testes.reagents.trans_to(target, cum_to_take, transfered_by = user) else - var/cameloc + var/obj/item/organ/filling_organ/cameloc if(vaginal) cameloc = target.getorganslot(ORGAN_SLOT_VAGINA) if(anal) @@ -254,9 +254,8 @@ if(nipple) cameloc = target.getorganslot(ORGAN_SLOT_BREASTS) if(vaginal || anal || nipple) - var/obj/item/organ/cameorgan = cameloc var/cum_to_take = CLAMP((testes.reagents.maximum_volume/4), 1, min(testes.reagents.total_volume, cameorgan.reagents.maximum_volume - cameorgan.reagents.total_volume)) - testes.reagents.trans_to(cameorgan, cum_to_take, transfered_by = user) + testes.reagents.trans_to(cameloc, cum_to_take, transfered_by = user) else var/cum_to_take = CLAMP((testes.reagents.maximum_volume/4), 1, testes.reagents.total_volume) testes.reagents.trans_to(target, cum_to_take, transfered_by = user) //digest anyway if none of those. diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 94d6b4f1803..979b1b54aa3 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -345,17 +345,23 @@ /datum/status_effect/debuff/bigboobs id = "bigboobs" alert_type = /atom/movable/screen/alert/status_effect/debuff/bigboobs - examine_text = span_notice("They have massive GOODS!") + examine_text = span_notice("They have massive MAGICAL GOODS!") effectedstats = list("constitution" = 3,"endurance" = -2, "speed" = -1) duration = 10 MINUTES var/initialpenis var/initialbutt var/initialball var/initialbreasts + var/nodrawback = FALSE /datum/status_effect/debuff/bigboobs/permanent duration = -1 //used for quirk +/datum/status_effect/debuff/bigboobs/permanent/lite + alert_type = null + examine_text = span_notice("They have massive GOODS!") + nodrawback = TRUE + /atom/movable/screen/alert/status_effect/debuff/bigboobs name = "Enchanted Endowment" //was gonna name it a curse but it isn't a technically one. desc = "They feel as heavy as gold and are massive... My back hurts." @@ -367,7 +373,10 @@ var/mob/living/carbon/human/species/user = owner if(!user) return - ADD_TRAIT(user, TRAIT_ENDOWMENT, id) + if(nodrawback) + ADD_TRAIT(user, TRAIT_ENDOWMENTLITE, id) + else + ADD_TRAIT(user, TRAIT_ENDOWMENT, id) to_chat(user, span_warning("Gah! my [user.gender == FEMALE ? "TITS" : "JUNK"] expand to impossible sizes!")) //max them out. for(var/obj/item/organ/forgan as anything in user.internal_organs) //as anything cause i either do this or use for() twice which is i guess worse. diff --git a/code/game/objects/items/rogueweapons/rmb_intents.dm b/code/game/objects/items/rogueweapons/rmb_intents.dm index ddb03aa79e9..43241d0317a 100644 --- a/code/game/objects/items/rogueweapons/rmb_intents.dm +++ b/code/game/objects/items/rogueweapons/rmb_intents.dm @@ -10,7 +10,7 @@ return if(user.incapacitated()) return - var/mob/living/carbon/human/L = target + var/mob/living/carbon/L = target user.changeNext_move(CLICK_CD_RAPID) playsound(user, 'sound/combat/feint.ogg', 100, TRUE) user.visible_message(span_danger("[user] feints an attack at [target]!")) @@ -39,8 +39,6 @@ L.Immobilize(30) to_chat(user, span_notice("[L] is tripped up by my combat maneuver and momentarily stunned!")) user.apply_status_effect(/datum/status_effect/debuff/feintcd) - L.target = user - L.retaliate(user) else to_chat(user, span_warning("[L] avoids my trip maneuver... 80%")) return diff --git a/code/modules/jobs/job_types/roguetown/church/priest.dm b/code/modules/jobs/job_types/roguetown/church/priest.dm index 5dd4f8f72e9..f2468d1a3b5 100644 --- a/code/modules/jobs/job_types/roguetown/church/priest.dm +++ b/code/modules/jobs/job_types/roguetown/church/priest.dm @@ -1,5 +1,6 @@ /datum/job/roguetown/priest title = "Archpriest" + f_title = "Archpriestess" flag = PRIEST department_flag = CHURCHMEN faction = "Station" diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index 746ae084f63..c04ba81e7aa 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -113,7 +113,7 @@ Slimecrossing Potions /obj/item/slimepotion/endowpotion/attack(mob/living/M, mob/user) if(!isliving(M) || M.stat == DEAD) - to_chat(user, span_warning("The love potion only works on living things, sicko!")) + to_chat(user, span_warning("The endowment potion only works on living things, sicko!")) return ..() if(M.has_status_effect(STATUS_EFFECT_ENDOWED)) @@ -127,7 +127,7 @@ Slimecrossing Potions if(uses <= 0) to_chat(M, span_notice("The potion is useless now.")) qdel(src) - to_chat(user, span_notice("I feed [M] the love potion!")) + to_chat(user, span_notice("I feed [M] the endowment potion!")) if(M.has_status_effect(STATUS_EFFECT_ENDOWED)) M.remove_status_effect(STATUS_EFFECT_ENDOWED) M.apply_status_effect(STATUS_EFFECT_ENDOWED) diff --git a/code/testing.dm b/code/testing.dm index d1f973f8109..1d44a88e0f5 100644 --- a/code/testing.dm +++ b/code/testing.dm @@ -15,4 +15,3 @@ #endif //#define WARTIME -#define FASTLOAD diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 98f97d03542..84881a765d6 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -595,3 +595,12 @@ /datum/quirk/endowed/on_spawn() var/mob/living/carbon/human/H = quirk_holder H.apply_status_effect(/datum/status_effect/debuff/bigboobs/permanent) + +/datum/quirk/endowedlite + name = "Naturally Endowed" + desc = "I have massive bits, they are natural and not emburdening like an enchanted endowment." + value = 0 + +/datum/quirk/endowedlite/on_spawn() + var/mob/living/carbon/human/H = quirk_holder + H.apply_status_effect(/datum/status_effect/debuff/bigboobs/permanent/lite) diff --git a/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm b/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm new file mode 100644 index 00000000000..8c99d4f8af3 --- /dev/null +++ b/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm @@ -0,0 +1,22 @@ +//By Vide Noir https://github.com/EaglePhntm. +//reagent coating for weapons that apply on successful hit through armor. + +/*todo +- splash or dropper reagent apply +- wash reagent clear +- unarmored hit detection to apply reagent +*/ + +/obj/item/rogueweapon + var/coatable = TRUE + var/reagent_cap + var/reagent_apply_amt + +/obj/item/rogueweapon/Initialize() + . = ..() + if(coatable && sharpness == IS_BLUNT) + reagent_cap = w_class*10 //weapon size equals more coatable. + reagent_apply_amt = 10/w_class //smaller weapons will apply more poison at once. + create_reagents(reagent_cap, TRANSPARENT|REFILLABLE) + +/obj/item/rogueweapon/ diff --git a/modular_stonehedge/licensed-eaglephntm/icons/roguetown/items/surgery.dmi b/modular_stonehedge/licensed-eaglephntm/icons/roguetown/items/surgery.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8c69b4496650b563cd5326b327f536d51b18cfa6 GIT binary patch literal 1308 zcmV+%1>^dOP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#H0xHwZXi;5L&6%4sJ(~1&vQz2})f`ZI~)RL0a_*9}*rV*_& zC$q3LGXH<__$ZLY1E1TACeT(tvG`saJ0KUBSb;xU8fW}WhSlfGbrpBUd@6`d& zZf9D!Ltb45AFSN7#-r1OW0M`fHO(5=5?4JlLH{moO^rnvjYT?syL)GiY++q;yFLSi z@Wjl#{H|%%5VIg0o20PzkZXynZc|I)Ni8YAJ1`rFS>R-dt3AMJ)GNhY%jc$9W2KOF zee|71y`+~~J|CEkj{RIU;OWj2DYjC~(KKr$X6C6Bb1kFq6@=K5UgE%Pkkpct^pYI? z`}r!Leg0v~KCbkD%)*i-{(tY&52V;iF($a6XUOL|FeGc^_k z;C{Z!SE=ia#v)vL|5Y6W86e2x+824C4n%>J==N|dJRF^zrkdNcr@=P`=l+FAV1ViZR3k7zbpfgo7@)cU)d&nwU4Uu?2B&wW69eo?tq3f|-^JNEtDE=re!*1(`pM^2!?hmJZ$7UYt~SAL z^7*rdflqmS0;uW7bb{&K3iB1EzZta z+U-Hhb`L!p&>ompin-;)%slAjQ}cOvgJ-}=`8<%<(;1o1U)=c@fJZxhb3QL-Mz637-`LmyU}R*ZuVdM9q5%#g9s#09=le1^ zhnHTCxJ|fg932Lnkk8{*T;1)>P&^*DgkUd(3$%oze&qAd|Jt Date: Fri, 29 Nov 2024 12:48:03 -0600 Subject: [PATCH 104/192] Stuff (#144) * bog trekking fix and nut fix final * fart changed spells around since was renamed for zizo cleric finally fixed bog trekking to not be stupid. no slowdown but no speed boost AS WAS INTENDED added fart emote. YOUR WELCOME. --------- Co-authored-by: Moribun <117505981+Moribun@users.noreply.github.com> --- code/datums/gods/patrons/inhumen_pantheon.dm | 28 ++++---- code/datums/status_effects/rogue/debuff.dm | 13 ++++ .../objects/items/rogueweapons/intents.dm | 5 ++ code/game/turfs/open/floor/roguefloor.dm | 72 ++++++++----------- code/game/turfs/open/water.dm | 11 ++- code/modules/farming/produce.dm | 3 +- .../carbon/human/voicepacks/genfemale.dm | 7 +- .../living/carbon/human/voicepacks/genmale.dm | 8 ++- code/modules/mob/living/emote.dm | 23 ++++++ code/modules/spells/roguetown/acolyte/zizo.dm | 9 +-- modular/code/modules/living/carbon/stress.dm | 5 ++ 11 files changed, 115 insertions(+), 69 deletions(-) diff --git a/code/datums/gods/patrons/inhumen_pantheon.dm b/code/datums/gods/patrons/inhumen_pantheon.dm index d9c634bf36b..284cd0304ff 100644 --- a/code/datums/gods/patrons/inhumen_pantheon.dm +++ b/code/datums/gods/patrons/inhumen_pantheon.dm @@ -15,9 +15,9 @@ worshippers = "Power-Hungry, Powerful, Charismatic, Liers." mob_traits = list(TRAIT_NASTY_EATER, TRAIT_SNEK, TRAIT_ZOMBIE_IMMUNE) //had to add zombie immune so as not to double dip when making the infection immune t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen - t1 = /obj/effect/proc_holder/spell/invoked/invisibility - t2 = /obj/effect/proc_holder/spell/invoked/eldritchhealing/any - t3 = /obj/effect/proc_holder/spell/invoked/projectile/sickness + t1 = /obj/effect/proc_holder/spell/invoked/eldritchhealing/any + t2 = /obj/effect/proc_holder/spell/invoked/raise_undead + t3 = /obj/effect/proc_holder/spell/invoked/strengthen_undead //wrong spell t4 = /obj/effect/proc_holder/spell/invoked/revive_inhumen confess_lines = list( "Praisssse the Greatssssnake!!", @@ -56,17 +56,17 @@ ) /datum/patron/inhumen/baotha - name = "The Sacrifice" - domain = "Void, Loss, Absence, Nihility." - desc = "The Sacrifice wishes to take from you, and for you to give it willingly. You will never get it back if you go too far. But you will always have the sacrifice." - worshippers = "Nihilists, Gamblers, Warlocks, and Villains." - mob_traits = list(TRAIT_CRACKHEAD) - t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen - confess_lines = list( - "I do not yearn for anything!!", - "I CANNOT LOSE WHAT I COULD NEVER HOPE TO HOLD!", - "THERE IS NO LOSS, THERE IS NO LIE! THERE IS ONLY SACRIFICE!", - "IT'S ALL OBLIVION IN THE END FOR ME!", + name = "The Sacrifice" + domain = "Void, Loss, Absence, Nihility." + desc = "The Sacrifice wishes to take from you, and for you to give it willingly. You will never get it back if you go too far. But you will always have the sacrifice." + worshippers = "Nihilists, Gamblers, Warlocks, and Villains." + mob_traits = list(TRAIT_CRACKHEAD) + t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen + confess_lines = list( + "I do not yearn for anything!!", + "I CANNOT LOSE WHAT I COULD NEVER HOPE TO HOLD!", + "THERE IS NO LOSS, THERE IS NO LIE! THERE IS ONLY SACRIFICE!", + "IT'S ALL OBLIVION IN THE END FOR ME!", ) diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 94d6b4f1803..f93f4d434e9 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -239,6 +239,19 @@ effectedstats = list("fortune" = -3) duration = 20 MINUTES +/datum/status_effect/debuff/shame + id = "Ashamed" + alert_type = /atom/movable/screen/alert/status_effect/debuff/shame + effectedstats = list("fortune" = -1, "intelligence" = -1) + duration = 5 MINUTES + +/atom/movable/screen/alert/status_effect/debuff/shame + name = "Ashamed" + desc = "I feel really fucking stupid right now..." + +/datum/status_effect/debuff/shame/on_apply() + owner.add_stress(/datum/stressevent/shitself) + /atom/movable/screen/alert/status_effect/debuff/devitalised name = "Devitalised" desc = "Something has been taken from me, and it will take time to recover." diff --git a/code/game/objects/items/rogueweapons/intents.dm b/code/game/objects/items/rogueweapons/intents.dm index 8711f1f1a18..8d7276d34c5 100644 --- a/code/game/objects/items/rogueweapons/intents.dm +++ b/code/game/objects/items/rogueweapons/intents.dm @@ -250,6 +250,11 @@ volume = 100 extra_range = 3 +/datum/looping_sound/unholy + mid_sounds = list('sound/vo/mobs/ghost/whisper (1).ogg') + mid_length = 320 + volume = 100 + extra_range = 3 /datum/looping_sound/invokeholy mid_sounds = list('sound/magic/holycharging.ogg') diff --git a/code/game/turfs/open/floor/roguefloor.dm b/code/game/turfs/open/floor/roguefloor.dm index 7e85b6298a1..ff338da3c2e 100644 --- a/code/game/turfs/open/floor/roguefloor.dm +++ b/code/game/turfs/open/floor/roguefloor.dm @@ -152,18 +152,14 @@ slowdown = 0 smooth = SMOOTH_TRUE neighborlay = "grassedge" + /turf/open/floor/rogue/grass/get_slowdown(mob/user) - var/returned = slowdown - var/negate_slowdown = FALSE - if(HAS_TRAIT(user, TRAIT_BOG_TREKKING)) - negate_slowdown = TRUE - if(negate_slowdown) - returned = max(returned-0.5, -1) + var returned = slowdown // Initialize 'returned' with a default value + if (HAS_TRAIT(user, TRAIT_BOG_TREKKING)) + returned = 0 // No slowdown if user has 'TRAIT_BOG_TREKKING' return returned -// /turf/open/floor/rogue/grass/Initialize() -// dir = pick(GLOB.cardinals) -// GLOB.dirt_list += src -// . = ..() + + /turf/open/floor/rogue/grass/cardinal_smooth(adjacencies) roguesmooth(adjacencies) @@ -221,28 +217,35 @@ var/dirt_amt = 3 /turf/open/floor/rogue/dirt/get_slowdown(mob/user) - //No tile slowdown for fairies + // No tile slowdown for fairies var/mob/living/carbon/human/FM = user - if(isseelie(FM) && !(FM.resting)) //Add wingcheck + if (isseelie(FM) && !(FM.resting)) // Add wingcheck return 0 - var/returned = slowdown - var/negate_slowdown = FALSE - for(var/obj/item/I in user.held_items) - if(I.walking_stick) - if(!I.wielded) + // Define 'returned' with an initial value + var returned = slowdown + var negate_slowdown = FALSE + + // Check for walking stick + for (var/obj/item/I in user.held_items) + if (I.walking_stick) + if (!I.wielded) var/mob/living/L = user - if(!L.cmode) + if (!L.cmode) negate_slowdown = TRUE - if(HAS_TRAIT(user, TRAIT_BOG_TREKKING)) - negate_slowdown = TRUE - if(negate_slowdown) - returned = max(returned-2.5, -1) + // Additional check for 'TRAIT_BOG_TREKKING' + if (HAS_TRAIT(user, TRAIT_BOG_TREKKING)) + returned = 0 + + if (negate_slowdown) + returned = 0 + return returned + /turf/open/floor/rogue/dirt/attack_right(mob/user) if(isliving(user)) var/mob/living/L = user @@ -301,24 +304,11 @@ return TRUE /turf/open/floor/rogue/dirt/road/update_water() - water_level = max(water_level-10,0) - for(var/D in GLOB.cardinals) - var/turf/TU = get_step(src, D) - if(istype(TU, /turf/open/water)) - if(!muddy) - become_muddy() - return TRUE //stop processing -/* if(water_level > 10) //this would be a switch on normal tiles - if(!muddy) - become_muddy()*/ -//flood process goes here to spread to other turfs etc -// if(water_level > 250) -// return FALSE if(muddy) if(water_level <= 0) water_level = 0 muddy = FALSE - slowdown = initial(slowdown) + slowdown = 0 // fuck you im tired of trying to clean this slop. icon_state = initial(icon_state) name = initial(name) footstep = initial(footstep) @@ -355,13 +345,11 @@ canSmoothWith = list(/turf/open/floor/rogue/dirt,/turf/open/floor/rogue/grass) neighborlay = "roadedge" slowdown = 0 + /turf/open/floor/rogue/dirt/road/get_slowdown(mob/user) - var/returned = slowdown - var/negate_slowdown = FALSE - if(HAS_TRAIT(user, TRAIT_BOG_TREKKING)) - negate_slowdown = TRUE - if(negate_slowdown) - returned = max(returned-0.5, -1) + var returned = slowdown // Initialize 'returned' with a default value + if (HAS_TRAIT(user, TRAIT_BOG_TREKKING)) + returned = 0 // No slowdown if user has 'TRAIT_BOG_TREKKING' return returned /turf/open/floor/rogue/dirt/road/attack_right(mob/user) return diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 9c0112e4ac1..36c24cbd786 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -304,13 +304,12 @@ BP.add_embedded_object(I, silent = TRUE) return . /turf/open/water/swamp/get_slowdown(mob/user) - var/returned = slowdown - var/negate_slowdown = FALSE - if(HAS_TRAIT(user, TRAIT_BOG_TREKKING)) - negate_slowdown = TRUE - if(negate_slowdown) - returned = max(returned-1.5, 0) + var returned = slowdown // Initialize 'returned' with a default value + if (HAS_TRAIT(user, TRAIT_BOG_TREKKING)) + returned = 0 // No slowdown if user has 'TRAIT_BOG_TREKKING' return returned + + /turf/open/water/swamp/deep name = "murk" desc = "Deep water with several weeds and algae on the surface." diff --git a/code/modules/farming/produce.dm b/code/modules/farming/produce.dm index 643abc53a0e..f0d80ef4ba1 100644 --- a/code/modules/farming/produce.dm +++ b/code/modules/farming/produce.dm @@ -445,13 +445,14 @@ /obj/item/reagent_containers/food/snacks/grown/nut name = "rocknut" + desc = "a nut with mild stimulant properties" seed = /obj/item/seeds/nut icon_state = "nut" tastes = list("nutty" = 1) filling_color = "#6b4d18" bitesize = 1 foodtype = FRUIT - list_reagents = list(/datum/reagent/consumable/nutriment = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/acorn_powder = 4, /datum/reagent/drug/nicotine = 1) grind_results = list(/datum/reagent/consumable/acorn_powder = 4) /obj/item/reagent_containers/food/snacks/grown/tomato diff --git a/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm b/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm index 75ec6d61b95..9b5fdb57d37 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm @@ -7,7 +7,12 @@ used = getfsilenced(soundin) if(!used) switch(soundin) - if("deathgurgle") + if("fart") + if(prob(5)) + used = 'sound/vo/vart (4).ogg' + else + used = 'sound/vo/vart (2).ogg' + else if("deathgurgle") used = pick('sound/vo/female/gen/deathgurgle (1).ogg','sound/vo/female/gen/deathgurgle (2).ogg','sound/vo/female/gen/deathgurgle (3).ogg') if("agony") used = list('sound/vo/female/gen/agony (1).ogg','sound/vo/female/gen/agony (2).ogg','sound/vo/female/gen/agony (3).ogg') diff --git a/code/modules/mob/living/carbon/human/voicepacks/genmale.dm b/code/modules/mob/living/carbon/human/voicepacks/genmale.dm index 2401bcee6ef..5f8d2038724 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/genmale.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/genmale.dm @@ -7,7 +7,13 @@ used = getmsilenced(soundin) if(!used) switch(soundin) - if("deathgurgle") + if("fart") + if(prob(5)) + used = 'sound/vo/vart (4).ogg' + else + used = 'sound/vo/vart (2).ogg' + else if("deathgurgle") + used = pick('sound/vo/male/gen/deathgurgle (1).ogg','sound/vo/male/gen/deathgurgle (2).ogg','sound/vo/male/gen/deathgurgle (3).ogg') used = pick('sound/vo/male/gen/deathgurgle (1).ogg','sound/vo/male/gen/deathgurgle (2).ogg','sound/vo/male/gen/deathgurgle (3).ogg') if("agony") used = list('sound/vo/male/gen/agony (1).ogg','sound/vo/male/gen/agony (2).ogg','sound/vo/male/gen/agony (4).ogg','sound/vo/male/gen/agony (5).ogg','sound/vo/male/gen/agony (6).ogg','sound/vo/male/gen/agony (7).ogg','sound/vo/male/gen/agony (8).ogg','sound/vo/male/gen/agony (9).ogg','sound/vo/male/gen/agony (10).ogg','sound/vo/male/gen/agony (3).ogg','sound/vo/male/gen/agony (11).ogg','sound/vo/male/gen/agony (12).ogg','sound/vo/male/gen/agony (13).ogg') diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 262d7de6fa6..72d055e941e 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -1573,3 +1573,26 @@ set category = "Noises" emote("hiss", intentional = TRUE) + +/datum/emote/living/fart + key = "fart" + key_third_person = "farts" + message = "lets rip a grand fart, holding a pose as if awaiting applause." + emote_type = EMOTE_AUDIBLE + +/mob/living/carbon/human/verb/emote_fart() + set name = "fart" + set category = "Noises" + + // Define the location based on user's turf + var/location = get_turf(src) + + // 5% chance to shit yourself + if(prob(5)) + emote("fart", intentional = TRUE) + new /obj/item/natural/poo(location) // Spawning the poo item + to_chat(src, "Wow. Did I really just shit myself? I'm a loser just like mom said. This isn't funny anymore....") + apply_status_effect(/datum/status_effect/debuff/bleeding) + else + emote("fart", intentional = TRUE) + diff --git a/code/modules/spells/roguetown/acolyte/zizo.dm b/code/modules/spells/roguetown/acolyte/zizo.dm index 84e05dfabb5..fda1111d470 100644 --- a/code/modules/spells/roguetown/acolyte/zizo.dm +++ b/code/modules/spells/roguetown/acolyte/zizo.dm @@ -7,7 +7,7 @@ range = 4 warnie = "sydwarning" movement_interrupt = FALSE - sound = 'sound/magic/heal.ogg' + sound = 'sound/vo/mobs/ghost/whisper (1).ogg' invocation_type = "none" associated_skill = /datum/skill/magic/holy antimagic_allowed = TRUE @@ -82,12 +82,12 @@ warnie = "sydwarning" no_early_release = TRUE movement_interrupt = TRUE - chargedloop = /datum/looping_sound/invokeholy + chargedloop = /datum/looping_sound/unholy req_items = list(/obj/item/clothing/neck/roguetown/psicross) sound = 'sound/magic/revive.ogg' associated_skill = /datum/skill/magic/holy antimagic_allowed = TRUE - charge_max = 2 MINUTES + charge_max = 1 MINUTES miracle = TRUE devotion_cost = 100 var/revive_pq = PQ_GAIN_REVIVE @@ -114,7 +114,8 @@ ghost.mind.transfer_to(target, TRUE) target.grab_ghost(force = TRUE) target.remove_client_colour(/datum/client_colour/monochrome) - target.emote("breathgasp") + target.emote("scream") + target.emote("vomit") target.Jitter(100) if(isseelie(target)) var/mob/living/carbon/human/fairy_target = target diff --git a/modular/code/modules/living/carbon/stress.dm b/modular/code/modules/living/carbon/stress.dm index ad125e3d17e..caf0e07932c 100644 --- a/modular/code/modules/living/carbon/stress.dm +++ b/modular/code/modules/living/carbon/stress.dm @@ -27,3 +27,8 @@ timer = 5 MINUTES stressadd = -5 desc = "Pain makes it better." + +datum/stressevent/shitself + timer = 10 MINUTES + stressadd = 10 + desc = span_danger("I shit myself, I really went too far...
") From 7e2c0f2335d34ef79be41ae92fd4e59d0220b64d Mon Sep 17 00:00:00 2001 From: Kabramen <46802162+Kabramen@users.noreply.github.com> Date: Fri, 29 Nov 2024 19:27:19 -0300 Subject: [PATCH 105/192] gobbo (#146) --- .../clothing/rogueclothes/npc/goblin.dm | 26 +++++++++++++------ .../job_types/roguetown/goblin/tribalcook.dm | 1 - .../job_types/roguetown/goblin/tribalsmith.dm | 1 - .../mob/living/carbon/human/npc/goblin.dm | 20 ++++++++++---- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/code/modules/clothing/rogueclothes/npc/goblin.dm b/code/modules/clothing/rogueclothes/npc/goblin.dm index 5e8b702fd41..0fccdca6fa7 100644 --- a/code/modules/clothing/rogueclothes/npc/goblin.dm +++ b/code/modules/clothing/rogueclothes/npc/goblin.dm @@ -4,7 +4,7 @@ item_state = "plate_armor" icon = 'icons/roguetown/mob/monster/goblins.dmi' smeltresult = /obj/item/ingot/iron - allowed_race = list(/mob/living/carbon/human/species/goblin) + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) body_parts_covered = CHEST|GROIN|ARMS|LEGS|VITALS sellprice = 0 @@ -14,16 +14,26 @@ item_state = "leather_armor" icon = 'icons/roguetown/mob/monster/goblins.dmi' body_parts_covered = CHEST|GROIN|ARMS|VITALS - allowed_race = list(/mob/living/carbon/human/species/goblin) + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) sellprice = 0 -/obj/item/clothing/suit/roguetown/armor/leather/hide/goblin +// /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin +// name = "goblin loincloth" +// icon_state = "cloth_armor" +// item_state = "cloth_armor" +// icon = 'icons/roguetown/mob/monster/goblins.dmi' +// allowed_race = list(/datum/species/goblin) +// armor = null +// sellprice = 0 + +/obj/item/clothing/under/roguetown/loincloth/goblinloin name = "goblin loincloth" + desc = "smells funny." + icon = 'icons/roguetown/mob/monster/goblins.dmi' + mob_overlay_icon = 'icons/roguetown/mob/monster/goblins.dmi' icon_state = "cloth_armor" item_state = "cloth_armor" - icon = 'icons/roguetown/mob/monster/goblins.dmi' - allowed_race = list(/mob/living/carbon/human/species/goblin) - armor = null + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) sellprice = 0 /obj/item/clothing/head/roguetown/helmet/leather/goblin @@ -31,7 +41,7 @@ icon_state = "leather_helm_item" item_state = "leather_helm" icon = 'icons/roguetown/mob/monster/goblins.dmi' - allowed_race = list(/mob/living/carbon/human/species/goblin) + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) sellprice = 0 /obj/item/clothing/head/roguetown/helmet/goblin @@ -39,7 +49,7 @@ icon_state = "plate_helm_item" item_state = "plate_helm" icon = 'icons/roguetown/mob/monster/goblins.dmi' - allowed_race = list(/mob/living/carbon/human/species/goblin) + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) body_parts_covered = HEAD|EARS|HAIR|EYES sellprice = 0 smeltresult = /obj/item/ingot/iron diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm index 43bac496a0d..fb03eb76661 100644 --- a/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm +++ b/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm @@ -17,7 +17,6 @@ /datum/outfit/job/roguetown/tribalcook/pre_equip(mob/living/carbon/human/H) ..() - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin shirt = /obj/item/clothing/suit/roguetown/shirt/tribalrag pants = /obj/item/clothing/under/roguetown/loincloth/brown belt = /obj/item/storage/belt/rogue/leather/rope diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm index d740523097b..1f8c864f173 100644 --- a/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm +++ b/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm @@ -16,7 +16,6 @@ /datum/outfit/job/roguetown/tribalsmith/pre_equip(mob/living/carbon/human/H) ..() - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin shirt = /obj/item/clothing/suit/roguetown/shirt/tribalrag pants = /obj/item/clothing/under/roguetown/loincloth/brown belt = /obj/item/storage/belt/rogue/leather diff --git a/code/modules/mob/living/carbon/human/npc/goblin.dm b/code/modules/mob/living/carbon/human/npc/goblin.dm index 5faad00cf98..39521a6ee6d 100644 --- a/code/modules/mob/living/carbon/human/npc/goblin.dm +++ b/code/modules/mob/living/carbon/human/npc/goblin.dm @@ -262,6 +262,10 @@ body_overlay = mutable_appearance(icon, "[wear_armor.item_state]", -ARMOR_LAYER) if(body_overlay) standing += body_overlay + if(wear_pants) + body_overlay = mutable_appearance(icon, "[wear_pants.item_state]", -ARMOR_LAYER) + if(body_overlay) + standing += body_overlay if(head) body_overlay = mutable_appearance(icon, "[head.item_state]", -ARMOR_LAYER) if(body_overlay) @@ -273,6 +277,8 @@ /mob/living/carbon/human/species/goblin/update_inv_head() update_wearable() +/mob/living/carbon/human/species/goblin/update_inv_pants() + update_wearable() /mob/living/carbon/human/species/goblin/update_inv_armor() update_wearable() @@ -319,6 +325,8 @@ ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_NOHUNGER, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_NOROGSTAM, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_HEAVYARMOR, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) // ADD_TRAIT(src, TRAIT_NOBREATH, TRAIT_GENERIC) // blue breathes underwater, need a new specific one for this maybe organ cheque // ADD_TRAIT(src, TRAIT_TOXIMMUNE, TRAIT_GENERIC) @@ -390,13 +398,13 @@ switch(loadout) if(1) //tribal spear r_hand = /obj/item/rogueweapon/spear/stone - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(2) //tribal axe r_hand = /obj/item/rogueweapon/stoneaxe - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(3) //tribal club r_hand = /obj/item/rogueweapon/mace/woodclub - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(prob(10)) head = /obj/item/clothing/head/roguetown/helmet/leather/goblin if(4) //lightly armored sword/flail/daggers @@ -410,6 +418,7 @@ r_hand = /obj/item/rogueweapon/huntingknife/stoneknife l_hand = /obj/item/rogueweapon/huntingknife/stoneknife armor = /obj/item/clothing/suit/roguetown/armor/leather/goblin + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(prob(80)) head = /obj/item/clothing/head/roguetown/helmet/leather/goblin if(5) //heavy armored sword/flail/shields @@ -428,10 +437,11 @@ if(prob(20)) r_hand = /obj/item/rogueweapon/flail l_hand = /obj/item/rogueweapon/shield/wood + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(6) //tribal club with rope for lewd r_hand = /obj/item/rogueweapon/mace/woodclub l_hand = /obj/item/rope - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin + //pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin //lewd goblins don't need lioncloths i guess H.seeksfuck = TRUE @@ -568,4 +578,4 @@ else penis = new /obj/item/organ/penis/goblin penis.Insert(user, TRUE) -// src.sexcon.manual_arousal = SEX_MANUAL_AROUSAL_MAX +// src.sexcon.manual_arousal = SEX_MANUAL_AROUSAL_MAX \ No newline at end of file From 0e9c9ce8fd0640c35b2bd2ea302742e68d81cbe5 Mon Sep 17 00:00:00 2001 From: Ghostcoffeee <66063955+Ghostcoffeee@users.noreply.github.com> Date: Sat, 30 Nov 2024 00:28:27 +0200 Subject: [PATCH 106/192] DiagnosticMedicine (#145) --- .../jobs/job_types/roguetown/adventurer/types/combat/warlock.dm | 1 + modular_stonehedge/code/datums/traits/unspecial.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm index a3685ce6c9e..4f9a2f91e2a 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm @@ -412,6 +412,7 @@ eldritchhealing.targetnotification = "Maggots eat away my dead flesh!" eldritchhealing.othernotification = "'s wounds are healed by... Maggots?" H.mind.AddSpell(eldritchhealing) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) // If you get healing, you get diagnose /////////////////////////////// // Curse diff --git a/modular_stonehedge/code/datums/traits/unspecial.dm b/modular_stonehedge/code/datums/traits/unspecial.dm index 98f97d03542..47debd5ae98 100644 --- a/modular_stonehedge/code/datums/traits/unspecial.dm +++ b/modular_stonehedge/code/datums/traits/unspecial.dm @@ -176,6 +176,7 @@ /datum/quirk/mtraining1/on_spawn() var/mob/living/carbon/human/H = quirk_holder H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) H.mind.special_items["Patch Kit"] = /obj/item/storage/fancy/ifak H.mind.special_items["Surgery Kit"] = /obj/item/storage/fancy/skit From 415362dab9df9df783c66465eea33f26cb807f53 Mon Sep 17 00:00:00 2001 From: DerFlammenwerfer <7h3ph4nt0m@gmail.com> Date: Fri, 29 Nov 2024 19:42:01 -0500 Subject: [PATCH 107/192] Fixes three bugs with summon spirit Spirits will not be forced to drop soul coins. Silver coin should now properly be turned into soulcoin when returning or dismissed. Spell timer now has a check to cancel it if the spirit was dismissed early. --- code/modules/spells/roguetown/acolyte/necra.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/spells/roguetown/acolyte/necra.dm b/code/modules/spells/roguetown/acolyte/necra.dm index ae6f08a459b..551273a78c9 100644 --- a/code/modules/spells/roguetown/acolyte/necra.dm +++ b/code/modules/spells/roguetown/acolyte/necra.dm @@ -156,10 +156,11 @@ to_chat(SS, "[user.real_name] has returned you to the underworld. If you are wrongfully denied your reward by your summoner, please open a ticket.") for(var/obj/effect/landmark/underworld/A in GLOB.landmarks_list) for(var/obj/item/I in SS.held_items) - if(!istype(I, /obj/item/roguecoin/silver) && !istype(I, /obj/item/flashlight/lantern/shrunken)) + if(!istype(I, /obj/item/roguecoin/silver) && !istype(I, /obj/item/flashlight/lantern/shrunken) && !istype(I, /obj/item/underworld/coin)) . |= SS.dropItemToGround(I) if(istype(I, /obj/item/roguecoin/silver)) to_chat(SS, "As you return across the veil to the underworld, the silver coin in your hand is transformed.") + qdel(I) var/obj/item/underworld/coin/C = new SS.put_in_hand(C) SS.loc = A.loc @@ -195,18 +196,21 @@ */ break to_chat(P, "[itemstorestore]") - if(capturedsoul) + if(summoned_spirit) spawn(60 MINUTES) + if(!summoned_spirit) + return to_chat(user, "The soul returns to the underworld as your spell expires.") to_chat(capturedsoul, "You feel yourself being pulled to the underworld as your summoner's spell expires. The carriage awaits, if your summoner") for(var/obj/effect/landmark/underworld/A in GLOB.landmarks_list) capturedsoul.loc = A.loc capturedsoul.invisibility = initial(capturedsoul.invisibility) for(var/obj/item/I in capturedsoul.held_items) - if(!istype(I, /obj/item/roguecoin/silver) && !istype(I, /obj/item/flashlight/lantern/shrunken)) + if(!istype(I, /obj/item/roguecoin/silver) && !istype(I, /obj/item/flashlight/lantern/shrunken) && !istype(I, /obj/item/underworld/coin)) . |= capturedsoul.dropItemToGround(I) if(istype(I, /obj/item/roguecoin/silver)) to_chat(capturedsoul, "As you return across the veil to the underworld, the silver coin in your hand is transformed.") + qdel(I) var/obj/item/underworld/coin/C = new capturedsoul.put_in_hand(C) summoned_spirit = null From 662b613d58a993e926f54469445197b3f60005a8 Mon Sep 17 00:00:00 2001 From: Vide Noir <39886147+EaglePhntm@users.noreply.github.com> Date: Sat, 30 Nov 2024 04:04:38 +0300 Subject: [PATCH 108/192] Revert "Fix: Query result no longer gets qdel'd with qeury (#139)" (#148) This reverts commit 28dfb942ace59ecc5ee2f7d12ce22990c5b77129. --- .../modules/maturity-prompt/code/maturity_subsystem.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm b/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm index f91971455f4..6dc43758da4 100644 --- a/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm +++ b/modular/code/modules/maturity-prompt/code/maturity_subsystem.dm @@ -122,10 +122,7 @@ SUBSYSTEM_DEF(maturity_guard) // There should be only one, we're querying by the primary key; if it returns more than one row something is very wrong var/result = query_age_from_db.NextRow() if(result) - qdel(query_age_from_db) - var/list/itemreturn = query_age_from_db.item.Copy() - return itemreturn - qdel(query_age_from_db) + return query_age_from_db.item return FALSE @@ -149,10 +146,8 @@ SUBSYSTEM_DEF(maturity_guard) ) if(!add_age_to_db.warn_execute()) - qdel(add_age_to_db) return FALSE - qdel(add_age_to_db) return TRUE // Logic inspired by S.P.L.U.R.T age_gate From 7969944ce5836b014f11ac4cdf353a57069edd61 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sat, 30 Nov 2024 05:03:35 +0300 Subject: [PATCH 109/192] CBT --- code/__DEFINES/components.dm | 3 + code/_onclick/item_attack.dm | 1 + code/datums/sexcon/sexcon.dm | 2 +- code/datums/status_effects/rogue/debuff.dm | 9 ++- .../adventurer/types/combat/cleric.dm | 10 +-- .../job_types/roguetown/church/puritan.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 1 + code/modules/mob/living/carbon/human/life.dm | 2 +- .../mob/living/carbon/human/species.dm | 1 + code/modules/mob/living/living_defense.dm | 1 + code/testing.dm | 2 +- .../game/objects/items/class_selectors.dm | 2 +- .../items/rogueweapons/reagent_coating.dm | 74 ++++++++++++++++-- .../icons/mob/screen_alert.dmi | Bin 1103 -> 1316 bytes roguetown.dme | 1 + 15 files changed, 91 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index d01d55d0143..eeeb60185d4 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -416,3 +416,6 @@ #define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) #define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) #define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) + +//stonehedge slop +#define COMSIG_APPLY_REAGENTS "item_apply_reagents" //used for reagent_coating component diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 67bb6ba3f08..bf14416cf61 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -430,6 +430,7 @@ to_chat(user, span_userdanger("BACKSTAB!!! MY ATTACK DOES GREATER DAMAGE!")) user.mind?.adjust_experience(/datum/skill/misc/sneaking, user.STAINT * 5, TRUE) apply_damage(newforce, I.damtype, def_zone = hitlim) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, src) if(I.damtype == BRUTE) next_attack_msg.Cut() if(HAS_TRAIT(src, TRAIT_SIMPLE_WOUNDS)) diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index 19a54b8d0f5..ef8318a9e86 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -254,7 +254,7 @@ if(nipple) cameloc = target.getorganslot(ORGAN_SLOT_BREASTS) if(vaginal || anal || nipple) - var/cum_to_take = CLAMP((testes.reagents.maximum_volume/4), 1, min(testes.reagents.total_volume, cameorgan.reagents.maximum_volume - cameorgan.reagents.total_volume)) + var/cum_to_take = CLAMP((testes.reagents.maximum_volume/4), 1, min(testes.reagents.total_volume, cameloc.reagents.maximum_volume - cameloc.reagents.total_volume)) testes.reagents.trans_to(cameloc, cum_to_take, transfered_by = user) else var/cum_to_take = CLAMP((testes.reagents.maximum_volume/4), 1, testes.reagents.total_volume) diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 979b1b54aa3..607a49e7a1a 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -358,8 +358,9 @@ duration = -1 //used for quirk /datum/status_effect/debuff/bigboobs/permanent/lite - alert_type = null + alert_type = /atom/movable/screen/alert/status_effect/debuff/bigboobslite examine_text = span_notice("They have massive GOODS!") + effectedstats = list("constitution" = 2,"endurance" = -1, "speed" = -1) nodrawback = TRUE /atom/movable/screen/alert/status_effect/debuff/bigboobs @@ -368,6 +369,12 @@ icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' icon_state = "bigboobs" +/atom/movable/screen/alert/status_effect/debuff/bigboobslite + name = "Natural Endowment" + desc = "I got unusually large, natural bits, they aren't as heavy as an enchanted one thankfully." + icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' + icon_state = "bigboobslite" + /datum/status_effect/debuff/bigboobs/on_apply() . = ..() var/mob/living/carbon/human/species/user = owner diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm index 8c310f13720..1c6483cdd8c 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm @@ -112,10 +112,10 @@ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_glowshroom) // HEARTHSTONE ADD: cloistered cleric subclass (lighter armored and equipped) if("Temple Devout") - // Devout start without the typical cleric medium/heavy armor shtick and without much in the way of weapons or skills to use them. + // Devout start without the typical cleric heavy armor shtick and without much in the way of weapons or skills to use them. // They're better with miracles and regenerate devotion passively like the Priest does, however. H.set_blindness(0) - to_chat(H, span_warning("You are a cloistered cleric, a devout traveller whom has engressed into distant lands to spread the word of your chosen Patron. Having secluded yourself for many years, your body has suffered... But you have gained great insight as a result!")) + to_chat(H, span_warning("You are a Temple cleric, a devout traveller whom has engressed into distant lands to spread the word of your chosen Patron. Having secluded yourself for many years, your body has suffered... But you have gained great insight as a result!")) H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) @@ -132,6 +132,7 @@ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/guidance5e) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/churn) H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/light5e) + ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) // HEARTHSTONE ADDITION END armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron @@ -203,10 +204,7 @@ var/datum/devotion/C = new /datum/devotion(H, H.patron) // HEARTHSTONE ADDITION: cloistered devout devo regen & tier buff if (classchoice == "Temple Devout") - if(H.patron?.type == /datum/patron/divine/noc) - C.grant_spells_devout_noc(H) - else - C.grant_spells_devout(H) + C.grant_spells_devout_noc(H) else C.grant_spells_cleric(H) // HEARTHSTONE ADDITION END diff --git a/code/modules/jobs/job_types/roguetown/church/puritan.dm b/code/modules/jobs/job_types/roguetown/church/puritan.dm index b5409914516..b0d2950ffa1 100644 --- a/code/modules/jobs/job_types/roguetown/church/puritan.dm +++ b/code/modules/jobs/job_types/roguetown/church/puritan.dm @@ -26,7 +26,7 @@ outfit = /datum/outfit/job/roguetown/puritan display_order = JDO_PURITAN give_bank_account = 36 - min_pq = 0 + min_pq = 10 max_pq = null /datum/outfit/job/roguetown/puritan diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index c72838708a1..0be25a4b1c5 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -225,6 +225,7 @@ else user.used_intent.penfactor = initial(user.used_intent.penfactor)//Sanity check to make sure intent penfactor gets reset when the attack isn't a sneak attack. apply_damage(statforce, I.damtype, affecting) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, src) if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) if(prob(statforce)) I.add_mob_blood(src) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4ec763c715b..2a5a50734e3 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -80,7 +80,7 @@ charflaw.flaw_on_life(src) if(health <= 0) adjustOxyLoss(0.3) - if(mode == AI_OFF && !client && !HAS_TRAIT(src, TRAIT_NOSLEEP)) + if(mode == AI_OFF && !sexcon.current_action && !client && !HAS_TRAIT(src, TRAIT_NOSLEEP)) if(mob_timers["slo"]) if(world.time > mob_timers["slo"] + 90 SECONDS) Sleeping(100) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 7585032ca15..2950695144c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1651,6 +1651,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) I.take_damage(1, BRUTE, I.d_type) if(!nodmg) var/datum/wound/crit_wound = affecting.bodypart_attacked_by(user.used_intent.blade_class, (Iforce * weakness) * ((100-(armor_block+armor))/100), user, selzone, crit_message = TRUE) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, H) if(should_embed_weapon(crit_wound, I)) var/can_impale = TRUE if(!affecting) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 7f7ff9add58..3988781a5cb 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -2,6 +2,7 @@ /mob/living/proc/run_armor_check(def_zone = null, attack_flag = "blunt", absorb_text = null, soften_text = null, armor_penetration, penetrated_text, damage, blade_dulling) var/armor = getarmor(def_zone, attack_flag, damage, armor_penetration, blade_dulling) src.mob_timers[MT_SNEAKATTACK] = world.time //Stops you from sneaking after being hit. (Should work!) + src.apply_status_effect(/datum/status_effect/debuff/stealthcd) //the if "armor" check is because this is used for everything on /living, including humans if(armor > 0 && armor_penetration) armor = max(0, armor - armor_penetration) diff --git a/code/testing.dm b/code/testing.dm index 1d44a88e0f5..9de4bed63aa 100644 --- a/code/testing.dm +++ b/code/testing.dm @@ -3,7 +3,7 @@ This comes in later, so it wins out against the first in the defines. Thus this file is unticked as I don't know which you people prefer using. */ #ifndef TESTING -// #define FASTLOAD + #define FASTLOAD // #define DEPLOY_TEST // #define ROGUEWORLD #endif diff --git a/modular_stonehedge/code/game/objects/items/class_selectors.dm b/modular_stonehedge/code/game/objects/items/class_selectors.dm index 2d6a15c5905..af7867cf025 100644 --- a/modular_stonehedge/code/game/objects/items/class_selectors.dm +++ b/modular_stonehedge/code/game/objects/items/class_selectors.dm @@ -156,7 +156,7 @@ if(H.patron?.type == /datum/patron/divine/noc) C.grant_spells_devout_noc(H) else - C.grant_spells_devout(H) + C.grant_spells_cleric(H) if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 2, TRUE) diff --git a/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm b/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm index 8c99d4f8af3..83003a8002f 100644 --- a/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm +++ b/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm @@ -7,16 +7,74 @@ - unarmored hit detection to apply reagent */ -/obj/item/rogueweapon - var/coatable = TRUE - var/reagent_cap +//component procs +/datum/component/reagent_coatable + + ///Reagents holder + var/datum/reagents/reagents = null var/reagent_apply_amt +/datum/component/reagent_coatable/Initialize(...) + . = ..() + if(isitem(parent)) + RegisterSignal(parent, COMSIG_APPLY_REAGENTS, PROC_REF(apply_reagents)) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react)) + +/datum/component/reagent_coatable/proc/apply_reagents(mob/living/H) + if(!H || !istype(H, /mob/living)) + return + if(reagents.total_volume) + var/available_reagent_amount = min(reagents.total_volume, reagent_apply_amt) + reagents.trans_to(H, available_reagent_amount, 1, no_react = FALSE) + H.visible_message(span_green("[H] shudders with pain!"),span_boldgreen("I feel a burning pain on my wound!")) + log_admin("[H] was struck with [english_list(reagents.reagent_list)] using a poisoned weapon.") + +/datum/component/reagent_coatable/proc/clean_react() + if(reagents.total_volume) + reagents.remove_all(reagents.total_volume) //buh bye reagents. + +//general weapon procs +/obj/item/rogueweapon + var/datum/component/reagent_coatable/reagent_coatable + ///incase you want to set something non blunt uncoatable anyways. + var/uncoatable = FALSE + /obj/item/rogueweapon/Initialize() . = ..() - if(coatable && sharpness == IS_BLUNT) - reagent_cap = w_class*10 //weapon size equals more coatable. - reagent_apply_amt = 10/w_class //smaller weapons will apply more poison at once. - create_reagents(reagent_cap, TRANSPARENT|REFILLABLE) + if(sharpness != IS_BLUNT && !uncoatable) + reagent_coatable = new /datum/component/reagent_coatable() + reagent_coatable.reagents = new /datum/reagents(w_class*5, TRANSPARENT|REFILLABLE) //weapon size equals more coatable. + reagent_coatable.reagent_apply_amt = 5/w_class //smaller weapons will apply more poison at once. -/obj/item/rogueweapon/ +/obj/item/rogueweapon/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(reagent_coatable && istype(I, /obj/item/reagent_containers)) + var/waterbuse = 0 + for(var/datum/reagent/water/waterussy in I.reagents.reagent_list) + waterbuse = waterussy.volume + reagent_coatable.reagents.remove_all(waterbuse) //buh bye reagents water washes it + I.reagents.remove_all_type(/datum/reagent/water, waterbuse) + if(user.used_intent?.type == INTENT_SPLASH) //tries to add everything. + I.reagents.trans_to(reagent_coatable.reagents, min(I.reagents.total_volume, (reagent_coatable.reagents.maximum_volume - reagent_coatable.reagents.total_volume))) + else if(user.used_intent?.type == INTENT_FILL) //adds 5 units at most + I.reagents.trans_to(reagent_coatable.reagents, min((I.reagents.total_volume < 6), (reagent_coatable.reagents.maximum_volume - reagent_coatable.reagents.total_volume))) + //we dont want water coated weapons so last failsafe + reagent_coatable.reagents.remove_all_type(/datum/reagent/water, reagent_coatable.reagents.total_volume) + +/obj/item/rogueweapon/examine(mob/user) + . = ..() + if(reagent_coatable && reagent_coatable.reagents.total_volume) + if(user.can_see_reagents() || (user.Adjacent(src) && user.mind?.get_skill_level(/datum/skill/misc/alchemy) >= 2)) //Show each individual reagent + . += "It is coated with:" + for(var/datum/reagent/R in reagent_coatable.reagents.reagent_list) + . += "[round(R.volume / 3, 0.1)] oz of [R.name]" + else //Otherwise, just show the total volume + var/total_volume = 0 + var/reagent_color + for(var/datum/reagent/R in reagent_coatable.reagents.reagent_list) + total_volume += R.volume + reagent_color = mix_color_from_reagents(reagent_coatable.reagents.reagent_list) + if(total_volume / 3 < 1) + . += "It seems to be coated with less than 1 oz of something." + else + . += "It seems to be coated with [round(total_volume / 3)] oz of something." diff --git a/modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi b/modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi index e45f135578b227e4fc74d0446316da15c6c94b58..b5b851b7e9627a8fcb4c75ab1077610b7c17ed6f 100644 GIT binary patch delta 1146 zcmV-=1cm$02&4)niBL{Q4GJ0x0000DNk~Le0001B0000$2m=5B0MhD$JOBUyX^|x* z23Uo(B_d6cN*e>fz`&7ZBo)T^@rwWe00DGTPE!Ct=GbNc004@So@0MwD9p($NhPc} zCqJ>okT_*V1eFz+q$cK+WF)8HQmL%q>gNLXJ^+@eO9JqJHA4UZ1Jg-FK~z|Uwbu)G zsxS-yU?G)4L7BQ8Q12A?|9|97(g(B@88~y!Q0dG^`hdFG=twxyJ~n;;hv;Krdolvj z$oGc{M6?~IgmL~DAZC96F%JxsH2`ek8IaBZVg?Xz2VlF+U>Zng05Jnl0ol8OXBDI~ zfS3X39QTv?*FOiWvEAyC4uNzA2=j*kUp`*H#BO3C1oFI4iUFmHJRbpNCaa1wSC!1l z2>?J!GY|og=Q|9AfTA}j_zB7kOW%@E(Hj)}cFe!8F&KzcP*8u?-3JN^j}(R1PT!*1 zE6mT-Rt5k-&9RqKj>mv6e|OmJj;ABPQW1mpl5^rw){v*86%4*y}gI zs0Mre28h&vJ@iF2;N{aH=pvne$N5hz>^wo|=bYFFgHJ&Pl%69TgTnOB062_*(gVs# zfX)ZAsIdLR`Hg?@(F@Y{59c>R<_kPYsdK1>0q}sr^^kIXR1AR9^-$&ds0@I8O#U~hH|DCOF#N(1(0$3Qj6Z?`S51^Z0!03s;N z?KbVw3Efghs;=B&BT!32=@$LGK}fj({W&jR|* zGyrkHZ47@R?Hg~?sJD5G0b!r3b3if!z!dPL-4i1Dy$sRs&$XM0y#DvWT)+re_WR(E z0P!l|{R)WzP1C#+!2F_h#9IJLY=yrEICblUcL10iyXZBbpGsjnT{`D}0e}?FmkUe) zZPT{cMJ>Lr0aCb9{`2LZ5rTH%=IH7QzVYu&!W4gSL!xcg&Z2M3e`O$A0p-8l09t@` zz_+OZ1vAcZ0ApPjU3Cp`zu(CS0qS`K8mhnu%Yf8e{v9Yk3n6f0fT!9TAk_mvV{qnv ziUL~D!>}0W^V8c&ptHlU7HyzyMrkW=+R|t~DjB z04RSh*h2}g={V4KU8nOe255pla0oCz{6w}T8tA%~k~d;8Kr7%uw<5cyqd<#sqdP`q zU-An;PanSgpD4iTX{5vb|02My=>V{!?3Tl7zzo52VEG{P1I;{ku2CQ?VIhD*!UwBF zHn+`7K>zz-63};M1&V38#y zkx(0vZX^{idw!i_@)4M{{nR9Jex)juk*!O?S z&P)=>GJ#g-oLcX-|Hot@vfJs(xbmfTegRjpRPcEg0lAQe0#ZVpmw;j$a1;rE64rox z11R2q2B0iIAPwXj05$OOF0j@?z5!5($6>a^zX5BMrJl(U$TtAKJYK)TVXzPab=@e% zfKp9eCjfw|G7}L1b=_hq1QfkN!3QwE@30sUI%p`>exji8m8uBH#lLFToIWzUBOhg*Ftp1B!EnbI_Rn z9pI1za0;tn6&l+==Z)~`3%rQbJnaGozyq3j1Zo~b69D^;1j_ReJm7SwZC+WSKAcnzyWaQsJVe`Zh`*W1$ZGV%mb~03pB^$yaWsw;dl%>IG?|O^LyG7&MGK> zB(ON2X@RO)8bE-yF*ebev&jQ?N@>8}ObjR|Z;y2-!JY{oKm?V!oiqN2_qmBx=1`3R zj@o0LUb4&wbj;jGkO1=KRR&Cc6VPuWVE%Fh5pYU>O-Vy2{sd$xpm6g6uv>4y6U4k( z=+~bQAOhs)gQV~`px6Surwj?``~Dq&0Q1E#6E6W2w8H-Zjt;Z%3V>l8!aA@lMff>g znzJhaAiHwMHG zC_jz>1Aq+NO%EuTd6WSxc?dV%13VrNGD3hxjzCWx7{Lc}bNL5Qo`nz?8Q`UVl7L)K z0L{UL#~}h*(9;kBOP<~)fyquo1Uw&9mv8!m%QHB$EHL&{u6u|NRd`|nZX>fNWndai z3j#oO#Svt@CuLxmrb*``fEMtHQ-FE+iH=uBw(gs9f&894EUtMu}f00000NkvXXu0mjf D-b;t^ diff --git a/roguetown.dme b/roguetown.dme index e1f5a168424..4454372274e 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -3631,6 +3631,7 @@ #include "modular_stonehedge\code\datums\traits\unspecial.dm" #include "modular_stonehedge\code\game\area\roguetownareas.dm" #include "modular_stonehedge\code\game\objects\items\class_selectors.dm" +#include "modular_stonehedge\code\game\objects\items\rogueweapons\reagent_coating.dm" #include "modular_stonehedge\code\game\objects\structures\dungeon\lewd_statues.dm" #include "modular_stonehedge\code\game\objects\structures\dungeon\loot_generators\dungeon_chest.dm" #include "modular_stonehedge\code\lewdai\lewdai.dm" From f363b10a0c837300903a5075d3af1cc1a5111ebf Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 22:03:14 -0500 Subject: [PATCH 110/192] Fix emotes not resetting message --- code/modules/mob/living/carbon/human/emote.dm | 8 ++++++++ code/modules/mob/living/emote.dm | 20 +++++++++++++++++++ modular/code/modules/living/emote.dm | 12 +++++------ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 8658bd3e57a..f48089c8d0c 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -19,6 +19,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak()) message = "makes a noise. Tears stream down their face." + else + message = initial(message) /datum/emote/living/carbon/human/sexmoanlight @@ -33,6 +35,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak()) message = "makes a noise." + else + message = initial(message) /datum/emote/living/carbon/human/sexmoanhvy key = "sexmoanhvy" @@ -46,6 +50,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak()) message = "makes a noise." + else + message = initial(message) /datum/emote/living/carbon/human/eyebrow key = "eyebrow" @@ -88,6 +94,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak()) message = "makes a muffled grumbling noise." + else + message = initial(message) /datum/emote/living/carbon/human/handshake key = "handshake" diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 72d055e941e..57962fc609d 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -947,6 +947,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled noise." + else + message = initial(message) /datum/emote/living/clap @@ -1222,6 +1224,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled yawn." + else + message = initial(message) /datum/emote/living/warcry key = "warcry" @@ -1241,6 +1245,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled shout!" + else + message = initial(message) /datum/emote/living/custom key = "me" @@ -1407,6 +1413,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled yip." + else + message = initial(message) /datum/emote/living/yap key = "yap" @@ -1426,6 +1434,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled yap." + else + message = initial(message) /datum/emote/living/coyhowl @@ -1446,6 +1456,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled howl." + else + message = initial(message) /datum/emote/living/snap @@ -1492,6 +1504,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled bark." + else + message = initial(message) /datum/emote/living/whine key = "whine" @@ -1511,6 +1525,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled whine." + else + message = initial(message) /datum/emote/living/cackle key = "cackle" key_third_person = "cackles" @@ -1529,6 +1545,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled cackle." + else + message = initial(message) /datum/emote/living/blink key = "blink" @@ -1561,6 +1579,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled meow." + else + message = initial(message) /datum/emote/living/hiss key = "hiss" diff --git a/modular/code/modules/living/emote.dm b/modular/code/modules/living/emote.dm index 7f97cd6345f..7f7ab23d406 100644 --- a/modular/code/modules/living/emote.dm +++ b/modular/code/modules/living/emote.dm @@ -9,6 +9,7 @@ . = ..() && intentional /datum/emote/living/subtle/run_emote(mob/user, params, type_override = null, intentional = FALSE) + var/message_to_send = params if(!can_run_emote(user, TRUE, intentional)) return FALSE else if(QDELETED(user)) @@ -19,22 +20,21 @@ else if(!params) var/custom_emote = copytext(sanitize(input("What does your character subtly do?") as text|null), 1, MAX_MESSAGE_LEN) if(custom_emote) - message = custom_emote + message_to_send = custom_emote emote_type = EMOTE_VISIBLE else - message = params if(type_override) emote_type = type_override - user.log_message("SUBTLE - " + message, LOG_EMOTE) - message = "[user] " + message + user.log_message("SUBTLE - " + message_to_send, LOG_EMOTE) + message_to_send = "[user] " + message_to_send for(var/mob/M in GLOB.dead_mob_list) if(!M.client || isnewplayer(M)) continue var/T = get_turf(user) if(M.stat == DEAD && M.client && (M.client.prefs?.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T, null))) - M.show_message(message) + M.show_message(message_to_send) - user.visible_message("[message]", vision_distance = 1) + user.visible_message("[message_to_send]", vision_distance = 1) From f89be06ff446da31ec0b2f118394e6273c1c681b Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 22:14:35 -0500 Subject: [PATCH 111/192] Makes the game compile again --- code/modules/mob/living/carbon/human/voicepacks/genfemale.dm | 2 +- code/modules/mob/living/carbon/human/voicepacks/genmale.dm | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm b/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm index 9b5fdb57d37..2e711830a71 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm @@ -12,7 +12,7 @@ used = 'sound/vo/vart (4).ogg' else used = 'sound/vo/vart (2).ogg' - else if("deathgurgle") + if("deathgurgle") used = pick('sound/vo/female/gen/deathgurgle (1).ogg','sound/vo/female/gen/deathgurgle (2).ogg','sound/vo/female/gen/deathgurgle (3).ogg') if("agony") used = list('sound/vo/female/gen/agony (1).ogg','sound/vo/female/gen/agony (2).ogg','sound/vo/female/gen/agony (3).ogg') diff --git a/code/modules/mob/living/carbon/human/voicepacks/genmale.dm b/code/modules/mob/living/carbon/human/voicepacks/genmale.dm index 5f8d2038724..ca7035b0dd5 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/genmale.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/genmale.dm @@ -12,8 +12,7 @@ used = 'sound/vo/vart (4).ogg' else used = 'sound/vo/vart (2).ogg' - else if("deathgurgle") - used = pick('sound/vo/male/gen/deathgurgle (1).ogg','sound/vo/male/gen/deathgurgle (2).ogg','sound/vo/male/gen/deathgurgle (3).ogg') + if("deathgurgle") used = pick('sound/vo/male/gen/deathgurgle (1).ogg','sound/vo/male/gen/deathgurgle (2).ogg','sound/vo/male/gen/deathgurgle (3).ogg') if("agony") used = list('sound/vo/male/gen/agony (1).ogg','sound/vo/male/gen/agony (2).ogg','sound/vo/male/gen/agony (4).ogg','sound/vo/male/gen/agony (5).ogg','sound/vo/male/gen/agony (6).ogg','sound/vo/male/gen/agony (7).ogg','sound/vo/male/gen/agony (8).ogg','sound/vo/male/gen/agony (9).ogg','sound/vo/male/gen/agony (10).ogg','sound/vo/male/gen/agony (3).ogg','sound/vo/male/gen/agony (11).ogg','sound/vo/male/gen/agony (12).ogg','sound/vo/male/gen/agony (13).ogg') From b681737865233d2350168f5599f20f0005cc4e95 Mon Sep 17 00:00:00 2001 From: Mneme <72026892+SpessMneme@users.noreply.github.com> Date: Fri, 29 Nov 2024 22:52:06 -0700 Subject: [PATCH 112/192] Adds Magician Apprentice Spells to Magician --- .../jobs/job_types/roguetown/courtier/magician.dm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/roguetown/courtier/magician.dm b/code/modules/jobs/job_types/roguetown/courtier/magician.dm index c5b9c726c23..885c6290df2 100644 --- a/code/modules/jobs/job_types/roguetown/courtier/magician.dm +++ b/code/modules/jobs/job_types/roguetown/courtier/magician.dm @@ -9,7 +9,19 @@ allowed_races = RACES_ALL_KINDSPLUS allowed_sexes = list(MALE, FEMALE) - spells = list(/obj/effect/proc_holder/spell/invoked/projectile/fireball/greater, /obj/effect/proc_holder/spell/invoked/arcyne_storm, /obj/effect/proc_holder/spell/invoked/invisibility, /obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe, /obj/effect/proc_holder/spell/targeted/ethereal_jaunt, /obj/effect/proc_holder/spell/aoe_turf/rogue_knock) + spells = list ( + /obj/effect/proc_holder/spell/invoked/projectile/fireball/greater, + /obj/effect/proc_holder/spell/invoked/projectile/spitfire, + /obj/effect/proc_holder/spell/invoked/projectile/lightningbolt, + /obj/effect/proc_holder/spell/invoked/arcyne_storm, + /obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe, + /obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf, + /obj/effect/proc_holder/spell/invoked/invisibility, + /obj/effect/proc_holder/spell/invoked/projectile/fetch, + /obj/effect/proc_holder/spell/targeted/touch/prestidigitation, + /obj/effect/proc_holder/spell/targeted/forcewall, + /obj/effect/proc_holder/spell/targeted/ethereal_jaunt, + /obj/effect/proc_holder/spell/aoe_turf/rogue_knock) display_order = JDO_MAGICIAN tutorial = "Your creed is one dedicated to the conquering of the arcane arts and the constant thrill of knowledge. \ You are one of the Arch-Magicians of Dreamkeeps Magick Academy; Ravenloft. You help teach and manage the students of this Academy.\ From 08f19b4aa7b82335c30f11fcb96538c3e2ca7539 Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sat, 30 Nov 2024 04:05:20 -0800 Subject: [PATCH 113/192] god this sound sucks (#153) --- code/modules/spells/roguetown/acolyte/zizo.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/spells/roguetown/acolyte/zizo.dm b/code/modules/spells/roguetown/acolyte/zizo.dm index fda1111d470..e0500d33e7e 100644 --- a/code/modules/spells/roguetown/acolyte/zizo.dm +++ b/code/modules/spells/roguetown/acolyte/zizo.dm @@ -7,7 +7,7 @@ range = 4 warnie = "sydwarning" movement_interrupt = FALSE - sound = 'sound/vo/mobs/ghost/whisper (1).ogg' + sound = 'sound/magic/antimagic.ogg' invocation_type = "none" associated_skill = /datum/skill/magic/holy antimagic_allowed = TRUE From 54c48e837ada84ce053202d4d95b4889f23c3298 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sat, 30 Nov 2024 15:05:55 +0300 Subject: [PATCH 114/192] fixes --- code/controllers/subsystem/rogue/devotion.dm | 20 ---- .../sexcon/sex_actions/sex/anal_ride_sex.dm | 9 +- .../sex_actions/sex/vaginal_ride_sex.dm | 10 +- .../adventurer/types/combat/cleric.dm | 11 +- .../game/objects/items/class_selectors.dm | 106 +----------------- 5 files changed, 12 insertions(+), 144 deletions(-) diff --git a/code/controllers/subsystem/rogue/devotion.dm b/code/controllers/subsystem/rogue/devotion.dm index 95d0c74c889..0107f8a9e29 100644 --- a/code/controllers/subsystem/rogue/devotion.dm +++ b/code/controllers/subsystem/rogue/devotion.dm @@ -208,26 +208,6 @@ prayer_effectiveness = 2 to_chat(holder, span_boldnotice("I have been welcomed back to the Church. I am now able to gain devotion again.")) -/datum/devotion/proc/grant_spells_devout_noc(mob/living/carbon/human/H) - if(!H || !H.mind || !patron) - return - - granted_spells = list() - var/list/spelllist = list(patron.t0, patron.t1, patron.t2) - for(var/spell_type in spelllist) - if(!spell_type || H.mind.has_spell(spell_type)) - continue - var/newspell = new spell_type - H.mind.AddSpell(newspell) - LAZYADD(granted_spells, newspell) - level = CLERIC_T0 - max_progression = CLERIC_REQ_4 - max_devotion = CLERIC_REQ_4 - passive_devotion_gain = 1 - passive_progression_gain = 1 - update_devotion(100, CLERIC_REQ_4, silent = TRUE) - START_PROCESSING(SSobj, src) - // Debug verb /mob/living/carbon/human/proc/devotionchange() set name = "(DEBUG)Change Devotion" diff --git a/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm b/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm index 5500d7d90fb..2d5ae05a881 100644 --- a/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm @@ -17,8 +17,6 @@ if(issimple(target) && target.gender == MALE && target.sexcon) else return FALSE - if(HAS_TRAIT(user, TRAIT_TINY) && !(HAS_TRAIT(target, TRAIT_TINY))) //Dissabled for Seelie riding non-Seelie - return FALSE return TRUE /datum/sex_action/anal_ride_sex/can_perform(mob/living/user, mob/living/target) @@ -49,17 +47,12 @@ /datum/sex_action/anal_ride_sex/on_start(mob/living/user, mob/living/target) ..() if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) - user.visible_message(span_warning("[user] gets on top of [target] trying and failing to ride the tiny cock with their butt!")) + user.visible_message(span_warning("[user] gets on top of [target] and begins riding the tiny cock with their butt!")) else user.visible_message(span_warning("[user] gets on top of [target] and begins riding them with their butt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/anal_ride_sex/on_perform(mob/living/user, mob/living/target) - if(user.sexcon.do_message_signature("[type]")) - if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to anally ride [target], unsuccessfully.")) - do_thrust_animate(user, target) - return //Return because male seelie cannot succesfully penetrate a large humen target if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) user.sexcon.try_pelvis_crush(target) diff --git a/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm b/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm index 5c2d9325e31..5184902aad2 100644 --- a/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm @@ -17,8 +17,6 @@ if(issimple(target) && target.gender == MALE && target.sexcon) else return FALSE - if(HAS_TRAIT(user, TRAIT_TINY) && !(HAS_TRAIT(target, TRAIT_TINY))) //Dissabled for Seelie riding non-Seelie - return FALSE return TRUE /datum/sex_action/vaginal_ride_sex/can_perform(mob/living/user, mob/living/target) @@ -49,18 +47,12 @@ /datum/sex_action/vaginal_ride_sex/on_start(mob/living/user, mob/living/target) ..() if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) - user.visible_message(span_warning("[user] gets on top of [target], trying and failing to ride the tiny cock with their cunt!")) + user.visible_message(span_warning("[user] gets on top of [target] and begins riding the tiny cock with their cunt!")) else user.visible_message(span_warning("[user] gets on top of [target] and begins riding them with their cunt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/vaginal_ride_sex/on_perform(mob/living/user, mob/living/target) - if(user.sexcon.do_message_signature("[type]")) - if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to ride [target], unsuccessfully.")) - do_thrust_animate(user, target) - return //Return because male seelie cannot succesfully penetrate a large humen target - if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) user.sexcon.try_pelvis_crush(target) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm index 1c6483cdd8c..2a11249f4c0 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm @@ -179,10 +179,6 @@ if (H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE) H.mind.adjust_spellpoints(1) - H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) - ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) - if(/datum/patron/divine/necra) head = /obj/item/clothing/head/roguetown/necrahood armor = /obj/item/clothing/suit/roguetown/shirt/robe/necra @@ -204,7 +200,12 @@ var/datum/devotion/C = new /datum/devotion(H, H.patron) // HEARTHSTONE ADDITION: cloistered devout devo regen & tier buff if (classchoice == "Temple Devout") - C.grant_spells_devout_noc(H) + C.grant_spells_devout(H) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE) + H.mind.adjust_spellpoints(1) + H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) else C.grant_spells_cleric(H) // HEARTHSTONE ADDITION END diff --git a/modular_stonehedge/code/game/objects/items/class_selectors.dm b/modular_stonehedge/code/game/objects/items/class_selectors.dm index af7867cf025..14e22e4285e 100644 --- a/modular_stonehedge/code/game/objects/items/class_selectors.dm +++ b/modular_stonehedge/code/game/objects/items/class_selectors.dm @@ -144,6 +144,10 @@ inventory_items += /obj/item/clothing/neck/roguetown/psicross/skull if(/datum/patron/divine/noc) inventory_items += /obj/item/clothing/neck/roguetown/psicross/noc + H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 2, TRUE) + H.mind.adjust_spellpoints(2) + H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) if(/datum/patron/divine/dendor) inventory_items += /obj/item/clothing/neck/roguetown/psicross/dendor H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 2, TRUE) // enough to craft druid mask, at least @@ -153,9 +157,6 @@ inventory_items += /obj/item/clothing/neck/roguetown/psicross/pestra if(/datum/patron/divine/eora) //Eora content from Stonekeep inventory_items += /obj/item/clothing/neck/roguetown/psicross/eora - if(H.patron?.type == /datum/patron/divine/noc) - C.grant_spells_devout_noc(H) - else C.grant_spells_cleric(H) if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) @@ -190,102 +191,3 @@ var/spawneditem = new invitem(H.loc) H.pickup_and_wear(spawneditem) qdel(src) - -/obj/item/class_selector/test/attack_self(mob/living/carbon/human/H) //test purposes not selectable. - . = ..() - classes = list("test") - var/classchoice = input("Choose your past", "Available archetypes") as anything in classes - switch(classchoice) - if("test") - inventory_items = list( - /obj/item/clothing/head/roguetown/helmet/footmanhelmet, - /obj/item/clothing/suit/roguetown/armor/plate/scale, - /obj/item/clothing/suit/roguetown/armor/chainmail, - /obj/item/clothing/under/roguetown/chainlegs, - /obj/item/clothing/shoes/roguetown/boots/armor, - /obj/item/storage/belt/rogue/leather/black, - /obj/item/rogueweapon/mace/pipe, - /obj/item/clothing/ring/lantern, - /obj/item/storage/belt/rogue/pouch/coins/rich, - /obj/item/storage/backpack/rogue/backpack/rucksack, - /obj/item/clothing/gloves/roguetown/chain, - /obj/item/clothing/wrists/roguetown/hiddenblade, - /obj/item/rogueweapon/huntingknife/skin, - /obj/item/lockpickring/mundane, - /obj/item/reagent_containers/glass/cup/silver. - ) - var/datum/devotion/C = new /datum/devotion(H, H.patron) - switch(H.patron?.type) - if(/datum/patron/divine/astrata) - inventory_items += /obj/item/clothing/neck/roguetown/psicross/astrata - if(/datum/patron/inhumen/zizo) - inventory_items += /obj/item/clothing/neck/roguetown/psicross/silver - if(/datum/patron/divine/noc) - inventory_items += /obj/item/clothing/neck/roguetown/psicross/noc - if(/datum/patron/divine/dendor) - inventory_items += /obj/item/clothing/neck/roguetown/psicross/dendor - H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 2, TRUE) // enough to craft druid mask, at least - if(/datum/patron/divine/necra) - inventory_items += /obj/item/clothing/neck/roguetown/psicross/necra - if(/datum/patron/divine/pestra) - inventory_items += /obj/item/clothing/neck/roguetown/psicross/pestra - if(/datum/patron/divine/eora) //Eora content from Stonekeep - inventory_items += /obj/item/clothing/neck/roguetown/psicross/eora - if(H.patron?.type == /datum/patron/divine/noc) - C.grant_spells_devout_noc(H) - else - C.grant_spells_devout(H) - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/engineering, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/labor/butchering, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/lockpicking, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/stealing, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/blacksmithing, 6, TRUE) // testing smith item qualities - H.mind.adjust_skillrank_up_to(/datum/skill/craft/armorsmithing, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/weaponsmithing, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/smelting, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 3, TRUE) - H.change_stat("strength", 3) - H.change_stat("constitution", 3) - H.change_stat("endurance", 3) - H.change_stat("intelligence", 3) - H.change_stat("speed", 3) - H.change_stat("fortune", 3) - ADD_TRAIT(H, TRAIT_ANTIMAGIC, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOMOOD, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOPAIN, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_POISONBITE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_STRONGBITE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_BLOODLOSS_IMMUNE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_TOXIMMUNE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_EMPATH, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_MEDICAL_HUD, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_ARTIFICER, TRAIT_GENERIC) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/churn) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/bladeward5e/test) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e/test) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/encodethoughts5e/test) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/poisonspray5e/test) - H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray) - dressup(H, inventory_items) From cd719479dc95ca2ee75f55f6235b20927436699c Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:24:46 -0800 Subject: [PATCH 115/192] Ratwood bodyslam port (#154) --- code/modules/mob/living/living.dm | 48 ++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ae62f6a473a..5a823174cd9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -180,23 +180,42 @@ if(!move_failed) return TRUE - if(m_intent == MOVE_INTENT_RUN && dir == get_dir(src, M)) + if(m_intent == MOVE_INTENT_RUN && dir == get_dir(src, M)) // Rebalance of charge code. Taken almost directly from Ratwood. if(isliving(M)) + var/sprint_distance = sprinted_tiles + toggle_rogmove_intent(MOVE_INTENT_WALK, TRUE) + var/mob/living/L = M - var/charge_add = 0 + + var/self_points = FLOOR((STACON + STASTR + mind.get_skill_level(/datum/skill/misc/athletics))/2, 1) + var/target_points = FLOOR((L.STAEND + L.STASTR + L.mind.get_skill_level(/datum/skill/misc/athletics))/2, 1) + + switch(sprint_distance) + // Point blank + if(0 to 1) + self_points -= 4 + // One to two tiles between people - this is the main combat case. + if(2 to 3) + self_points -= 2 + // Five or above tiles between people - 3-4, a viable combat ram with good planning, results in a modifier of 0. + if(6 to INFINITY) + self_points += 3 // This is basically impossible to use in combat unless the other guy's asleep, and I think accidentally knocking over someone is funny, so big bonus. + + // If charging into the BACK of the enemy (facing away) + if(L.dir == get_dir(src, L)) + self_points += 2 + + // Ratwood does not have artificer, but we do. Numbers are basically the same so I'm keeping the old bonus. if(HAS_TRAIT(src, TRAIT_CHARGER)) - charge_add = 3 - if(STACON + charge_add > L.STACON) - if(STASTR + charge_add > L.STASTR) - L.Knockdown(1) - Immobilize(30) - else - Knockdown(1) - Immobilize(30) - if(STACON + charge_add < L.STACON) + self_points += 3 + + // Ratwood has RNG here. No thanks. + + if(self_points > target_points) + L.Knockdown(1) + if(self_points < target_points) Knockdown(30) - Immobilize(30) - if(STACON + charge_add == L.STACON) + if(self_points == target_points) // Exact match will be rare with athletics being fractional. L.Knockdown(1) Knockdown(30) Immobilize(30) @@ -914,6 +933,9 @@ var/old_direction = dir var/turf/T = loc + if(m_intent == MOVE_INTENT_RUN) + sprinted_tiles++ + if(wallpressed) GetComponent(/datum/component/leaning).wallhug_check(T, newloc, direct) From e37e3b39fdcb9cf4c85fdc229fb9ef06ecff2324 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sat, 30 Nov 2024 21:46:13 +0300 Subject: [PATCH 116/192] i hate my life --- code/_onclick/item_attack.dm | 2 +- code/datums/components/_component.dm | 2 + .../sexcon/sex_actions/npc/npc_anal_sex.dm | 1 + .../sexcon/sex_actions/sex/anal_ride_sex.dm | 7 +- .../sex_actions/sex/vaginal_ride_sex.dm | 6 +- code/datums/sexcon/sexcon.dm | 42 +++--- code/datums/status_effects/rogue/debuff.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 1 + .../mob/living/carbon/human/species.dm | 2 +- code/modules/mob/living/living_defense.dm | 5 +- .../surgery/bodyparts/bodypart_wounds.dm | 2 +- code/testing.dm | 2 +- .../game/objects/items/class_selectors.dm | 2 +- .../items/rogueweapons/reagent_coating.dm | 81 +++++----- modular_stonehedge/code/lewdai/lewdai.dm | 139 +++++++++--------- 16 files changed, 146 insertions(+), 152 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index bf14416cf61..66946db41a4 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -430,7 +430,7 @@ to_chat(user, span_userdanger("BACKSTAB!!! MY ATTACK DOES GREATER DAMAGE!")) user.mind?.adjust_experience(/datum/skill/misc/sneaking, user.STAINT * 5, TRUE) apply_damage(newforce, I.damtype, def_zone = hitlim) - SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, src) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, user, src) if(I.damtype == BRUTE) next_attack_msg.Cut() if(HAS_TRAIT(src, TRAIT_SIMPLE_WOUNDS)) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 11807131a2a..ab1fc1d2177 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -68,6 +68,8 @@ */ /datum/component/proc/_JoinParent() var/datum/P = parent + if(!P) + return //lazy init the parent's dc list var/list/dc = P.datum_components if(!dc) diff --git a/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm index 36c014221e9..00d266bba04 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm @@ -2,6 +2,7 @@ name = "NPC Sodomize them" stamina_cost = 0 check_same_tile = FALSE + require_grab = FALSE /datum/sex_action/npc_anal_sex/shows_on_menu(mob/living/user, mob/living/target) return FALSE diff --git a/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm b/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm index 2d5ae05a881..e3067155c50 100644 --- a/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm @@ -53,11 +53,10 @@ playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/anal_ride_sex/on_perform(mob/living/user, mob/living/target) + if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) + user.sexcon.try_pelvis_crush(target) - if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) - user.sexcon.try_pelvis_crush(target) - - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] anally rides [target].")) + user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] anally rides [target].")) playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) diff --git a/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm b/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm index 5184902aad2..65239ccf0b9 100644 --- a/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm @@ -53,10 +53,10 @@ playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/vaginal_ride_sex/on_perform(mob/living/user, mob/living/target) - if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) - user.sexcon.try_pelvis_crush(target) + if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) + user.sexcon.try_pelvis_crush(target) - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] rides [target].")) + user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] rides [target].")) playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index ef8318a9e86..f6c0c214eeb 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -206,26 +206,28 @@ /datum/sex_controller/proc/cum_into(oral = FALSE, vaginal = FALSE, anal = FALSE, nipple = FALSE, girljuice = FALSE) var/obj/item/organ/filling_organ/testicles/testes = user.getorganslot(ORGAN_SLOT_TESTICLES) - if(!issimple(target) && target.mind) - log_combat(user, target, "Came inside [target]") - if(HAS_TRAIT(target, TRAIT_GOODLOVER)) - if(!user.mob_timers["cumtri"]) - user.mob_timers["cumtri"] = world.time - user.adjust_triumphs(1) - user.add_stress(/datum/stressevent/cummax) - to_chat(user, span_love("Our sex was a true TRIUMPH!")) - else - user.add_stress(/datum/stressevent/cumok) - if(!issimple(user) && user.mind) - log_combat(target, user, "Came inside [user]") - if(HAS_TRAIT(user, TRAIT_GOODLOVER)) - if(!target.mob_timers["cumtri"]) - target.mob_timers["cumtri"] = world.time - target.adjust_triumphs(1) - target.add_stress(/datum/stressevent/cummax) - to_chat(target, span_love("Our sex was a true TRIUMPH!")) - else - target.add_stress(/datum/stressevent/cumok) + if(target.mind) + if(!issimple(target)) + log_combat(user, target, "Came inside [target]") + if(HAS_TRAIT(target, TRAIT_GOODLOVER)) + if(!user.mob_timers["cumtri"]) + user.mob_timers["cumtri"] = world.time + user.adjust_triumphs(1) + user.add_stress(/datum/stressevent/cummax) + to_chat(user, span_love("Our sex was a true TRIUMPH!")) + else + user.add_stress(/datum/stressevent/cumok) + if(user.mind) + if(!issimple(user)) + log_combat(target, user, "Came inside [user]") + if(HAS_TRAIT(user, TRAIT_GOODLOVER)) + if(!target.mob_timers["cumtri"]) + target.mob_timers["cumtri"] = world.time + target.adjust_triumphs(1) + target.add_stress(/datum/stressevent/cummax) + to_chat(target, span_love("Our sex was a true TRIUMPH!")) + else + target.add_stress(/datum/stressevent/cumok) if(girljuice) if(!issimple(target)) target.reagents.add_reagent(/datum/reagent/water/pussjuice, 10) diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 9f0ed88bb03..687ac6e0b3f 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -75,7 +75,7 @@ /datum/status_effect/debuff/stealthcd/on_apply() if(owner.mind) - duration = duration - ((owner.mind.get_skill_level(/datum/skill/misc/sneaking)) SECONDS) + duration = duration - ((owner.mind.get_skill_level(/datum/skill/misc/sneaking)) SECONDS * 2) if(owner.m_intent == MOVE_INTENT_SNEAK) owner.toggle_rogmove_intent(MOVE_INTENT_WALK) owner.update_sneak_invis() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 0be25a4b1c5..af5e7514015 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -225,7 +225,7 @@ else user.used_intent.penfactor = initial(user.used_intent.penfactor)//Sanity check to make sure intent penfactor gets reset when the attack isn't a sneak attack. apply_damage(statforce, I.damtype, affecting) - SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, src) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, user, affecting.owner) if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) if(prob(statforce)) I.add_mob_blood(src) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ce3bee14737..c2717b911bb 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -203,6 +203,7 @@ L.add_embedded_object(I, silent = FALSE, crit_message = TRUE) emote("embed") L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, I.thrownby, L) // visible_message(span_danger("[I] embeds itself in [src]'s [L.name]!"),span_danger("[I] embeds itself in my [L.name]!")) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) hitpush = FALSE diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2950695144c..30c916d82d0 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1651,7 +1651,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) I.take_damage(1, BRUTE, I.d_type) if(!nodmg) var/datum/wound/crit_wound = affecting.bodypart_attacked_by(user.used_intent.blade_class, (Iforce * weakness) * ((100-(armor_block+armor))/100), user, selzone, crit_message = TRUE) - SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, H) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, affecting.owner, user) if(should_embed_weapon(crit_wound, I)) var/can_impale = TRUE if(!affecting) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 3988781a5cb..8c6bedcb8e0 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -1,8 +1,9 @@ /mob/living/proc/run_armor_check(def_zone = null, attack_flag = "blunt", absorb_text = null, soften_text = null, armor_penetration, penetrated_text, damage, blade_dulling) var/armor = getarmor(def_zone, attack_flag, damage, armor_penetration, blade_dulling) - src.mob_timers[MT_SNEAKATTACK] = world.time //Stops you from sneaking after being hit. (Should work!) - src.apply_status_effect(/datum/status_effect/debuff/stealthcd) + if(alpha <= 100 || rogue_sneaking) + apply_status_effect(/datum/status_effect/debuff/stealthcd) + mob_timers[MT_SNEAKATTACK] = world.time //Stops you from sneaking after being hit. (Should work!) //the if "armor" check is because this is used for everything on /living, including humans if(armor > 0 && armor_penetration) armor = max(0, armor - armor_penetration) diff --git a/code/modules/surgery/bodyparts/bodypart_wounds.dm b/code/modules/surgery/bodyparts/bodypart_wounds.dm index f65801cca06..8c1b0fb5acc 100644 --- a/code/modules/surgery/bodyparts/bodypart_wounds.dm +++ b/code/modules/surgery/bodyparts/bodypart_wounds.dm @@ -318,7 +318,7 @@ dam += 10 if(owner.resting) dam += 30 - if(from_behind || user.alpha <= 15)//Dreamkeep change -- Attacks from stealth should have greatly increased crit rate. + if(from_behind || user?.alpha <= 15)//Dreamkeep change -- Attacks from stealth should have greatly increased crit rate. if(user.mind && !HAS_TRAIT(owner, TRAIT_BLINDFIGHTING) && !user.has_status_effect(/datum/status_effect/debuff/stealthcd)) var/sneakmult = 2 + (user.mind.get_skill_level(/datum/skill/misc/sneaking)) dam += 30 diff --git a/code/testing.dm b/code/testing.dm index 9de4bed63aa..1d44a88e0f5 100644 --- a/code/testing.dm +++ b/code/testing.dm @@ -3,7 +3,7 @@ This comes in later, so it wins out against the first in the defines. Thus this file is unticked as I don't know which you people prefer using. */ #ifndef TESTING - #define FASTLOAD +// #define FASTLOAD // #define DEPLOY_TEST // #define ROGUEWORLD #endif diff --git a/modular_stonehedge/code/game/objects/items/class_selectors.dm b/modular_stonehedge/code/game/objects/items/class_selectors.dm index 14e22e4285e..897abe351a6 100644 --- a/modular_stonehedge/code/game/objects/items/class_selectors.dm +++ b/modular_stonehedge/code/game/objects/items/class_selectors.dm @@ -157,7 +157,7 @@ inventory_items += /obj/item/clothing/neck/roguetown/psicross/pestra if(/datum/patron/divine/eora) //Eora content from Stonekeep inventory_items += /obj/item/clothing/neck/roguetown/psicross/eora - C.grant_spells_cleric(H) + C.grant_spells_cleric(H) if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 2, TRUE) diff --git a/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm b/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm index 83003a8002f..bbabbcb393f 100644 --- a/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm +++ b/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm @@ -7,74 +7,67 @@ - unarmored hit detection to apply reagent */ -//component procs -/datum/component/reagent_coatable +/obj/item/rogueweapon - ///Reagents holder - var/datum/reagents/reagents = null var/reagent_apply_amt + ///incase you want to set something non blunt uncoatable anyways. + var/uncoatable = FALSE -/datum/component/reagent_coatable/Initialize(...) +/obj/item/rogueweapon/Initialize(...) . = ..() - if(isitem(parent)) - RegisterSignal(parent, COMSIG_APPLY_REAGENTS, PROC_REF(apply_reagents)) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react)) + if(sharpness != IS_BLUNT && !uncoatable) + create_reagents(w_class*5, REFILLABLE|DRAINABLE) //weapon size equals more coatable. + reagent_apply_amt = (5/w_class > 0) //smaller weapons will apply more poison at once. + RegisterSignal(src, COMSIG_APPLY_REAGENTS, PROC_REF(apply_reagents)) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react)) -/datum/component/reagent_coatable/proc/apply_reagents(mob/living/H) - if(!H || !istype(H, /mob/living)) +/obj/item/rogueweapon/proc/apply_reagents(obj/item/I, mob/living/user, mob/living/H) + //signals are fucking weird, the parameters above are all fucky weird. + SIGNAL_HANDLER + debug_admins("[I], [user], [H], [usr], [src]") + if(!H) return if(reagents.total_volume) - var/available_reagent_amount = min(reagents.total_volume, reagent_apply_amt) - reagents.trans_to(H, available_reagent_amount, 1, no_react = FALSE) + reagents.trans_to(H, reagent_apply_amt, 1, no_react = FALSE) H.visible_message(span_green("[H] shudders with pain!"),span_boldgreen("I feel a burning pain on my wound!")) - log_admin("[H] was struck with [english_list(reagents.reagent_list)] using a poisoned weapon.") + log_admin("[H] was struck with [english_list(reagents.reagent_list)] using a poisoned weapon by [user].") -/datum/component/reagent_coatable/proc/clean_react() - if(reagents.total_volume) - reagents.remove_all(reagents.total_volume) //buh bye reagents. +/obj/item/rogueweapon/proc/clean_react() + SIGNAL_HANDLER + if(reagents) + if(reagents.total_volume) + reagents.remove_all(reagents.maximum_volume) //buh bye reagents water washes it -//general weapon procs -/obj/item/rogueweapon - var/datum/component/reagent_coatable/reagent_coatable - ///incase you want to set something non blunt uncoatable anyways. - var/uncoatable = FALSE - -/obj/item/rogueweapon/Initialize() - . = ..() - if(sharpness != IS_BLUNT && !uncoatable) - reagent_coatable = new /datum/component/reagent_coatable() - reagent_coatable.reagents = new /datum/reagents(w_class*5, TRANSPARENT|REFILLABLE) //weapon size equals more coatable. - reagent_coatable.reagent_apply_amt = 5/w_class //smaller weapons will apply more poison at once. - -/obj/item/rogueweapon/attackby(obj/item/I, mob/living/user, params) +/obj/item/rogueweapon/attackby(obj/item/reagent_containers/I, mob/living/user, params) . = ..() - if(reagent_coatable && istype(I, /obj/item/reagent_containers)) + if(!istype(I, /obj/item/reagent_containers)) + return + if(reagents) var/waterbuse = 0 for(var/datum/reagent/water/waterussy in I.reagents.reagent_list) waterbuse = waterussy.volume - reagent_coatable.reagents.remove_all(waterbuse) //buh bye reagents water washes it - I.reagents.remove_all_type(/datum/reagent/water, waterbuse) + reagents.remove_all(waterbuse) //buh bye reagents water washes it + I.reagents.remove_all_type(/datum/reagent/water, 100) if(user.used_intent?.type == INTENT_SPLASH) //tries to add everything. - I.reagents.trans_to(reagent_coatable.reagents, min(I.reagents.total_volume, (reagent_coatable.reagents.maximum_volume - reagent_coatable.reagents.total_volume))) - else if(user.used_intent?.type == INTENT_FILL) //adds 5 units at most - I.reagents.trans_to(reagent_coatable.reagents, min((I.reagents.total_volume < 6), (reagent_coatable.reagents.maximum_volume - reagent_coatable.reagents.total_volume))) + I.reagents.trans_to(src, I.reagents.maximum_volume) //we dont want water coated weapons so last failsafe - reagent_coatable.reagents.remove_all_type(/datum/reagent/water, reagent_coatable.reagents.total_volume) + reagents.remove_all_type(/datum/reagent/water, reagents.total_volume) +//custom reagent examine /obj/item/rogueweapon/examine(mob/user) . = ..() - if(reagent_coatable && reagent_coatable.reagents.total_volume) + if(reagents && reagents.total_volume) if(user.can_see_reagents() || (user.Adjacent(src) && user.mind?.get_skill_level(/datum/skill/misc/alchemy) >= 2)) //Show each individual reagent - . += "It is coated with:" - for(var/datum/reagent/R in reagent_coatable.reagents.reagent_list) + . += "It is coated in:" + for(var/datum/reagent/R in reagents.reagent_list) . += "[round(R.volume / 3, 0.1)] oz of [R.name]" else //Otherwise, just show the total volume var/total_volume = 0 var/reagent_color - for(var/datum/reagent/R in reagent_coatable.reagents.reagent_list) + for(var/datum/reagent/R in reagents.reagent_list) total_volume += R.volume - reagent_color = mix_color_from_reagents(reagent_coatable.reagents.reagent_list) + reagent_color = mix_color_from_reagents(reagents.reagent_list) if(total_volume / 3 < 1) - . += "It seems to be coated with less than 1 oz of something." + . += "It seems to be coated in less than 1 oz of something." else - . += "It seems to be coated with [round(total_volume / 3)] oz of something." + . += "It seems to be coated in [round(total_volume / 3)] oz of something." diff --git a/modular_stonehedge/code/lewdai/lewdai.dm b/modular_stonehedge/code/lewdai/lewdai.dm index 385e717f0fc..d4bbcfe7250 100644 --- a/modular_stonehedge/code/lewdai/lewdai.dm +++ b/modular_stonehedge/code/lewdai/lewdai.dm @@ -44,19 +44,20 @@ return if(retreating) return + if(handcuffed || legcuffed || lying) + return if(sexcon && !chasesfuck) - var/list/around = view(aggro_vision_range, src) - for(var/mob/living/carbon/human/fucktarg in around) - if(!src.aggressive && fucktarg.cmode) //skip if the target has cmode on and the mob is not aggressive. + for(var/mob/living/carbon/human/fucktarg in view(aggro_vision_range, src)) + if(!aggressive && fucktarg.cmode) //skip if the target has cmode on and the mob is not aggressive. continue if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && CanAttack(fucktarg, TRUE)) chasesfuck = TRUE - if(src.gender == MALE) - src.visible_message(span_boldwarning("[src] has his eyes on [fucktarg], cock throbbing!")) - src.say(pick(male_lewdtalk), language = /datum/language/common) + if(gender == MALE) + visible_message(span_boldwarning("[src] has his eyes on [fucktarg], cock throbbing!")) + say(pick(male_lewdtalk), language = /datum/language/common) else - src.visible_message(span_boldwarning("[src] has her eyes on [fucktarg], cunt dripping!")) - src.say(pick(female_lewdtalk), language = /datum/language/common) + visible_message(span_boldwarning("[src] has her eyes on [fucktarg], cunt dripping!")) + say(pick(female_lewdtalk), language = /datum/language/common) break else continue @@ -67,12 +68,12 @@ approaching_target = FALSE in_melee = FALSE if(prob(10)) - if(src.gender == MALE) - src.visible_message(span_warning("[src] seeks his mate, cock throbbing!")) - src.say(pick(male_lewdtalk), language = /datum/language/common) + if(gender == MALE) + visible_message(span_warning("[src] seeks his mate, cock throbbing!")) + say(pick(male_lewdtalk), language = /datum/language/common) else - src.visible_message(span_warning("[src] seeks her mate, cunt dripping!")) - src.say(pick(female_lewdtalk), language = /datum/language/common) + visible_message(span_warning("[src] seeks her mate, cunt dripping!")) + say(pick(female_lewdtalk), language = /datum/language/common) seeklewd() if(seekboredom > 25) //give up after a while and go dormant again, this should also help them get unstuck. stoppedfucking(timedout = TRUE) @@ -83,15 +84,15 @@ if(!erpable) return var/mob/living/carbon/human/L - var/list/around = view(aggro_vision_range, src) var/list/foundfuckmeat = list() - if(sexcon.current_action && fuckcd > 0) + if(!retreating && sexcon.current_action && fuckcd > 0) return - for(var/mob/living/carbon/human/fucktarg in around) - if(!src.retreating && fucktarg.has_quirk(/datum/quirk/monsterhunter)) + for(var/mob/living/carbon/human/fucktarg in view(aggro_vision_range, src)) + if(fucktarg.has_quirk(/datum/quirk/monsterhunter)) foundfuckmeat += fucktarg - L = fucktarg - if(src.Adjacent(L)) + if(foundfuckmeat.len) + L = pick(foundfuckmeat) + if(Adjacent(L)) if(iscarbon(L)) chasesfuck = FALSE if(attack_sound) @@ -111,12 +112,12 @@ if(L.wear_pants) if(L.wear_pants.flags_inv & HIDECROTCH && !L.wear_pants.genitalaccess) if(!L.cmode) //pants off if not in cmode - src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) + visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) var/obj/item/clothing/thepants = L.wear_pants L.dropItemToGround(thepants) thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) else if(L.cmode) - src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) + visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) enemies = list() target = null approaching_target = FALSE @@ -128,29 +129,29 @@ sexcon.force = SEX_FORCE_MID if(!Adjacent(L)) //are we at the same tile? walk_to(src, get_turf(Adjacent(L)), 1, move_to_delay) //get on them. - src.visible_message(span_danger("[src] starts to breed [L]!")) + visible_message(span_danger("[src] starts to breed [L]!")) if(sexcon.force == SEX_FORCE_MAX) - src.visible_message(span_danger("[src] pins [L] down for a savage fucking!")) + visible_message(span_danger("[src] pins [L] down for a savage fucking!")) else - src.visible_message(span_info("[src] climbs on [L] to breed.")) + visible_message(span_info("[src] climbs on [L] to breed.")) sexcon.speed = SEX_SPEED_MAX if(gender == MALE) sexcon.manual_arousal = SEX_MANUAL_AROUSAL_MAX log_admin("[src] is trying to init sex on [L]") var/current_action = /datum/sex_action/npc_rimming - if(src.gender == FEMALE && L.gender == MALE) + if(gender == FEMALE && L.gender == MALE) switch(rand(1,2)) if(2) //anal current_action = /datum/sex_action/npc_anal_ride_sex if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_ride_sex - if(src.gender == MALE && L.gender == MALE) + if(gender == MALE && L.gender == MALE) switch(rand(1,2)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal current_action = /datum/sex_action/npc_anal_sex - if(src.gender == MALE && L.gender == FEMALE) + if(gender == MALE && L.gender == FEMALE) switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex @@ -158,7 +159,7 @@ current_action = /datum/sex_action/npc_anal_sex if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_sex - if(src.gender == FEMALE && L.gender == FEMALE) + if(gender == FEMALE && L.gender == FEMALE) switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_facesitting @@ -169,15 +170,12 @@ sexcon.do_until_finished = TRUE sexcon.target = L sexcon.try_start_action(current_action) - return - for(var/mob/living/fucktarg in foundfuckmeat) - var/turf/T = get_turf(fucktarg) - Goto(T,move_to_delay,0) - break - return + else + var/turf/T = get_turf(L) + Goto(T,move_to_delay,0) /mob/living/simple_animal/hostile/retaliate/rogue/proc/stoppedfucking(mob/living/carbon/target, timedout = FALSE) - walk_away(src, get_turf(src.loc), 1, move_to_delay) + walk_away(src, get_turf(loc), 1, move_to_delay) if(gender == MALE) //put that weapon down soldier. sexcon.manual_arousal = SEX_MANUAL_AROUSAL_DEFAULT sexcon.current_action = null @@ -187,7 +185,7 @@ if(sexcon.just_ejaculated() || timedout) //is it satisfied or given up fuckcd = rand(50,350) else - fuckcd = rand(20,80) + fuckcd = rand(20,40) if(aggressive) //if its in combat and unsatisfied by prey slipping off, it will wanna try again. But with some delay so the person can actually get up // and if they are taking turns with multiple seeksfuck mobs around this may help a bit. @@ -232,29 +230,29 @@ if(sexcon && !chasesfuck) var/list/around = view(10, src) for(var/mob/living/carbon/human/fucktarg in around) - if(!src.aggressive && fucktarg.cmode) //skip if the target has cmode on and the mob is not aggressive. + if(!aggressive && fucktarg.cmode) //skip if the target has cmode on and the mob is not aggressive. continue if(fucktarg.has_quirk(/datum/quirk/monsterhunter) && should_target(fucktarg, TRUE)) //normally checks !sexcon.beingfucked but carbon mobs arent directly on top of the mob to fuck so its probably fine to get ganged. chasesfuck = TRUE if(lewd_talk) - if(src.gender == MALE) - src.visible_message(span_boldwarning("[src] has his eyes on [fucktarg], cock throbbing!")) - src.say(pick(male_lewdtalk), language = /datum/language/common) + if(gender == MALE) + visible_message(span_boldwarning("[src] has his eyes on [fucktarg], cock throbbing!")) + say(pick(male_lewdtalk), language = /datum/language/common) else - src.visible_message(span_boldwarning("[src] has her eyes on [fucktarg], cunt dripping!")) - src.say(pick(female_lewdtalk), language = /datum/language/common) + visible_message(span_boldwarning("[src] has her eyes on [fucktarg], cunt dripping!")) + say(pick(female_lewdtalk), language = /datum/language/common) break else continue if(chasesfuck) //until fuck is acquired, keep chasing. seekboredom += 1 if(prob(10) && lewd_talk) - if(src.gender == MALE) - src.visible_message(span_warning("[src] seeks his mate, cock throbbing!")) - src.say(pick(male_lewdtalk), language = /datum/language/common) + if(gender == MALE) + visible_message(span_warning("[src] seeks his mate, cock throbbing!")) + say(pick(male_lewdtalk), language = /datum/language/common) else - src.visible_message(span_warning("[src] seeks her mate, cunt dripping!")) - src.say(pick(female_lewdtalk), language = /datum/language/common) + visible_message(span_warning("[src] seeks her mate, cunt dripping!")) + say(pick(female_lewdtalk), language = /datum/language/common) seeklewd() if(seekboredom > 25) //give up after a while and go dormant again, this should also help them get unstuck. stoppedfucking(timedout = TRUE) @@ -263,17 +261,17 @@ /mob/living/carbon/human/proc/seeklewd() var/mob/living/carbon/human/L - var/list/around = view(10, src) var/list/foundfuckmeat = list() if(sexcon.current_action && fuckcd > 0) return - for(var/mob/living/carbon/human/fucktarg in around) + for(var/mob/living/carbon/human/fucktarg in view(10, src)) if(fucktarg.has_quirk(/datum/quirk/monsterhunter)) foundfuckmeat += fucktarg - L = fucktarg + if(foundfuckmeat.len) + L = pick(foundfuckmeat) STOP_PROCESSING(SShumannpc,src) mode = AI_OFF - if(src.Adjacent(L)) + if(Adjacent(L)) if(iscarbon(L)) chasesfuck = FALSE if(!L.has_quirk(/datum/quirk/monsterhunter)) //one more check incase this is somehow the wrong target who dont have the quirk. @@ -290,43 +288,43 @@ if(L.wear_pants) if(L.wear_pants.flags_inv & HIDECROTCH && !L.wear_pants.genitalaccess) if(!L.cmode) //pants off if not in cmode - src.visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) + visible_message(span_danger("[src] manages to rip [L]'s [L.wear_pants.name] off!")) var/obj/item/clothing/thepants = L.wear_pants L.dropItemToGround(thepants) thepants.throw_at(orange(2, get_turf(L)), 2, 1, src, TRUE) else if(L.cmode) - src.visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) + visible_message(span_danger("[src] manages to tug [L]'s [L.wear_pants.name] out of the way!")) if(aggressive) sexcon.force = SEX_FORCE_MAX else sexcon.force = SEX_FORCE_MID if(!Adjacent(L)) //are we at the same tile? - walk2derpless(Adjacent(L)) //get next to them since it looks like shit tweaks out. + walk2derpless(L.loc) //get to them since it looks like shit tweaks out. if(!pulling) start_pulling(L) - src.visible_message(span_danger("[src] starts to breed [L]!")) + visible_message(span_danger("[src] starts to breed [L]!")) if(sexcon.force == SEX_FORCE_MAX) - src.visible_message(span_danger("[src] pins [L] down for a savage fucking!")) + visible_message(span_danger("[src] pins [L] down for a savage fucking!")) else - src.visible_message(span_info("[src] climbs on [L] to breed.")) + visible_message(span_info("[src] climbs on [L] to breed.")) sexcon.speed = SEX_SPEED_MAX if(gender == MALE) sexcon.manual_arousal = SEX_MANUAL_AROUSAL_MAX log_admin("[src] is trying to init sex on [L]") var/current_action = /datum/sex_action/npc_rimming - if(src.gender == FEMALE && L.gender == MALE) + if(gender == FEMALE && L.gender == MALE) switch(rand(1,2)) if(1) //anal current_action = /datum/sex_action/npc_anal_ride_sex if(2) //vaginal current_action = /datum/sex_action/npc_vaginal_ride_sex - if(src.gender == MALE && L.gender == MALE) + if(gender == MALE && L.gender == MALE) switch(rand(1,2)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex if(2) //anal current_action = /datum/sex_action/npc_anal_sex - if(src.gender == MALE && L.gender == FEMALE) + if(gender == MALE && L.gender == FEMALE) switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_throat_sex @@ -334,7 +332,7 @@ current_action = /datum/sex_action/npc_anal_sex if(3) //vaginal current_action = /datum/sex_action/npc_vaginal_sex - if(src.gender == FEMALE && L.gender == FEMALE) + if(gender == FEMALE && L.gender == FEMALE) switch(rand(1,3)) if(1) //oral current_action = /datum/sex_action/npc_facesitting @@ -345,21 +343,18 @@ sexcon.do_until_finished = TRUE sexcon.target = L sexcon.try_start_action(current_action) - return - for(var/mob/living/carbon/human/fucktarg in foundfuckmeat) - var/turf/T = get_turf(fucktarg) - walk2derpless(Adjacent(T)) - break - return + else + var/turf/T = get_turf(L) + walk2derpless(T) /mob/living/carbon/human/proc/stoppedfucking(mob/living/carbon/target, timedout = FALSE) //try to bind after sex. if(target && Adjacent(target)) if(aggressive && !target.handcuffed && target.lying) //aggro mob, not handcuffed, lying. - for(var/obj/item/rope/ropey in src.held_items) + for(var/obj/item/rope/ropey in held_items) if(target.cmode) visible_message(span_info("[src] struggles with [target]!")) - src.adjustStaminaLoss(50, TRUE) + adjustStaminaLoss(50, TRUE) target.adjustStaminaLoss(50, TRUE) else ropey.apply_cuffs(target, src) @@ -370,9 +365,9 @@ else if(aggressive && target.handcuffed) //already cuffed. emote("laugh") target.adjustStaminaLoss(25, TRUE) - src.adjustStaminaLoss(25, TRUE) + adjustStaminaLoss(25, TRUE) else if(target) - walk_away(src, get_turf(src.loc), 1, 1) + walk_away(src, get_turf(loc), 1, 1) sexcon.current_action = FALSE chasesfuck = FALSE seekboredom = 0 @@ -381,7 +376,7 @@ if(sexcon.just_ejaculated() || timedout) //is it satisfied or given up fuckcd = rand(50,350) else - fuckcd = rand(20,80) + fuckcd = rand(20,40) if(aggressive) //if its in combat and unsatisfied by prey slipping off, it will wanna try again. But with some delay so the person can actually get up // and if they are taking turns with multiple seeksfuck mobs around this may help a bit. From 20e7b5f470bf6e83dcb1a2d14744b1f4baa2ccab Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sat, 30 Nov 2024 21:52:08 +0300 Subject: [PATCH 117/192] harlequin --- _maps/map_files/dreamhold/Dreamhold.dmm | 9 ++++++++- code/modules/jobs/jobs.dm | 2 +- code/modules/mob/living/carbon/human/examine.dm | 2 +- strings/Anglish.json | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index eec6befca09..6031dc715ab 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -24663,6 +24663,13 @@ }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) +"sXG" = ( +/obj/effect/landmark/start/jester, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/tavern{ + first_time_text = "The Sylver Dragonne.."; + name = "Silver Dragon" + }) "sYg" = ( /obj/structure/closet/crate/roguecloset/dark, /obj/item/clothing/under/roguetown/tights/stockings/purple, @@ -159616,7 +159623,7 @@ fSQ tRu tJb tJb -tJb +sXG tJb fcI rlX diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index eb9e01bcc8e..201690428f8 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(noble_positions, list( GLOBAL_LIST_INIT(courtier_positions, list( "Magician", "Physician", - "Jester", + "Harlequin", "Head Butler", )) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 9afcf8b1333..5c1c5fcbef5 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -11,7 +11,7 @@ event.desc = self_species.stress_desc */ if(user.has_flaw(/datum/charflaw/paranoid) && (STASTR - user.STASTR) > 1) user.add_stress(/datum/stressevent/parastr) - if(HAS_TRAIT(user, TRAIT_JESTERPHOBIA) && job == "Jester") + if(HAS_TRAIT(user, TRAIT_JESTERPHOBIA) && job == "Harlequin") user.add_stress(/datum/stressevent/jesterphobia) if(HAS_TRAIT(src, TRAIT_BEAUTIFUL)) user.add_stress(/datum/stressevent/beautiful) diff --git a/strings/Anglish.json b/strings/Anglish.json index 8cca5af86bf..1a1f9cca99c 100644 --- a/strings/Anglish.json +++ b/strings/Anglish.json @@ -13,7 +13,7 @@ "bog": "mire", "ass": "arse", "butt": "arse", - "jester": ["funnyman", "marryman"], + "Harlequin": ["funnyman", "marryman"], "literature": "bookcraft", "doctor": "healer", "emperor": "king of kings", From 0bbcb8c6035051eb7c22c754b67852a2df206987 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sat, 30 Nov 2024 22:36:26 +0300 Subject: [PATCH 118/192] welp --- .../game/objects/items/rogueweapons/reagent_coating.dm | 7 +++---- modular_stonehedge/code/lewdai/lewdai.dm | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm b/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm index bbabbcb393f..5164cd7a028 100644 --- a/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm +++ b/modular_stonehedge/code/game/objects/items/rogueweapons/reagent_coating.dm @@ -24,13 +24,12 @@ /obj/item/rogueweapon/proc/apply_reagents(obj/item/I, mob/living/user, mob/living/H) //signals are fucking weird, the parameters above are all fucky weird. SIGNAL_HANDLER - debug_admins("[I], [user], [H], [usr], [src]") if(!H) return if(reagents.total_volume) - reagents.trans_to(H, reagent_apply_amt, 1, no_react = FALSE) - H.visible_message(span_green("[H] shudders with pain!"),span_boldgreen("I feel a burning pain on my wound!")) - log_admin("[H] was struck with [english_list(reagents.reagent_list)] using a poisoned weapon by [user].") + reagents.trans_to(user, reagent_apply_amt, 1, no_react = FALSE) + H.visible_message(span_green("[user] shudders with pain!"),span_boldgreen("I feel a burning pain on my wound!")) + log_admin("[user] was struck with [english_list(reagents.reagent_list)] using a poisoned weapon by [H].") /obj/item/rogueweapon/proc/clean_react() SIGNAL_HANDLER diff --git a/modular_stonehedge/code/lewdai/lewdai.dm b/modular_stonehedge/code/lewdai/lewdai.dm index d4bbcfe7250..168b1df34cc 100644 --- a/modular_stonehedge/code/lewdai/lewdai.dm +++ b/modular_stonehedge/code/lewdai/lewdai.dm @@ -368,7 +368,7 @@ adjustStaminaLoss(25, TRUE) else if(target) walk_away(src, get_turf(loc), 1, 1) - sexcon.current_action = FALSE + sexcon.current_action = null chasesfuck = FALSE seekboredom = 0 START_PROCESSING(SShumannpc,src) From f7abe643fe9eeaab595a282da238beb039deced9 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sat, 30 Nov 2024 23:51:49 +0300 Subject: [PATCH 119/192] oops lmao --- .../jobs/job_types/roguetown/apprentices/mage_apprentice.dm | 1 + code/modules/jobs/job_types/roguetown/courtier/magician.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm b/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm index 6797cb4d142..5baf4d996ba 100644 --- a/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm +++ b/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm @@ -64,5 +64,6 @@ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/splash) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/roustame) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/animate_object) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, "[type]") H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) diff --git a/code/modules/jobs/job_types/roguetown/courtier/magician.dm b/code/modules/jobs/job_types/roguetown/courtier/magician.dm index 885c6290df2..e1d45916f43 100644 --- a/code/modules/jobs/job_types/roguetown/courtier/magician.dm +++ b/code/modules/jobs/job_types/roguetown/courtier/magician.dm @@ -51,6 +51,7 @@ backl = /obj/item/storage/backpack/rogue/satchel backpack_contents = list(/obj/item/slimepotion/lovepotion,/obj/item/reagent_containers/glass/bottle/rogue/poison,/obj/item/reagent_containers/glass/bottle/rogue/healthpot) ADD_TRAIT(H, TRAIT_SEEPRICES, "[type]") + ADD_TRAIT(H, TRAIT_USEMAGICITEM, "[type]") if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 5, TRUE) From 2834fc95ca27890f5e473260b05358ab19ba2be7 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sun, 1 Dec 2024 01:45:23 +0300 Subject: [PATCH 120/192] Update inhumen_pantheon.dm --- code/datums/gods/patrons/inhumen_pantheon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/gods/patrons/inhumen_pantheon.dm b/code/datums/gods/patrons/inhumen_pantheon.dm index 284cd0304ff..d74410701db 100644 --- a/code/datums/gods/patrons/inhumen_pantheon.dm +++ b/code/datums/gods/patrons/inhumen_pantheon.dm @@ -30,7 +30,7 @@ domain = "God of Twilight and Change. Magic. Transformation. Dusk/Dawn. Crisis/Resolution." desc = "Jayx is known as the Herald of change, often depicted as a two-tailed comet or Phoenix. The Divine Phoenix represents the immortal cycle of growth and advancement, often a god of both magic and art; they are known more than anything as the passage of time itself and bright blue magical fire. (Mana)" worshippers = "Mages, Alchemists, Soul-Searchers, Fateweavers, Supernatural Creatures, Soothsayers." - mob_traits = list(TRAIT_ANTISCRYING) + mob_traits = list(TRAIT_ANTISCRYING, TRAIT_USEMAGICITEM) t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen confess_lines = list( "THE PHOENIX BURNS BRIGHT AND PURE!", From 1822a36cf3e8d277b250cc7ff31f1ed2873e4181 Mon Sep 17 00:00:00 2001 From: EaglePhntm <39886147+EaglePhntm@users.noreply.github.com> Date: Sun, 1 Dec 2024 01:57:33 +0300 Subject: [PATCH 121/192] Update cleric.dm --- .../job_types/roguetown/adventurer/types/combat/cleric.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm index 2a11249f4c0..33f7026c520 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm @@ -176,9 +176,6 @@ armor = /obj/item/clothing/suit/roguetown/shirt/robe/noc pants = /obj/item/clothing/under/roguetown/tights/black belt = /obj/item/storage/belt/rogue/leather/black - if (H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE) - H.mind.adjust_spellpoints(1) if(/datum/patron/divine/necra) head = /obj/item/clothing/head/roguetown/necrahood armor = /obj/item/clothing/suit/roguetown/shirt/robe/necra @@ -196,6 +193,10 @@ armor = /obj/item/clothing/suit/roguetown/shirt/robe/psydonrobe if(/datum/patron/divine/eora) armor = /obj/item/clothing/suit/roguetown/shirt/robe/eora + if(/datum/patron/inhumen/graggar) + if(H.mind) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE) + H.mind.adjust_spellpoints(1) // HEARTHSTONE ADDITION END var/datum/devotion/C = new /datum/devotion(H, H.patron) // HEARTHSTONE ADDITION: cloistered devout devo regen & tier buff From 158eedb6390cdd92ad0bf0ea03915943beb24b30 Mon Sep 17 00:00:00 2001 From: Murderfox Date: Sun, 1 Dec 2024 14:49:03 +1030 Subject: [PATCH 122/192] Map Tweaking minor visual fixes to make things look nicer after a few big changes lately. Most of them are small tweaks like cleaning up issues from quick mapping to make it look a bit better in spots. --- _maps/map_files/dreamhold/Dreamhold.dmm | 1774 ++++++++++++++--------- 1 file changed, 1094 insertions(+), 680 deletions(-) diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 6031dc715ab..c85a8a0b078 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -135,10 +135,8 @@ first_time_text = "The Twilight Woods" }) "aeO" = ( -/obj/structure/flora/grass/jungle{ - icon_state = "grassa2" - }, -/turf/open/floor/rogue/cobblerock, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -379,13 +377,14 @@ name = "far stonehedge" }) "apN" = ( -/obj/structure/flora/grass/jungle/b, -/turf/closed/wall/mineral/rogue/decostone/mossy/blue{ - icon_state = "decostone-cand-blue" +/obj/structure/glowshroom{ + icon_state = "glowshroom2" }, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/exposed/church{ + first_time_text = "Druids Grove"; + name = "Grove" }) "aqh" = ( /obj/machinery/light/rogue/wallfire/candle/blue/r, @@ -800,6 +799,20 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"aEn" = ( +/obj/structure/roguewindow/openclose{ + dir = 1 + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) "aEX" = ( /obj/structure/chair/bench{ dir = 4 @@ -962,6 +975,7 @@ dir = 4 }, /obj/effect/decal/dirt, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -1011,6 +1025,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"aKv" = ( +/obj/item/reagent_containers/glass/cup/wooden, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "aKJ" = ( /obj/machinery/light/rogue/torchholder/l{ dir = 8 @@ -1748,6 +1769,14 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"bmK" = ( +/obj/machinery/light/rogue/wallfire/candle/blue, +/obj/structure/chair/bench/church/smallbench, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bnm" = ( /obj/structure/flora/roguetree/stump/log, /obj/effect/spawner/roguemap/tree, @@ -1869,13 +1898,9 @@ first_time_text = "Stonehedge" }) "brD" = ( -/obj/effect/landmark/start/priest, -/obj/structure/fluff/littlebanners/bluewhite, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/shelter/bog) "brY" = ( /turf/open/water/river, /area/rogue/outdoors/caves) @@ -2141,7 +2166,7 @@ name = "far stonehedge" }) "bFR" = ( -/obj/structure/ladder, +/obj/structure/stairs/stone, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -2374,7 +2399,8 @@ /obj/structure/closet/crate/chest, /obj/item/reagent_containers/food/snacks/grown/wheat, /obj/item/reagent_containers/food/snacks/grown/wheat, -/turf/open/floor/rogue/blocks/stonered/tiny, +/obj/structure/bars/grille, +/turf/open/transparent/openspace, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -2524,6 +2550,14 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"bUT" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/exposed/church{ + first_time_text = "Druids Grove"; + name = "Grove" + }) "bVR" = ( /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/outdoors/exposed/bath) @@ -2981,10 +3015,7 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) "cpy" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ - friendlyfactions = null; - friendlyjobs = list("Guildmaster", "Guild Appraiser") - }, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/grass, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -3364,6 +3395,12 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"cGr" = ( +/obj/structure/well/fountain, +/turf/open/floor/rogue/cobble, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "cGx" = ( /obj/effect/decal/dirt{ dir = 1 @@ -4071,10 +4108,14 @@ first_time_text = "The Twilight Woods" }) "dfJ" = ( -/obj/effect/landmark/events/haunts, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/closet/crate/drawer/inn, +/obj/item/natural/feather, +/obj/item/paper/scroll, +/obj/item/paper/scroll, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "dfQ" = ( /obj/structure/flora/roguegrass/maneater/real{ @@ -4084,13 +4125,11 @@ /turf/open/water/swamp, /area/rogue/outdoors/river) "dfT" = ( -/obj/structure/roguemachine/vendor{ - keycontrol = "mage" - }, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/exposed/magiciantower{ - first_time_text = "Ravenloft Academy"; - name = "Schoolgrounds" +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/shroud, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "dgg" = ( /obj/structure/fluff/railing/wood{ @@ -4249,6 +4288,14 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"dkn" = ( +/obj/structure/chair/bench{ + dir = 4 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "dko" = ( /obj/structure/mineral_door/wood/window, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -4473,7 +4520,7 @@ }) "dqW" = ( /obj/structure/closet/crate/coffin, -/turf/open/floor/rogue/twig, +/turf/open/floor/rogue/cobblerock, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -4701,11 +4748,12 @@ name = "Ravenloft Academy" }) "dzN" = ( -/obj/item/bodypart/r_arm/rprosthetic/clock, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/item/bodypart/l_leg/rprosthetic/clock, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dzU" = ( /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/bath{ @@ -4850,6 +4898,14 @@ }, /turf/open/floor/rogue/carpet, /area/rogue/indoors/town) +"dGW" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa1" + }, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "dGY" = ( /obj/structure/glowshroom{ icon_state = "glowshroom2" @@ -4987,7 +5043,7 @@ name = "Ravenloft Academy" }) "dOZ" = ( -/obj/structure/fluff/statue/tdummy, +/obj/structure/fluff/statue/tdummy2, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -6059,12 +6115,9 @@ name = "far stonehedge" }) "eCw" = ( -/obj/effect/landmark/events/haunts, -/obj/effect/landmark/townpatrol, -/turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors/woods{ - first_time_text = "The Twilight Woods" - }) +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/indoors/shelter/bog) "eCy" = ( /obj/structure/flora/roguegrass/bush{ icon_state = "bush2" @@ -6199,10 +6252,11 @@ /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/library) "eJl" = ( -/obj/structure/flora/roguegrass, -/turf/open/floor/rogue/cobble, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/fluff/statue/gargoyle/moss, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "eJs" = ( /obj/structure/bed/rogue/inn/double, @@ -6329,6 +6383,9 @@ /area/rogue/indoors/town/bath) "eNl" = ( /obj/effect/wisp, +/obj/structure/flora/grass/jungle{ + icon_state = "grassa2" + }, /turf/open/transparent/glass, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -6350,6 +6407,14 @@ /obj/effect/mist, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/caves) +"eOe" = ( +/obj/structure/lever/wall{ + dir = 8; + name = "Courtyard Portcullis"; + redstone_id = "rearmain" + }, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/bog) "eOm" = ( /obj/structure/fluff/statue/gargoyle/moss, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -6479,6 +6544,11 @@ }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/exposed/bath) +"eRD" = ( +/obj/effect/landmark/start/bogguardsman, +/obj/structure/chair/stool/rogue, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/bog) "eRJ" = ( /obj/structure/closet/crate/chest/dungeon/mimic, /turf/open/floor/rogue/hexstone, @@ -6791,7 +6861,7 @@ }) "eZV" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/spacevine, +/obj/structure/fluff/statue/small, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "fah" = ( @@ -7924,6 +7994,15 @@ "fWg" = ( /obj/machinery/light/rogue/wallfire/candle/blue/l, /turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +"fWY" = ( +/obj/item/burial_shroud, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/shovel, +/turf/open/floor/rogue/cobblerock, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -8003,21 +8082,11 @@ first_time_text = "The Twilight Woods" }) "fZA" = ( -/obj/structure/roguemachine/vendor{ - keycontrol = "steward" - }, /obj/effect/decal/stone/blockedge, -/obj/effect/decal/stone/blockedge/blockedgeinvert, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/turf/closed/wall/mineral/rogue/decowood, +/obj/structure/table/wood{ + icon_state = "tablewood1" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -8182,13 +8251,11 @@ }, /area/rogue/outdoors/river) "geQ" = ( -/obj/structure/flora/grass/jungle{ - icon_state = "grassa1" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/chair/bench/couchablack, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "gfe" = ( /obj/structure/flora/grass/jungle/b, @@ -8764,11 +8831,11 @@ first_time_text = "The Mountain Passe" }) "gGI" = ( -/obj/structure/flora/grass/jungle, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "gHc" = ( /mob/living/simple_animal/butterfly, @@ -8806,6 +8873,21 @@ }, /turf/open/floor/rogue/cobble, /area/rogue/indoors/shelter/town) +"gHR" = ( +/obj/item/natural/bundle/stick, +/obj/item/natural/bundle/stick, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) +"gIe" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobble, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gIm" = ( /obj/structure/glowshroom, /turf/open/floor/rogue/grass, @@ -8858,6 +8940,14 @@ /obj/effect/landmark/start/bogguardsman, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) +"gKW" = ( +/obj/structure/flora/newbranch/connector{ + dir = 1 + }, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "gLu" = ( /turf/closed/wall/mineral/rogue/decostone/end{ dir = 1 @@ -9048,6 +9138,13 @@ /mob/living/simple_animal/hostile/retaliate/rogue/spider, /turf/open/floor/rogue/cobble/mossy, /area/rogue/under/cavewet/bogcaves) +"gXv" = ( +/obj/structure/table/wood{ + icon_state = "longtable" + }, +/obj/machinery/light/rogue/torchholder/l, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/bog) "gXN" = ( /obj/structure/flora/roguegrass/water/reeds, /obj/structure/flora/roguetree/happyrandom{ @@ -9143,10 +9240,6 @@ }) "hau" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ - friendlyfactions = null; - friendlyjobs = list("Guildmaster", "Guild Appraiser") - }, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -9625,6 +9718,17 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"hta" = ( +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/item/bodypart/l_arm/rprosthetic/clock, +/obj/item/bodypart/r_leg/rprosthetic/clock, +/obj/item/bodypart/l_leg/rprosthetic/clock, +/obj/item/bodypart/r_arm/rprosthetic/clock, +/obj/item/signal_horn/blasting{ + name = "Enchanted Horn" + }, +/turf/open/floor/rogue/naturalstone, +/area/rogue/indoors/town/vault) "htw" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/rooftop{ @@ -9667,6 +9771,14 @@ name = "Seawater" }, /area/rogue/under/cavewet) +"huN" = ( +/obj/structure/fluff/railing/border, +/turf/open/floor/rogue/twig{ + dir = 4 + }, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "huR" = ( /obj/structure/flora/roguegrass, /obj/structure/flora/ausbushes/ppflowers, @@ -10734,6 +10846,7 @@ /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, +/obj/item/scrying, /turf/open/floor/bronze, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -11050,6 +11163,7 @@ /obj/effect/decal/dirt{ dir = 4 }, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -11465,6 +11579,16 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"iQi" = ( +/obj/structure/table/wood{ + dir = 1; + icon_state = "longtable" + }, +/obj/machinery/light/rogue/torchholder/l{ + dir = 8 + }, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/bog) "iQZ" = ( /obj/structure/fermenting_barrel/water, /obj/structure/fluff/railing/wood{ @@ -12148,11 +12272,9 @@ /turf/open/floor/rogue/blocks/stonered/tiny, /area/rogue/indoors/shelter/town) "juB" = ( -/obj/machinery/light/rogue/torchholder/l{ - dir = 8 - }, -/turf/open/floor/rogue/blocks, -/area/rogue/indoors/shelter/bog) +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry, +/turf/open/floor/rogue/greenstone, +/area/rogue/under/cavewet) "juO" = ( /obj/structure/closet/crate/roguecloset/inn/south, /obj/item/dildo/silver, @@ -12192,8 +12314,8 @@ first_time_text = "The Mountain Passe" }) "jwv" = ( -/obj/structure/stairs/stone, -/turf/open/floor/rogue/dirt, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -12482,13 +12604,10 @@ /area/rogue/indoors/shelter/bog) "jFL" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/roguetree/happyrandom{ - desc = "An old, beloved tree that even elves could love."; - icon_state = "t3" - }, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" }) "jGg" = ( /obj/structure/mineral_door/wood{ @@ -12576,6 +12695,14 @@ /turf/open/floor/rogue/rooftop/green{ dir = 8 }, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) +"jJw" = ( +/obj/structure/flora/wildplant/wild_herbs, +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -12688,6 +12815,7 @@ /obj/structure/fluff/railing/wood{ dir = 4 }, +/obj/structure/spacevine/dendor, /turf/open/floor/rogue/shroud, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -13026,6 +13154,8 @@ /obj/item/grown/log/tree/small, /obj/item/grown/log/tree/small, /obj/item/grown/log/tree/small, +/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame, +/obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/dirt, /area/rogue/indoors/shelter/bog) "jZo" = ( @@ -13108,7 +13238,7 @@ first_time_text = "The Twilight Woods" }) "kcf" = ( -/obj/structure/fluff/statue/lewd/random, +/obj/structure/fluff/statue/small, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "kct" = ( @@ -13850,6 +13980,14 @@ /obj/structure/flora/ausbushes/lavendergrass, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) +"kEw" = ( +/obj/structure/chair/bench{ + dir = 1 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "kEE" = ( /obj/structure/rack/rogue{ pixel_y = 2 @@ -13986,14 +14124,11 @@ /turf/open/floor/rogue/greenstone, /area/rogue/indoors/shelter/bog) "kHI" = ( -/obj/structure/roguemachine/drugmachine{ - icon_state = "submit_anim"; - name = "UNDERMARKET VENDOR" - }, -/turf/closed/wall/mineral/rogue/wooddark/slitted, -/area/rogue/outdoors/beach{ - first_time_text = "Emerald Shores"; - name = "Shores of the Emerald Coast" +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "kHM" = ( /obj/structure/flora/grass/jungle/b, @@ -14066,9 +14201,13 @@ first_time_text = "Stonehedge" }) "kMT" = ( -/obj/structure/fluff/statue/small, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/bath) +/obj/effect/landmark/events/haunts, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kNb" = ( /obj/structure/flora/newbranch/connector{ dir = 5; @@ -14115,6 +14254,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"kOv" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kOC" = ( /obj/structure/spacevine, /turf/closed/wall/mineral/rogue/stone/moss, @@ -14439,8 +14585,8 @@ name = "Shores of the Emerald Coast" }) "laG" = ( -/obj/structure/fluff/statue/tdummy, -/turf/open/floor/rogue/cobblerock, +/obj/structure/fluff/statue/tdummy2, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -15071,15 +15217,10 @@ first_time_text = "Stonehedge" }) "lCr" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ - friendlyfactions = null; - friendlyjobs = list("Guildmaster", "Guild Appraiser") - }, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) +/obj/machinery/light/rogue/firebowl/standing/blue, +/obj/structure/spacevine, +/turf/open/floor/rogue/tile/bath, +/area/rogue/indoors/town/bath) "lCH" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -15204,13 +15345,14 @@ name = "far stonehedge" }) "lIq" = ( -/obj/structure/lever/wall{ - dir = 8; - name = "Bogpath Gates"; - redstone_id = "rearmain" +/obj/structure/fluff/railing/border, +/turf/open/transparent/openspace, +/turf/open/floor/rogue/twig{ + dir = 4 }, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/shelter/bog) +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "lIv" = ( /obj/structure/rack/rogue, /obj/item/book/rogue/cooking, @@ -15361,6 +15503,7 @@ "lRd" = ( /obj/structure/closet/crate/roguecloset/dark, /obj/item/slimepotion/lovepotion, +/obj/item/scrying, /turf/open/floor/bronze, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -15472,9 +15615,17 @@ name = "Ravenloft Academy" }) "lWm" = ( -/obj/structure/fermenting_barrel/random/beer, -/turf/open/floor/rogue/blocks, -/area/rogue/indoors/shelter/bog) +/obj/structure/fluff/railing/border{ + dir = 1; + pixel_x = -4 + }, +/turf/open/transparent/openspace, +/turf/open/floor/rogue/twig{ + dir = 4 + }, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "lXv" = ( /obj/structure/fluff/walldeco/stone, /turf/closed/wall/mineral/rogue/decowood, @@ -15550,7 +15701,11 @@ /obj/structure/roguewindow/openclose{ dir = 4 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -16187,7 +16342,7 @@ /obj/item/paper, /obj/item/paper, /obj/item/paper, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -16673,6 +16828,13 @@ /obj/machinery/light/rogue/campfire/densefire, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) +"mOd" = ( +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "mOu" = ( /obj/effect/decal/border/ruinedwood{ dir = 8 @@ -17075,8 +17237,8 @@ first_time_text = "The Twilight Woods" }) "nfv" = ( -/obj/structure/flora/grass/jungle{ - icon_state = "grassa2" +/obj/structure/fluff/railing/border{ + dir = 8 }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ @@ -17277,6 +17439,8 @@ /obj/machinery/light/rogue/torchholder/l{ dir = 8 }, +/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame, +/obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/shelter/bog) "nmS" = ( @@ -17661,6 +17825,12 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"nBi" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "nBZ" = ( /obj/structure/chair/wood/rogue{ dir = 8 @@ -17793,6 +17963,16 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) +"nGq" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/fluff/railing/border{ + dir = 8 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "nGA" = ( /obj/structure/bars/passage{ name = "Armory"; @@ -18303,10 +18483,12 @@ /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/exposed/tavern) "nYE" = ( -/obj/effect/landmark/townpatrol, -/turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors/woods{ - first_time_text = "The Twilight Woods" +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "nYV" = ( /obj/structure/flora/newleaf{ @@ -18613,10 +18795,13 @@ name = "Adventurers Guild" }) "orU" = ( -/obj/machinery/light/rogue/wallfire/candle/blue/r, -/obj/structure/fluff/statue/small, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/bath) +/turf/open/transparent/openspace, +/turf/open/floor/rogue/twig{ + dir = 4 + }, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "osH" = ( /turf/open/floor/rogue/cobble, /area/rogue/outdoors/river) @@ -18933,6 +19118,15 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"oGb" = ( +/obj/structure/flora/newbranch/connector{ + dir = 2; + icon_state = "branch-end2" + }, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "oGD" = ( /obj/structure/glowshroom, /turf/open/floor/rogue/grass, @@ -19121,7 +19315,11 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -19285,6 +19483,15 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"oUY" = ( +/obj/structure/flora/wildplant/wild_poppy, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "oVa" = ( /obj/item/natural/rock/gold, /turf/open/floor/rogue/grass, @@ -19682,10 +19889,10 @@ name = "far stonehedge" }) "piY" = ( -/obj/structure/fluff/statue/lewd/random, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/bath{ - first_time_text = "The Dreamers Demesne.." +/turf/open/floor/rogue/naturalstone, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" }) "pjg" = ( /obj/structure/flora/grass/jungle/b, @@ -19725,6 +19932,13 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"plk" = ( +/obj/structure/closet/crate/chest, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "pll" = ( /obj/structure/flora/roguetree/burnt, /turf/open/water/river{ @@ -19802,6 +20016,8 @@ /area/rogue/outdoors/river) "poq" = ( /obj/machinery/light/rogue/torchholder/l, +/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame, +/obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/dirt, /area/rogue/indoors/shelter/bog) "poD" = ( @@ -19811,6 +20027,16 @@ }, /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors/shelter/town) +"poT" = ( +/obj/effect/decal/dirt/grass{ + dir = 4 + }, +/obj/effect/decal/dirt/grass, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "ppv" = ( /turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/warehouse) @@ -20059,6 +20285,13 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"pCx" = ( +/turf/open/floor/rogue/twig{ + dir = 4 + }, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "pCG" = ( /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ @@ -20243,10 +20476,7 @@ name = "Silver Dragon" }) "pIz" = ( -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ - friendlyfactions = null; - friendlyjobs = list("Guildmaster", "Guild Appraiser") - }, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -20312,6 +20542,7 @@ }) "pLo" = ( /obj/machinery/light/rogue/lanternpost, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -20569,7 +20800,8 @@ name = "Shrine of Lune" }) "pTJ" = ( -/obj/structure/chair/stool/rogue, +/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame, +/obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/shelter/bog) "pTS" = ( @@ -20623,7 +20855,7 @@ }) "pWc" = ( /obj/machinery/light/rogue/wallfire/candle/blue/r, -/turf/open/floor/rogue/twig, +/turf/open/floor/rogue/cobblerock, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -20647,7 +20879,7 @@ }) "pWJ" = ( /obj/machinery/light/rogue/torchholder/l, -/turf/open/floor/rogue/twig, +/turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -20882,7 +21114,6 @@ pixel_y = 5 }, /obj/item/candle/skull/lit, -/obj/item/reagent_containers/glass/cup/wooden, /turf/open/floor/rogue/herringbone, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -20892,6 +21123,15 @@ /obj/structure/flora/ausbushes/ywflowers, /turf/open/water/cleanshallow, /area/rogue/outdoors/caves) +"qeU" = ( +/obj/structure/flora/newbranch/connector{ + dir = 1; + icon_state = "branch-end1" + }, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "qfa" = ( /obj/structure/flora/roguegrass/thorn_bush, /turf/open/water/swamp, @@ -20948,6 +21188,12 @@ /obj/structure/flora/roguegrass/bush/wall, /turf/open/transparent/openspace, /area/rogue) +"qgv" = ( +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "qgM" = ( /obj/structure/roguemachine/scomm/l, /turf/open/floor/rogue/blocks, @@ -21040,6 +21286,13 @@ }, /turf/open/water/cleanshallow, /area/rogue/outdoors/caves) +"qkR" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/twig, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "qlk" = ( /obj/structure/bookcase, /obj/item/book/granter/spell/spells5e/eldritchblast5e, @@ -21175,6 +21428,12 @@ }, /turf/open/floor/rogue/greenstone, /area/rogue/indoors/shelter/mountains) +"qpF" = ( +/obj/structure/flora/newbranch/connector, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "qpQ" = ( /obj/effect/landmark/start/adventurerlate, /turf/open/floor/rogue/ruinedwood/spiral, @@ -21261,10 +21520,10 @@ }, /area/rogue/under/cavewet) "qrG" = ( -/turf/open/floor/rogue/twig, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/flora/grass/jungle, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null }) "qrP" = ( /obj/structure/flora/rogueshroom/happyrandom, @@ -21386,6 +21645,16 @@ }, /turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town) +"qwx" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/tavern{ + first_time_text = "The Sylver Dragonne.."; + name = "Silver Dragon" + }) "qwU" = ( /mob/living/carbon/human/species/skeleton/npc/dungeon/ambush, /turf/open/floor/rogue/naturalstone, @@ -21394,6 +21663,13 @@ /mob/living/simple_animal/hostile/rogue/ghost/wraith/wraith2, /turf/open/floor/rogue/cobble/mossy, /area/rogue/under/cavewet/bogcaves) +"qxj" = ( +/obj/effect/landmark/events/haunts, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "qxl" = ( /obj/structure/flora/roguetree/happyrandom{ desc = "An old, beloved tree that even elves could love."; @@ -21492,6 +21768,7 @@ /area/rogue/under/cave) "qAU" = ( /obj/effect/landmark/observer_start, +/obj/effect/landmark/events/haunts, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -21548,6 +21825,16 @@ first_time_text = "Ravenloft Academy"; name = "Ravenloft Academy" }) +"qDH" = ( +/obj/structure/flora/roguegrass, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "qFr" = ( /obj/structure/bed/rogue, /turf/open/floor/rogue/ruinedwood/spiral, @@ -22237,6 +22524,16 @@ "rcU" = ( /obj/structure/roguemachine/scomm/r, /obj/effect/decal/stone/blockedge, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/structure/closet/crate/chest, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -22324,6 +22621,13 @@ /obj/structure/spacevine, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/river) +"rfG" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors/exposed/church{ + first_time_text = "Druids Grove"; + name = "Grove" + }) "rgj" = ( /obj/structure/flora/roguegrass/water/reeds, /obj/structure/closet/crate/coffin, @@ -22411,8 +22715,8 @@ }) "rjd" = ( /obj/structure/rack/rogue/shelf/big, -/obj/item/rope, -/obj/item/rope, +/obj/item/natural/saddle, +/obj/item/natural/saddle, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/shelter/bog) "rjg" = ( @@ -23034,6 +23338,13 @@ /obj/structure/bookcase, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/library) +"rIw" = ( +/turf/closed, +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "rIX" = ( /obj/structure/fermenting_barrel/beer, /obj/structure/fluff/railing/wood{ @@ -23108,9 +23419,7 @@ /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/town/tavern) "rLF" = ( -/obj/machinery/light/rogue/lanternpost{ - dir = 1 - }, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -23186,6 +23495,18 @@ }, /turf/open/floor/rogue/blocks, /area/rogue/outdoors/caves) +"rND" = ( +/obj/structure/roguewindow/openclose, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) "rNK" = ( /obj/structure/flora/grass/jungle, /turf/closed/mineral/rogue/bedrock, @@ -23233,11 +23554,10 @@ /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/bath) "rPU" = ( -/obj/structure/stairs/stone, +/obj/structure/spacevine/dendor, /turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/area/rogue/outdoors/rtfield{ + first_time_text = null }) "rQW" = ( /obj/structure/flora/roguegrass/water, @@ -23596,6 +23916,13 @@ /obj/item/reagent_containers/glass/cup/wooden, /turf/open/floor/carpet/royalblack, /area/rogue/indoors/town/bath) +"sej" = ( +/obj/structure/flora/grass/jungle/b, +/turf/closed/wall/mineral/rogue/decostone/mossy/blue, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "sek" = ( /obj/structure/handcart, /obj/item/rogueweapon/stoneaxe/woodcut, @@ -23738,7 +24065,11 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -24093,7 +24424,7 @@ first_time_text = "The Twilight Woods" }) "sBl" = ( -/obj/structure/closet/crate/chest, +/obj/structure/chair/bench/couchablack/r, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -24110,6 +24441,15 @@ /obj/structure/flora/roguegrass, /turf/open/floor/rogue/dirt, /area/rogue/under/cave) +"sBS" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa2" + }, +/obj/machinery/light/rogue/lanternpost, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "sCi" = ( /obj/item/book/granter/spell/spells5e/primalsavagery5e, /obj/item/book/granter/spell/spells5e/poisonspray5e, @@ -24131,10 +24471,11 @@ first_time_text = "The Twilight Woods" }) "sCW" = ( -/obj/effect/landmark/townpatrol, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/woods{ - first_time_text = "The Twilight Woods" +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" }) "sDr" = ( /turf/closed/mineral/rogue/bedrock, @@ -24197,6 +24538,16 @@ }, /turf/open/floor/carpet/purple, /area/rogue/indoors/town/bath) +"sFf" = ( +/obj/effect/wisp, +/obj/structure/flora/grass/jungle{ + icon_state = "grassa1" + }, +/turf/open/transparent/glass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "sFI" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -24495,8 +24846,10 @@ first_time_text = "The Twilight Woods" }) "sPq" = ( -/obj/machinery/light/rogue/wallfire/candle/blue/l, -/turf/open/floor/rogue/twig, +/obj/structure/fluff/railing/border{ + dir = 4 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -24663,13 +25016,6 @@ }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) -"sXG" = ( -/obj/effect/landmark/start/jester, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/tavern{ - first_time_text = "The Sylver Dragonne.."; - name = "Silver Dragon" - }) "sYg" = ( /obj/structure/closet/crate/roguecloset/dark, /obj/item/clothing/under/roguetown/tights/stockings/purple, @@ -24885,6 +25231,9 @@ first_time_text = "Druids Grove"; name = "Grove" }) +"tfK" = ( +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/under/cavewet) "tfW" = ( /obj/effect/wisp, /obj/structure/flora/ausbushes/lavendergrass, @@ -24926,10 +25275,11 @@ name = "Ravenloft Academy" }) "thD" = ( -/obj/structure/stairs/stone, -/turf/open/floor/rogue/blocks/green, -/area/rogue/outdoors/woods{ - first_time_text = "The Twilight Woods" +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" }) "thL" = ( /obj/item/clothing/mask/cigarette/pipe/westman, @@ -24995,7 +25345,7 @@ }) "tiz" = ( /obj/structure/table/church{ - dir = 1 + icon_state = "churchtable_end" }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/exposed/church{ @@ -26074,6 +26424,15 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) +"ubr" = ( +/obj/structure/flora/newbranch/connector{ + dir = 1; + icon_state = "branch-end2" + }, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "ubt" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/outdoors/rtfield{ @@ -26417,8 +26776,11 @@ name = "far stonehedge" }) "unr" = ( -/obj/structure/flora/roguegrass, +/obj/structure/chair/bench{ + dir = 1 + }, /turf/open/floor/rogue/cobblerock, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -26520,6 +26882,12 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"usY" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "utn" = ( /obj/structure/rack/rogue, /obj/item/clothing/suit/roguetown/shirt/shortshirt, @@ -27379,8 +27747,8 @@ /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/caves) "uYX" = ( -/obj/structure/fluff/statue/tdummy, -/turf/open/floor/rogue/dirt, +/turf/open/floor/rogue/cobblerock, +/turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -27389,6 +27757,16 @@ /obj/structure/flora/newtree, /turf/closed/wall/shroud, /area/rogue) +"uZr" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/exposed/church{ + first_time_text = "Druids Grove"; + name = "Grove" + }) "uZx" = ( /obj/effect/decal/dirt/grass{ dir = 4 @@ -27514,6 +27892,9 @@ }) "vdK" = ( /obj/structure/flora/grass/jungle, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -27869,6 +28250,14 @@ icon_state = "rockwd" }, /area/rogue/outdoors/river) +"vwj" = ( +/obj/structure/flora/roguegrass, +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "vwm" = ( /obj/item/natural/stone, /turf/open/floor/rogue/dirt, @@ -27923,7 +28312,7 @@ /obj/item/paper/scroll, /obj/item/paper/scroll, /obj/item/natural/feather, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -28406,6 +28795,14 @@ /obj/item/restraints/legcuffs/beartrap/armed, /turf/open/transparent/openspace, /area/rogue/outdoors/river) +"vTF" = ( +/obj/structure/chair/bench{ + dir = 4 + }, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "vTP" = ( /obj/structure/mineral_door/wood/fancywood, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -28849,6 +29246,10 @@ /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/shelter/bog) +"wpF" = ( +/turf/open/water/cleanshallow, +/turf/closed/mineral/random/rogue, +/area/rogue/outdoors/river) "wqn" = ( /obj/machinery/light/rogue/torchholder, /turf/closed/wall/mineral/rogue/wooddark, @@ -29037,6 +29438,10 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"wxV" = ( +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/blocks, +/area/rogue) "wyc" = ( /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/outdoors/rtfield{ @@ -29428,11 +29833,10 @@ /turf/open/floor/rogue/dirt, /area/rogue/outdoors/caves) "wOd" = ( -/obj/structure/fluff/littlebanners/bluewhite, -/turf/open/floor/rogue/cobble, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/fluff/statue/tdummy2, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null }) "wOm" = ( /turf/closed/wall/mineral/rogue/decowood{ @@ -29801,12 +30205,12 @@ first_time_text = "The Twilight Woods" }) "xfT" = ( -/obj/structure/closet/crate/chest/dungeon/mimic, -/obj/item/bodypart/r_leg/rprosthetic/clock, -/obj/item/bodypart/l_arm/rprosthetic/clock, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/obj/structure/flora/grass/jungle/b, +/turf/open/transparent/glass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xgm" = ( /obj/machinery/light/rogue/firebowl, /turf/open/floor/rogue/dirt, @@ -30232,6 +30636,19 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"xxq" = ( +/obj/structure/fluff/railing/border{ + dir = 4 + }, +/obj/structure/fluff/railing/wood{ + dir = 4 + }, +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/shroud, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "xxw" = ( /obj/structure/chair/wood/rogue/chair3{ dir = 8 @@ -30584,10 +31001,7 @@ }) "xKH" = ( /obj/machinery/light/rogue/wallfire/candle/blue, -/mob/living/carbon/human/species/human/smartnpc/townguard/sentry{ - friendlyfactions = null; - friendlyjobs = list("Guildmaster", "Guild Appraiser") - }, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -51797,10 +52211,10 @@ qMz qMz qMz gTO -qMz -qMz -gTO -qMz +nhM +nhM +nhM +nhM qMz qMz qMz @@ -52000,8 +52414,8 @@ nhM nhM nhM nhM -nhM -nhM +tfK +tfK nhM nhM nhM @@ -52201,10 +52615,10 @@ gTO nhM nhM nhM -nhM -nhM -nhM -nhM +tfK +juB +juB +tfK nhM nhM nhM @@ -52404,8 +52818,8 @@ nhM nhM rTO rTO -rTO -rTO +tTg +tTg rTO rTO rTO @@ -52609,7 +53023,7 @@ xAd eFh vFo bhN -vFo +hta rTO nhM nhM @@ -52807,11 +53221,11 @@ gTO nhM nhM rTO -auK vFo vFo vFo -xfT +vFo +auK rTO nhM nhM @@ -53009,7 +53423,7 @@ gTO nhM nhM rTO -dzN +vFo vFo vFo rTO @@ -53616,7 +54030,7 @@ nhM nhM rTO diM -auK +vFo sVs tTg vdm @@ -76857,7 +77271,7 @@ tMj pCG xwM hxE -pCG +gHR ptG rxm lyF @@ -77059,7 +77473,7 @@ tMj pCG ptG pCG -pCG +gHR ptG rxm rxm @@ -83522,7 +83936,7 @@ bFf bFf vxU orJ -qgp +aKv qeA eAD vxU @@ -83723,7 +84137,7 @@ lzV rPi rPi vxU -qgp +wHV qgp qgp qgp @@ -83925,7 +84339,7 @@ xDh prw rPi vxU -qgp +cNu cNu cNu dHL @@ -84110,7 +84524,7 @@ rPi sZB sZB sZB -kan +cVO kan sZB nVt @@ -84127,9 +84541,9 @@ xDh xDh prw vxU -wHV -cNu -mAH +plk +qgp +qgp qgp vxU rPi @@ -84315,9 +84729,9 @@ bOt kan mks sZB -nVt -nVt -nVt +lyF +lyF +lyF nVt nVt nVt @@ -84331,7 +84745,7 @@ xDh vxU vxU uxq -eAD +mAH qgp vxU rPi @@ -84533,7 +84947,7 @@ xDh xDh lzV vxU -qgp +eAD qgp vxU rPi @@ -84708,19 +85122,19 @@ nVt xDh rPi nmp -sPq -qrG -qrG -qrG +fWg +gIK +cVO +kan nmp sZB sZB -fWg +dzN kan fWg kan -oum -oum +fWY +fWY sZB sZB nVt @@ -84734,7 +85148,7 @@ prw xDh xDh xDh -gkJ +rIw qgp qgp vxU @@ -84910,11 +85324,11 @@ prw xDh oSM hio -dqW kan kan kan -sPq +cVO +fWg nmp fWg kan @@ -84933,10 +85347,10 @@ nVt rxm rxm rPi +wpF xDh xDh -xDh -gkJ +rIw qgp qgp vxU @@ -85112,11 +85526,11 @@ xhl xDh xDh hio -dqW +kan kan bFR +nmp kan -qrG ayP kan ktL @@ -85330,7 +85744,7 @@ kan lLf sZB nVt -nVt +lyF nVt nVt rxm @@ -85516,14 +85930,14 @@ xDh xDh xcU nmp -pWc -qrG -qrG -qrG +wUB +cVO +gIK +kan nmp sZB sZB -jLy +gGI wUB kan kan @@ -85532,7 +85946,7 @@ oum sZB sZB cgq -nVt +lyF nVt nVt rxm @@ -86150,7 +86564,7 @@ riK vxU iac qgp -etP +qgp vxU rps rps @@ -86339,7 +86753,7 @@ vKW xjT hhP iDC -nVt +lyF rxm iCo xQN @@ -86528,7 +86942,7 @@ kqH kqH rPi rPi -rPi +prw sZB xWw bRi @@ -86541,7 +86955,7 @@ vKW vKW vKW sZB -nVt +lyF rxm uxq qFr @@ -86553,7 +86967,7 @@ dYB dYB pRH qgp -qgp +etP vxU vxU prw @@ -86730,7 +87144,7 @@ cgq nVt nVt nVt -nVt +lyF sZB iDC dvC @@ -86932,7 +87346,7 @@ xVg nVt nVt nVt -nVt +lyF sZB iDC eHD @@ -87134,7 +87548,7 @@ nVt nVt nVt nVt -nVt +lyF sZB iDC jja @@ -87536,7 +87950,7 @@ nVt nVt nVt nVt -nVt +lyF nVt nVt sZB @@ -87738,8 +88152,8 @@ xVg xVg xVg cgq -nVt -nVt +lyF +lyF nVt sZB eHD @@ -87940,9 +88354,9 @@ xVg nVt nVt nVt -cgq -nVt -nVt +lyF +lyF +lyF sZB kwu fFQ @@ -88143,8 +88557,8 @@ cgq cgq cgq nVt -cgq -nVt +lyF +lyF sZB pEK eHD @@ -88346,7 +88760,7 @@ xVg cgq nVt cgq -nVt +lyF sZB sZB eHD @@ -88365,7 +88779,7 @@ qrm pjI hAi mgS -lCr +qgp qgp qgp gfu @@ -88519,7 +88933,7 @@ hoU odP uzp uzp -uWO +lCr evw cgq lzV @@ -88718,9 +89132,9 @@ gec evw evw kcf -orU +iOZ odP -kMT +ixO eZV evw cgq @@ -98234,7 +98648,7 @@ bkK jlY bkK sVM -kHI +tym fVN bwF bwF @@ -105864,7 +106278,7 @@ tNE gIm pfu kHM -rSD +euV boH jEU jEU @@ -106066,8 +106480,8 @@ eHG tyj tyj kCg -nsy -rSD +bUT +euV eMs kUS uKj @@ -106885,11 +107299,11 @@ oIl rSD rSD euV -ccM -iYe -mmt +iJR +euV +uZr mmt -rSD +euV rSD rxu xbZ @@ -107086,12 +107500,12 @@ qQt mRd rSD iJR -iJR -iJR ccM +ccM +iJR rSD -rSD -rSD +euV +euV rSD rSD rxu @@ -107140,7 +107554,7 @@ lqr eJD oZS ilr -nYE +ilr ilr ilr ilr @@ -107200,7 +107614,7 @@ eHG eHG ilr eHG -nYE +ilr eHG miB miB @@ -107288,11 +107702,11 @@ qed tiz rSD iJR -tqS +apN tqS ccM ccM -iJR +ccM iJR rSD rSD @@ -108699,8 +109113,8 @@ gvT wIc aFY aFY -ujl -ilr +rfG +jnA kCg pfu mrF @@ -108902,7 +109316,7 @@ gvT gvT pfu kCg -jCm +jFL bUL pfu pfu @@ -109105,7 +109519,7 @@ mrF mrF pfu kCg -jCm +jFL ilr eeB eHG @@ -109566,7 +109980,7 @@ cpy ilr eHG ilr -cpy +mVp oZS fmt eyG @@ -109616,7 +110030,7 @@ miB hmK nEo fmt -nYE +ilr eHG miB oZS @@ -116035,14 +116449,14 @@ mYC aUw hSA npG -npG aUw npG npG +aUw fXQ fXQ fXQ -npG +aUw npG npG ddS @@ -116241,7 +116655,7 @@ viE viE viE viE -dfT +viE vZW xBi viE @@ -116279,7 +116693,7 @@ ilr ilr ilr ilr -nYE +ilr ilr ilr ilr @@ -116474,7 +116888,7 @@ ilr ilr ilr ilr -eCw +oZZ ilr ilr ilr @@ -117652,7 +118066,7 @@ gTl vmN lIe jdO -beK +rLF beK beK mJe @@ -117854,8 +118268,8 @@ tSN tHV tLk qMs -beK -beK +rLF +rLF beK mJe ucZ @@ -119248,7 +119662,7 @@ gdU kan kan kan -sfZ +sej oTG eHD wsc @@ -119269,7 +119683,7 @@ qJZ qMs tLk vIa -beK +rLF beK mMK kXp @@ -119471,8 +119885,8 @@ vmN ueO qJZ beK -beK -beK +rLF +rLF mMK kXp kXp @@ -119647,7 +120061,7 @@ xDh xDh pgm dNW -jLy +bmK sfZ kan kan @@ -119666,15 +120080,15 @@ xis tax wsc jLy -emy -sfZ -ycO +cVO +hVW +nFS qJZ vmN qJZ beK beK -beK +rLF mJe gZE kXp @@ -119851,29 +120265,29 @@ xDh ePi kan kan -wgl kan +wgl xis nWJ mpx mpx xAN xis -kan -kan -kan +sPq +sPq +vcN kan pJt kan cal kan -kan +cVO wsc kvz -tac -tac -ycO -ycO +xfx +xfx +nFS +nFS beK beK vIa @@ -120053,30 +120467,30 @@ xDh ePi kan kan -xUU kan +xUU xis eHD eWu kvk mpx xis +mfc bFR kan kan kan kan -kan mMv kan sfZ guW wsc -voH -tac -ycO -ycO +eJl +nYE nFS +beK +beK qAU beK mJe @@ -120255,30 +120669,30 @@ uNM ePi kan kan -ksK kan +ksK xis xAN eHD mpx eHD xis -sfZ -kan -kan +nGq +nfv +lXw kan eLJ kan tax -kan +cVO kan wsc kvz -ycO -ycO -ycO -ycO nFS +nFS +nFS +nFS +beK beK beK mJe @@ -120455,7 +120869,7 @@ xDh xDh pgm obn -jLy +bmK kan kan kan @@ -120474,9 +120888,9 @@ xis cal icP jLy -hVW -kan -ycO +sfZ +emy +nFS qJZ qJZ qJZ @@ -120864,7 +121278,7 @@ alQ kan kan kan -kan +wsc oTG eOW wsc @@ -121086,18 +121500,18 @@ tHV tHV qMs qJZ -beK +rLF beK beK haD uCN hiA -sBl +tno dYB qKQ dYB dYB -tno +dYB hiA hHR jdj @@ -121288,13 +121702,13 @@ qJZ tHV tHV qJZ -beK -beK +rLF +rLF beK mJe uCN nWu -qFr +geQ dYB hiA hiA @@ -121698,7 +122112,7 @@ nFS mJe ucZ hiA -qFr +dfJ dYB hiA tiA @@ -122130,7 +122544,7 @@ dFG eHG mVp oZS -nYE +ilr eyG fmt mVp @@ -122304,11 +122718,11 @@ beK vdK aoF uXz -elJ +dkn elJ pMv -eTV -tHt +vTF +okm ucZ wSv sPl @@ -122488,7 +122902,7 @@ xDh xDh xDh tNb -tNb +lwK lwK lwK sPi @@ -122503,13 +122917,13 @@ qJZ beK fDe beK -rLF -aeO +dpz +eTV avu +pMv +pMv elJ -laG -elJ -avu +qgv pVI vQz nfU @@ -122705,15 +123119,15 @@ qJZ beK beK beK -dpz +uYX elJ gZN -elJ -elJ -elJ pMv -elJ -ucZ +qrG +pYW +pMv +kEw +tHt gsy uCN fbr @@ -122909,13 +123323,13 @@ beK vIa beK avu -elJ -elJ -avu +pMv +pMv +cGr elJ pMv pMv -idV +oUY ucZ ucZ fbr @@ -123112,13 +123526,13 @@ beK beK elJ elJ +dGW elJ +pMv elJ -elJ -laG avu -okm ucZ +nfU uCN prw fbr @@ -123311,16 +123725,16 @@ qJZ nFS beK beK -beK -elJ +vIa pMv +pYW pMv -elJ -elJ -elJ -eJl -dok -wSv +qxj +aeO +pMv +kXp +sBS +vQz wSv prw fbr @@ -123513,17 +123927,17 @@ qJZ vIa beK beK -xDM +beK elJ avu pMv elJ elJ -unr +elJ unr xKV -tNZ -vQz +wSv +ucZ prw fbr fbr @@ -123715,8 +124129,8 @@ qMs beK beK beK -xhh -npg +xDM +dok elJ elJ pMv @@ -123917,15 +124331,15 @@ qJZ beK beK nFS -gGI +xhh xKV laG -avu -laG -jql +kXp +kXp +wOd xKV -jFL -ucZ +xKV +nfU myd idV prw @@ -124313,13 +124727,13 @@ vmN vmN vmN qMs -qJZ +tHV vmN lIe qJZ tLk beK -beK +rLF vIa tLk ucZ @@ -124327,9 +124741,9 @@ ucZ ucZ wSv ucZ -ucZ -uCN gBA +uCN +ucZ wSv wSv fbr @@ -124521,8 +124935,8 @@ qJZ qJZ qJZ beK -beK -beK +rLF +rLF qJZ uCN uCN @@ -124719,7 +125133,7 @@ qJZ qJZ qJZ vmN -qJZ +tHV qJZ qJZ vIa @@ -124933,7 +125347,7 @@ tNZ myd ucZ okm -ucZ +nfU xKV ucZ ucZ @@ -125136,7 +125550,7 @@ nfU wSv ucZ ucZ -dfJ +ucZ uCN wSv uCN @@ -125281,7 +125695,7 @@ nXV lss nXV jsd -piY +jsd jsd nXV jsd @@ -125788,7 +126202,7 @@ eyG dpg rMN tyj -sDr +tyj oCe oCe oCe @@ -125989,8 +126403,8 @@ xbF ksN ilr xkJ +jJS tyj -sDr oCe oCe oCe @@ -126136,7 +126550,7 @@ tHV tHV vmN qJZ -nFS +xfx beK beK tLk @@ -126172,7 +126586,7 @@ ilr mVp ilr eHG -fEi +ilr nEo miB eyG @@ -126191,9 +126605,9 @@ xhU xhU ilr dBp +xhU tyj -tyj -oCe +fxW oCe oCe wjU @@ -126338,7 +126752,7 @@ vmN ruP qJZ qMs -beK +rLF beK beK ijB @@ -126393,9 +126807,9 @@ jJS jJS jJS xhU -tyj -ilr -oCe +xhU +xEY +fxW oCe oCe wjU @@ -126541,7 +126955,7 @@ qJZ qJZ tLk beK -beK +rLF beK tEM pwz @@ -126576,7 +126990,7 @@ xhU jJS eHG ilr -jcj +pBr eHG xhU xhU @@ -126586,7 +127000,7 @@ xhU xbF xhU eKC -xAs +pBr kFO xbF eMO @@ -126596,7 +127010,7 @@ jJS irm xhU jJS -xEY +pBr fxW oCe oCe @@ -126705,7 +127119,7 @@ fqz fqz fqz fqz -fqz +nBi vil foY vVw @@ -126950,7 +127364,7 @@ nFS qMs ghL npg -dfJ +ucZ wSv ghL tNZ @@ -127182,7 +127596,7 @@ xbF jJS eHG eHG -jcj +pBr eHG xhU hzP @@ -127192,7 +127606,7 @@ xAs xhU oIk xbF -xbF +pBr xbF kFO qUZ @@ -127202,7 +127616,7 @@ vAI xhU jJS gXN -tyj +pBr oCe hcX xWI @@ -127546,7 +127960,7 @@ tac nFT lvM ycO -ijB +kOv pTW qJZ qJZ @@ -127947,7 +128361,7 @@ nze ufX voH ijB -slN +vwj ycO nWn qMs @@ -128158,7 +128572,7 @@ vIa beK beK beK -beK +rLF qJZ uCN uCN @@ -128336,14 +128750,14 @@ sPO yls sPO qnW -sPO +wLq sLh oea oea gTl qJZ jdO -qJZ +tNG qMs nFS beK @@ -128352,7 +128766,7 @@ vIa beK beK nFS -vIa +jwv vIa beK beK @@ -128360,7 +128774,7 @@ beK beK beK fDe -nFS +xfx qJZ ucZ wSv @@ -128519,7 +128933,7 @@ tNb bjQ bjQ wLq -sPO +qnW hGY xBY dTA @@ -128543,9 +128957,8 @@ oea oea oea nFS -beK -nFS -beK +rLF +xfx beK beK beK @@ -128554,8 +128967,9 @@ beK beK beK beK -nFS beK +xfx +rLF beK ahG beK @@ -128594,7 +129008,7 @@ kFO xhU rfe xhU -sCW +eHG ilr jJS jJS @@ -128722,7 +129136,7 @@ tNb sPO sPO sPO -xBY +rZO xBY xBY sPO @@ -128736,7 +129150,7 @@ wDQ gix iGj sPO -qnW +kLn yls edm sPO @@ -128746,7 +129160,7 @@ oea oea dff beK -ahG +kMT beK beK beK @@ -128940,20 +129354,20 @@ utx syG sPO nPY -yls +edm uxu ccn oea oea -dxy +thD beK nFS beK beK vIa beK -nFS -vIa +xfx +jwv qJZ qJZ qJZ @@ -129131,7 +129545,7 @@ xBY dTA sPO pLo -sPO +qnW wLq sPO rvE @@ -129142,8 +129556,8 @@ sPO sPO pFL uxu -uxu -uxu +nPY +nPY pIz pwR oea @@ -129155,7 +129569,7 @@ beK tEM qJZ qJZ -qJZ +tHV qMs wmH nSI @@ -129325,7 +129739,7 @@ sWi wPv tNb sPO -sPO +wLq sPO qnW xBY @@ -129333,7 +129747,7 @@ xBY hGY dTA xBY -xBY +rZO xBY xBY hGY @@ -129345,7 +129759,7 @@ dTA hGY xBY xBY -xBY +rZO xBY cER xBY @@ -129354,11 +129768,11 @@ beK beK beK beK -qJZ +jdO qJZ pkF qJZ -vmN +cUn uAy tNG qJZ @@ -129494,7 +129908,7 @@ oCe sPO sPO sPO -sPO +wLq sPO sPO aSX @@ -129532,7 +129946,7 @@ nnZ qCV fhZ xBY -xBY +usY xBY xBY drI @@ -129731,7 +130145,7 @@ aBk bjQ sPO cMN -fqz +dKA ixt vYY xBY @@ -129934,7 +130348,7 @@ bjQ hif fqz aJC -yls +edm qoW jCl xBY @@ -129943,9 +130357,9 @@ xBY eYD jCl mvU -xBY -xpk -sPO +rZO +poT +wLq sPO sPO uxu @@ -129958,7 +130372,7 @@ oea pwR nFS rLF -nFS +xfx beK nFS ycO @@ -130124,7 +130538,7 @@ tNb kqH sWi tNb -tNb +lwK tNb tNb gdc @@ -130146,7 +130560,7 @@ xuW mNc khc xpk -sPO +qnW sPO fQv sPO @@ -130160,7 +130574,7 @@ oea oea cns nFS -nFS +xfx nFS ycO ycO @@ -130361,7 +130775,7 @@ oea oea oea umo -vmN +qDH cns pTW nFS @@ -130380,7 +130794,7 @@ qJZ qMs qMs uCN -ucZ +rPU xVJ xVJ dqQ @@ -130583,7 +130997,7 @@ qMs gTl ucZ xKV -ucZ +rPU wyc wyc xVJ @@ -131184,7 +131598,7 @@ kbK ycO ycO ycO -kfa +ycO ycO ycO xKV @@ -131334,7 +131748,7 @@ sWi sWi bjQ sWi -tNb +lwK sWi oRP tNb @@ -131381,8 +131795,8 @@ gfM gfM tHV qMs -qJZ -qJZ +tNG +tNG tHV tEM qJZ @@ -131581,7 +131995,7 @@ daX daX daX daX -qJZ +tNG tHV qJZ gTl @@ -131791,11 +132205,11 @@ qMs qJZ qMs qMs +tNG qJZ -qJZ -ucZ -ucZ ucZ +rPU +rPU wyc wyc ubt @@ -131850,7 +132264,7 @@ eyG fMm fMm hcX -iRs +xWI iRs iRs iRs @@ -131994,7 +132408,7 @@ ubt ubt ubt ubt -ucZ +rPU ucZ wyc wyc @@ -132053,7 +132467,7 @@ tyj tyj hcX dVE -bRj +brD iRs bRj hcX @@ -153994,9 +154408,9 @@ kan kan sfZ rsg -rsg -sfZ -sfZ +gIe +kan +kan kan urx icP @@ -154195,11 +154609,11 @@ fTn kan kan sfZ -geQ -ovd -ovd +wsc ovd -sfZ +xfT +xfT +kan sfZ kan mha @@ -154398,7 +154812,7 @@ kan kan iYC ovd -eNl +sFf cys iYC iCK @@ -154810,10 +155224,10 @@ dAL wZi wZi sfZ -emy -qgd kan +qgd kan +emy kan kvz mfc @@ -155003,7 +155417,7 @@ nPy uCw pTD kan -sfZ +kan kan kan adc @@ -155012,10 +155426,10 @@ kan kan kan kan -brD -kan dAL kan +dAL +emy kan tVj kHg @@ -155206,18 +155620,18 @@ dbt lXw kan kan -sfZ -nfv +kan +kan ghn kan dAL xlt xlt kan -wOd +rsg dAL rsg -sfZ +hVW rsg kvz mfc @@ -155406,7 +155820,7 @@ ghn nTI wKz mLt -apN +pOo lxn ovd eNl @@ -155609,9 +156023,9 @@ kan kan kan ghn -ovd +xfT cys -ovd +xfT ghn iCK adc @@ -155811,10 +156225,10 @@ fTn kan kan kan -sfZ -ovd -ovd +wsc +xfT ovd +xfT sfZ kan kan @@ -156977,7 +157391,7 @@ rfD edm uxu uxu -nPY +mOd dKA fqz fqz @@ -159623,7 +160037,7 @@ fSQ tRu tJb tJb -sXG +tJb tJb fcI rlX @@ -159821,7 +160235,7 @@ enU tJb tJb tJb -dmS +qwx tJb tJb tJb @@ -161748,13 +162162,13 @@ sib sib uYJ onM -lIq +fMr xnj fMr fMr fMr -cTY fMr +cTY hKD rxm rxm @@ -162034,7 +162448,7 @@ fqz fqz fqz fqz -qnW +sCW nnZ xBY sPO @@ -162152,7 +162566,7 @@ sib sib hKD eQy -qmG +eCw qmG vEo wSW @@ -162959,9 +163373,9 @@ sib sib sib xkX -lWm -buH -hZj +wSW +eOe +gXv qcD rYi wSW @@ -163167,8 +163581,8 @@ gvl qcD rYi wSW -gKA wSW +gKA hcX rxm rxm @@ -163369,8 +163783,8 @@ wSW hZj qcD rYi -jCj gKA +jCj hcX rxm rxm @@ -163571,8 +163985,8 @@ wSW gvl kax rYi -jCj gKA +jCj hcX rxm rxm @@ -163759,7 +164173,7 @@ sib frc frc dXq -dXq +iiF sib fxW fxW @@ -163773,8 +164187,8 @@ hZj qcD rYi wSW -gKA wSW +eRD hcX rxm rxm @@ -163961,8 +164375,8 @@ frc iiF iiF sib -dXq -dXq +iiF +iiF fxW fxW fxW @@ -163970,8 +164384,8 @@ fxW fxW xkX flh -juB -gvl +wSW +iQi qcD rYi wSW @@ -164163,9 +164577,9 @@ iiF sib sib sib -dXq -dXq -fxW +iiF +iiF +iiF fxW fxW hcX @@ -164365,8 +164779,8 @@ iiF iiF dXq dXq -dXq -fxW +iiF +iiF uZq fxW hcX @@ -164568,7 +164982,7 @@ hcX hcX hcX hcX -hcX +xkX hcX hcX hcX @@ -164763,7 +165177,7 @@ trE dnh vAz vAz -vAz +xxq dqe hcX hcX @@ -165164,7 +165578,7 @@ cPm eKV toK gEU -wSd +qkR wSd wSd wSd @@ -165370,7 +165784,7 @@ wSd wSd ijB haJ -hcX +hKD jZg poq hcX @@ -165569,10 +165983,10 @@ cPm gEU uCO wSd -ijB +rzN pAs ijB -hcX +xkX rjd ljH hcX @@ -165757,24 +166171,24 @@ qYZ toK toK toK -toK +dfT lMW aZy lMW lMW aZy toK -toK +dfT toK toK toK gEU snY cSc +qJZ ijB -rzN beK -hcX +hKD rjd oPy oPy @@ -165969,13 +166383,13 @@ eKV toK toK toK -toK +dfT gEU kPv kPv -beK ijB beK +beK oCM oPy oPy @@ -166158,7 +166572,7 @@ sHv sHv kEU toK -toK +dfT toK eKV eKV @@ -166366,21 +166780,21 @@ toK toK toK toK +dfT toK toK -toK -toK +dfT toK toK dnh lxG uCO -wSd ijB -qJZ beK -rPU -hcX +beK +beK +qJZ +hKD gja oPy oPy @@ -166565,7 +166979,7 @@ jKa dxr toK toK -toK +dfT toK toK qYZ @@ -166576,12 +166990,12 @@ vAz vAz lxG wSd -wSd ijB beK -ijB beK -jwv +beK +qJZ +ijB hcX mBE pTJ @@ -166775,16 +167189,16 @@ vAz lxG uCO wSd +ijB wSd -wSd -wSd -wSd +ijB +beK +beK beK -qJZ ijB umo qMs -hcX +hKD hcX hcX hcX @@ -166966,23 +167380,23 @@ qYZ qYZ cSc wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd +beK +beK +beK +ijB +beK +ijB +beK +kHI +nSI +kHI ijB +beK +beK +beK +beK uYX -qJZ +qMs dOZ qMs bJv @@ -166999,7 +167413,7 @@ oCe oCe oCe bmw -cEY +wxV tyU tyU cEY @@ -167168,19 +167582,19 @@ qYZ qYZ qYZ qYZ -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -hBs -qMs +tNG +ijB +beK +ijB +ijB +beK +beK +beK +beK +beK +beK +ijB +qJZ ity hBs qMs @@ -167372,17 +167786,17 @@ qYZ qYZ umo ity -qJZ -qJZ -qJZ -qJZ +ijB +beK +ijB +ijB eVj nSI -qJZ +tNG lZh qJZ qJZ -qJZ +qMs umo qYZ qYZ @@ -167575,14 +167989,14 @@ qYZ qMs umo nSI -qJZ +tNG umo qYZ lhD lhD qMs -qJZ -ifo +tNG +jJw pAs umo qYZ @@ -181288,7 +181702,7 @@ taL lbr vLX vLX -vLX +lZI vLX vLX taL @@ -182090,7 +182504,7 @@ aZy sib egl lbr -vLX +rND uij vBX vBX @@ -182102,7 +182516,7 @@ aXd vBX vBX ePk -vLX +aEn lbr egl egl @@ -183767,8 +184181,8 @@ oVq oVq oVq oVq -sDr -sDr +tyj +tyj sDr sDr sDr @@ -183970,7 +184384,7 @@ oVq oVq oVq oVq -sDr +tyj sDr sDr sDr @@ -184172,7 +184586,7 @@ oVq oVq oVq oVq -sDr +tyj sDr sDr sDr @@ -184779,6 +185193,7 @@ oVq oVq oVq oVq +tyj sDr sDr sDr @@ -184791,8 +185206,7 @@ sDr sDr sDr sDr -sDr -sDr +tyj oVq oVq sib @@ -184981,6 +185395,7 @@ oVq oVq oVq oVq +tyj sDr sDr sDr @@ -184992,9 +185407,8 @@ sDr sDr sDr sDr -sDr -sDr -sDr +tyj +tyj oVq oVq sib @@ -185590,8 +186004,8 @@ oVq oVq oVq oVq -sDr -sDr +tyj +tyj sDr sDr sDr @@ -185793,9 +186207,9 @@ oVq oVq oVq oVq -sDr -sDr -sDr +tyj +tyj +tyj sDr oVq oVq @@ -185996,9 +186410,9 @@ oVq oVq oVq oVq -oVq -oVq -oVq +lWm +orU +lIq oVq oVq oVq @@ -186197,10 +186611,10 @@ oVq oVq oVq oVq -oVq -oVq -oVq -oVq +ubr +lWm +orU +lIq oVq oVq oVq @@ -186400,11 +186814,11 @@ oVq oVq oVq oVq -oVq -oVq -oVq -oVq -oVq +lWm +orU +lIq +qpF +oGb oVq oVq oVq @@ -186602,9 +187016,9 @@ oVq oVq oVq oVq -oVq -oVq -oVq +lWm +orU +lIq oVq oVq oVq @@ -186804,9 +187218,9 @@ oVq oVq oVq oVq -oVq -oVq -oVq +lWm +orU +lIq oVq oVq oVq @@ -187004,11 +187418,11 @@ oVq oVq oVq oVq -oVq -oVq -oVq -oVq -oVq +qeU +gKW +lWm +orU +lIq oVq oVq oVq @@ -187208,9 +187622,9 @@ oVq oVq oVq oVq -oVq -oVq -oVq +lWm +orU +lIq eHG oVq oVq @@ -187218,10 +187632,10 @@ oVq oVq oVq oVq -sDr -oCe -oCe -oCe +tyj +fxW +fxW +fxW oCe oCe oCe @@ -187410,17 +187824,17 @@ oVq oVq oVq oVq -oVq +lWm +pCx +huN lKC eHG lKC +lKC tyj sDr -sDr -sDr -sDr oVq -sDr +tyj oCe oCe oCe @@ -187615,13 +188029,13 @@ lKC lKC eHG eHG -bxE +lKC +eHG +lKC tyj sDr -sDr -sDr -sDr -sDr +tyj +tyj sDr oCe oCe @@ -187814,13 +188228,13 @@ eHG eHG lKC lKC +piY +lKC +eHG lKC lKC tyj -bxE -sDr -sDr -sDr +tyj sDr sDr sDr @@ -188015,12 +188429,12 @@ lKC eHG lKC lKC +eHG +lKC lKC lKC lKC tyj -bxE -sDr sDr sDr sDr @@ -188416,8 +188830,8 @@ oVq lKC lKC lKC -lKC -lKC +eHG +eHG bxE bxE bxE @@ -189222,7 +189636,7 @@ oVq oVq lKC lKC -lKC +eHG bxE bxE sDr @@ -189423,8 +189837,8 @@ oVq oVq oVq lKC -bxE -bxE +lKC +lKC bxE bxE sDr @@ -189625,7 +190039,7 @@ oVq oVq oVq lKC -bxE +eHG bxE sDr sDr @@ -189827,7 +190241,7 @@ oVq oVq oVq oVq -bxE +lKC bxE sDr sDr @@ -190029,7 +190443,7 @@ oVq oVq oVq lKC -tyj +lKC bxE sDr sDr @@ -190231,7 +190645,7 @@ oVq oVq oVq lKC -tyj +eHG bxE sDr sDr @@ -190433,8 +190847,8 @@ oVq oVq oVq oVq -tyj -bxE +lKC +eHG sDr sDr sDr @@ -190635,8 +191049,8 @@ oVq oVq oVq oVq -bxE -bxE +lKC +lKC sDr sDr sDr @@ -191240,7 +191654,7 @@ oVq oVq oVq lKC -lKC +eHG qUP tyj bxE @@ -191645,7 +192059,7 @@ oVq oVq lKC lKC -lKC +eHG lKC bxE sDr @@ -191847,7 +192261,7 @@ oVq oVq lKC lKC -lKC +eHG bxE bxE sDr @@ -192048,7 +192462,7 @@ oVq oVq oVq oVq -qUP +eHG lKC bxE bxE @@ -192250,7 +192664,7 @@ oVq oVq oVq oVq -qUP +eHG lKC bxE bxE @@ -192855,9 +193269,9 @@ oVq oVq oVq oVq +eHG lKC -lKC -lKC +eHG bxE bxE sDr @@ -193260,7 +193674,7 @@ oVq oVq oVq lKC -lKC +eHG bxE bxE bxE @@ -193461,7 +193875,7 @@ oVq oVq oVq oVq -lKC +eHG lKC bxE tyj @@ -193866,7 +194280,7 @@ oVq oVq oVq lKC -lKC +eHG lKC qUP sDr @@ -201327,7 +201741,7 @@ oVq oVq oVq oVq -thD +eVp mVp eHG uwo @@ -201529,7 +201943,7 @@ oVq oVq oVq oVq -thD +eVp eHG tyj eHG From 63b916718863c7a7020392c1b3b5dd73a6151d6b Mon Sep 17 00:00:00 2001 From: RikaruZW1 Date: Sun, 1 Dec 2024 06:54:37 -0500 Subject: [PATCH 123/192] Jayx Paladins get Misty Step and magic tab (#156) --- .../roguetown/adventurer/types/combat/donator/paladin.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm index dca7033a277..22bda7147a0 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm @@ -150,3 +150,8 @@ //Max devotion limit - Paladins are stronger but cannot pray to gain all abilities beyond t2 C.grant_spells_templar(H) H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray) + if(/datum/patron/inhumen/graggar) + if(H.mind) + H.mind.adjust_spellpoints(1) + H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) + cc From eef7b2ceb61b25350a2639a7292b9724f7cbeaf4 Mon Sep 17 00:00:00 2001 From: TooFewSecrets <56473355+TooFewSecrets@users.noreply.github.com> Date: Sun, 1 Dec 2024 03:55:00 -0800 Subject: [PATCH 124/192] Warlock pact weapons are much harder to lose (#155) * Weapon retention * Don't explode this time please * this makes more sense --- code/datums/components/pact_weapon.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/datums/components/pact_weapon.dm b/code/datums/components/pact_weapon.dm index 46cdf6d0ef0..04c81842b1b 100644 --- a/code/datums/components/pact_weapon.dm +++ b/code/datums/components/pact_weapon.dm @@ -27,7 +27,7 @@ weapon.wdefense *= 1.2 weapon.max_blade_int *= 1.2 weapon.blade_int = weapon.max_blade_int - weapon.max_integrity *= 1.2 + weapon.max_integrity *= 2 weapon.obj_integrity = weapon.max_integrity weapon.minstr = 1 ADD_TRAIT(weapon, TRAIT_NOEMBED, TRAIT_GENERIC) @@ -39,7 +39,7 @@ if(istype(parent, /obj/item/rogueweapon)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_RIGHT, PROC_REF(attack_right)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(equipped)) - RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(dropped)) + // RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(dropped)) /datum/component/pact_weapon/proc/attack_right(obj/item/source, mob/user) var/mob/living/target = user @@ -62,10 +62,10 @@ /datum/component/pact_weapon/proc/equipped(obj/item/source, mob/user, slot) var/mob/living/target = user if(target != weapon_owner) //you dont own the weapon - to_chat(weapon_owner, span_warning("[target] has equipped [weapon]!")) //message the rightful owner - to_chat(target, span_warning("[weapon] burns you as you equip it!")) //message the wielder - target.apply_status_effect(/datum/status_effect/buff/pact_weapon_debuff) //apply debuff to wielder - + to_chat(weapon_owner, span_warning("[target] tried to equip [weapon]!")) //message the rightful owner + to_chat(target, span_danger("[weapon] slips from your grasp!")) //message the wielder + target.dropItemToGround(source) //this is not yours, drop it +/* /datum/component/pact_weapon/proc/dropped(obj/item/source, mob/user) var/mob/living/target = user if(target != weapon_owner) //you dont own the weapon @@ -88,3 +88,4 @@ name = "Cursed Item" desc = "An item I have equipped burns me periodically." icon_state = "debuff" +*/ From cdc746f2515c384f5b2c1d09ccbbcc3a685b098c Mon Sep 17 00:00:00 2001 From: Alejodbort <62310132+Alejodbort@users.noreply.github.com> Date: Sun, 1 Dec 2024 08:55:13 -0300 Subject: [PATCH 125/192] Lute/Flute BG3 music (#157) --- .../objects/items/rogueitems/instruments.dm | 10 ++++++++-- .../sound/music/instruments/flute (7).ogg | Bin 0 -> 1387593 bytes .../sound/music/instruments/flute (8).ogg | Bin 0 -> 2128444 bytes .../sound/music/instruments/flute (9).ogg | Bin 0 -> 1540444 bytes .../sound/music/instruments/lute (10).ogg | Bin 0 -> 1746785 bytes .../sound/music/instruments/lute (8).ogg | Bin 0 -> 1475344 bytes .../sound/music/instruments/lute (9).ogg | Bin 0 -> 2193199 bytes 7 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 modular_stonehedge/sound/music/instruments/flute (7).ogg create mode 100644 modular_stonehedge/sound/music/instruments/flute (8).ogg create mode 100644 modular_stonehedge/sound/music/instruments/flute (9).ogg create mode 100644 modular_stonehedge/sound/music/instruments/lute (10).ogg create mode 100644 modular_stonehedge/sound/music/instruments/lute (8).ogg create mode 100644 modular_stonehedge/sound/music/instruments/lute (9).ogg diff --git a/code/game/objects/items/rogueitems/instruments.dm b/code/game/objects/items/rogueitems/instruments.dm index c1898500c2b..c98d6513b66 100644 --- a/code/game/objects/items/rogueitems/instruments.dm +++ b/code/game/objects/items/rogueitems/instruments.dm @@ -155,7 +155,10 @@ "Tip Thine Tankard" = 'sound/music/instruments/lute (4).ogg', "A Reed On the Wind" = 'sound/music/instruments/lute (5).ogg', "Jests On Steel Ears" = 'sound/music/instruments/lute (6).ogg', - "Merchant in the Mire" = 'sound/music/instruments/lute (7).ogg') + "Merchant in the Mire" = 'sound/music/instruments/lute (7).ogg', + "The Power" = 'modular_stonehedge/sound/music/instruments/lute (8).ogg', + "Bard Dance" = 'modular_stonehedge/sound/music/instruments/lute (9).ogg', + "Old Time Battles" = 'modular_stonehedge/sound/music/instruments/lute (10).ogg') /obj/item/rogue/instrument/accord name = "accordion" @@ -202,7 +205,10 @@ "Rous in the Cellar" = 'sound/music/instruments/flute (3).ogg', "Her Boots, So Incandescent" = 'sound/music/instruments/flute (4).ogg', "Moondust Minx" = 'sound/music/instruments/flute (5).ogg', - "Quest to the Ends" = 'sound/music/instruments/flute (6).ogg',) + "Quest to the Ends" = 'sound/music/instruments/flute (6).ogg', + "The Power" = 'modular_stonehedge/sound/music/instruments/flute (7).ogg', + "Bard Dance" = 'modular_stonehedge/sound/music/instruments/flute (8).ogg', + "Old Time Battles" = 'modular_stonehedge/sound/music/instruments/flute (9).ogg') // "Spit Shine" = 'sound/music/instruments/flute (7).ogg') Doesnt exist on HS /obj/item/rogue/instrument/drum diff --git a/modular_stonehedge/sound/music/instruments/flute (7).ogg b/modular_stonehedge/sound/music/instruments/flute (7).ogg new file mode 100644 index 0000000000000000000000000000000000000000..060b90fb922e77735bced2b04d3b3a31f62c78cb GIT binary patch literal 1387593 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 z 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%0AlIzPGD*=@W=yA$JMlj^ka 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%0D9Y2(x}_luDh;&FM3dO)DwIc zi5{oaC71$y-vBJy7fkD%zjv<;Rjy{)x}c$+UQ;17!<>1SPn)@F!$2lyXDZ3q3TdiM zQD&MOW=raA$z|}|M-7cCEj~Txa*^wf_N_Izt5$Yy`)S+eVC6gg?4&*C25xQl(6e#H z6jrkV$_cQAjW*eGylpD<8b=9OeFB33Qhq()6d9umVYh zvzDrXN1N+#pC}T1-{>>E8OLNmW|AIOVF7@_hNd|KO`?T;41y|c?+{vIW0=2vT-Ayp z#Zy^0?;x;l^W>dQfgM1!w(c%yJ@}&7wkQY8d4c8IBgKm1&wnIESIxX03>ntLnBi-* z++uWE2kXhW%afu_Co?PLBx^6y$v~wRaYjS#oxOjN%Whg)5y@2B%~{;khyM$$z(u?v zuOracZ_Q^v(RjqK1y$I|d~L=>iQcgL{;V+I<<#s2O`2?kMw|w#Y%x6Y4%<4HvH?%c zj6!EMCm-EuxpuYZmyTLJjEt>|TAa+@d1S;+$kQ7qcdP4iU)(->vxiOA3|o&$vwysN zRbzxnP4M0=31Hbz7LcH4}r~+Jey%&s0}Ui5bpfG$#DQonb@H{p2%KQX&;K za2Cu{-$Z(?Ex}@~7OPuJ?Ju_#{Yie4)lzX|USlu9*qF*Z9|YATFx=h!_{8{kev?H0 z7-V(h%W)Mm-cx)Xc|j~JY8X2&Kl+FA-w-7@ zm?X_GCe^|u8K|UXAGtrRGb2fJRbfurf~|8p&wAHQLr7GV&J74eP|6N_vV5a6OYk2x z{mSRO(1d~t(O87wvIE1ZI!NQ7Ijr&>qjfWeGxsJGEeNTBZd3Z{uf=X{gh^xPeDeg7u2 zTaGA>p)5JP&Fl7GH0I6Slo@^&aGB%y@_7kpY2aPo+5BK6bhiuW!gx$;^EJvQGbPqfQkru%$;cu0HO-O46XJZ z9i0A%OQelK9SpyG9ZkAsj2>NFS~L@lOe^`;-NpQs$nj1l9btwa7S+_frDp+nS&CAV zROBq&@OFA37Wo{D`Tg|pSA)2IEzQ_(PfgyojoHT8_5?i8SBDGycC)?92Zk_7!|H53 zY%9OF(PA~%!eJN7;B&>|rH4U}zD==a5za{eK20e7Ba!mGoJ|FZQ;G}4s7hF92Mt|$ zA%qj6gLQ3bfB0-7HlN1#)~E}Yv|jyE)v0{fj@o{N!*L5@EdBv2@*Ln`pK>RcZvPbV zbeUPb^cuHLkC;sjz}XFpgxu{FTTyjhtC4^KhTlB<2Lvo25m5(sn!TB%{o4ugaP2it zleJmx7fwEQA)g0i6sbVZFW}zbAF6Wt;X^DX;(&?tP7)~nI*j7*9;7NXdz>vU;-+4S z>%QPF+ob4l`gg`8QA?=CE6GD(?c1@C1gy>-YY|4=LdRfr36cl|G08o33pEoWnOm<9 zBR(GoTNhr`7e6X0L&gd|#X@yII9>>i9=cEa{4)fK0MfGQ)OJyYFEnlPd-!P;Ow|MDjOchf4OPplW1M=;9{C*Au8-7qEYE247M~ zJhPQO*-}sFA>GUB1{sNly_a>)SX#&zmoU3vku-*}*B)w)$U2Cn)zK1}O%oKlc@A#u zb_VX z76M8iM*S7m;6IN{O4)Qx9h&4i1H%4mqFITcAnrzUT=VFuuoQoZww1Jo4S4^oJzDK# z2zG#m0PMv;TApuGYGICnLYoqEnhAAqCTglTUrHfI=Z!1`fxS5TXy8of>!U1>S;%aE zmfmdOmRqCr`C!=@-MgF!3e0t~`&HD>+ALpGLK1RvKtTrq_u+M~($4DcCtzqSK~jAw zL_$}>tT_>vlQ%|h?;Q9^i#Kb!r#REP8JMQGGWwo1Gn=xmfB$n0t;6AT=fP#unUKi* zXDQ?`TTY;%9e7h=_gJ0Wu%3^vJP~hSIN7RH@<-~P9Y7|H*~5(0%_!Y&TUTnwSW-eG zvroq%VEjNWXFYa-Kb-UPG~*15<|CVcP--K?ku1jY)x?OWm!L(5&Q#bRNF%m_59r2R z;g7xGlX>Za6^ghl(|t-d4a0tr;14x{v@RlUVjiqFPyxrIS8;&}&u>E>1=-6iF^O;; zzro4_?d^b=ti0p*uNmPu*qr@gjGBw(!MJw)sv3i*!|MkVGd>Tk7aZB*SXjz42{!it z^Sv&!@ewTov&dTD<1{!mlo6eXr$lQ5HvXZodoE*JL1y=V7~c*>j77|nxHH;!9u$8r z?-$LuY@jmwrZw-uH+lgz!trU+C-=m>1Z$E+sH!OPgMz^Ro#YYI?hF=|M(OSSbO&ki z7AE=cDzo@gGdQ4@)O7sQ?_-V{a~KPyNrh`C1<{=S^6IrY1Oqa?37 zaC}NE@{vVy*g4~36y%)KY{3FPHKm!!cEHqtk1mcr-DEsu9LQ=Z_?~dJ#>GLJQP<6t zt8T>2(oHVZ+=P6!O=h{d`PB|5)uKCOcZQw(S@f0(q2tQnbz8r|iDZTBMIPXjMMaf( zgk*&EjEv`9Li7>9l4n!(jN874u#hhc%QMUGS-sVSm}0|EeLs6#cD76v>wZ9Ta_B<49}Bx3Irxs0(-I2u0s8!8I(y-S_vg z7#XsNnx8!V3==lYNSWi^aVlaEy>!-U@{QrIJMR26l=s1UCMFkwk zK-#i@@%Stk&rYdWwC$_ZUgm`Q3R@Jpms*@(0!T-n{?pY0NJEvdD>Q2npXOZ5POZFa zyh}y-)~k8#U%IRCa_X#2#B6?=Ti=D zln)k_XE`f5-Jg+aSiku3L)hDBR}5`bUMbttuGL=9x5&M> zT$kq+u3rBoyTf~7@zw99_oMAX`JWl?)v}SGmH-Gbn30DBEL4k|*+dVWBCF~OR}}u6 zmqx24${;fOS?8}+h)I+x@-?fFWdihK|3}l8z(e_c|KFK0W9+-^jWzpDLN#{TcZuw> zCVQeZ_AMp*7DJIe*&`aFP>Jk?DA^SeD)GNQ-`~GpuVH4M$INq|d(S!docDRZC5Y2I zQDSJ1>64T^B!2GMC1>)e+Se!U%IByw(>tMJtmAQ~*<kyp+C>oH<3JtQncKqKmQIOGfd@=!syA=Y7q`qimnnyxvRSeK~|7 z1?y9WzV~_(9fe1do@jaSjontaWHEGCSiW@h@WZ1A)L#z|om6ShU)fq}*=n+~jC|y& z{N@|%HpSLya7MSX#hgbIZ`~0)!h5@npS*u756vO4`THWELg6d9)P*ev-Wc2U^06I<AF&WS~Q!LN&cJYizeN) zDVo+xCT?k2Z!6Bf{>()&)aP?6;CHa_cgMIQhd7 zb}an}LNc#{x}PrbP6x8_$KkviRmR(Bt$V1G9bsb#W~ox_oTgfC!%@gD`|t*CZ(KR6`8) zS+d1O0#+;a)76Nse9v9Eo)Bqh7+zMEY@uac>k95p>PBBK-#;63l`6dVx;9+$$N9j zuN@4nxN=(`1tTL`1z-N2G5*+4qANjl()WH-#Mcmc)Lbl#c#gTdOWmC$#ot)DX(iof z11FEnUMP;&zMk~HMDlR>w+XxcJsg~QCyVmKdXi~gkKP_w1O#ls`WC-l+xPygqo4mK z2RTQHGZo1ht@{qL-}y%A?}FHp!I6K?#(sm2>@78W*|H{93`u>77Tp+E^rcN4O)=XY zYHVyq*@mS7ADOn^00Xwyk(`MTBcS)O#Q3~tIP*U$nmJpAIEF>+1o##eHk81s z9Wv(h_)C&YT-HVQ@B}>v-S$frl$MXgQ|rP^nw`E9GtzeS=FNJo%0*e!_U=zcg)Eig zOm`lpSr({Qdk7jwrX;q?f)*NqIi|cTfBsUd6;Pd7ykv4qb%;5H-S4-qI_CeH0fdhM z=Ko{Rhxrgt*IW^9@gFb#F`%FK=;V>`e+>cHzlV?ypBggbBOpgU6@>Ux!Il83z26Y- zPX(I=7-3@oCp>}~vgM=TE62?NT<{qi{2P=<=pzRE$+4;5PlolpOGHMxoLI${?wKb& z(JZgAeM<%7R)PcUP_47YaJxAVR#tYKAn?8)D|W@xjd=A}qGuy^j~P1bBy?}izh&A) zoJ=x~?&y7RH0iuv(0fwc3x$g+$4t?j4T~6O{XP=$o&DKa7I~kYMe$F)^Nyq0*Jw>7 z8z`}a^&`;)>a6EVy==Gh;{tQ^@@zy3J|z{f)Ax7hISD+iO~*tk*a!8F%7;nBmQjIJ zk|UFvC4VBuoSUhIPa2a5X;G3lb8SsY^Y>qz<33VVx^b!#+wSQw+CTN8dqZq8h5bBI z2tW7FKwp-fF{W%=o?J)Tg}-H`jn@^SYB;7|eQmOA) zCeA%yADM26RHTwBKm*7f9DVxe@1K-6zJ$Q#JF*#;Y)-nhqTq(#@QYR9EDRzQ{P{vx zK!bF>LE8JtInlsrrpgf@f))-4TXS8?rOTV)ghbbGuj|FtA1xUlUDqf^1UYbCC%O;N zJvnSfNzZ?fcT*0!CU`q1K!hgZ!?`o#cN}gFdAJJm>BMy-&{@{7#W>_5+nxF+z`hBNNSR1Rp%9kq7*jb%eGrwvsA6R(it;sVCyVx(Wht?P9 z*%Gxrqg0~YPvudA>q%8f|J+fIvt>3FLef{Z3~_+)Df%7ejydd*{qxWBGHEj0R%TMq z;i}7k!bkc)sqI4gux$VwX7_e2S)cR$?rEa>kyXapvi@_?j>=xhLl*2-cQ^{7| zBR1SM9K%#$#At*`SfOSjomn{vaJO3u!Mfzg^v<{}=hek_J+Nj>I-1vl1{C#-4 zRc3jo^{(ExZH;*2cOZBfIXZphOIUn#eKc{(XMA_b+932gO<9}hvsUGB$>q30U;6Qn zmxZ}j75?6s(U?hos@(OQKvH~rcC3!a?sS{Sv+0Yt+R7isO7W4!XW3dzQOS<>HuY;N zf!m$j*L2dq7S?c!kL1a1#XC9t{nk6KylutX>g{Jp9WEl_dnyKhx%lj+3pk8-%iXhm zA#G&F*e`b7f-S=CnPNT*-WLS9(OlU*&XDLek`I!9gwNw>gIQ;Ik^6x-j^HY0?v)fUU1h3`21InD1Z%@pF zzl&R6dA7~x{YGwuqtMv;SAp`P%?u zJBPY%dta^pcUg{{@b`5xQ}VKbWIv5?He?j=2zb5#_Sd^g-V1^1_VkJAqo0=|*2xdv zqwx;}kqaX?bfB`tt4kq%o$tr4{>=+fqLtPdkI!e$>D!<)zqi8<%Emz%vZKJ^(9cAe zgc0IBzhtsx9N3S4|17xTJ%TWJ?Zt-F;m|+7Nuj}agT?+kFSH%}!cLvBobtP3^x$o4 z8z`R$oyx4pK8ey7II(Ufnat=)Mp(uaeIK?Hf5LH6Dr$U@MzGSO-Lgl*kaBhH;kB4vxgIR)`QNrVRMS4ByLS@R-vmp)^Lo=$mY9kqa2v87_U{vsFzBkS<+Q09K z&h{qhiM47Dkd3`jG9;Yp=`g6w?e2G#{MKh7j*h*wC5&V~?~!!pQImVegEway23y~? zY=2{}cB@pfP$+nk-f$`t;CU{RT{kcdq7pIFOYHNZ{8eJK95b!U_#?@6F;m3zehi@M zz2H>z^!*cuAIO`&GXo?x487Js&aEHcm6_tq=+S8c6huyPewXpzFZxu|-}T!E{@z?MH;bFhT~MI#x@ExLWrr4b0SSetGU~w=3frwcKc>-V zH=Wzy9CDC%Je;}xV&3UU4Ai+d+)?IEa%1TaU;(ugWdmBG2}xd(gaS&if6eM$L;PZe zv=KxT+XTLLGbITHzbAhClS1paU4ZY{Jg;+lg;`qauz91PzedHpY$@-0EHcy3$Mw%! z6~{e$xgBl9ru&W6OanSb`nr4@`i%>Q^7pkzYp;kFaS6*D>9y7Mv%Jl{nd61z_%Ze8+6uKX;!`u37S?-k@a<1K$W+`bhh zM@FW>JvJDzanOI3g;4dKa3x{;+YY*nb-x>P?M1lj(OL^2l|q^O9dZ6MbbXev!nX9{ z>pdfZzvSTgHQs0bTt&4C2%N>>=E{x1Jbo&GS5+-{MHlUGt79w%$JRf?>GbZ!y`)>7 z+OlWR`-j<2m!zfKt9{kxr73v!qAW~o%+HOa<=m#y7#HTuLL z%1=yK&dhTeG&yag?#69;ZwLFYuPwMfXWgCpuDa7(3W1o8YcEqUvY{QtPbUUZv;)oR zFFV>XAB`bas`XpI3&CoaRc^AZe1UESI!@Yy&T*!n*)bIM9&kayIQnx4=nJ^Zp?6P~ zYRT#@^k)EfiSCrAEoJDB$P#q{K#GXnJ%Fo8R5F1r{{7p>X86FYUCV~yH*#gGibm#G z1U^b4>a^j|yEcivr3=M0DIqHEgy&Qs^7a10fU=OEw(>+h1}#m^Jr@GWwiUt2saZ#`!^K35oGHAG{E^b+B$}Di&xf-2K^JX`t@oV7i ze_6qtR1bjg`cstZ$!-p5ThF8^0qpM?=4`vWJ&G^SdaRjOyYMNHIr- z%$8Pz-;!W|h($6VBP8x%FQ52J*n>JjTTEMEUKIrrex-3TgZb6PmAG^uE10Awx)Ct) zsXG5O&rKPsqv0BKv@S$v5l_+mqKiMd{hPMrNSK>32jS&%+dS-$QmEC$X&qb8>-H}6-+Xb&@ zZ!Kekmm#>A@BIYyNki* z+~LE?FA#vBeQ^ZfA0|q7k}1KH2qmJ?l05@bCIkFHR_fTg>v=R~gT>IcNGb-oCS5+iLsIiUO{ z^7NNQk(4E^0&UHInxC*a_al-J_>F?34}`07T#APm9c7k8UsWOr!etIH%`I<)sdSZv zHD^G-3z=k8A-%1Bb7^@f?uMy?78!on>yDVcC+uE7n9LS2E;4rtQA7eCPj?l%>KQpe$_z_IGZmmB734d%Hq#R0xy-IlolH8T!$uJ4SrYf@mj!0`p3}mS(yaS< z)tE!;j)j6?e^XNwecOtPu?=x*3fz2Efs!A7BWW+;BIz-JZfA0GR~PzBy6)50 zVRpXs#d*u=WmNb7SHI$c&0I7-VXTD6sl;7@6_T^K8B}4EdXx%Xf;}5suo?>if>kJB zlvmD{FT8lUo)Ug#dj@{;eoDN4VSxQT6O0No!6#y&#=Y>?{wB=p;oin#AK!93%6DU* zl!r%qj1f$No36l-1+6Bj2#;7Pg9p%oV}j>7ROCa;&0ES1XqF*&DT!GS0l*g1ddhd7)Hbeb!q4ZTpZO7)TPGhq&;$Z8~Kp%oDWjFktbOIk9 z2Wb^Ee5;6r)m;iUQ*Cuh#*4i2X3Q#eZ5YB$Ok4#I0TISTwG>wT=!3BGa6rW9a!N_I zr)Uk5Xu0+H@Nnwm6_15G2{(}2f0os#p4NXoz4y`b4E^WqJD*z;6mFQ{PY|>TJ(m3h zx}hV8LW9%xf>0D)|3=Kdy_?Li%zQGL#+r!Mp2=-in-B!Ucb5OW#7R`=37Dn6@|D`r z4U}(m@gt~5n`O$XtDPmy7(ic%J&e7_^CFJ~;EWl4^VSla0(gw{aU_l``En9^Z_^*n2KWG6yhin}%46H_B`LFPp6*GZs$QbS`yNsu!M-cs2?&63D|GpU_$s zQ|6pkgM@k7yS94M#StnoWb7CEe#lU7JZAoEesn#tUZ1de4F5!fa&UA!XksXQuwtkX zq7h}P;*DzRcW$kQ7_=;)XHIoJwQ(jI z>2ojVt8Fb}2>(HKEL%T*Mjn!E*qjn@xE}9LXUuo|k--J5DKtVQF*mur1hM#H7C^v> zE1;gxFxlJ?Vb($;E}w}|SszfKoFr6t4>p=15;~1NS*47^tNo2cRm7s>X>~^#*2y7) z4_7L%!-~h#QX+?{l!d?m&-8_%|O*puuV*n-Y|9-edh=GK0f zioS0%s-8f1UaKqq;<;ZCd5;;7&rqs8lEg}~&z~15Th(`dF!Uf^JXwPwLJSW!q5pul zzQAG-QB4hO$Q|Ic>1zP;Vf?SAg!CQXvP2bQL62uB?68!ff^{7*UmyhM1~93W=`#mt zkc#a4KBk2*X%cJ01boLw(yOfg`l_OM5F(~BfB;5p6e@o6*KTsYd=H!C!Kbg(mv9Km zNg&*aXK`(^OhET-k0+*^h8qOXdtpr-(M0BSkum=e2sjNTVWe4IZH?GsfXUliw=k$8 zB*bQl0MpWEm#W)hvpD52F=9vvC?IrFY`&*wr?}~u62mGNbpM>osZTd1xbkN1=}KP9 z(xV^({K^PywjjbDgi+)EruIKK6Qh!m`^HI5o4ge#(?2H*pE@z$@;@l7EuimwtOc)b zG!O~(1HLf7hvG%Ah^*skqE!ZrLSzWA##uCi02%CkFbErJU$G_N;dP~d9I8LQB{y$) zFNZtp!9jIU~%!UCYK`t<3ow_*=gSb?e*dYOUH zrT$>;vKOAAl0n(q+dLtP%fy%x zKH=O9W(#udcNa1b3SV>eeH_w%6~Eig?ep_;Z)MhE{eue=g%~?^q83;T4b7u~N6m#~ly-eq3qxSsI3tY%bPUG9v)@y@K#ZY7A(RUa2=a}Zr=iPul;twF+CyuYPtS~tWygj^iyV*FNH4P$WRYzNBFR< z3gbWw_c($v1yazZMyw!k?zmamNuY>PW4nf{7NsnClzs^jZ9b zrdHP;4GQ2rNYW~KzTEw0L9(~CH%UridfqFMofNJltbxvRC>s9H27a|v*wLgtu3tI$ z;rs~(Yb-I~PECBq#foqTS>IG(1zjhks@?_k?S&kKOhl^9=}-ZXxKgWO;Oy3`dmrHT zb_}c`dWD9X(~xoqZU#IRt&cC5IEnj+=_LUwzEd zInfB;qc8h&phv|$Jp2P%aojQ<1rT#FLLfo2n;JNpXw}wO;VsqtDpxRVH5N?|^zOTw zTb7q~G*dQTYvXG&v6NO9lXyiPOi!8i5#VD)JsoybZGv1HBi+ooGeG&CI)wqf&zlAcN2Z1uHs@+*7BzK%cdMNBLV)p*NSAg*4)lq#*GaJD2gC$b zSe2@~7}WyUx{uUiN6R2cGLM_PbPO?|+vEG-hY9P?L3K$epotgXpDV~#`*b*%0!K&? zPD|+E_Bpc4hwTes;}Jrfu`n0w6#9{nJ>u^-=WNUcV<|I|GTel57{tqNpbtACZ( zCitXvTWG+NLBj0CVA#*}xclHFJYtccNr2b=mI|l>yoozheMb99>mzVC>wndYNl<{8 zp2g2UU!}b)j1Y!aQ%TeC^V=)6!DRU7b)_XH{0RgqygCI_;(z6$wzG(Rwa?VbYAdg_ zn?YMwdvsuN4$4b->}pi~DZ<)?Vl9!%v=0r!fA5}i`6epDi)OI;Xn^o+dw^GSYPzp3 z2N2?-G3BfD$fhZ>W1lUBNt9>FqBzlg8sGsilrETDpSa;i)r2kqlo~inHHM+n7C6ct z)H(LWnsxz)ns9qQ-%%tY+lBPGbbt2Gb*V3A(F7LUf83$mb6SuCm|#iVU;v6kO0IgehG;4R43zcZ;FQ;%Z~D^foP$h7SO9v3Itn5s z%XjOw@@bWzdWkbX&mXN=8QDlcXoxyrdHwpXC)NGvs}B_oHr75M@puI2xD0CVgs19V zazjI4YTH>w0@7y)m)k^$DSIxpA&r%w(8 zNul-Rn73A+>DaA7*F!e6HHA&-Q7us;Wj+>;XavLuc|c=WCkyW6Eew<6=pVdtvN8LX zNzPCK9L1#;wYQ=|aqc~1wqaLMpywMEyWhut$c_MGrZe!NG3&KKoh7VJz<<~MX75Dm z_;>eCocp(+_wi)_3>@$g>m%1XJ(-8&VZ06MfadtmozX~8=Y#^xscQ@P>QY2OsDy}% z55Bbgjqqo@Sb2KXGw8<*=*%{&v;>AiA)x$>66h8IlsF4P_YGn) zk-OwvYs7anRF7THcRgS6SCY}!%U}q*I9e4GPN=_(jk>)U!*YLKFRll|BU;o_XUdA?a#mS{Dk#qRAqV`7 zb-BgSe@-3iqzYxUyIQRjCMVEV6Swp)o)Gbj`(91=zH&OqqG| zFggguot6~|-XyR-6|O`hO0j(BtO?~hF^*WAXl5e){GVq%VNq}P;&tFj@+u@K;jQs8AuFGC+lCfj?64^uU zF*pOBe}W%&?OXyYIBpg<6m1AT-$C$JbN*41ZLw<{a%r!c&(}f?`9CkZzXfCK|7>bl z)518pW3VmJUzauT={u8ekh047T0cax%2x?C^CRiu$hpBo3A1O99EDUKloJ48)YaOY zGnIXmwc%+inJxnEK6vkO>#1p_5-&Urgrq;-eXLK~HiRb?k_}=0o&I@38LAfHdolNy z6DmD{(k8ivymq%N`$7+f-N2lL*L(5+dEvfcm7w2iUYtq41UlfBQk{}SpmLHKJ%>?! zcngX)HLBScIM#NlIW?3G_h)VP6C$45bAp{0}TfB4B*f+Zu)YbUCk_a{mzz9z!|rrN9=9aPVs$beMxl|2plUy zZr&<~&f!;qF-dgjCmTT4wMpPx0_fX%nwb<7R`tCamY1a^H%7YQ+>v;eqz zJQ`PmHX*vT&nzX6A&*N;7DSm;2q#UZOCW_S^R{f%cv+sJIV0-k3QgY@@T?e;jdG`R}(Ri9RBa0wills-WgL{3rc;y>c!#l z;L*edM$}KrlCabCWz2o{6nsq|@ugg@=`zu*q8`^2*4f(TY2zqH!#YI$=?W(k5IjV# zaNDaWj5Iy7$uwM^;AWNLYkf%mgIP6Xy!EY!C+(VDBpFu-%VCDJLq+&5-^k^2x+Iv$ z&4wN0GX4+%52dK!LoRIAd%#Yakcy5?e{U@g( z0ZdS)NOjKkWx*glO{||FNxKo?>p0RCq-kCb6rQEbGyyw9(Db;nz3Rp(P|rC|O4|h8 z570PmiNxW!>6afRris_g`Dt$3?Ev8@xz^~3(`+Zl&wH;5KT6`Wd3Eni)vq^s68yq( zuQWcImY?&GYv3lrZwxjSe87?icm7!f91`t=%k}Gmvo_r+qBxmoyRmcUn@bPY(arwV zd@@oQa3J2m*;Ib3fAh&M_n9+tBm&0jwsy7us3q`#x&Po!8dlEOfv62@=2K|J;7MFH{wUz)NT_qZLj} znOY)NI84ksOXdkV`&_21rhHAT0~3yfw8Tdp{x7iza4> ztZ1B#W1eSnS%bk$Hz?VdXjU53G^|VXa6UKIfgq|4x4pCT)F7u6P_H1f!H5c0e#jT< ziN!MJS_GXu&0uN0kHTFcQqkXCtX_9iFV1+yG3)tiz*1Hs_%rQrlP;fw>xs?3?{^tL zpN-*&7mYeG2pzCJE11)gg7FBnu6CQcAiewq<0h-vYc8e)4N;&bRJ0#+VHfb+<36gW zgtm87|KKKO9I7UarBUc3ey`}}Y_;?8sqiv$BIQM8t-XiHDCNe=kL2ZNk z3?SQo_H{f?{sd;{WehQ*KBnLjLTiQ%pxpNgPH`@^4V^G=@$@w>e)76O$CkVv__>*MYxq(h9zVBi7r=|T;DPKY}u2-f$yQDKNet` zd;QH52F<`KvNI7h5vF3vQnIYwdJSm!sC$uwTmM?%wo3CID1h?dmpTFvu(&_59ymth`Z-`=V;rU?%tTur;e{dt-1?-L5}m`-V+aBtdX z-~?di8rEdwhwtNHKEt2y#u^gCnP*+a(t7l5rcoT&B!xPmX2^=g zm#0>gb5W%82f4l@MhlmnSqKqsf5J5=m?&?5W~yZvOK{BBo5TWt3s4Ls1D%`6%r0xGu9d;=EdCEEssHCzLj8}kuip4K zE(i~&kdiFdZ#iF!Qz^k0`5hxF;Al3|BmAxN6gAmBe}# zJ;DTk)*UQxVDSh}nqMFGSW-x7cZ76dn1Rc(62DjOuhlBP`Vl~#neQ4_c|N(k>e;IE zO|k!C)tmRAYylW_=Z0S8t}WF?+OtafiZ(LY7xb`Tp|Ma7hGf21c+c~~QGpN}JBnjx z)%9!mEmW!u1}1s}JN_)A-L9f!VQ+NjujLH;>VJh%7y9t{MIWU_TH=t2pkZC$6Ns%wg~h8IY>~RiJ}GM4mu3ciR6oRF2CNC$ zrhmK^OyLNE>aS!}IM=rWkV6Evk}PTS>WD5C%&H8noLOrP*=FVeV3DAy0yHm5{fDj#{dCPxAxFxx}}l`U8G7swKUx`Lj(-r#BgIh zby^D3$KtSCnJ(Z0+Adj`p#I3};Zq;O0%Rkg_CUia_3Smeu2sD5X-e16tG5fUf-wo4 zsdgGgc?=TK!H5>c{t+K1Ty?=GDZ5L!QZc+VLLI0&Q9+`InG8S3zmr%ta5+h5;Bz)J zq%-=ye*FSW{^(^;{m`eVx_d707mS=eLqH%xa&l@3)a4j9?3A@> zDPF0Lr1`bdFEwe^3dd^+go)`^RM6Mc3;Ok8mc62prRtt-kAQgaSS#Dz(^FZ5EwPuL z$OM(|mYI(}$r}canW(8-D%4imy_xVN8dHZ;-~(e)<>&)CyjndOs>O$HLUu6i0b8>j z>DiM>Ia|*ToeyN+UA(2cmAm>k&DHv93``>(_u<($LN9ue9qfdC;AbQ`bJxX3bt!(E z9$vs!zzv&s4J*LseRrH+Vl#z_Q~a?!H5l_8>B!HLxI^WX3C&>@@Va4~K0)(Tv zAy6}91BBu&B7L=Bmw~pLLd|)(A24IZSM#j8E6ehPv`R~{&-8N75$>WOZB77_5Dhcur_DDeQMq4> zBTGQx4NO;j%(mT`o9r+4IhIG>k`J)bbimY}djURE~o9 z&r>SSj&FN6`Lva_0B$>$69G&z1iR&6B?TLq+LV|-0PPXLrS#Wo&9@QDpUrNVB|Q+{ z?OE}zzWAr&1$0yNl*J1lYAF;x6at?mFG1i(-p^S+D@Q=EuydSIRSD*F0n(uHxmYV> zo|z*3PNb6>c{E3KivFjS+y=GNxK|dwy_aMgPtOnE{-sBm8~mf3#-ae~LO;EsrluE~w!dX;{lVU-3I~tC`JP(WRu+Vt`vR=O#GngtR(If z>T#jf3n$U*dav%DS~IU7Ikoe`hXdvUVk(3**x0|zz4<^5)W1^_-u$_Vx+0D!UWx0J zu=SeSX++)`6G@X9!}nT-sQqScr_e#8h}x{Kxj3U<>_VCZ7kyd?(ZqBeP%+J);S0-7 ziSH$Uy2fHF>&lofb=EJn$MNU}kCgRR&Sno!(+Gvn@?TD$=6+ookT2T!oG=~n#qia8 z)WmD9Q9@z&f{3s3nG6c{>0{yQpO}+11 zj@5;QKiwkGoHR%JaR|zZW`1+d3bYgeeczWZ3s&;T<^-H|xVQptD&O!au#!lhq#arq zD0%QS|3K)_p#h;JjK5d4Xyr@zaQm7qMn$nUh%be&nz(et@?ai5UI61G|Y~o*I zh}A+(G)AHva>6=7K6P787)7y7qqUZj^%O|OSXh6=Cw-Ra>InOlTSSGSeaVxG@ zB${S5n{1`)N*n9c7Al#~)FLJcv5a*{f$aKG1&nL@|L4LV`!Amfj=At*EDgplk9@ue zVeagZ!JZZV$3S-b6AFU;{7L)AoI!aK*hrhc0sQk z(SqjztyIi+Odi4u00Cxh&>d*bN^hCnp@z&)(@VY+u9wd&rHI1lJt7{{3exFPkd)^~aX%wH9l{<>gcy zFI%Fw0w<1@aE@Kdy)FgM|DFH}DYU2GPZ(|EGx&JsPyddcUy5HDAFfi5(c1q%QaS{zJ}KOl{(G z9)&f7u`!?O^6wJN z#b$_$%~YMu7bw>3)vrPfnPjda37V%^EU+2ApN^y07smyx{T1sM$HfZA3A4S`%l$W6 z4J4--TL7})jJj078$mnvolJA(M+&Q-$$Qk^uz3)knwWTG^(zB5P{^)5y>!-LrC!&$ zM`K^8gA~#E&OWO#$$4L{^W-`u_^%EM%4rBo+DP;pv=ZBOGtz?he8xmZQIf7|>A*$|9tK2Wo&? z2m$a%MOv zLi_KpD?269^=)TBloj&VKciC;E?R@hX8xPEi(&fVW}@ENvDnaba0NB@n*l$(iNM!d zQ%Jj~kVW53F}1X@m|RzuQ=}6cMtcU4!HW6x+_!;DL{H_#>F`*s;4}Nx0#q zC|4CIpmzU3uV3b~_q8nPx;)e_)RDu^bzSn<*Jo+%$bC3%DvXGi9_h8}q4C9S0tj$f zo&{f;#eBC;IjZ-8#^lR6>z2csUx)W^(XCyya{pX@)=NdT7`V#$c!!uX#$&#~=G5`K zfhr7Bwo# z!Z=N;+3@8eFO5u^Oe0g$N#dMZ-R6ELy;+jQgE2hX#PY0sm8U1=pNj`D*Ye{vMb{rP z1X1~Y8&)3Ax_@x~!Kt%U>&EwKbzMwdL>IO1ke#*=TFEgmB7aJzC{Ja;Y^TwHuzNbE z=tTxYKkb9H{GxiY`qbCCn^gzu-~5dqOIT%M=WqQtE&9^88>DA3(wo!hPOt;1>nRDI zQe=}Bi&qGNA*2Miv`T>c7E?$L#_(6I>8>>ZqQ6Sw^PhEq;Aj~77KtBz84jLpHNuIJ zb?Szoz%whj`6TTu!bf2&6W&k*;PFSR?;;DW2d^m?p$Xp1M2lXTmykOK@6| z22NcSW5&Z&J`iq+sEG>umuCSExa<7O>x#PhZkFoAK(t1o1vfWRzCXvH>!u5*u=*Rd zcNl6=D55>EogVhAoA1Mc?dA(I)X!hDJ3mEJx9#S_=jmYx2+PL~bCHT9Kh(x#xO|cT zoo_eF@DcPi!h3H*H_^gn0k>Mi0HJ_J8iz7Vw`K+h`_IuhnXEQgC0hBT$oY2_+KRc8 z+$XdorYxO(YH;VPkih7t6ZOeR^BmQ6G!Ev#%k8g59p^IYcRVDMWY}V=KW+|V;Kp5a zrWw2y&0I?iW^l`S)JCD_#9HAN<<1uA1MV}TVw4|0B0i#cQ1SO?e&DF0WhDO8GGW>K ztP+Y1Y`rUEnv-KBEGuj!_ib8J5x~wjb`lsMU}NLkO_9mF0h>?35`x*aH8Q2)H2*7^B{p)p7)?sTud{aCz(j$K`Ey<VQEek3Q;dx90o86?rYa z3g(r@5_!hGwU-Qb{46n&S~$x>YQh;>H{B9~HJ(5i9&YTtJolYB{^+h{S1ql}#^wBi z-S9PJ+v}9t$bZLP5a;(6L(0Ze(IT9QS{!#dj+f5CzoM4=7M6&i0%lagl0ln_dL+S%obZgx-C3Z`geW=6;2{D--ta=OS=~`9vyTmCUYtm{)Kx z7D`XPvRKnBKK9O2Rd>{32Fq2KO@I}y+&=a%unZKVj&tJmv9Uq{)gU~9m(5KY=)R6^ zHH}+0{qD%gPu_N3Keze4qidjH6;d}T$n4ZRmg3$M`3;eX+0s~hK54F)ai;XFnfK3{ z#@KVO3$$OFr=a&@D1>Vo__UF<=iYl+3fSWEL;8+KV=cS#`Ol=<3i20kr7g}0G|F`Z znO*L_#`OF@LFkik`kn%{F#Z#Njv!HNAzLq)ARl(;yv+R~q~pv20@&iK7fX}OT zGD2(q5E6WSt%3k!RjhqJbkMhwzV|84t04$q`ZI;3%cJ1MCiLV(G;a6Zrz2A9svT+y zv|y;N_QxeR@%->DL97X!m9Csyzs{U;l%+%#2hXPP z8TLfI$I6u!qD141iAqa$)t6uPYo6q?jG~08y2d*Tj*JN*oHl6QXy|e<2VcG2+rJ2= zy=I@g%^o-X)y4XTjeyKOx9%V0w^#wRC@>;9b9)2pr@?t*ZZOd3+L=XZ{~nr>N{}kJ zSOyCOZldpbU=tA|q)6Sx*&`g?9s}tC3z+dkf{dMQSLf1KS3k~wboDiGMS(+G#RKOV z|B`NN6HF=2Dl$TDUTO;J1KNbKwpj>lG@DKwdk?DUg zDt=-+3?AE4#O%pZ_y2wUb~ov)^EUbSlhx1@9JAUG{JK!2$B1$?seXxZQbmU;kb0z1 z?s!m!(&j7333I(|{c?b)3eClb78Pc&lNCvM-~+RzjyUhoRLZ*0Dh^kG&Kvdh4!iF* zlJJnvgFnXrLrN`f!uhg+A%t#=bTrLi!oZxs zXbD+R5PFvyTrB2gh8l~N?K;dXr{+X0W4xn2*k6Epg7?G7TF3cLn3Fw^yV4%A=J5S- zF#v(bHEckC^BEe{B@;$J=_u3%_p{j`1d<&YVrobC`!!66Dja4uN2(>lGH+$}sy?hDW zcBIsm#X&l4f-EZ;5nLE?Zww0gY+d!W1kMV-ka5Xd0<9r*2oTi7Z#||%(v?*e?;b`_ z(!5J$v2-)7Cu1D2Bp|2(QOSxUebQeDk1%0HV#{&Te9XKF>sBY+jcDt*dw48QiQuOE zPUMy8>R4V7$#G3v^a{ae64}NDXaOmSMGvADZognBfmze$_U7=ScTR-fGQ<@o6E3b| zm!}WggKUIxdU8b2c_yxB`~1$&gcAyizcfjmZ=~^i4$T8PodS8vu>v>$kI)hXRAS~L z&-t-Sk`@FJ;X|b&H?6a%%SFMy&NV$+O5iWozQT*ZmFdBpXKfOY1lg=$zCOC;D7pje}9ih_dXu?y4`z^*ZZ8;>-l=Vp3fhic!G8GcQ;Ew zQPz2Al%(#!B2ippBTg>5Ynm@TwqHV7`^-6xQ~RsOxbU!Spw;be_(7>#Aoi2h&|#>{9=|dKU=atb1&((F*-b0WV2Z$UR9@Qs*@D$F*26?ab1wy z2E7Jym{F4&9_>~yjtuc1bIxz+Wu1!I0g&;w+~Um^C+_D zOP07QzGPv3nu`?~OS%){B-ermhHmDv*91Xl4H__f;c+zu1XGo%QB8Oj6C>PqHtspY zum)2x7a~^Y6T3G@@Q=YvrB~xi5@VPf1bh70mbO{5N8QRU^yIsNCA@O zaVmRup1Nu78OhBpp91q&D5E+}lzy5-OK+7r7KI2|JsmsGmTh7l^RRBv_r%%nzM`|K0)pU&rmN57}u;w`@Yb@O#lxWhod{sNZT|1O^|>h$X*0ri$y zIH@bWBoVFJl|WxE0jKV0Z+0>w1&LDz%?)w4=^=Y-3~u;uTJb=x1}JJfT||Lv+v&Q$ zu#u2cPq@+kw6O*y#l(5cIZWKn=0=wV%-YtU&E;B*)+RQo!NDMaDL=3jen2z~8|XWs zZNQWdNW2f&d+JZ%XTCTu6nuk^ZD_oKm`bi0T9S!ev*O3tZpOHgvrL1B&&e0|CUkYQ;XV8ekZrW}F?GDdma z5S?tU53q!>AA6w{okD=uto9yrz;pK>J7?jiozu2>l5%mpVQSI{Z2#O=>P@i53 z)E{URQ$l$sJXYfQy^P^4OO?VPRy5vuRnMWJp5F=l4g1W_gC6fD7O!GJx_rN1h&PUu zdPUkg;pBa8%TMlD6ffI@r8`WX!tdzrh>??P7d#&b5DNdM8h5}=E@E@j1dZAdd4(bU zYQjyCI@`3UBtX#}-(AdGbpT-jEb?bP51m=`M6cbxLQ3X7A)@?2159dgfB7ZiT6)x= z!r~KtW`a{7p!HyO%QwB0@7qxU&;C1-z~vC806pfzib@_yRmv~&Yy`U`U_!%R%rV0V z0%5|}^W+*9jJbo}SF20X;F2*N_@0Gk*(+|QLX#2x&Aowy@mZ_<#Y)IA9{#n`WR6{b zO^2oRw_KFp`lFH{4WxS!wU2>6P39DJ2FbisPGXeIT}`?Y_b*ox`mbd&NrR6nYVvHM zr6dqk1x85K1;nkKTQMT;$Euo2KINDYZ67BvKK_1}edI(z|6v^i zJlHh~@l0LM9(#Jjt}>5R)G5z~eJ=FuN~PG*GEBYGJj_9F!a!JHn~K6aVo328*Y9H8 zt69I`gA0N5~q&xX@Ga5-qKs6U@uwNN=A*mmC^~gqppfoK|SS z^}Z-;`*GgY8*AGWFBhF4>hAN*G*gs11R0IAYmdh*XKnq}XETaMdYWG3Sw2K~8$_82 zmer{?dZL)6K7+o_is1tyOXP=@C)wwTAy%({=wcl20CSpop;HZ~Ofq}S5;du0Mudo- zyxY7H#>C)zB9o=!{XWI!hs~NF_ZY+IVzF!KzpsQCuA(LmeTfNwAbJr$c1iauPHKtm zV*|Z3W-x$21e0(*emO-ikdNUiM#o=fN^{R|<9&Y@6pJ0+W10E;0&bIVK@t{Oki)bE zqi|J<>$@&?*U>JQL()8jFyE)s%mr?zW>;W4s@(?)llOKB1Dp4lR}+3e;7iRsUaR(G zJ*#(GQEpT_LJuO|%$}a;J;`1plE7w$EOdvenrh=!%tVVXEF#nwf>$@#D}{;FK@N^X z%xJS)*X7gpgQ0}c1&Cn4~8G|#xG$)uUT*FoTbZPssxUtBqR6qXJ z|2%%1({qq@ZbI2Q0gXm5yG9+JvKKOz*hHdw21KXfg;T$$*6J9nI{P*CJMSv|lmC~^ zDO!MLRoaH+Iupo{-xSWQd}9^Q))uID^bSCFO&LV5GLXWxzM8NC&Od5RS z0WO{_a9O6h`E(UY4V0q8QI%vAPJ;&uY#xMAVlb$TGFmu>hq+-WUtt%k`7B< zW|s&|H$>XpQug63vI-s^zZ>|0jPf~)D+a;Kr3y>M%*tD7`H=&IG6`N(6azLZjG(A~ z3UPOJ9Z)sq(q-<(8o6cYGJk>&5!vI@J$Z(Q6-{p9(YYPcbpF3n333qZ3&q%^ddHp$ z63XM$#HWmQ4CG?{TH(b2Ct=3f$8cck`zPLi;0c4&QKS70Z~tVMrjipMOVJuG%F(1R zXbsDn%?~uu5&qAU90astw?P39&DR!V6(p+Tqmq8f_#3190ZT5h=~L~4=LE$1hqc0g z;AUuxVg@7XLA`j|Zxr|u!~kfal@UdwI7t0S+K6|R4g2g?Y;5%&nfCg0bfu%{=*%w$ z$Y=R38PCTU_~D!_)i7qJokfWv33%C@0yvyQ-Sm_Ifu9c8GCakyDw@f;Vm5SjrE)EA z-)C=-C~^=ILxshgOG=}Dl!u+&J8m{A3oAc2mPAJ7TYCHq4wBPoAo$e_esPd_(8_CW zT3?8Ic2X8SeGp<8AedesBha~w{0(}F*Z9DKMnownVY{LAr24xdv-^@vTlikLXbiP) z2)O?4@Q1^$Sh5NZiozABgd#wuU%xW)bpTqs12_mU(adEaQO zJ`3~@DMI)tSqlwzQ4BBlV42Rq8KZPABFPMZ(bS9%bV~SQAE9z)&7~HG; z;X@cO!l)BQ%QL2V_db1)cV^aHD!9eyj1KC=XLLPVm*~!0wEhK2+b{9=Uc_I#bp(PU z@KD@1BAUhr7<6~sHykLf&@=YhcgBzDfW)(7Mn~|J!;ffG(K8J)ltgF(fnD2<&EKCk zx8{$srC(WhkHKBO=KDx^g5Je~{@>^y+*F7m@-)nK#91h9nFn2ctF6*TA}&pa8wCcM z-?d`FyZj+o_3zq1k1bq}qHU=(LQj34IjlGmj0{v>(#ESLO_rxyRD!DN-(p9S9)6r>DR@ZAG#cW{Jf;}-d`k7_@9X)td^Beqb6CVs*@=~yopaY&22X#x&mJ@ zfT_>l^`OuZZ}R9mLbctfCH7w9>0do6JF-ia%_+^kxUmNS@lK>b|%GTEi5qZYVhrn|*?qS7AVUO)=c4dP6hMjhx0&?WDwPjMv&IYbWy{B&gMZofscU?7Zbs^glkvFzG%PyG@|Kl^82M4lu2jYlqT zKHaR%w{DIgJUVvg_&@X2y?^_T2=ZG1_?j;3hFA6^R&oULR<GDMYDwe%wLZ1bY zwweHte=cwUo`8@ABwT4u&lEMuB6c5&QFMCn737Ipq~qjg1~d-dvrSgd3k$lun4)Ww|FFyP@6lAWx$A8k}ul2eOpx#aW81pnGb-U2z=ey zf9ix&f;|O;ka6L5z)Ywz=WGf-1utmg^MsBPL#?jDq|YCXKwWpqF^hTi%ouw`W0}u<=5wjrQfZl8^-7(ML>$VpQg(w*!KwRX;p*Wv5E(h`{JO zmaOiF`TS&_?QnWD7eML=mGU9iM$Lb@C-UJod0 zz0ij?8#E{@V=hTrJoz6v^=@hK2i3{5;QF^LynNISO|Mbuz^U=DAK6yprdq|_Qa5w1 zHqD(>Fh&Oqk31UvGkf{*@6qvX_s2g5mj?=8ecrfQHCCc#V!0A!Wo_-7yq*4FICgnh z;MxiqC1zFtsft1VsTcyrHXVbF{T`E($D^6QVfmF$*xRoRqL?&1=&@0E5k9s4q4 zjLjp11YT`zhNbGMfX0H^%JHVs<0p#QxOLo8JCCka^u_eJ6o^ag!c7<)z5c_05B3c; zG!VL>d-Xk6pWYuZc2TH;T}T=usQ7sOQ!w6|p4cjIqbzkR>Ff6{T}0UihfsG~^kmbS zFM7=5L}-t1Y%rhoz3y=})!gCQ>l<61XXax4%bvRh`n4p!cmGrBq>NMPH93Ok=6ijo z^7oA27)qX3DPhUZ$@{vMgAY?=N^;oo4nEgw56#@wUraqo@b{i5TWRaL7Qj1g`yuIK zdU>&>nc@l&|8Xb*$8xa!?cb$)oW>O=GKTV3F`1sZv(}39en4FM z2>9xBd5PGS6fJEq<;=}a^*#C%Cc=g9Q=M&|A1R$H)EmGc{N6ST?t7uJr|vHh znPT$G@qrQFvb>nz*hZyc=kqSktYkMlQjcfz#Bwt#NO)iK^&j+YcJh!hFp~Ro;0^jL zr||3Lp{7e$f0`O_3^R1EDYVG{ z+*EkZzNmRGZ3s}0`RKNuyed@==UzD5e9uvFUF9#YXQ@8J8cZ7hiA0drSv*=^dX}>a zy5EWReDRVDK~V%Q$O4xDN#gAwnk2M7)1ZVyn%=%u0Qj?-K#)HM4K}}`y2l#gA)fxq z*9t#*M0vbGR)aM5VVcKx=tApKh9H6aM1&~#{^$CLKu=#}Y8I-%UrR1Sjh8YM3{*(3 z%r%?W_Cc+po5>e{`SX%0JvEz(P)Q%Gdx!Ra4X+-g^Fe|$CLEocquj|0`;6*!?NldO z2vLS>@H0zoe}0Ar2>e%ntL5ACkZ(~F5mdLKMLuWW#mB4_0a+Gi*EqhPEzun0-&IvD z!2Fg$!k+o4sq1yNQ!tPDqNbl&g!VU_l4q~Ebf87*`^DdxS2Cpy#OSB#;Ykm>x7+re zRU(Mq`RwIa3@qu zbnNKR3BS-@oD2+Z;07Pv^v{KD9? z0<)C%iRp~QBFJaxoVmJ&L&Th2citCah#aZFGec~yUsMZhU-{;c3qaOc-JhS|2w)mc zyP?F+Sz}CiKAkWBP9u$ri3JZT@lmgRzv-D^i+s`B*h8oEYn@ko_daOf2ulKP!%b~x z4q*(sVxQT~vGByGaJcYuqA94f(PpHZWtfkcE- zy-Q3H;b}{Xzd;#u9*9w*s4E{-e?^7WCx=NRYz{t@FQ?l!8vot1{**-}>X&Ur_$M2dqWRS^Z5Kw$rY#$d~~Qp9fg#Hx&L5pKNJ_#25yY7 z7FTfjF6Te|-hhCzHIt8L!J9mduct==Ru`*qe88VuSHL^VeXe7aBS1BEwMZmV@I2ix z^3Fv2t01kH#QKQ+Hkud4!}00v4!=sA3OiTxeTSqSyVfRCe;GFGfW3buI-Cy2a@n(U z4P8Yl1x6c8$Xv1jIR#3FKB#hoi#|Zk8d;XFw*T2gM zM7zjYS~z_>=lY}7AsBG3&<}<2f0ET8HXjyyr=EW2$>Fcg2jY`)nDBR+3SDC9R=SQ> ztwe(bi#vRcys)eF!CNLnC2gy=-c+a~g=61cuiIwnk={~xT`B=%h3=_xDkTm~W#+Pr zG85T}8=C8|Z_nyS8fSlh? zlK_O<1l?E?(h__T?hbULPm1G<7j$DSRaajt@c-4k9_gn*xZ_>71f9`}k4-qfcLb_W zu5`^Kx1$Wv3i6!glXOWFCmDreUcqaG0Bov)KXprpfTGd!rH8p_Zx4QxViw&F_yzq) zt~-BKA;2*F4W4lejq%ZT32lV~)(d-r|Z0Z%22)Ue%l>3c~|_7vDq z=s9_0sdtLQ^vW^L+>8M!Hsm6zd+)U0|{}g@qj>H0AyM1jl<)i09G0bU##kjN|Jw z+)0&gI~c^i{~nq|2Wo#xXD|SM0~2C3*7+5YT{CNi=?nj`&2seqLl7ArQ zyfWiiuQVUvHg9j$EhrEWKwe6s4!tqO>FS0b|MnJrzB*NHKoNNxB875Q!Z%`x0zTiR ztWLIYoQ|zyvm{>)PA;-c7^M$6p>rafV%&h*fy{O&S<2|-M%-rl*WUo!uj@n@Xj`Fx zVFwRJXh-rRY8eh8>Xg`8JnYj?&nfr~7pJoo7H#u4d9K&E9IOd8WE=kcn;w{T5A3;B zX%Qbe0ffr1Rs}RE*MaYvEnZeS=YIilXRTG>)m8Al*pmkg*mh1st*N3Os2TJgeIyD) zN0oY5i8VM|I7k4?5fi;8i|6kC;dc+qQj6g4N0hZwAE1cX!=#srn7M&P1BJ7`rYu@Q zC_{xS{8J+}XDIz%OwKme=P*~DPsg7$cr)0+smx$QG6@O6Q|8h1Nlf!K<(7jA8d+wA z$^x>@HCdZ1cTR`^jybetY%PaG*#(Wmza=Jm_9OK|+DYnn}&3>H+{Z_p!M2Zonrp?KqX^BQ9kIlM`O#qle| zoc5clGJ*U>l;Mp8P1L&Nm-3gtgLCW`0#*|li4%p-oc4dearBnBSuciC5SPf?^Eu2| z-z5>W+`rpLztr?7_+Za{woFkRj=)@Up7O;s_jauRy~ciA{$hq#mlXe*Z$_nsyk@MH zsV-gUh-wCegnpVg@royQvsYJ*bS9H2+F%+Wel5dD*0f9R4wsX@A?!w5UkWe1&K!0B zM251{c*i`0fRIuHs|F_KXa-l2l$3y?CMUQdO$TG+X977X%?j=p2OsWz{OxGtqbvV% zUkHl&=O1$ykiJEn45dke3U~cCwydxJl~P2}6Byz3=R?d5T{vJHQ3Z&rS&$!R z^cf^q9!$R-NelE` zp!frbKXm6{Q=z8F8RTn>7;5s**(-NeF$qeBSBh@B0J|PA&rI!#Cfz-1H$%};*!P55|6P?IGR35nV!by^Z!|2=jear@j^Qj!eD&ksJ3}OyYJf{+MGcK3 z%CeRoAFRw9io_r-UTPJN0QH_y1IMeHA_79tprrMa7*f!XzqkEOnHmD2QKn^=@txQ7!Ja(=XqWJzI>a7P}e z6G&WCEASo<|MP$wFwpg~2gYd_<}ojnJp0&nS4_=d$okmP_1i@E{VFn~&}YFyZJaVS zY47eo)4`}?3SV~fH73uHqGa2yo=RZxVe-3blG7t-5cR(MR_M&r!?DN1Sg5ek7B%$x zB@TYCaaGN1XhG)h7wzF3sTPr%b6Y?5lmPU#q+PLd@9w)QeH>KQe8` z+rKvQ2e|QKN5{?Am>K_<#dDvizlxmHLTW!4vy`GY-58dZyZIGpra|ogh;a!29LV|0cTP7z$cFNz1WmEq{5-X0d2fc zHpCsr$>0Tw&rre$N9rRp_GzyX4^40<7m1C7Lu99d?!EK4gim$FV`)CWI*^%&M~8Lj zs`X6Davv)+UPwR}V>7JPZleL%dCFMI;ATdI@E%>)pAD``R%s6%c^C$4M^0a`+UFwC zwSH>|O5>`r!TtL9B|JtJ`?xj(E zqQxEW=V+DD=$#gT9W>M&llitxc`iHk^I7@IUCGV}B@Q3!Ol>+a|)hL)aB*TIaV zM-Itn;iWCrLjuByr}r~T?Pt4C?C@`$#~;cJDukgz*`=?Ls_tC(DHl8dz$FI0vQT>h zHdfuTP4oItV0^r$QDM(Te9*WO@D6|A|KxVbToAE~c)Q|VgDxoOFI6QoB6`k1Jl*mD z$QRS3<{(SHiS|=PAz_>`ImT73ANU!=Tw)R>d-*rxP}K@Zvlu{Y%!a&)@3?0l`;ks} zO$0LZBruJnsRIL=eU zmBed`nlz%@nlU|3j!er_*1z#W6UdKWLX;nl^!HKKd{d2d=(L z+5a{$uEvFoA}zB@f$X8-d0_T99MG8eBqPcd;iw&NBsxJJOzHWM0YYPo(R!Yy;{yuw zG&flJniA?zfox|2U$70peRVSqs4$T+K+@t=Z?UL;p3H(JkS+`g6GOZWszAZ0V@ix+ zxqYb{o}yTtOGb0Punob8@DJ`d-N+7Ufv6=q^Y#30(NWgOMU(; zvyusd8f`jD>?u15t&WSvW!mma&4=4FAkLvCs&rE$Z8WP8>#-;~9~v7c+!#xSXG4o+ z^t0ohv6s+2>;FVPI~2WLJxym?|()8znhQRw270HpYECgrD@`hT+TSah#21o)JrAGK=Bx?c-M?k zAu3ZFMq`ka01Ri(-6k-!|F}EMZ#9EA$ZOp-`nqy2|C!ZEwTQG? z;rxRkPB%1mFLbq#ZN)uqCo=89ulK+1*lB@sWcW-Xpr~D`O3b+ULE__=A_llM@E>3V zDZxTuiVsj`svbbEKayELSR7>s^u*L(?|ff*&89yzUXj zGD5mFb<0TUb=E~KU>5th5M(7OD)LIAB2LTcD1De6V-=(oO0vsP&skt0dCW!)DeXIp zD>@S`X_qzcHepy3z;_1_I;jLJ780{{vL*W;TdwIo%tbzdz=mn%C_M&{;N8Ua6SB<$ zo`X#TjMWb^FcNs$q4jTXr?&?4jy3 z9qlrjWSaFP&*?YeI+ov`Mu~9xf^UNVnZff^^`KyoN@1nUNuKSBur{s_=R2I22LAxV=k&_Ac%5P--b?^d^GO6h7Bl_uy2w&5o1 zeCd;LsdM}Ha}rH0i9iwRp0e2=BdN&q;6*W3WL6UQR7c4Bq#OCZF*!0eS?&@Ya-F#( zaiOkhn{?SYfZ7l|7V+Nh}k zDvsjB_sR){^fe!8WB{&6_!0$fh&{g|_u~whk@f0V+Jag<2569Y`S%rZ^4C3KaPAED zi6H_2Ug`|9B3iL1bW|oOGQIqEJW3IKV*(urFP*av*zcc{_SR&~bnK9k4v|TchL}AK zDw4JYaX zE4|5!Y7Rq%?RKDn>+Fgea@S2@z3B!Dc}_oc7j~>RIf98c18dYODTML*Itn z0N=5wI~@aJ93a&M&NrZ_e=n3;Bk=9UEFf5nDD>h16CZWD4c4xRzo*yi{NW6>CXX4A zeMLEx4& zpo1abJuIA%j{#zHmIu(5g~W{lMLIxzO7cv8;mw9lV2L&(LfzEtsRZJK;|PjP^cFt} zyWuz0qbdsUoe`cslma#iMnN-4Nt8&s(wfV1I$zqPTfYeVo5>*L4io8dyIlYlln2XPam7)V$HueL@bs#V|sNHXo&QK4Z)R48^#ASI@wl^cMNRtu&pV zMDKe1#i5;zs|IZnpJS=h^cMi}!+*zY>u;tYB%j`pwp79hdfs(>VZcXoO(%#$R??L> z@G=$dU>*bIDcvYAcJn~QJ}|K8mGzo0l3jPO<=)m5;bn>lx@tBddYo!>dDY=#&a^GHuPl&;KfD@4ufm zO>Yc7>;2zR(#>o`o7hLW7nklf%e!QWEd*xQ{JDTgztaH}N$Wb8O2dI7X8o`#Nnjl4 z4Nq87rmL_H43=T7-KwX~7K|vvi%W%Gg?T=2Q0f{}BYbMsJ}ikqBH~0}6ccnMbe88X7@jtG6XhyW-`>90uG8yv zGP%fnEIzv0lGl497K=|y-j30I7Bjjx$Qiwh!eVJp>0FnK1@xZLH~llqgd_J1aC|6c{Z-NlCo z-TN+~o;|fflSIm6bZyIWqw3x#wwV?k8~9jKSyf(6~hy%+VQEjSE9$tZ*o$nSIy zK1hqJHswVj_YyO<9)*RBpBKx*U|;=Q6U^23y$ten%YW6JEKEY|LzCHuq!TJ}@%OE6 zZSlV=B3jl-d+Ql~*kDADAcEeCBm6#>bM@UubSQj)8uc#mb*ZYe$99S}eF(=>3KMfg zmsy}2`&PwMi~Ef|oCPw-@0m69?uUewt0Alh4fTp=hkoW8p2KVn?MJ|&+rXsGnEv{Y zHWZz(_x|l?b&rYeT9MIL_3r*rj$59~%_k3LWZ)!&Tq#}PgT#MNZvC~Qk zpBaYV?Ur$sja72-zq$KRe<4tQrHu~!nq!~S5J_3$1-+&0xCJn0`<|7ciJ1>sjPHFlYFl~zjLKJzv(Jo z5o3S!s?s;E(Bmeh%(Kz*uI@lI#y^Oi(M!R|W9U68K_1nj$*mOI#;X`@NOCwGfpa-y zvK&`@i}P5{Ozo~T3n^%=S1fqZ;_z@ZNO8-zlmN43F=+V^wg6QfGg0SUz)@& zb}_R5NlHerccvp6DY@z4a_=jh3OH2cwD!|V2=VTyY5@W1Sz3KkL}rpiU-oKp1qz`H zpfI^uD#X9MSDvKHjnGW!Gd(o@a{FG|Xi)g@WVJy{xdhLFhJh+NK#c`Dr zA^qQwT0R9moxjQx*KA2+&E;LliTWUZ9DbQ$I z@-++Zp~1$YN7u7{1s+@`$6(~C9Ba4M!wyC9Mf^&7k`;eMU_ea$cT*TJO}~7<<+go% zLl+qfNPzNfMGJIZ_C!t1(t%bwCh%#_f%#IOa+sPMOf6q(xnf9P?&seqFuDKvF%KY3 zX*OyTE}j1&jQFUYSgMJ%4~UG|Km&Ez-=QCtoMqh*s{xB(S@8PTeC=C;;?KvMBjV1k z#=U&y_i-lo7Pua8J<$H!^2jB?+upJ6E=vnbQ$=pk zc3;sXYB=?Uesj*XOB?tg!oF5dt`lMO`de>3XRKcF@{}d1O&-;{s`Id>Ib__6uVD%c zYP-uuyr*_17emaHqu8^f%HjA?%FvU{+(lxFP+`=GQ?u6V&r^?NW8}^MuiIKM$GgPQ zqqqj8>GfU802c`kB1#Z2&I5JM^c*nJEL{+0rNu$RhbX5i%SRUx}0SsOu&3||KW zRUX+L?&@b;^WMc!u+{Z7Ezd={Cu1<^4dLgEEVLy-*ThJ~`jwB@;? zxvn3N!OO*k!>p*1NoJY+ucH^&yA%-@qN@Jzm=ObKsjWCwqA%G0V~X)$TOX$^(Tzve z{^!MoRQk`$`erN-T$rkOyj>Mv;sB1-&SuN1Z-FEIq1YQ=#2Q4n?dz{C7j}_2%QigX zVRF^3ddrv*RA(BnFzp%*{r#CNRI`k*E#S8IKiAzE2@0Jkt7Na5(*0Nu(d+**h^}LZ z236yy0PRk8PUW|RVpxj7p`n}lXi|R!2Bi3T3V<)RONV1Fp~2%*X}eiagSx|Wr+M^N ze8vNDEJM|??dI(H*@6}}QqqZC<9Fh&$hUj9_>kF+C04j8XAE3Di6V)H4u;OgX~7ES z_Psl7*|T_Ll}Gf5*%z+2$&!f!zONE2RP`EjoT&u1CrwRb@=?A-u%Eo z6FKYkin(Lx>%n5P2++h0DT?jGeklw4C94hnV>15AJU9Ghw^OempGPS4i2HsFeq|bL zKa1=_=<#to8wbsRcRsZP(Cq0MA@AC1o_Iqo0BC2>nbX?-?YbC9vMo z61`->mmZ~9^>VRrTtXYkYEQyg9}#z4+g(_<^r1H=O=vYdZ^I!x?AwL+ z+T>W#6ROWC{Qn~{{kK3CXzl=ia1V=3;LKhCsj?mhF>rDbJ>@la915{~1vFPQSkQ~4 z-{b;~2`msXjk)e44}XLDFVeWK6`=?Ov$P)~?4TX7PM16(NEXyOiJhu%;uGFF&HWL4 zJg*g-(s_WHwe~t6STQI9Fv_;M)lA)&Ca%#=7p{8W zTs>BM#F!(T#`-wf@Pu*V<7$ZkffGaGT4KHXUY{ezeVf;TOg; zX`!Q2VwEk=XD`W+z$z|7Z9yS5*|jV|3^EfSuNMtcw4e*4CRA5m5eBmUsLo$i z7#R16sfL2|C5ZU>J-eQj1R@>|Jvw%DW%Qk*4-Oo-{GoB|^`J>D#w}AY_Tn+YuCa*N zEfmuKSaVk19rEYzw_Wl9$j3w1PCZg-)I49_4BnDAy8L(d1QsPuR@JzW`AVf14#qkAC){MB?8R=8!sB8d9zV#4<(xYI>@2C%;^u7^(uLCrew}QVrxCgV zFzq;H=UVyuFQt7vA^5C zcXvk9Oza2A#{U0rB96QJjwp~+{4uMq8Q;+-sPbi~QoG0~Ufi@~8| zIO*{p&WAquw1vfv8~WH@O!M@ zclDs1pPwcycs>o zCcuu<6Sbb6TPctLDT05n;tu* z0+8kC6o{(=GhKLin|+Kb#6h)E1`ZZLv|vz)k6%gI8Jdy>KRL^Zp?}f^K`IMp#?pJ?qJD{*nknJJ}RI4H1(T6z+is8Cy%Q-;P zZJHZB1ZfMwR%IUOoDi{97Dj;52@_27pk1r><_YLx<)dIpjNwV+$~IBCVXN67gQ@Uw zH9#g<7|c2x-|^6hY>tgiZl`I}=U2B7-&dvOCPQSafE~>?&VmnVeM&4h^;O&EgMGXW zO|53%yegT0_}=b*feISkDm~P-=5TLeGn?;@>Zu!%JKyg({NS!G`0{^w2DHNa%T-24 z`FPCFo^GU9KpRhi7B{d<4s-E){XekC;5h*hec<3%Arxo`?Ziz5HDak=+mTRbBGO!2 zH?fctg9zd+j-B0BQEke?&=XT`ZggM{91x!1MO8fewJX4rKAn=$EF2>1F@|mr;*Sg}-%Ux5$c}?>jFQnL>UD%@}gY@n0 z|7M0}Ze}^5?Solypqv{`nPXd;i&53_)jcyuRa^o(|Ex{mmU;!)NvzU zhJ_*mHecG0-iZ(zQ8Q!y(A8ZR@=WL*`jlqC_MXDb`tQTk$KCrLqLioXMv5+ju~f(3 z8zywFpowi}hzYb9zP#~Ab-7CC{h;!_#O9OE3l@xc0|4~UjImWxYjjBSg@bnp3p!LP z1?w!&ch#IJ4q)kEW-}keu==q(Eo~eZZ{9YMdDTnOoE)8^ctrvw>?iS*PFGXof$5>! zL$vE{k%H(Ufw+@qa<7^0;xA1p5)t%czL2hG6G_Uk59|h{DrT?A`PptY^*aa~ihb$& z?==1IhK1|O8!49nqcVGP1T0D@KSKFIz>VNqFy$*y4f^xZL4w8S2-gJb{Dc`$(F0rK zr=R4{nw~uqCPxa&9xuH3{A}oHdWMzguutda_C>h890nvU5xVeqNz88i*KF(8fa%bV zTqXcjTf1^5F9FNIrNc@Gqz+^`xB^1p{Gx&($j!nS8O8L4eE4B{zsyJCcKlt*2T8S( zoIjRX%1kF8nR|JPvj4Uyc3wpV+2LKc&2?r@W9z(+k?*{~O4Z@3^vbjAb^{l!WBu}_}S^obt zf^GkOikdW*+Z_sWLXmPQWL+{Fz=9I(aST{pJBR{%{Lb&8P@*k*UH|l3V0>myM-W7B zRz$94mJX%0GSVXkgW%Iz%aN-Um>!Ydy*Ak=XCvejQB<#;y)7FKs0TJUcm+tknZN{k zvWFA3GH)Qty1R6rBl8jnekNgWjljqY#^U$vMpI@kabb8iBX(&~0z2!<3Xe*{!=2jA z$Po#*+aDQe*O9Sk1kSB)L-BAn30yHOCbPxH#1*Kg4w~D z#6*LCdOSHti8;QQ1kKutntpA`Vl|ALFTJC~vEWIRawSk>M)J| zU#qO6YfdtK>6}G%8m{F9_nK>}*{6xC3;K7W_x=9=9pm*y$&c?)U-vOjanrn*n<pZ3uEIh2L$r%H(bmr;M)i*wgahEsN)_KV4^>7#Se326R zY}V6B9=8e$EO_B2G@@*Xq_$$FZ_^Z(9*7ljoMC65=+$O?-wQ@w=1_ftQk_+>JMo{hIcAUQjQ-zzbfo!3>22R6t`yfRw@~6y6 zV~T+cL~mHmfKFxqt8Yh9Q`fG*EI|6l66^$eUrl94CT#(l`@|^#wJ}<=_@JJ|ftHXG zcG(eIU@G7K?RnEql^{KML}j=w!bC@SA+N2;#qiG3!5^3wCEtc56N+9M5~p*?_ALn| zk+b5K^8a{x4{$2~|9|{-pXHom9W%RQWoGZ9V`gWE>?njpNTJ(I8QG&$2-z!yqElHR z6hcN6GE$^S$nWm``TqZ|%f)r$xbOSC?$>iY236;IM@OwBLj5ZjqSPYxloanqBlN8n zedv@uF8>5ny2+k80xUwSBnWVHP&GI{cPtVDMV=o&#Q=fVU)3ZrV$BymH`!Xt-3!0!hp$m6}v`{SYSNfc?tq2#pR z^@{^iX&~k4)U4a7$%8Y0A^*JNjZc{ATE2n=RkWmVFb}eojK{n!-~|-@S2zK@3=lo1 zg3Qx;t457(nXr{*nf1W(W_rSTY(0phL8G(zW#t>RMcTE{v+<~7E{3PdGDKY&3g{>L zG@nZ1L6IMu){+_CKgKrIofeSuQG33JJq^+44Y8P2{81;b?n=reyAGuN`zqs1+**fN zyDAbTkCv2*o+}!_@U;#6;i;#yW)`r%v5h>#%N2;k#NOb)oj}4N2;N1zJb9XpfXD*= zwQNxN?`P@mKa7AXOCB6n1AS91;ttOdIPK0t9+dS5>Jj^Doa_&Hdb|0mcXtQ%rypR) zeFgcfgV2fy2CC2-j5p;%8*W)1-DqEg z*;S!}I008j(GPfJz82qxz}(PisZYYjfbK&aJ&_}VGi&dGRMyH+ zqCQQ6gZDw%SK=M!n}kQmy8p+shEHg`5{AEUQ&0o(=4Dn=UmRM>5#ll^5gSBU`L7_5 zD8;Eq3p6B^h*;`#XesP&6A|H}7kgfbL9Tu;?eEmHOF1lhF|c;TezeW+DfzV|OEBS( zocB9)LK&$waz|3?5sG$ah0{Jq&VX#EXD}aC&tp`!kRF>KnI{7G_z`!~lwVZqW)We#3NI&O_6k~K%TAEqf7_FM4Eq#IV zfx@)3??+mAm*KN_hVi>gkmh}(50N;FqEme@ajfXSzdcq?Xo^X2}3wF818x(!!gmj)BKML?x9*5$m;u#J>Wi#UMwfz^FwL{Y!F{tW2IjSNF< z0%J}QAX{||IpCA)T_PtHU0ffri|md!Q_k-DAmU;b!GATsho0fhEoMhmwa^jIsPXas zQKgBg8b{B}RWboeZ>Y!lZ>4X^%EW7J{eUh3ORI1cpeyjNM&qE*)$lh30fV`TF`;bz zOe;gRMBJUBd+wjuGTrSNdD82Wv?jN%Rc(rY{Ai$SVKGDqwyvZ7u^JOgfXe;l%4IOR z`SLZB?w*+Iw%vS}Y~O6$c<_fyki?+!Ng(Nj8V~CH@SFR6q&DUkq;lZ2lesrG9kYC1 zFtc>A^WId#8Lo(G&$4pn)bhx~4yHin0O`OZYvbcp+BS5aquM>!c)QN>a*)5hU;?FV z&q8+dsCF4i+I zfK5>m37@OKC4vBnGI&jTy!M{I!B7mKOUtAMAB^r;X9qx5OLP_jkUqcQ-@23(IzT(L zYAD@@f5`K0(ZG9D&TlIu6Pr-K$&M*B&VZ%p|L5WIntn z@`&f&)}4zRC%-zzr`ORO@~Yc@yS-0peQFtRabG_1Y&@ILQV2&qYWbB5SBYkvIEWy0 z&DXq9vL0l&xXBe3@Z*Sg*}iPNSx~@h*9sMt{eQTUu*vVCdwUS|)z2?3pr4z<&CQ?w zQ2fk708(}9pk_bEc0=&9si~ybpf5cx@C(mgE+D=Cv+_(#_zNAl^~?MEI104bwqEz% zH@QE(hJgy9FCU#9Q0rm1q1`{%6Vx^99#7C?z-11X*nASoXW{BIq$_xG+97bOG@3d4 z-9zt(R9Uh<)FEoL`dp=x@-&JzQa1tDHNG-3(OvhGbF|9a!o+umxg23$(<@gkt)@u%$P=EhKM7gP@!&S*{IVW#30 z2bOZ#*{%VQML4%~Epb?eARJcR-XS6M@pQZ4s9={uKM&G@VEzXqSby_E&Y9PR4|bHh z7GO8PR(*>MIC4SvlfUrhk)!al@pq_M$DkS0w&Q%?7n%-Ri6L^aBLxqiWSlaPyg1}C zKlfxnZAdJl$U_bg;4J>TR>eU5I|3F&c&Z|C^HF!4 zSR?CL_FV+o(6i)Yqga`8d9|uET5yagteMKh#1VxfLvt_Kr>)6@l0kNTC;R6U%~ut1 z0OU``dsFnB)RdSoO|t8UnK#C3zVL8~9zoZY+>Zas=aG!rp&@WXR{6qr$xq`G!ZlpL zZ&Z`75Qu%w+1q+{{K|wLi6#)%t53&?dX>z9{{x0Avi*ym{{h3v$k*qc5$CMrkq-q0 ziuQphg7tu)zLs;{_h~l+(-Aag)*<_QX6!;ULrd@lg8A*6 z-NldlgTgsWZpXMy96=j@7I`lz)yg+Lw+j@^uvE*a4<)}o+DdEWy#ApWA}?R@RMkk! zy_1zyO5jbkD(*Xj6!Ir+W1XjcZy#g-1?lGy;YV)^7Ox+w**BI;5!zz3; zS@=-t#QFCZ&kb4?%4RrqZC*Qs$U;OL6e`x0UxbnEEO^rdzHx<=B zxT-VO_ZQhJ8s+f$^Y?`66~2qpp32Toy^dDAz*d51PZ^(Fzu4|HYHV1MS0=}wXCPtK zL-#YpeDU(ip(d2hXOT^uvhVGW+-q1*D`?#Z!!sT>JT|?5`d(+%g*KtOzVbC=o(m3{ z2{fy(zWpFy3{e8cbJ?BT3a#x5iM=#Aa2g$)2^VDDzZ&-BKxb=Xvv2#9YSqTOu(j{G z_UFRc5_~b+OGn?AIrsU;2J?i|?-(_lIOhGPkMC^+V$G z;lx?q{Wm3x?+ZLqMt=&ZbIYZi89&TOO?VR%X^3(5l6{re89T>5&8T}n&j8xe;NfZZ~s;E zxDiZO|HM4w+qcxu6NU*2c7^!Aqe}K$--2RY08M#vAkaj8(2=x3QkUqrszgyUM!E33!+wq5#)FZj;hANB2^rqn#STS@=fd(Z zuE>Xnd7Sulbzei@M_iZXd1~HMZgRt1&;4Yp5WngfMl+@MvRm4bj|Yk3F5kzQ9BV4o zwmF$EMw~1Srm5}kH`Z`ziYLD08yD&qWu>vd-*fL6m>Jh?`Jz|+my$rL4tKaPt9Usp zBAu1C`b5uZ@LS?P=8Xr-htl&(0-YwEJcyf4%6K9cUQd24j|RKKEok`s1GU1g`8O!w z>(O$yZ&?rmt{T5)tKJqqva^Bi^0dsps)@Y({z2x4^RgxA74)&w$`sbe>@pNe90K6A z3X;a@d&s@HmC!)b6}eDPA5-x0g|FM3T*f7HKw)QcqQ_A=%C{{}PCRl0)Xv)G6oG@UIG-)QiEa@lFD1i4M!`SZKYF4VU{#VD)*6?d?*nuGllYb^JC5@zlf; z_34SRFYMRv_Vd2Xxv4N_-te}^Cyh>s8;QcWm2TbG3&9QSmlS7SOIv-s{k4o+L9G0u z(EPsU1$OWeQC&yscLqf)HBeND@_^-`e6QG(-cF*n6jEFk0N7&NE8rNIZTMgZe$pM8 zx&pxmG(e@j7fZ#1e7Tu7hB;eXA#6WS^YDPePYF{iSJgxA#{nfB%g4wd*@`^?X9r5G zq+~#;j;HuBGiC@5O7=(#h3XsC);W3#9P?v#gG2r6dP^()i=TE&3NFbl9>tBgnk>r2 z(6|H1JBkeeffc(xhv;JUZpOWgH2HX6Wp(PNp$V0r~L@N>=llUGX#D zBOc`!IT~B*Y)HAwv&UGNf@Mx509tn+W;w+AT}X_Frxd9g+Kuw`qf>j)CzZ?CeJ%H3MVSz8Iu`9=N^DMECI?{O=zND!&b|7;uuPGioK!hgpf5m z9*!boNLntShC-H+A(Lhm(~PWz$wrpu1V>+{?Dp5yG{aKcHYdUy`bIXsN((t0?sO(F zPd6ISc9>`c#BI4X&c8|P3FlV~!<<2JFO_?zOXVOt3mAj!2G@cY`61~UjWxA(lT zpVqC(rw9FoXb|3v6ucO+h$pAEz(xSj=cN>{wHTC(4&4Im_<7rm_{lr8M0JRjWwwelt<(jAngtBMKFuG${RTc`QPW%+xy~Szw$Po3+=pcNc{UT z^o~D^DAqomUqN)Bj%z&&3i!3#R5;xftmVNZ95jW_WX;DQHRl1K@ zuuOTQZEaR>Wx|h6ilSh@rzPY09LpndER@v|HU@l>g;rs)x!d^`&e<+}PA5gaD+ucw znWFf>=53g`LRHHn_4OE+)!qjEgZ1En+9oLgp1k9iycvlmHju#A0*f4n0j zWpF!E9`ADJ&i08|{?S?>N=4ieIlER?jWgeCnF~N;y)|ZsANdwv5E5garRn^aAN=!U z7*`5YBVPcuk{jqHb<1dp$1+?j7%44rz-Etw;Fis51s2d}tAhm}u?=tURC2=Wedx;% z@w3xT0Q^upGFz2@iyx`#5sQJM7%_G(;a)TtKzDA^868YM<0I3?td&4y%K#MStdI=+ zitnf>c!w2!3T{!!k;P=I8!j=XwA%9e$+>8DmD3m=1Yy&)vgs>OMb=q}-epeA+`f@(Lnq+mzyIRWAoQEz z{{S}V*&x87cZ`E6`i7`G0zyN2E8S64^;Eb!2!VP+w^pLli$tE;+A4Y+tSMU6-EZo7t&6SnFTMWkWJ)88qejq! zmtP_e&dU&EYy0J7X%97@$qywHA63aOs9~KGKN2;HqVfW{m@E4{k7~=o_n4^Gj!L`( zH)ii>F3~|W?PBaJ`}ah{qd62AW(;d<{VsC*at`UzjU8&mq5oB0wOplVP|u(#OR68C z@P$h#xx+Hot%wNR)H#qzZ|l9?QV|d*IEI4vXt{$l5pgW=;7uCCdUva4>j**|-BZ%_NPWJApQ-AdryDUR-mp=XKfNHF+I z1n_0Nd$8l?@e?E*m<~IHA3rzB2FeOQipG)OaOsB4U0L=-y~A>mq5C_rEBnS(NAVUh zg2|aKJX42<&nRnNR$q_)frp)uRPZ`!VObI={g@$Ax%0!0Qj@bOIuoK(AmQGvSSygi z(smAb$12n_fOp5g`XY+yaznx1cqCw!&b)d8gl`wxXRxyBcJ3J!8=2rigP$iaZ2BNB zy}(k&C7&)ZxOWEA+|G5Yj1&#oaA3|INh!XgFWkdyo0Pv$SmKJkywx*s|Gdg_sH(O7 zf;WKa+#==sJS3IHb?YK-I;d?)Iv-x+R440rLMW1G#c<3S#p(0fH{1hg9uiUP>oqR4 z_aWf2JF-GkCwOG-2xbNvu=SRUd=|~&IWK^9q47+5kGj9((YsckF&f1xo1E+V>Z68T zW+PK<{0l}mc5od7en+(4>Q%o0d6L^JY1eT%;)XJzhF(LNpUd5>^}&!rR|)~#=C7~= z`HHU7A%4Uw1dR#UE1LrnqXFaiA>C6Mqx^u z%Fh%TuvJxm1o%JKcttm%eCc8dvlMTepjOUjZIdE<2^XKNHbewTT#lLPn5i5P9%7&a z-{bmeCOLa>UWT6ZFP7*bIb;irTUottZBNVJ5ib&!>w13rdx5K1c1}PCCx6(99u^SB z2>v&^z^UA&m$^p^=e97JY2anM%25=VY9V@%p?tnd7Sz&JBAcZN=%I`)&7(-SD(o~d zl$Y|^rJDjYAo#b~8^__NUp{W(sJL=0zAEBrM-`wdpnq!ljh3VV&Jkd?M`He(#es?e zfPbU6i^7R_hniELkwvKt+Aj2J{%Km~LA>kw*eu+R(6W+ddB&|j2@;`N(o&!PtP>pn z=);2!4f*dfElliJ%8A%(zag?K{QRB@v;Bd!_Y%wP<+NswGi`=bM5@Eskd{B^L>z9? zZCK_llf>tBKI1?96Rzh`7~n+c>iyhn-_je)?&|6w{Yo!kdDsBz#;#J2Mr5TY;6vrasTkMtMd?|&w2jMr z4>@t6JVEeq?J-{ap;f^Yd<%2gBk3vNftzCvKJdCnUc@Ym6s(O(*cGmCD}BqjMUyV ztu$>=l;P`x^*BrJdF{kkU=(?GD#l8vn{njX>y1fG&<8Fpyf`Qwe^)Dt;)Zzz zvmT3{`9+W1OZ~9*g69I?+S)a~If%wA<*>ol>nt&O9pKn758&tHa@t{gzi{7EJ&~2r zEb-!H`}9Wraf73}&u0I;q*+IUu!GAB%NL}e=BSN*9pHrSU`>fe3Ha9MS+xkn0&-Xz z6B=0QEhmMrfT~ML${QX4U$0SlQ0or=Xh-0aN{sG7{0oyO8@AA3D`%qi zHV3l}JNRPHN44FhKP=`c*3+a(FohxrB?wY8bd|p`9`QM#UHBv4R(Zh=cL^lQ!ri|F^`#Lqr4x`{HP;i5Gh&FYb}WaABG;%z{XDosxXvOUERkPz!jI# zIF&>V39$5&bgQH8)}I57a32eWTr@cLCHypsRkYS6->meI04Ns)W6bxqI2a}%@Il5KK6WOkX2ginKPO^8#Fv=V3>=SbD-Do|5d!bt(lq0t%xkoXY`~E z>mg7|i7+z8;ak51vfASkUFjYDpP-J77zU{xZ%ROgmsQK^;A0to$>3a|CKzI+J_(7=0w}|*J;jI z>LYT$;-%p>O?X^?503P`a_hT(sE~cb&bP)x!p6f-kLXdMC+0lp~zG-6@AcYzp*?n|s8FxdqXpySh2Y+D^+vjg1-Xe>k);%?=%{SLKUilKsddb=xc8pS zViF?OY;I|Iq&+JR@oDYUVNVRvx}DJHGHKRNp+?y-xSqcTHYCg01^CP5dW$HJrW)>c*+ z2SQ%J^)3oOpxNs1wEKJ9DRZeX(9MM=3X3r_0n`~zbUz;14|+Fjhg*LZ7M1c{k$Ca; zLj+yf0|~d^oLX0|r$`I^OMU+$p!jaJ9r1sj&3-OxLeXM)+qxtF>}QW2K8GW-{_SXh zs8sKd*jYO>`jc022-}NdtH=64Q%vN$PuPv@QDi@le9p$SE-v@DapNc_g4EuhcH^~F4M$;x z=kAM01?cd5O(d0XOZ|>iv|Sq1a~pDuv+vzO`_D&NeXD+rKO>L}N=0#udN zZ4)BJWnMvv1&{`-K+l7;v2-P{4%|75>n?rWXmFG=j5QSVIW7F^fx;SZ4jRnP&>$-$ zB!nvw(9~vD^N#wfjl$;$hXA=iQpOKZ)+};@sxUEKYD7ZDwY%g7FZ9)^FQ~Lb(Ga%U zrn15@vo_sUNbuRcn2ksb)0{b@rDJ7HG-HF#^TGvcef_xep-b(1Z=(m3OLOS;U*h(d z?vHwM*!vBJu;VoA#95hpvpy>>I<~J@V!p=w z^Dn6#9zq1FR6jD7IHFu!N6$k!(yxl8P=E#QwK$E+nH^w}M#anm%GU&mmEB%<6UZmu z7ssWT*+-W#_1@x!ad;aC4i}Sd2vrJb4jJU~2$(Um=N2n)a9-Psl-x>&kFQ=T^Ie+s^CCsY zHwk{2-~EWC5d5dEM|?a)b(TaP77A^ET(ZgXf08KT8a;m9xOiq(vN$I;hMsRiajMSu zabsL2`;VRqs&I2acX-1>rkY+4VgrUm3KfVt_+O;p{q*>n{;VS9ISgN+CUfcE5%%EH zNwke2vjM~5L|xo^W>(oG1eS({fN7}s=Xz)z3pD5kQKiiJ`B5m-2%EQm&D9Br$&Zv~ z!l4U8x&S^Kow&Jc%)7~S(PA>p*?Fun?j3RIyP!tLKpvovJy3W*9f zc_j;&>zXX?G2RXYt{0V?vk7BlsR-Gjfw^rxwEI+;v<^)sj!4HgqInC2r{+ICQ+DIK z*GHsu2Q!PY>smV|uVSOtkDFjM7alg%Xv1wy>XGc-Ls1NV159ut#5a*S|9Q%NnaQa` z@%C}SxIkf*fNc@w<+(`VmqI7M9sX(u%`*Sb>?ivW<_f*p{cL{}Jx)Fr^%Y|TjEz6# zREQ(9wk)=FSb96+93Oy7v%xd;^{rVXUx$N@!ywz!$f@M~m>3Qz&1PT%#@ve>>9>1I z5p3L!DrF&^@iQ#RO)?p)5LDyf#|TyLee>R3va`Ntm7!zxs}e8kLC1tA7?1=~_~T=2 zO}^Nouw4~c7hDVz2S#UutK>EP2}YA5ue(P?N9hMuU!6L+>U;>mQPKx=em5(m5FYJt z`^=)68xW4czG56sjn%rIcKMV6aMSThaopo$ckH|AXc&2}XjTVvxCb~*{OX8E3jP(b zoF4Wp4KMXH*78 z{dqZW1kQe=`!4P(03MBC_R5tDm3heZ6Hmslff5@gt(VN!Z9!sE@S~rbzQn1^ZvnGlV&kM zS*g5grP3hTEG-MYdF#!1c5b2XM(@>fovkeO2d>&}+L?m$Lev@6i!}L;$kI^ky|maQ zId@1WkBM?b<U5)IKZs#|(ZN5s<*G4eU8yTyx_wBR)a!(s5&=t{c~D`Yi&3o!E_Ig1&&W{NLNrJ+|06PcDYwn zYHtMtWFBOIpPWmRYsjDxko=!RFZ+(umwJ|aMrJA-CWR`k0x)8jFvV;1JXi?K8p9iV z$CZYFP=45fcdtv;dqZ1nuC9wTzgwdW8sKDZxg$-gMp_U!Wgmr?J(7H#V+)T0~g_t)A!$XX|IHg10O zh*@u6XG0J+2gm{k(lmhMDTX=Shh$fWJPYt$=PZmgFjE>lG%5n%I>ghZ5>fnj%)i}k zb8+(o2?7Nd>`o>aW$v020mbh&eNgVr;Y$L*9Rm-42yw+QCyRL;`@GQi!Yn{&Bz$yc zxW81-y3Xwsq?-G7g^IIwiy}1L@^B=YXdpFHdY}o;kU?W>#{~t=1Sms_|k% z_Rx(jzb1q2iSes`I20N8)vtyiHE*Skt6Wtf15^ZZH$M9v|E2NT(aNbXbz6>Sr(5Lo zlck%EKcx)>zti4E^rHS7F+GElzns>(MxdOz8vmMrW>M-aCxX$9HxURTH2vY`y2ly@ z*kq~#>Tv}A`ei8n1r4hvMU&(ry8nl`t-}obw=`~f@h!@=X#wiM7rex;&2tFfLKvNL z#&6UQvq%aST-jj*@TJGSW+q2*Ld)M)8Vb6_Gy$(w6+(ta#RDSzHhXl{fZ(BM*jP@c zaq%}IV#qL_dS6k0x-MoTV$%9~aB^XfwS@12GZLPFsGGE>g%zK(Ar!AXjcgrkhQib9 z48k)wDSzAvOtzq$b=duRR~et|=V!<&U}`5J_0sR~sR9-?-Y!6c%u{zp=fgkd)OMY^ z9P0j>_N?@)*f9MZ?rlz|j%v&ApKh%SygVQef_3DI4u--}oyh4=#7oWI2D9$p{me!keuk#Xspg!?)iJ&e zRf~h!=`>;JhL+@I^h-rr{VPqTq=tAca?B2QDw(>Ci9CuD z%kgj#{(X$Dy(_rm#o@KK=HFz)wPq(BW%8*UZwO$#W72Z29hu z@38hkNIV-LFMj;w@O(3CU4!dG`H|ueriR?iK^)7hYPm@&QK(Wi+iEWre(hI!gg5i= zAdQ`%m92iCh>{Ai!5&unQz^AP-WHK|b#++yb za&os^vhJlcRP?fe53)%6`CMnXA?~A;C`+v)NpDf1~Fo}_3`dwp1)fOg3ZR^sS2@K+fK^CQqX%W z(xp)JyhdMnGNMQ8^rt>RYfeaB*-@&mbRu2C(S4`&MG^xf&!8+OUV~=9XpIi#7-yca zyWL$DQ^d-OA0kg>I7mXkKJUY(v;m;z{>4$yUnN4Akkgu-XhFwhUT?oEatK0lEna!V zC}}K%1OfmDY%MrD@9%cL5~27S9s&AhY+%AG3xcS>ZjmNX6eql4B&b1BLMp&Dyu9Tq zX_IuvD~o7g5Tx44k!V{yS`jipZ?H7ROR(={Z*yD;qKBC8cXANbJY(21`Kn33llXTVJ(w!fDeNeRagOrYE!N;!9sw0r+>qxMy7?6OovA|Pa(g3Q?JGD+Q(?A-R z@cL8BDPu%uDERYf79jK74ysko8?IhQtgwkGt~<#4M_rPi+mXN$K<)Q+m$8#&(#A=M z=NVuKBh@}P$JeIYMLH3HDRZ&TBML-mfOv20q=J{I_I@?bTUd;wyg=}c|75s3zpRW&~KZnoK}J9r;p#%UEY$t}YU zUloSPG7Q32Z(Ivx3g}#*rZb|{rq9>N>gG`Np5Jfdxh79#CVVjRDDV6mJ=!w z1$n6fFRzhvd-jg$B-_W!U${0`$dWyy_*LT&4%2_*=SuUGhlJf1-lHOv@U07lnf>gA zw|w+YKK*?d{*8stK$8BG0t)$OWpb2;d)y~L#Lln12>ReEo1U`o zG@yvV!=*O57%-%9wVm|~!d(1u@U-vANV$jCzuiDKLZ$6ybTkI&M=4^ulG@6``$zvS zml_P=>8<)WRLww|wncG8vYG7_P6+0zWsRZ-dimIvBCHdh0>>uif6_H1%q@D)h7F>& z)5_tr3PXOqEl_^rg_ggw8%(-TaYw=)U=!n0hpow8U!Q5p*l(3+W{S7?EnycY4=Kqo)X2 z6u65~bI<1aZivw^0J>}PZ%_OPfNzQeY6FkwEA60AkPpm6Gpx_Ma@^t)isc1&3b0)Q zW^Sj~OcYL6WZPV~TmY5DXG&2@b1Y+18+;zNj+J(4yp*67+Pyy zDCEGiU442C8w$=}emvpY`RC?VvA8$|OEVJFvZ#bQiQX?IY!2U!DkYXZppqfbb!Z8r zgyo`s`&2kokDc8*f;K^hcEM8%4}3z480`k0iykFeU1fQ)pIlPOu9e(t6nBUZ;ot zLEYv%OUar{v4)!EEG~kQoa{!#NZW;OKQgmTmw{!l#~BmP<7!4%-V$y=3-=9E4Xw+= zPbHlG_Pn0D_w76Ks#Fo)QD@R=NhU_(dF<~qYz^&7$WdEo5^6SqCoZL_&;L-J3I7l) z40`GPee2HQWGFP~h@GU~zp??pA}nK<4w&(>%O<@)2E5v`^{t%JWTeBeC;m&K%(gMJ zB7kapio&mVgi#R+9RT-N&_euR{W-ggcE{Fu1RJh;s>63 z>^8&JtpEVNiMejn-}-Kk#C62EVfVA4`Yg!znTnHuheUm@;)F5_Gn|CTxX4S*bd>@U zq{KSjN_Td0O|U1G^0IQM@?|?udW-3f=c(dSmp4LKzPr?VLcR|Hps7)9L_l)ERLZ%& zwJbc@v{R3C1ITti+sOB3{`f#&k8c(u@5p~fkCbODg&dsUR5gyh@KS-8cYeiJj!aN2+!Pfs_yIR0?xs>!uhi^M<%gEUn5D*&(6 z&@n4fPrby|-h}d&oR22%^XjF(9J|@WTFmcx;Y*qT#gDI+As6S_ge3Eddw&MzTle1G zWI8X7+AdNKSXDQ_`k{Em8sgM>}is}45sGBHgJ z%*!Y~4?+R=DFalBi00aWEpi(a)AVjX<@4M<7ry+2#s^T#*bAkK-?MKs@B(~6vc|7T z&Ss_&jn}`hvqR-pSH<-O0TrYq{e0FsbGd?OR``|{uE=sTS48LY2t-3Km~rRaNLDkN(naM+1cj<&qU^OcyzTlx16A^dYL*26S+K5FPwE9rqs>_YYL;=9i5?~zl0uk~xKBqBnxde0KT zQU+I zqDDsop4B7g6^l=tQf{7+wl5lc@qs>!pe@TYpV1dmOwIV;Y_wBmHjj_1}q-fYDPG z<0ILeguRH`0i-1R|HrJ)Epd`Y^n5q%(h#Ou84AvE6x%_7R1Xe*@&HmMGeB$w03{>n zyqx3cVJ@W!B?eH6ZqihkDYS%u7CB(&LfJZU4>s28Uq#WSn3iwX3%0`_>UmHNHf#1Q zBgVW-9JaMseX~(7W{&uQktWT!adsF@<8X(>)mUF%+MiNh+^Z#-&Ot(48(9t^uT;Ev zW?}ARey9XT3j6%(p8;2ca(h-YGUnu>WX-FRqy~zS2a&4PDwgkq*OXU1m!>|%2$uiU zy~A;6U8}sSGJ8ngArGWK{%MN{L}~0CHM|z^p3UjKHJ?$EOzMnQ)1c@FHfOavgYsOi zPD^tCA~cd&WU2va=-Hh+*kfNK--cTMqcy?uu9iK((SJPs6b7Wosv{%Mw;T0H0YMJj z;eq&S><^L!1-L=J)Y`(3YDX@@LJ~Yo+Qy)dsPWZFrzV!z$>&S@Ap%HM}Q=KPi@1E1I%bS;WAG88)Wq)de z4XC6)7Ttjj-~o1bO0?soIFVt>)KA+Mz6Ig5FRw|=vdc+(d#3f08ms~XF|og2++hVX z|FuU!V0FhqNG{gJa2dKF($-#WRh_xz9KD9WGxB5Iy_2j+q) zC*PrlWZdgcuFJ2B*$(X!_uX(vdEfgZ>qqm}EvY|@o>OX#em67K;|2O-l%?}f%Kvx< z!2V{?Zxy?%Uh=Xw1Bh1`i1}Okl;r^dypX;(v26$_7ptM#HR@rZZ;A-^;~MNH^{qJr zD&L-&KJl*37ko9_Fyq7a4J!Qj+ zY?YNl%X~8Sv5eU}d)-7-%s`L&$emMys_`7e43P8DKtPv)J@^6 zS2o}6zE2jL=cNG?O5x$#Z|=#{D4M&YRWg5lYjQ8{uX5KvrN!X(DO;G21Q;2S(MEUW_E|aZ{4LaN0`YIw&IwVpzf#FvDyIl_X%{N z&#J1ft7QCQB)dFN71y;~ewTJZiJ{}oE0@UH&6EXhyE;+#A#R~ei+fA_i^c8ve1}cv zL_vl)07dDSQU+OhA~=Kh_A&!jhS7yT(rkz|#+)I>_V2I-M=;1bK=L$X%nGO%;72vD zv9x{K=ZGroff6-Z`VculWd)H&`klTR_5cgMdfi9j1E2+;_Vxi?b^A}W-46yzJa5F2 z*3gR!gKG7ce5kLtwS@}lrtN9q7jYi~f`~&#=(lyuig+<UEnC)#H|h| zQ3Jd-J0A4UUsfp8)^ObB5Im!z@G=4G#kUP9@ITSM!0+JN1nCriO;=WpZrLkWrW^{n znWJ`%`mA{fk}P25x2GQO5pZVwZh6Oel|IDnUe+9f?VV-zoQqWq~mHT=r42qiu`R(Mk$5HYz<_8U z)I5j$(b9>-ZM1A1Ll%ag%*My**eh35DuPitNh}mKHuu~BE_GQ~W5(O(G-WMWH7Xjg zq8ADcoV!R3z=p%kU`XZ9ITu0Yk_9p0mK6- zcsk8c%*mW68>Ry(;6Ov%*jbfx~4Lf%pW^>-gmXDOtlQbup>?@i4-s@?;jV=Kvp zXk;OJVaOfXTKda5orAo{|6E3rcjr2+bArk59L0JTv%$ zh|O-fI&Reh7!W2joGVIstt>f=ut=zTEi~XgO%N9XG6y-^!H20WvMdZ+=w$j?pC5kC z*3~~Q1<-@qW9~%MX;)x4QWUbUZ{aj%q^yJL5;7}N{jg9kewO>Q_pq=`h!X5x49MwP z6;sJJDbng5-uy}CtDU*BdQbBPv|LIa#e1IaHpCcU1r;YZ=v7u&LO)bh7C_^rIEVRwUg|BA^s?}@}aw|8LAs!J)?}wFv{t2}zpIrx6cD;BFv%J0SY3aA-~|_@a|5r#Xo1N;`vkmD zu@ifjA26U)t>PEq^~j;$(dqrU%wBtG@Z{luXKm-S>X+xgMKM#Q$LikrUD|v){Ncq` zvxF6gZ|GG^x{!paxBv-Q!LjvxnBvOIOujhJxG9V$6HQDsMK8LLqK82vEzYF9?o7qT zC8ok3?>;?g4%*u^e0s(~P4%jX?#o{{rWC<%x_@>|@DA!Cb#D65MatoOd{$Zmbvf28 zC~ES=T?9P5l=FU<23)Q_KLh3Sw)Fo$qTV~6>i7R2zs@-vhm4c#m7STrsbh~2vPpJ` z$jWxiWQFX^viHay9kN1_k(p6uh%(ClJ$t=B-`nrjAGwvo^SYkbcsw5W@yNZ=3J0{9 z?wWoXgy>Q5^V`p6Js{1&-u~;?im&UR(m?To&S(t}(gD13TRYtSRBZSjj9W+Gd#!fc z&wBaZ9g$9sU9NjHd7fk~@(9@F48zNKcl`+`8EtiIe>f`rZAteYIltv6ZbBAQnE%*6 z_G?pJbnU%IpP%tYJhLh3w7i3*7Icuf7rz`u>ZRj!SK?#i*f;SucMW4qqYMRVF~6A2 z7Kw={D*R5el%S`<{v-@O*T?o96t;4h=T+> zdlEs#1I=-9;-&Cu{`p3|$dJKCzYpYSy`th1q~dldC}x97#nBlb3=j)8JL&r$WHfTr zG{lb2W&sI}5hBzRMMy%iqr0NTn#dmB~% zrK6?>s+NB~Ei-4LxEgkSo0|~_|2Gp@hU!yUm@B5yf>iKz$wT(_vh;EVkmtz_6VCg- z*#H%PkJ&-M-rLlbL1>_37P0&w?at}gpT8Thz7x!Ne}qjt-9Kcmf6gNNIcnvkLMOMIZ+YXlx){z; z3iK2)Wj)w{jyU)gsCj@@Q4 zTpWW2>G1wB5%ZT?4ohqWBOLpY;HWP5%wm!Qs-5LkJ#Ym@Ea<3kiqkPegR8~mICm`v z$c5?aN7lG1QNkK7G*9nxF+v`L;JI&t;4M@0mEdHdWuG@T#Ku_L0Dv;snzw98 z_@1jVuuem{TSc0&73cMB?%;ip=X1hBiQHiZ7oXkkci>)>mnoBxmXYl1ygpu|&B$29 zteueU;BCu0si|rd4n#S$_DkM(C#kNO-deC__u1C__S@EgirVu?;|>sDH~v4HY%+|l zI!HBn(WjO=g^9}Njtz%IDu0o^<#3Fj(+eVC8PxR$fIjGSL_d`Hht$zHc5uBql@(op z(9%(!qNCY^{fKWg!15Vs{P<_Dk1sh8>G()*i1w$R0y+H?5wb;lsw_vYl@bm7^Njlcf}MR)N4(SH~~ z&Ef1f{uc`4^}iy)77Eg_f|`soR~?tzh^PC*-+uVEA< zGT9-~nW~V1kVID4@rSi?MQEOYtf(*pGLI6V%1V-wIbf|wj57i#9IA=M-6?8y9(E8) z>KYZM5Ld>dQQ+eWVR)E9UN)dFZIU`{>hLnwms{#PN~xI7Y&;ys%wf`8n#Ddw{aVk6 zyNmI)#lT8s1iR4(ocR@bT820UnKi*P3O?qjmnz5$kT$_jhk5SwV}I`sHU z2%XZOFiT?uk|Uxn+eY*--TfIze-{UKzTJU0Dqv2yF_Qx{1)_?&|WmC z13)iB+G}!@y!>i75IlVQ{nK4;?g(!PH2(Ef^@E9PZNY9WI)FTQbG z5RD20y{i z41!HxbpV~TsY|~gZ@b1Qm5Ued#OO`R`5g*fDzdkGR}y^k@u4y}RL_kU*pk3X;C?M2 zE8uLH8jfjfvpVwXNUz{k_>$KCwM8R1<^z4Lb}bz6iSYs+pPb%*O|kMCK1x8p7F$Bg ztGXpH^E8jq3L*LSe#W=m?-PvlW&a*&LY3kbZqIC(+NhjWa)_tH&(oflvR|%*ian8% zFwB=DGM(x9) zz7zebn#5jqc9u_KiqcUVUE+dK#P)91hq&K$kTPqVLu@!+ z{recY1;G|EGKaQk?>JQ?AfAc;1%BsXHTcuEy=ow>@j*o3`+3MUfcJlS7Kt1&ksTZN zl7S&1J`WtLAzl;@uw@k-fZ3iC@)Ly42kZ9!V#+1o7pW@hkR2b^Mk4tv!=O;c;t*Eyx!OwQyV8S3v~p?`yKpuS&)Y!+cy!;l&=y^>0E{OS5| z3LuHcr$MSfDc{da zpxcP>OV4`0_n`x2{{FKY-%sVU;7k7zHo?T%V|V~Ko`qYE#*;JH38wNoL2MJ;v&W`9 z0A=M^AqT+s<2&F;;bLd)y9l%fjOvP^xxez#Pd7x$=mk3*iBAfqb0?OARmC(RuWSme zZwr+)^iiHF28tL13h8Tj9#5s%lgH*r=HBjx;Mo=k0ITs!f#H zUKB>4{DVicU`tS$_&U_(u5vR4OW@CGnMA%(NNYV@maY#8xsDe-+yUmzu^B52TL+os zuQSX4hKPBfcQN^|vwj{_UYe{)hnr`oEFalKKr8NcTY95JUoTX&M`HOBLY?|7xk|K~ zXb6{Dg1qrLrYYrk5U6nCP(ULc?hwZi4o5d&^^5b;$yHjjU&6)W9udRwtiJadyNFY0 zbLbO&v+n98*_JSQOBI1twlb@utImjUad}^n?)66@FN0W?vla2CF+WCuyIcBCb<>Lv zFGp3R_-KDh&#J!5ru{gonh8TdwDzUbiK;3+^+MiXI3tM7Jk>$fW-8$1yTT7Tsb`_r z4>2YL2}GK%?ZFrpsipw?9eYkjKEq1Lu649jv>#53ty}(T=1vay?=5bCEcm3@@IPNN z&%f7u5g>1^WCX-CZK(`HnHN_0DjsE8|XjUK$dC_?vS0FjNdI8Z}W+7SbY=1yNowQ~WiH{2-gh#v_(`jh?p9F^1muD=I>4I? zFLlL>bu-!?ks^& zLrE%`JC5WxEGL?UZd3F=YIax~1`R^A} z7X&ce!rrN2fBeADmzXF!*bYws@BdYr7O=7t@H-VP_4+qeCQHlEU}?pV`y;?U_!TPg z5tdhYd_fNKpkZ3ISySc>RsTI?grWh-@_oO`h6f68@OCz@;Q<+!8Z`HAll%~1Qx}qz z>-;cZM;xOEK+lOnv0FyM zCgf2AkXP@lQrSJYr9qgE)9+KFB>UAS(J>ZkWa2u%Ng~u`CdQ$x#~_6$vHO=0|JL7X ze>~5>FG0ceqX^3j@PY2)xJ! z8Qfq7a3ZD-Q+yp7Qs=ybny7uPJ)560eJ=XOKr1r&7Z!~NurM` zWV;4fpa{-S+#{Goh5G-bb%c=vvqiP5MgwLAv}D0H43*fLHN6+FjagiGP&Id-@s{xy z_Xyp;!%&-Z2jE~Rl1iU&{i43WhiZ&cFDE#7j>BVjDx-h%Erh(ZtA=wDM*zA zI)Q~6hOn0*aI_4$awvudPe`ZFedxd(dB-pc2IT4T6Gk8P#{l3T!KI`tkVBj4AlEo` zp3^zIRdClqgR)8?nl47$)gzEnyNrHzj_L$W9B!J5iOirWB-hhY<~Msg$IHbt8ji%n z@*AHdAKr^{=_SHqhS1RXkCvXKtunQxrKpK=o-uWh%W1o=+El516j+L=w){`)ggJh7 z4@)2oV}E8l5=CXB_lQf69jKjZ3c^75`?`^GO0aaYBLQPhUN4t6gvOOFwc-j55XbLP zh@WSyq>vn5l&-#8k{_N^j76YzyYAJ&TM0uYDV?#^1zr8kgX5Z z(tcupfF_qOgAZF9Jh*-4y=vIR@l!&#z-4@a|BC|&mX6GT_;Y@_(yOFuPBhW_kQ3+r z7Id$n+UrIbZ$Obj?k2!yA-Kpe9&ON|G5z<@mOr{9o(|hUa-Oe)&-w2!*g|LJI8vDS z%*zn^4lJuoRCf`;Cr-|3Mo80ONHqoZJ-gxeMg{%X*Yta5Y7+-%C?I;ZEk6Fwmx(l@ zSk#?#7VGb&v^Oi^yKXymbsHZT}Y>=Z#GnwR}JbbR-bh-_T3VDXrZTg-@WX%>T|zTjVB%?ezs%wy9LATslVW@ddr6ZiLk+6 zcj(>m7uIF6>oVMK`JKsp8HK;;v7Nbe*g*@bzLk65hIt8d6UjrG@%w zhM>+RSbZ(Oe`o)UG}su9R|N~NfBd-351k5l`#Z-_rllNTnXN}jT6C*&GS~qDX1*wJ%HgM;or8G>@&t?M!ypfpy z6g~ToBh1K6Hzy?Kf6DS&eQi6a!-2C=vWL(%hZY6k{P7O>AkNwsLYeF+l-a2t4J0Ng z0G%%>5WG`hbJ3jvjD7fwfY08=tzbK-i=(D{BMizYZ7j6bC8vR)Z)c^$%Xhm;tN@1u z%pD41NHaFQtW2N3YZMisaBQ#3D>%Dscu@a(sUeq0ik`ksggT(bPja(@VY6W*{OYYD zPdB&w5UI+|LRUw*xdv@H@zfc{xwQ7Wuha|NreM{Wo9irM7jVjXT12k!9nt3629ah*P1DaRR^CO{)aEZVS9NHf9-{ptk z3gJB~R=%g5`8%Httya7>Onz)cKsVg~TrgnUhuKKnD81a99tMvpV*@DUNE%NRwQ;AJS;|!MX}pIF@NhWxH3tZ>4S$Ya%2Z-j9tb7J zxA~TjuY}q#+o90JU1j^6NIir5D$}bbI(6EgKPW3(rqar z`6hp&s2^1V{kb+kFdYY$_-@EY{)qy~eO8t%D<%DuM3L|W7hXWDkx(M3Ae@jSs%%_% z*g9nWlK-j?&L&oObRY`B~ z6;ro=cm6?m3A*n@e4d4l%%ZdGU3V&WmcuX_}%Gj()BCY*6nm44dOci4Tn11KMHCKq|}_ngyRed+0d8 zjAh&2`y2-2@vHP;t$|I?ZEn|z@xSvOg<@_1DDGFsSEw+eojCNSx6146t7B`fD)cai zFj%rA;`J$`C$;YQ90}p)I_ajr6?zOILyUJ;nKCIZsDb7h9cS<*9X=Zy4B2qU@NiKuwn2Vf1 zuXsXQf;^jim(IU+u(HoYS+$OM?QYGHg{akOvFMw6bD%e{!^_~q0aqq(2IY(&)5ke!O`f2Z$Ci}GgMy%vK2v`7%Gt9toU6NyoK>%irCcvP7#WYxvIRm zESW>ezuTpzC<#ln?pSOi99vsE-K+s_Fxkk!^js%R*i+zHM>U0kj!C6HMYx-o{ah~T z!MZrM5P=`AV^&g=AG{?p(=?>UtRce$GZJbl$=^@#S(tcRs*~MFp%iL>gA=#nW5X2$ z2pQi*2gVd9p>MU41`&E69BYS9ZIAvoUXpd_Jv$6-9FC^oVR*Mk$^0L$uV+Pb5f%XA zgBeM%ma6LaO3hRMxitgHk+nWE3NRCYb_B;7wypRRVwco+UT|K4qz7^n&~b|Xg)Cj# ztrwCDjzWO={f9%l0@6dTDl`CqS{l}P)TMh|4=JsZfT|Qd1MDs24q;%_nz$qSF|~p* z@qkfwE{QT zq|Ukys>4UoyK?pW?#ACeS7w=V48zm33fa9174TD6@|WV!XTwx^!3VcSA$TQae(N`C zs3-k%u+P`02CU60e)$iLmsbhy-331X!7D)MFc1X6q1Lm)*Y*bu5_y2-?otOn7JDF+ zyMO>;lUpxE95R{vyVV0B|Kh@SS(gPI#%9nfha%#BoKsSn+h#pVmXD*an2^-vp z{3I*~0DC!cN`xj1%V1cE2-V>Isy(<6q8??3u|Z?M@sz0uYx$%QbKcLd4CzU%t8GA; z3`b9@!0%<#Ybyox)oS#;tl)UKAqD$$5*kQBb0;rRN}NVS$kY7+|qcv`&RL%DR28awc>rZ;iB{+XYIn;=pD z@5a%wxoZNqX_)=uxkLIXXGPOdNl#!B6lGD|niYB`ECYQdumW|5iH15;0pf4`SM4on z1d=0^qxA2t8qYAthOA#@+-MvvQdAxcp|+HIk?o!%IX)L-NPt%a4>^p-S3IWD(yKAW zGypcuKg+aRItU`TnFHFbUVba_wk+0)4kW`9U`(4{^IQCdzViv)WJezS!$cQ{YGg*G z3H^HR`(YLcEadV7oo`?d`FHIJ_Uo`FQ7s+M5Y((0J1=_$hWhKB9YYA7H3fZufxl{i z2<3ZxT^LuMI#?_n0l>`j(ry`lIk%}LG#tBwvwn&ExCODPvB>kjsob(Rp?Ih~^I&2Z zWX(vMgkYlmyB5!@X^zU!1qf&&8nu+HEOFh5c-$>rNg^by$s8OsuexF;NTOlPC}YGP zmn|0!!wyDBrTE@XQQVzLboxQxrI#5MNQF7NkoFzPY+ssIIG8oQ4Cbj&XOpl(Y2_(K z%-=RMLkK6Y2@(;}HS(&MySBt<r=$C8x=)Y48$=BfJsVEIQ;yb%EX+q`Ip8-_a$v{!-c z0ZEBJ&?)dx`=*ozl4-}heLs^#9Bgv~MvarxpAZ8I(0pYQr!hc)@+Ks-^xqi7Tf^8b z;nngp*)ilZr8Md^SWg||=vt*P4x6ji@{UzqY8c6kbCI#rGCDC9ZJfRWiR9pltgjyW z9e5Yj!gadK9oYxQuJV-Guw>c?UQXJ;FpuZ+*CXe;oo)Gn9lOh*Q35N`!z}GhQr!1Tm24_n{cq$-jWoir^SHFH zI}N{rjv+$rN=TPer`}oX$jyDR>s4&x{-v|3DHt%8Fqv3_IKH_e{93c<*!8&Pg&UZXAZbn4>flt#@=$Hk zqKuM~xh4oMnkRd{C+4Igxw}C^Ny^4?DkT#KujdagfS4$QKfKGVF9C_{3zqwW;TjAl>+@r2DUJf0eZ; zze4M1p-Aq|U16X|znU(Ye_atQF z1bT!44XQF{<}J$BHde5$m?jLZUT-R2LN(@nKQ{c~kS&8#YH7>J@~uA%^TS1-M`Fc0 z(WppTf|ZBOkJ~O|bVXvxNfhEOy*ufPY@-|{82Q+)5Hew}j&PyTz#_eH-sUO)3-zMX zfY1&;J*KvuO|huA9wP0du>Zew7w`&m@Q8rrtj1LoSX^}fg65dnzf&1S_%e~;6>odp<@8|xRvPsBD}K&Ov(;J}-w#p6Q& zNv*SJZ6olajJD9Y8z>!`#;Yli8#BKY?*Yt7%%WG37|f=_9Ukq(HuKGnw8yQ5{TA@d zXocDPX`bYcR}E-1V4I=KFP|d}QDm7U-yZ7{Uq#%z8a)3QL-w&5#5hG--3#`UdhX8K z=zFF*we~x!a2AbUc6E=1jTHa;-Q6;W0VPB{QtCV6;$g&@%f16O&t}{bn)i9X9Zw~~ z^9L_%DWV>#xm<^$jMU&U;EJ8Qi#T9cFpe-sNavRkVHyLxbvT6pGs8|sDJgh+_ck#o z8}K_Rq6D@$3HR%8T*tF8lIeX>LBY9A$P~PdI8Wu&H6Lq(snBz)2jPPxx;e zI(%x_XYf}|SCm+#fX6vb*onQ>%?syWO)Y=L=q^N(kfR7eN!Hz;DNGk^FOdD)k0-syklDnPZuEQ3vURw`j9Fn7=L7qPqLq^29WR zCoghCPK3Lsg}oG-hZHaGt8^MjR0eGKQn(EP_8&moMgW5M&j@|>aG%=z7FQm!0_I_Z z=yB4NKPQ3&U|JqkKNOkE#tJdR^j}e3DnCm06?gXVGK33pU}>G!OY`gc`~sJwpG?Cy z6!L1I9RX+nKGc7OE2Gbyh6s;_23diDhXG>~R%Z-AHL|n+ZJqadWiM~D6M3kdh&25& zom)Hkqy~*N&?nGSB15U`dtT#T?Y(8Hd(vC=-t+bOB!5JggFNP4v$oi{c;q#yzSu`K zLfNL)k3#EbkpT{*Oi{gqE@XrFO3x|OhB?2v(`mi<665Jz#X&0Y7J3o4p*ZR&`23&h z^Upi)(N{`p@?-UO7YBM_(y5_2fj0AkH1Kg*_L9nHV3U1k7uK-~TD(X6{L{Pr< z>EoSg0P>}Uo|b(g*m43GRE=@g;$?fr`%Dq>&%VPM(%&qHIL$4<+^mIfkhUjH)7S@I zBX`)KwT1 zVi0fJQjxU^f!qA-^kO<7{iwlJLL4~s-+g-pP@*Qsdeez9i6NDZmH53eH*dQh+p3a6 z(vy>Z&)K6>1sZ6^Hnlv2uc|&T-Mmj+Zif@a6O!WqZ}sqqzXrWZ?bu1S$pdqNo$cz( zFmR<-k1~&jmZn;?YS)S7l`$_%`rMBnbm6g@)Cr!>FM)B0!ZH@!fTJz<+)`3>)$^Wi zXb0`IX?lvk$rKZD7Rm*oMMS@qC6Tn- zIQ2QQ3#d+$f}r%2jTWiR6u4+gm{KKMPO)mU{WJ9WmA~@A+`#-lX$3~~x*9|wKHp;; zRZT5Oaf$xVy0wD83681yEP9!E1?)Z9Cjl1BSwT}!lQqC4bf(^woqOw+TPqX+Te+@v zAZmy z14)eFR#f52_uo9_tmGXp`Yfnss}1DLujxteDaJ11<2e2&D)2r2K?LP%dtoFh`Kn4b zLVa1#O~G703Hi*J=l=ae44CIWfdPVrpr@o=2u+|dj3&d~|9+s=6fTa2c|%>{I?vi| znx~Oi27o!b==V#9;s4;6R4E(5N)0*1$8mA-rH*8!nOiV6UVFuIme-AQXviqzjLH5; z#9JTt!BY5cgO-FF2MJbDCc!P^-k`3^Y14rd7aAl;e!;$*iv$TTm%9wlnTVgi?HYZ} zf^{HlSH)0wEBKpUpXa8#IcgX3y#TJzWtrshg)cm#ehigd zxX|NM!aXEcFoWg8341j)>znqF_9mI_#;u1C7OWF_RNXlVvs_-iy9nF}0&Y9XQDEWN z!xba&_Ei<$9VsjcE_;zwdw6d+t$YkZbb;lskNX-U*oiA7;p^EkhVKQ%-CTaj!9n_C zB^v(v;btp*=!Vw7x!Ztnf}{9)1s zw1j_I9^iqCG8lA^0Fu5J0+8iO^O-v~X+nxz*tiyIQ3p>DiQFIro!>6%-wOnlg0ueMlXF?8vE!oaHmlKo zYZW2sjCou6`zSMLaWJy^{yXjX+rDrXlLkc{mtE~Q3ht>SKYlMJf*gY0LAfG^^ib7= zXOmqvsW^h6J9}1#%wo8a3xgk&H^eL*>J*7Mva+uR3C4ganmkW4< z>GoGof$`ptS_&XdgzoOjtRDArfHB&l+NkPLYwH z`Gwl=rHL5d7t}N)6&h;nPs#7GH7YHC`~@W}s#kIjCo8pkMVI1%)T2~+B={CPT=fqEbW7=pvNN?z<#%x-39k`5UZt30e8iKiD(R03 zuZphy?$wRe70qQh-H|<*G_zV~k>ZgVRo>S&9qEb`dt-gFa@$((<8~w~OB*tWTI@%m z{jy&+LB9NQ!><=ZuS{|$c~k=gBdI$H{@XIx$lBloP(!+ycAzW#8q`+|N*PuG9hnEO zyYRu;x8t8=S)|ymiyyG1j-_hN3#e#}@xSw&0NoXwCK@BHJx6I&Df^|3=mpx znHRKJ7nFO;|M8O=k#}Qt3Ha=ygcaV>&S=RpF+XuyQS2kE7#{Y$&iX7@f-J=XSMv7W>RLj`u=0O<(0ctrA_^91w)O0aH2ETo+A#qzTC2L8{8m_Fgxl>m~Akf>u{-@vcPrj`lce-8>(qY1a5<;t2q!JBVkp*ERk3(jf5k z27Kz%Qy&T_oW(8_SNtKxa&_ZRtT!!eg&NM;7f(!!)sWbtr}wvK>oV(Za21Mr86Yj0 zBic1|7t2lG7wD|%Kq@|aSt?4FbtlRhEO-BeWO4h5N|>W^?*uD7aq5S7qoIlhp_8AX zM|KYzmFB$`Iyv&dY2S*_uLe#F`OPItH@1Hn_~es~{!^;px@F!_ zSu!$}eW)W%FA$fcva$PjsLrk#f4c_q0wr@V`yF7Tzuf{sN!V2Vf(1YeW7Lc+q>)6B zbuP!7&)TbNee^~UN-*kc^Fh*Up`f<`4Uk0I`C_)givZjw8L8a8ugs$1qqn~0j(O4(Zt}o;tj)$_@rEF=XZ@dZ~qqVK}g(h0>)$IX5V zCj*x?DJl2Z`Ia%eo?xSaNKsYN;65#@t~^v|Cc%tRUg1(IS0+}YVDZr+lE~2Eov=33 zPunS_0qFGG;PrF<@QB)wh%Nu&UcJf(<(^zxHhkwEK1DZdHYOsw4XVDV?*E#XvMxNCHOq=g8QzRcVQ3rM>ewyMYK9W!WosUE|F z=10x_1NP&`5*|xW{qkl0m2#k3M*rX?+&qs*r=-4s&F~e^dNkw-@abjj_YmTQ+xstW z1ww6I%Q=Dcuhssa#RQO7W@FfQUkc-+??j~%(@Fqmu+wnw&Go{ka}YTfJNLIgm#wLi zfNS99h->|y@9lw^#220CPZ+AT?*v&@=moOrdJe?>>|*p6?kr@aeA~mB6S% zN)gq&lxM3yYH|8fq%_DpIlQ7`q180ZU^3`5#Z-uYX6s#6j7KfvT1Cw&hzwj5==4r{ zdR-MZsI#6&D0bAxVIJA?Pg^n5Fg+pQ?sJi&I7yE;jOJG|+HFa4>^K(-q32%he>RCx zgx&fhy3CY6V(b+mpZEJ2{}-DBd!{$kilPM4#nen;H~y>c7z50ILeYQM^2n>RNvaB1}xNM@yh1m#kX!gi1c@*L-Q5rNW8^PcrJkkhbJT8K=O zwih!K;uVVFDZ$MLofply9x@MI{hj0Y{TKN>4dAv$bvHK|x7{#lUfX+1}%8NI9T^-z2=o0iPcSU8FNMdb*5&s0jx(mgZ5`3gQw#m%$h z{-Ni$8+N^pz_b<0U#ewlE){c2+PSiKY&Vgkk?BHq4iaR#CGGzpl{ES4tlmfk=9m*; zHC8DRCODPp73vr^ZA*Q-v*pIXT#rA;c6T&eWb*Mz@IdD?&q0P6ycn|BiBj}j^W4o; zGuK=}QY)(jOx& z0~1_Uwa73>*d7srulEz8Ke_s~^H3=pj&pRJnxcHC2^4C=L{X`j2ir+(Exrk&Z^ z<8$r(R+ea4t>~ks4|}Vp#d&4qhd=mTc8}#71OsE^l}KnXG*t1rA6d$tE8gF#)^Rle z7E_)pW6rPcNmHuxgiUE!Nca{{fsa&s-5E>&DZw_}j*o+pK8X3tMUtz2`Gwu?5@eoOoX|?QNP;J@P|i2?K8V z)!um!bk(z*^W5WIwj7p|!YC>9Age1C9hj?pH&_$b5bmKF=h$+5T-HUP5c6v4BmR39 z5HQv)-Xfu5)|9^0Mu#~zhB9!BLG^d_?Kfju2&Q$4v(Loi{Dnl$!rgioWzU;)j(3)l$W=)P!zzJ2E><;qV7Nqoudo^}rc-4UX86cW+`@fJMtE0wS9N6NN2T5G8p z^7VHZB!7L0EHVutd#SH8+-v7mJ5t&rQe{nCmyk$an4~nx!-|ZBh1HD>+WzKJz4mp? zvq^S=UA0g&Txm0nfg8kqzv12=9`~rj9-VI>?V0YlUAahyzG>3d2mLHPT?N-yv-FxAA@h(5)0L6#ObvQ6S3U0--9Km_0en)@=7*RWf*1Y?3)Y3QI zNCLF^E|+pz9|$<(kP2L&@R!Xef@^Vb9pMUJGm4@aO+7`s2gMKN@;(f&tw>!`JIU1R zn@p)ZLaY=N{h1eex*i)NyZcJyS~SY`b7**43||!oNf@)%x>G zlj|?;{x%q+W&Qcq^wQH`;0v+{f1~2_GwizyBhurMfMN(E1Tj2f8lne zt#?PPpAtA(XWM7)hWRtMrA|tg@;?&PZHM2qMWGEeWTyyeJ5_g%YBPRHQ!72^qgl(- zmXm4QoFm!{p@z@@ceCd$o?XY1;odF0gD-KWdMc^93$0rl_QIE5MqV%NhZ@wnKQ5vM zqd%`#fq^TbZ@&8h3=Crs1i)XwC*jA8eRo|zo!a_4m~OCn|LVw0$|>+861>`!1)7uo zml=LHJy<@ixF6Y_pC9Br;5_-JsE}LEW&AFwe(V04ZN%3kou4Bzc`VCTHFs!q=dON# zz`eHInIw2lLB-02mk~=+Q-rsaJrJ-ReeC{F;So{nCWZ9~wG`Q?`}-{!)6wOvWP5zR z>pGg~IJ@Wf?@TGpk_D^nEl2=lr%qlrJEiDSM{W+i_|L}ao6}UjT%iLnD)x$Ss1IOv z@_F4yxjuvfzN3~?E}Pc)GiA&j^8IdTr9d(x+}YvfUy*-)7CLvF^b|9BjrdAsDX<~U z9VXiykbY(E=t(BTArF9H zhZNdr{KukwxU!N<(=HnSIF@j33=)s%Q&POHZMB>3Q-j63?}dN4AD7KKT(08p2UkDZ z!LV!dh6hV*mPowb&KQ-SFlJoW-6i5IvEX6}OsqOJ{A6nEI&Zl41OFdPD<$6dbft5K z1b^XS<;s!fP=^ND4(}4lhrc45f`0hVX@cBN0TxOdp(z1-*8sDM2$2?LxdCN4=sEYR zB!lfOoDM?cZhm*d18@)}-^dQ#@IF+cERJ)EKrP8wK4;=R=GhTKEnP*AbUf+1m6H~h&H7R!gM*L8^ z>q3c*6ykmC0~K+b0R4!U^-cFruOwgkIx-(rSdKjpAUxI+xGv`7wwPv9M5%lFRMV&` zW%bdi<)6bqrjC;61dEUpA+kO-jwGJAn}q$W`#14Vhd(Kkc<#&>*WPJup*)F6i&#zv z!8aJiIhI~ExwzB$QXDM@%7X=oIESzGeYe;qj+kWoxZ@_RIc;x-ZVRf!2MPs3*ex^? z02SokE%GOL+80^3l$qjV_v>{zAQs_997GHy0GNvf2y%wVcW3Rc*`R6o#CwaZ8x`g3 zHaoK4cBWPOCmevvY0Y-Md^pR$SvF@1{ZPe#e19&JyQV2CH6F3FFd{YgXPmyyg@2Zj z*t6-XnlcFvJ@DGzii9!EMA}Z~C^}X2<)9{Ofxg6(jJ9ueU2z{3uCD%!SM1lu3N}9B zvhu(G&@c=SV-qlcva8ugqS`(E*JoOh&Gw+hb4TX-sj&ZpS7r#WH*zv3d%OLerg?`4 z6aD@dNW#d^PiRC!st5Y3@Ci_Y3{5m|IIu~gL!38b&2SrkoAGbm;HY>Lqry~YD=*t5 z^xU#w>&&yQKgl8zlX+|bAuRtpbJqk2jGyf%MvQQ&k3{LK8nV!eyd zshidG81UfQ4jqncp$!%=w$RC`Gq^PA#ZW63>-=g!CAyxZNdISZC9E+yoIDX9EbV=$ z^RxR!=it&?Z@G+&!&$=>V!Hb9qddiCZR78&ySIql!J;wg;Z`a%ZQZ)uPROYDiEv`i zA=)knSX$Jtz_b>1U77o6Ra3wq%FV)ZrF>+EhpQr~%ve~m8_~v#@hl6B@NuGSdu$q- zDf4RE|Bh5t0)Gq;>tf4z_b zb6r9&?mVaDf&5NyP=2Z7cI2iU!%E&Tn5tq*t<@+{7{2mvvFkIWdaihj!y!nlenu-PIgoKS=5+W z^<15_&NkGZrZXu|abG%91qM#Cx(0Ve)pa!r zeN0xb;0E4^T`%~vP3N7hYo?VBT;yR-u8A25v*)Gg3745}nt5i&X8tHsi`6AsaG->P zHL*DhAz?h4?J{!jK>`L+0X`hyI$P-!RxhB?;4hD2YklgmY_bc9Or_vm8lrz%8K1+i z`5iEDHWZqCQ{eVH>{gk%@VQ%R&_<)!+EUiovg_aYKtAT7DeQs(e?!`#)LK9Pxa5)E z<2Z4f3T7*xS^>!V)Ajn#i&K1KiWo$*#}aNEo}spxhC8`Sr;MabWQ$*(pX; z%QT9@U1X}@jAGfbAr#+YBLw0fApp&2?j-^$MJR20il$4ImO&`FleSoEXr2b`{%wm} zi*QWLAk5N!V4=1_7={m8f32S``Utzeo&K?-l6VcSBsr7TqRsgtjwo?Q2}3$RspEC- zTN0TiN?f&ilqE9T?e}0udT#ai6DflyhA;Rx?1buEm_K-snp5ND+c1znWBx230`P={ zS*Da%D+K(tUQY5<{)l{A#$JVvjY9ov4RST-&)}>?$kCfImjZn=9)?>tW4?RK`|kCR z?LHMAfz7bfp4i@!bFG|3jn7d2XbR)&G*hG?4_myXPrftPCB99`#+EXdOm7Gb`)%{i zRp_M!qR<80AzyRuFo4MGGv=2g`%0dEyC;xRVLxjhrXA+R^;wl_Euoih$e`kPJXTcU z;=@U5%lg7`@Ov2;df|Fx=Yz*h_X(udt46)%jBfmDJnUSO^SL`$7jRiN#3J(Tcre4v z>n9hxt)>PyV_wORTV6+35Lw^8=7@~Xd^s51`hBy$zt!K7w1r(GMNcQDqG*o>LBRsT z6@)MhEO1CX24f~yzY+H}4_$_3Ply%k!=Nn9aZM~Y5}da=>|bCMz$DqrbQGp z?TVTuessXh-<5k_!z)+?LU(rDi^I-7&gmu-w>G>pzOziF98@q`_^wWOXJKiPFQR|I zQTybtT2wv2=qQ<55oz_}s+C?vB?(jlqgO#Zio$$FGC{>);7~K*23isDT=J0X{I)Ka z%HU1}S6SXsm$MUIIN#}4UK_g7sUt54c(jrRI58Sb5^YK^ zpQ~TVqpr@F1e;4GZQ(`#ef8BczS?oIzJ9W}6S=-((#L90X=1%x8E)NJmm)@t(IL(c zdY&OxGU$JI%iyf>`jiY}y5Kj>n+M{*E4)wnCPvu2&AiPY)I&sK3cd58+?nDI)*sBw z${^vH-k;#t4syxQiw`U3JeoP1`LtYGhLe`LVASR6<{YORbomcLFZ{F7rvdMv^1=4N zD=JSpvbGS5)^T$NgweYs(V&WP!`DaD9e10R!1OvRz_~Z%^#p$+Qk&W=ZlhbE$bTz$ z>*6e6ilNv~eOLYXqvg=Z?Cf$>b*EBi7A290L}Ke}YmqLijG0$iG06nA)6CJ*N~But zd_5UA5`}rz;@~z`MntTZ$ZNeY?nWEqj%rnft7Y&qWqLi%^6sF=rLiZ-fr8i_&77aF zcq8R6r(}hWe%q~succ*$MMF88SMm%st*SCo?5w?#@nW)$*y*Royb`hVwN^iDUYoNh z_9;oFDY6B7YW8lQ`oMUbzOQ7Dlm96OCEqu*&CdA1jbl67B^DtEktL(&e}-Z%{hzM` zZC9ESejduo3YPOmL^xkw>kmRm^z8as1jPAuiyi<=AoPS}?=baDd6f5PTaSc|IXXQ< z)iYqipds|)7{bpEjZ$$3R*Q+!Zyib?nPO|zuWumL@Xq*PATust=;EnkZH5g4YPbSA zL5|<=np4^}X8gz+M{_lZIBRg?KjQpv{hZR%t*tDqF88F1Q*}bbaIZR((ns>?1n5*% z>FSuzb%@oJ+mt!-9!rFKmu5XHsS)lGAVmin;xdb3hOA85r!wy=QlLpaPXuCieAge4e3@KEOp1HgeNQ9D zlzEcw`PlBj4qZ>=I3w-qZ%V4=KIkgp9 z%nc|$5iN5`{U9QvBw8g|NOsOhG^|k2L^LUbJxNYdR7U{u(?Li}b>_~mkM|Hjo+9(c zbFt<;SH4;y20Yr9y=vT?5c~M*;od6hiYt0Pxn8=X?+WbjD^_eSB$G7r5R$7yIS}0F?y$&JsV0d+D#g`wBLRn7#g|Gq(sDlB63>E zndhWCl1JV#!c9eeUqI{;f4a7<2X(mM1Nbj?c8EcQ@;lg48to0rTW!gTS(^|ZBUqdV z1_n<&u6Du*!n0>5$fx_F@j?`yHVE@XFA z6fX?#a_<=9Dh9r2^)ULR0vq z5cu?Rl+jH5VJcOAkegtzxlW-rZvYqINulLr=epZ7WX;WGhXbiKZ63T1ju1T-JV4@h zm`T(|KQ(dSxc)(8_1w|JA9ob3l;2D$hKk+$+rz+rZ)?O7>9EtDeM@F`K^4%1nPe7O zKE8v+;~62;=#SPH{yXB(v>}KMGLQ02w7$YhS<<(OfVk#bwYdMHX0F|F%q;%BLED2690HoUipX%i5HL{<0J(0*urr}RoFUj!Sox~ z`V#48KQsk&mxu;F2>l{myjzRwG+RBnDavZ5rpCLdhr;ilK!90*)nx?3?l9mdA7hl9 zqVMyxj)x4nHbweoJsq9h#6!%LT_u;ongBJRs;AVi{P2PUjz<*p47ZsHxXWt>itfkK z)kLu2rxMWNLvdc*2?>G7KOfnz4YexWI9}o)efA9G| zh(?-=3pn84NpgboIGx(JW@ma&P|<-yv*i<4e{LK}cqluYrDkMjsrNK3NZ$@Ncu1h-6XulaR!(-d&LiqD)S^~KW6r3;uz&}JJc3P5;X)zFaR6i~W zMm;`ejPS-y^4#m`jesJ3@k_un^+tcQGVx-R(PiDS{H$e0?9U?x(WomGHZ8@vL+^9i z=d;I@nNGI-NYR?*RAMy~Tv78Ds>?Oi!fXOS(mSw0X#BqRWj-VYpe;2*DQh|b9?tb zoiA^H9NhS26qd37k>1(hmQa2;*>up~sF|&sdn3{BU%M2-x{W!|-|rkVVQ+fsG`U3- zW_cE(gHD@G$4NPXgU99|6AF^+s=;5?nq5G65mLRNY>p$;@diII;w0xL=x5P~Y}L^s z!IQ6QBHE(d_|E#5>x~Eybc>o0to12)!7SL~df5*QR)6s?5_Vwt=-q5gT?2)mF>l%( zibr>AeG9_X%9D}=BwV9Mk{mwENZ|FzP?#yQ=SZi(#L=2)uqbqJ$FNKYc|~w2=%KC* zQStsK&->Z_@%cj717adnydPFHmV#o`1SyGfLmcn@Wg*qAHH)0>RI3W@@Z(d)Z;Vy$ zP%cIod9vMca$|R&&WJ_5`nW&STg-9btwp>klW_^A)|QAuqV=^bDZDt$t#&(-ZDHgh zagx7jgq@((@_(G;1RQkkq02wcac=1TjmqGN)mI1>kN67#+$o?N`Tx-ItQU+B;rJy8 z1y2Pb;@KfQyrQg{&NVg73(*T9X>moRzds<d%vp`32LFe(zCvF!VqHs0!!Yf zV=k=06KeM3>z7nHAQLjw^V-@hUg(#VcEH4MYvWv)n{Vl^EOJPPSq*O4YO2xa9fjnK z$}WK8{S0Rvl}soRW7T_D`m1!o8**eH6owvZUP?1zcpk`EI6yz(VdixGAX%uQs^!=` zTIuAs-Ndej@+%5)9;l88H6w}KDQlA;t`9cPK@y6V!f($pi1M0_FEP?1fXy#5@N(j| zislWb(EU1V>sN}6SHdcmWZ*yB*Pt_YObp=s^y`bAF+t)_QzqlZvdh;`g(alL(sra%lRYP4J9OpXgELXO#=KNx5q#i=| z%7Y}b<4u_}leQ04+3qXXuQQmdZdZ6(n+agpFWD71yPJrp#SPuueNyZ*_5C#FeV$)V z$ct}$AJbx^*{}4PPR!RtXPRuvR27I-yU{IC5y-QNthruDX)2f@6_R{)h+W2VA>C@x z#^=IGSI$rXf%D8G1dM0i_xw<&CNS6?onofJ-(;O`?w8a+tehKLxz18O;L}fxceU)9 zbb#syEU!43F~5e709iC;p+tW8x*E7H7l4j8qGKcW?ZpnVyI3tnX z%52M#{ma$O2k2Re=~jp)lkUv=8w&`Hn_>!OVq5jC)3z{&O+U>6fdlt0EQqol-s5fu zU8;M)F6ButBl4>M~*ri7agPZvkZw=p~b+jxq6Z%+!W zX!+DK8Fx7`&Je_Y(M2ODs$-js#Jtw}S{%0>K5bOpALi0NWCf<3T6_EYnE)(<5@~|m zqiB5SE-ENvUIzcmAnH{s$8IM(<9F!%lByIX=+ejq?Z+A#RpVVW znsv-r?l6`f7?TVA5uAO-(7!=&z%R4X%asJ2?_f%soopI8V!yiGO?rc?yEbdVw%FgD zkRjb!tNLpQ4#0n^f4ZS=pIN8rej{lgT#marJuqmv)#X{25seK%fPv*J-wxx`o}y#W ze zxKQ87@JgE>BISlQgd2|Y{nUiaeB(Elv5X19twLb%_1d8gF@+;?!z_#zior8_OBe+( zIjcRLotfI|+9ZNc`jm6U20ZfjnC0W16URM!O!2Cn0YkepfBT3e7m20RxK5M|aO$IZ zff})a*X7griFYg8a7JbV%5Py)rOYJvwXJku3Byx6WXldg(UA;HAj;hyHp`S6qZd=U zltk*z4a>u-U0h7Em#3pI^-d$a%B>16>%aipvk)*C0fBNI3Un*-*Np0(JD1ujJ#54z zq_~zVHZ(WAAF?WAT5#93F`AoWQ*v?m?k78iD0zwW+&6C&7dLJ(pMU11{&Ata(ZU#| z68A^#5*rM>d+^~%WgXTM#b>}jNZf6jS6$}<8~x~Ud#k*FX7u95O-KrjK__B#@O%IF zwOfVUB;;>YZ(LJO@mBIA`n!Lv9^+xPq{#o%@s4$Axm6HbdY*pRfCWQF#_5>EqwjS$ zG+r=Im=1~L<+si|F^ft7RA!n>s*wyrVNyg-u`ba>FvB=TGFUgebhE{UIU_sc#ZN`d zoR1n7SC;Hg!|{!VWmtpgm!|NOI%HL);0PCGfm-)32<`(yO<&_^p!-S7Kg&`t0ProN zNy^S1mmq8^^KIHdggg==bZS}HZ~uvQbd|Eg?d%sX1WLjyvDLRe!X%KobjwpJD@u;& z$OJ}+isPS#^}>6NvOTC*Gqzrc4|NTUub!pfkjWC`)KT^FRGS`j>!L-nGU}!SI)zs5w{$&yf>AzG_nSLqNwb8*9y`JcjO+kK59Cy zlihiO($&cDjali}8UGtWw;eqqvT zso{m35yU<3;Wqks$cx&Da6eTlimiYA327zgHq?^}t~~Gk_3DTc@E$ryDLdmQg3X<^ z10i^)X4(e^U1MF_;?D^P&~a=!b(cdNy`X-1EBtib0j9cKHfH+uG->&Htl|^Jm-h=y zbh3uTI|XnLRhEw*R17>#4|!R%@$|~z-?-}1caOaIX212 z?jD1yU%#%L=S4?dwcs=Ym)5w+YdCMtEn}n%qZ6~x?(WvaRw>85G( zJ_&{5Hj|J*l=fvOAJrSy3*UPsL#O1_^*4#S}{r$tUkg1*@ zhhKpci$PU*|I4);KV^&*zscJU%^9=n)opM6ifD4BTe9N4f+r7|wBEjbuutc;uxCid zQbQhU^Mb^GHYfN)d}!(n@C$aPV0v$MUc?iKOovT=(KvX{vl@RauPRn*F7SN3uCwpv zJy~A4=|_A#_irA0$FG2p=05^veGYS4uf1A%c)i_Uh0|;)5IEwlF4EDK2PpAMqF<&s z`hC%oC&0jfhm0@jRLvKs;g#=c8&WsoCx{5-5XS>l^_M|^z2u3n%FbjS6MB(iPUK`# z$aZV?@fGy+pEnawQEH;A3p~vvJ9aqnAp4?v?|Wsid2!9v!c;acsWy_=n0^(ehtFTA z%Hbr6i%Rq+Ca-S)`PB%Ov3`{ckkt@(zl%8Tn!PC%!r}9BeoW@I=h5*5G!e3cUwAR> zM~eW(juPjXofi@>_Y;CvgU)adr$iD4m`mu(FbwQ+X_xD7RWe7`MR#a%znWX{Vx=R2 zUwHEG+@X;!P2g1jfJvG^AH6U0e7xnjv#^$!jWhJiQ3lc)Zzj1TMZFgE=hG3p3Ug?h zs+J=qH%*t~t7VnpBMbS;{H9|~`_9Mlk%~g{Pybs293I1g=}V+;4a+`;HFm0)qeQYIo~~av}(1hC-!4pFnD6l-_E$Dbl;}+cTX&3#)OnD;_&2RCOj|3+PkK} z@#W9Yky45j{&E4^)%O}@UzXn&|BvDMm}2L#^=7}WbC|~s%TUu!ie<+W!|JRw)ba0Q z*U|9N@uoL2L{3lT+F3o5fNX*TU(BEruA53LqEoT|zGKVt%D3c#ZS8DQY>n7eE7S@Z zoSeYa7+UJTq~m_i9Q&(0HvG90XF}y2h6L6s%aOpEmt-5%k=9y|Ek2KZxzUBCqv(rZ zSPA4(E<)Y)n2R74!q!NP@OC_T(Jf_^=6ve%+X*5bgAg9T!3+QAGu(PNsk)E}f{Q!~ z0p)Gy46?A3vG@M+10|p(Fl-)Dj0Kw~(!!&6s9+;c4jzQvF1sNK6(J_HwN-@|X#7Hsi!d?jc(|8@GAQV5%5?CbUKf*rJE3QeEY*I11T z$I!CdSnGexdwuSb8Hlf-Sv9|#Yesh=dCUD}rMhd6Ur)T^LibwdtKxq zl2U17q>})3XhCy`<6?)Kp!BCSYl>!aq=7-M|BNO^#cXe3Q1jCFiTvN9XbQv2rtiGDemH`t}+AkZ4sv;Hy*X{C48clBYQ zT^@nYt^IYn^Pz(RQ15I6dC(>MdVS{qLUE zxcxm8C2bnjI*i9-S_+5o>`8Kxe!KIhMSo6s?#P8CwFaNcbnW62H=3^^yYZDU&5=LO zse&U)m?L~{9J7iW&dZbKHm#nf;K`s84@E+{K~Mt|o7jVOAAFc+##m{^u-#N$a4Q=q zU@5PuELGge@bQpc2KYO-NC~k2^7$^vIJ~u#dRzR8>+OjI&IZESf7#_x9%Z06aq}E^ z#?qG?5L6iz!O!3Snflq*r|0BU!y-DRmtnftaP$8Jm)<%? z`sST|t#5Ux%#!0$(3xAnpyS}~hB6Fuv~tI?_x~%)BKxBEFqAuPci$VNHKK36tbUN6 zj8raCa!z#j5VCqj@jVdsG;aeYx^HPG>T)@hswVSy{H3%0gAXpxZd(TRPekvV?+x>% zacRlF=lqlH{4;XVP>X+aQ5!W~&^3!AlndQs0uG5Xt0sF5Bu0;AD%xL2&|uP99e1Ny z|5t|GK93BdQpnF|Ze+8ctmJM-McJ@3{BMn3nGKfh# zCn3vlhLMa@)dPX;NrQJ;?-+(jtr{6NQuc3%eDGd>@RcV|y()l?)2;nd@bvGY_UmaS zr;ZZb%H_xBFR?a60NfhcWtd$CHXmGt{Rg-#x9yrc-W(&?_(IN#XA91~80liEg}?vHo$m9g$Kr>0wBb96lCg;qU3XwdG2Y5>isr%(J(sI;c z#JjfJEZ_e8srgTGBK#&&6X&ZTC5NH_(La;!)py=)AW;@m-9$4a%-eU1bqjIAMsDI0 z!jBz2W*ZBB2ktgmKR#L>*6&Xt-Cff7T{MHxQW@&`_G7zk;hW(;>Afr!M+*5e1vci2 zCw>6{qqP@c6j^#{22X+)s0H0CPUW{6IxeO%lTC{sT$lST0lD`@3?lgwwU1)W+S>Nm zCZn1G#kDa*{57NPvdE^3TRT6qb`6p$nL$*hmE_7vNaOJivdGMa%w)C zxy@ZEsJA<}`t#}!);e_^Jee@6VLTOo?noF4T_u=gXCU#9O25~?f8AM9bMWWv=h@=Zi&&fNF!-Pv9IZ98*&E~o12rRh(DGc*+Dj52nvjgZy9G-?DgR)jw@BQu~Ne%QIWxz`}s2+Mf`uW3Pe!{gY z>3MHRNMZle=G-d67q_Z6>D49~2k8&I3xfOKRyGy1TU6PjK*1yRQ-!V9xLwv(UdbHH zoy6h5s|UQaf~SMzyt)@gtIFI`Qc}ncG~ zye(r=@cv^VyM~9HuG zrn>QaX6tc0P3FaGbX{5bA^9}L`t#;?XG+ShREWC0R5EKtN$pY80c=@KvnH6Ww5Vfj zZIqD9z?Mh!{roc1R*q2%UoS~{r#K})y68G=<4K@ zKtNh+f%}LW0{@!rqT7ZN2zjQJ7(eJ{`U;XqpgI*>Ih}6(gNc&DzwylxJw`~UtG6d> z|H~R0dKSbcu-2%Z6ll+}-t=|jWx_mOR!T!)NHA+G@7chzwc9Z#%I8WQMGF%{hi6p1 zcl#?}CF>)3gBMCv%70baL>gNNI<@mu^Yk%^?!}QsrcumOxc3O_8tW@I ze(O1$pFM7O&TwW!(=F*{-Php;_{-S%G@lRbg@w!Ntfq4i)y#}Z+6a4G-5RwYjhgJ1 z{k>nv&n7%|f;H~4xFk8_%G`Jtl$NGgFDG;BG+VpFi))x&zc=MwAL;3+WSWU#(ge)N!_pyLxpq@;tBX zlN;}6@*u$Ts_v56Rf$`szhUKQcNCx|wI^W>wLU@G{tbH3WXP>3rlv*Z*9_Z2lTSHp z-23vQ@OqTUc}+EpLPz+@Qs&^YXbq_>?HUEf$_rr)PtWyTyCB+4fveg10R*= z=~c=KSK0rDe4C2U+netE_yzVWeCsd~GgI()ZdxldxuUM;;A0!JBV7=R#o@;fm5)ku zUXX0UWsGwS{E(MYMM+OFu6zqW;`#xP7xTY1ta~M)yO2I459| zTkI3Ge&Fqf+qiWvXvHVd)?ZP!IzDv7E^}c|f3Vr{Cr`66F>6LBZL$Cgq96CwVaACd z@Uu8nr>aS5ZaW}HHJxJhI_he(MU>-mwbUwUrjNU5Kz1}b`8LyCJlUZVXqWpV(5^mF z_eN?5KhcM^AT|SMyyRl|*ax%0;jMeo<#ZI6VZYwVa8jVaPj06I%&=ue%b=1!AQhl!#!6v zV!YnJAt4|JF*2=eByoZ$d_@8mj8J^{$`3&lPE5sv;0w!(AR5Kwaj?I^=rr>|F-lUE zwl*<#Y|sc+Du6GCp5J~oQ7>G*%_2YW$xOEtumQ{~DWSTRgD}Owo5kWK#F>(`HPPQ^ zpvbM}IK>wllEU+HTx4?Ea?~qCrINuMgEL`#@?{F~JzJ-@R9t`Af#Y-7LG^S?RmYQ0 z*4a%qj#XH~@z}iZ($fP-mISXIeK+8l4{#<%*~0z_LEz?rfEDhB9voazB;J3#DdfQz zuG5=%um5hUBiE0N2%A8Xli_O(PEnQ+O{tSC*gu7d!wiMD*lxe}fCF?9Y~?8uE9d$` zB(3{Xtr}VjNT3eX;c*i62t1jzvoC{{BOmlF)ry91nKz`W@Zv;INeFI*ltx5Znor=& z0LRVK-`_j8x0xIA^0jD4(dW;`&!x?fw4i%1>ZJ(r+(H{gRcxLk#OkH2(SIucwq5QBK@&PGwtm;h_(k8 z1Z#@|+397lFaeA@3{cc$lbS)%X@qR>Fe1+u5&*zs%L^on(LT6Ai+S^S3V`&faoDRrAhEKxM+Q^j&Z@vCvuxv--F*7Ff(VLNV5Lu)WIM= z^O}X(H1ZIsvwCJd;1!@uxVm}<*dzmRpvt61Ov^9viQ2rmU`&K%?ykh!pN0q2zJ({9 z&^f=t`SPO##MHlu=p$nNDc@Hf^t_J1_zRu3j~dX z4$Zu^LiiD#7mY!jrZ*0z2FUK%|Q*FF%Dy>FCuSOsSTm@C$UTQ>a06W7g2tz&( zBgEtDHZ$0zDA-+~xdq1~V7O=sDYsy6Z5Ms}Cns5|f~vnJi>oCf`LU>WzsFfNJ-CXd zPJBCh*G%>Ofz#5kX}s|l|BpY8Zgw2rebZZKW+YHVu4*QumcZcIg8^79A9#y@4!f&! z<4kYd-hc8P+TH;B{u1+z!E58TgNKyM^J+tPp`#zLVga&uSpH3fPsv{apb$8Nr9;bO zc3hD$t3gfQ1fpr(vH`eX)L8t6oy(lW)hm!qjD+`)kYlm&Xo=z2eM4UCQjwgLHIP9` z2;t#Lpe8+IS;d{~boRXv+_2ELb>;O#5TUUfnprHALtFl3=7zN|Uzsa#y=}5(W z!diUQ!4B856d2AYtP&$QU)S)&YElu~bGnduIur=lqqeZtrx;zZGQ{n$lwdIuC zs5DP@KjV;7;)Qk%hu(g8;=4hk-BQJe2wL*2$?__5lJaD5fb(j zE0v38@?(TW(^4r+zj6L-cQRwORLgwP1g-vm;2|<7&R!!PCUR0@dR4nxou`pPg9NZ| zP`}?P6}UXd&kOZB)q(pAA}|aFsaY$F{SX4f;S345ty}~D_@cM>UXGq!(zI|eUIpa4 zg$n2nRp@ZlNo=25Kp^&MM{y~9!u&qIi~!0}tGnP^v`SnxYuH{jG(sDK@sujAEculEH zX&3cLMLQtT=5e9oSE;xrnlEl2ZxSov7h&nIZ9SQVTW?%meE}R46W%`_eq0z-S6op~ zE6AeE%&=fOzBko$bFzuoU!?_VaXlZ_=LIB{WXt!so1kFA78|u9{vYRr;%YOEp zIziz4H~sdt>I(l({#L)sRYn~5gey6aWP5>{=KUnf9}^72Q{apCJmaXa2jbTt>^MHD zQixY2Rf00A@oAx&1i*Gl{*L?hqhECDrcdR)UzbTJ{)!!nJ}VCk6Fch*{(uv( z)6k(&>#j3<<0+FwS4=S6E!$?VU@w z%3M8e`euJ>Qj@gl-N@4aYZHipQ&n*h#39yPSZQcI=?&`1U|2$l9E=QdF53A6*I&TN z+{`+nx`k}Mz39$R)_8xWyvDT{$a(G`ssQjbAi?d!olElMD-=-M0>F=6983BctHQzR z!v}m0lm?tPU(zAu;4m`ns=a(l4^O`zObDo9P{+8(o0V#mOL)E%NfuLJ$K3KsXPhTt zgmVI7BSN#p)O%d6HV@}?`5L=S4NyOZ9APh>knGYA4N!O~@<@~A*yU_Y{N86t)sAqV zdvt}^=~|L{nIG{aaVb@$J7mr7>Le^A&iz(s>!n}R%{S zgb+;P?0=cN{tI_`yPLU0^OI4d1+6iXo~jj;5S&1vB#g7}}w2o@A{ zICc7LH&b(SRT>c1Xj^~6Oww`@$+*m&?Q#F7J+yxq?N%*8!=^n8bHkRwa7KX23y##b zuSYR35d!BEU9gb04QjOWLx@)yTAQJ^cVQMcsF)}`#5o?3c3rK~u2Gi;5T7hG1#jOB z!;zmT&B>5vm}iq&R}W!l7Kq$p^CYZ}BnS@1g=VrjL*6EHhw9~j4vG-8s1)KPc;D0= z88cNFOU6G_2pNE=`~@W~-Ov%9%?niS*)^AdDQQ;EXTvWHAy8i`BuaB{V}4T&vEdG( zZ=~TMi4_;h)Sp~$m#9qx$HNXTXM;~_hzIzqcM2hY#SL2A#_;1QPouedfl{h!0i(;_ z+xTA*&ZkjnEWh=?N68%I*vh?HV81(2i5(&a={bzyi+a!(=_9ZmFB>rsfklJPb0;?n zFL84nvO0mm#uHBBYp_xjQhT9g5bmVS`z$`|fQn*NPJ{B%c3q>QvofhF$h7fOHLK+z zw6gCtTs(VA=!~nW+qSW-akW>oJ^cj!qm*ysY!4$aq3vL)s(Nd|WioG4 zuZT?JLYJ-tBOK-7-gsy!Ff7>atE}Z))6&`ZDkPZN%Rvy@h&lTb90M_&sk;J3e$#-WFDNI+8a`XRKgI~X@|X{kAX;&FWZ+eyE) z)901+Lof*@k@I(@1|=6=lmk!OyDC~VsahZ(tbb?cr=H(S7>ExSe04h2A_90+o28u* z)@LT_L?Ly-60axjC+DZ6&QG&EIaL%H+B-HhxNowf-_v0x>jA{v>YBPKp)tVES^eypT)q`tjpvZMit^ zrse3pe`7*`c=Ce*KHLxTjJ|T=Y2~b2+1l#VfW*er>4#u<$`IhC&QJgO?y^LIIf7~o zXk&D$u?#uXeE;MNIw37}Z`$sW$A#Nk+CU`l8kZW@d_>rLlP~38ziHOPwr7R3)G%PQ z2JOYeZw(YL`4}{HR`49TJ60OP?7{$^ugTt5(@q&Sj3QL?)U6zgN%)uumJRb2b?@0x z-Scb?H-h7{jL`6Gzn8)>c;|y*()V^{{wUG70)tMh{P6c=b*Xgil0NZTh0=~yg!efa z&yXes!)-E@Obb&d=McpvGV!crGt<&@J_m#QJPMHnEqDl98Xt;|zx*jr zc!x57HNWLMU&jRTieA$l$n)lS6y91RI|R9}m0s}=%b`}0K%mCL^bQV_;&j5tm(;XK znjj!q!|qHn@S~v8!*eo2a}a7Siql=>NC0YZ0Z*kI#r)YCJiu<{wW6Pn!d>4xDcIuC zYS@FiFDB&&M{!oA^j+aTL6~GJW4J-A?H~$&()Aec)$*~)&#US71IApV{f4;DNwra+ z4-v)6c0;ST`e5N((ou?HoEj1uhXuViYx=C#!}Gq9a?-v(5-UBFDzvDgWWCewltDc( zPXV+~H^iTX;8_bs-c;pf2S(hMP%$pd9FHdq zfmDs=$5{ImG9=Q=;+h^M^RF6ia+U7eCMtvsZJ;(ao#!#7nQ||`e&z{<0iy(g(tLEj z-@A?ZSFE8`tZyLXKmFS$*X(C?GV85V)9+BUZSehc)QQsW7V0FN#KQpmQ#^8`aGz1} zF(LxeX%9DqOoJ@(GDU_tMXUJ;97w!ne__CT`Z*iUF8MAP30~7dLWD1tm0jhbEp;Ul z>$ofgw2`fU9qWm=-UolK7})^8IM(ZT<7#otzojwU0;fH_Ql4NeNSi_gSg9>lS}0#N zA+Tiq_y>@vBN-;RE)VN0RV4#k zwdhQIolkuba`K;w!3(!f&PrZsFa`zQpT6fpJhc#Q&xh*+3^Pm$M9&?BQK#ggYND?9 z1p4u48Y8y5kjcEZzs^=)(`#bmZO43*NpU*Y5gJl|SBZDL(%jfG>eNId4l zjTRzQBk*1;!Wzs{<}1>z(F&MEn`%7PQYwwT4ogPjfkf=`U29eu<4ZaF?Skn%Ez$S- zo$*ID5St@r;}hhfGNY2uefuvN5?R*I`0TJhmz03?<>ahgoZ_>V)~6dqi{3uC!HIBy zLMnrO)?_^s`&adIOXJNO&9wh5Olr);N6PxNp2R~svw=jb9sdRV&rI$R5%{uabB*D7 zS>yZ~#KtIa8YUdRuptOT3xff*;jF-0iu{9^oSBj%O z-xoR%39sSm{B)XGgx@Te2yFt8 zZgL{g{MpSA5^{x3zLF9OkMMgZ$glEd{t2{To)%y*=?D zNw1nLfaCEhy43$(HU@=9`jNtza5PFP`3yzaJ7`7CFY<(Vwq-DV46lzY`N?FOj z`wpU4YW84*aB^~^GPqtU$Z!MKHs+mxB}rJ0TVDE%B-mD_Bvj)4&;+i-%bGl}O6LNK zDVvOYf5u0IIB5$Tb+!5&yLyMT09q)m*g4s>P5_68|9^P+Pyat2o(DRC`l;?GmKQV^ zXy{4_;n=Ydj-3L+z>{AvK*)Bc3mC*6PYLnEvp}z+A^bZL^o;R>4Z_FML-*9sd+4AW z1M~>}zrVpCBs|>@=*=7#JPy#}GZ=bg^mI6n&Thh|eL!8}iT{6l8rCwaZ#}QQBm?+l z(|JXfe-X^5P--AoR@4!?#q*NwBe3j-gPIaAym(@{IG_e*!m#s6ot)2Z)Po2NB}bMH zuUA#+fw=g?(wc|GY6xXaPi<=C+jE~z1mNu%i%;7fyMP?R`S5mi794b{2%mBnjTY5} zG6NCp0MRX@3!|0B&}X7&Xi4X-dyL3Hd#+!glqAn`L^3%+0kcq(9Y1uV!CJhTWwp7a zx`m~jm0l5H5;%`SJbmW!I-R5lS@Q#~2x<}qhOr#5St%I4i^Y)KU|EGn)hT@8BlyStmBpfjw0&>tc ze9Blr`W34fYk8X(A7iv9(qqxAPfvt1yeUlXVWG;X}LlUfSePn z&mHzwDD?j{4pm8V4L0u^W@QrMt&X`o~R1J-hb=5Gv^qH@gbpYZs8R2tD((~VTm`*`g! z`8ON=Cl}BJfp*`gB7hJEQU37Z?GUP$(NZot_c%>eTFeBJ=azd zNm?{Opq18EF4PEzlev*61Z`0Z4Y$cQRG#vguX}H%-I*>Iv|qE5|5I8X-xLTW9GM9R z>*RM%q?|o`{2*HoatiW4QxrmbI>0^Ko^4Pf5=cQipeSej3bJFSg()fVrMA-xWPa!k zT*ebl^nP!Xwu8C{@(v05_scwglmVlTG3utRpE6FC?O{;if1*rNbmj#B`?Vj1`1~?d zxIkCP$Wql@#xHti@*Oe2@p`av;0(j;(^s+Mg73V}&NTLqy`~J!>{(LNC)lD6guZ=~ zS>a81H{V_LFZsiF_nSWapW|Z34+9>FL~~&ozP+3`=5cfgo(X6%e^s_1trm?XhW~SW zf3fL5dt3z~O5sQh=IVo17#`&Pc~IJ@;DiiP-#@H58C>R#dL)PsWF(`lwQI33qXn2%`=NHq9($RiYf%E;r-3RUvgu{4Et#rpDaQ zMz|CqyjsG=2$Hgt3}5pK_GJ3p#_^(k;8l;$`lTel;J^p>K9cZ%hw`F5u<5cj!XH;N zdM>C-0JydI=SJmup+G4U%M{1uud|%~$hu3pf*1nmj!h(DhUis+RTa`u)<~#^bFuN` zpbdfSnncVSWKtO^Pl`f|H!g)tL*@MTYvPP&6i|+2|222hJHy*QD!#Gt@TH@*{zlgE z2$>icU#ql~wQ32Haq6a4&^lH>*}%J9hoQ*9JFokH%)jsyy%{s>`6Ch>kn0nudk591 zqHbp^5@-(t5})^m^ua&(tvMC4a}BUl7Hu2NC%5S_`5c+WLeLVqd@qP0&*usyw2tr* zdPI4TW&oi346xo`<}0C2!YAXO4ZNVap7Gw)&^SrC_)*b8NFirHoJVg9tDD%-&j4X4 z&EyXVy<~WFtxe~_@hc?c(*X6$^hi=Paq!?1V&pz$h4CVlrcf0Y=AUptT=_z$7xkg2 z-ZT*h!_G`_k?14_KY-~u3ydvS)8Keft13Ybeg5xZyDAdU2ff5VC`G~UvHyO+p=VaH zK9r?Gb#(`d%Ja;6`~sgJC_~v8+|m`XTKQ}DYT9BaU!e2C%s91ugb9z98(<~YXA6S2 z#$~hul9#WcmkYhb&N%lnG;PA3OpKVUlV61_!{-ii)c*$PfE=L1K$u00ys+{hzmr;S z2qdCgx!_T|7>i3_!*~07B5P(sN1~u{+OGqVX}oSQ6v_bxcvi%S2eizfU$?u@H_7tM z*6kr=rlGFs&!E)&k@&cT@IPmuas#$Km#c5E&Kpeuf@QUmG^~j)D}J=(LrdUQ!OH&f zGLaRO-d?ST+C)pElPuEH9lXqPvMX(EVJOJ~f|2(yOri^h{{h2x$Fp0V&rSy*V=Qvg zo0jc<3{B5`JJ&s+P0nxm83N|HR`9aV{(4xTh!c#BzD%>@pk3wWg1vW^>cQ!q#}@(W z=@Et7vC3V38b~mbIo%G*6E0Jg|&`w2MJuJl+H__Tq2k{?ouTh{E zr*V+YBix2sNpO|=*2PGGBTvfbBD1^e&`jx7b?Q+1X{l4NN$m8dtC$|>UMEyq6A?&> z56{n~-#}*$E6^Q4eNPA&nT-OIv=a4Y`k)M{B|&b?v~DcrtC$3gSzBy~Ol<5Rl;O99 zlo)QN!O&7nm5u)NRkU?=UMZD!^8x>yky2}II5vcaH%>PC za*bohkBuD#K*T{~yviX!#a&ka!ajm%)Vz2X4BVImp|<7{9mDq)-ucrv=fCTf7j;V0 zXdLeJ)Y=M8Jg1`WI5=n$lhNv?2c&t>p+Z))0RSg`{}((EvV6sG>ad6^_ST)xoEmphs!_QRhb!&3{vtiN2}FsuT%5O5%N4 zlmd8+#(;@}N#jwTIWHJkmCLRdE=?AN^3|goMhGl{AN3)P2D?hkDPy??A5~O;uPad4 zLWx2T$CEwlQqXn$e`xydc&gv`|NBgvLx-$5W_DI0jbmnJWUuUOvP1Q<3Z;-OLiWnu zbcix4vJ#SzvZ53X>Ua14e1H0*hvRk5dENKxy07uPuIqU%H0wq6{r$W0njLV}LbTVR2*0Vq9^yECW5D~j#gwME`WlBpSvA7NcW9?8qE zjXX^3&42)!!kU?*VWZdT$%E@pj4ys{n<-r`cWAV`SUG&D{2d*9;CfXTLNG`M3S>TE z?5h$gjo`GWl^a3ZvsEUck)PXFPQ2v{9cTk3Q(}~$M^bTc!H)7UwtH|oX!sPGLi6Mu z8jx>3ElK*;#b=rl2Nf;@Fznz0><3=jKffvfq+egySQ3Z55jD6r$ti+Wvv&iamW35) z9rGyUbSZ1}pb@yekrc{Dc6gg6Ml}~}B!|6ouUjeno9`U&^5+Zx%&@#}Hv4H(T1An7 z*dkTDTM|~bk5Aq5Lc{ArW^E@858X(=^Q*DP_E_MjL*&#CaNN1&Lk7V&-gjEf7)53` zraVaJ%3q_-Xs1u@9`kzBVAW4AT$*iiaPrl0#bSlkU5l!yn`Xub7t8+7pwI!ot0*v` zZLf#7KW-u9JzFk@MUk)7M5fiHvL#5clIjbn4cVadco-u-meE9%p#c^_Py1%04|3~+ zGXqyf!gbz2`m1q3x~jhJ@%}>;H53hku>gxOsG{a0_w3MHVASJ0nX;)9mbk)We(P}AkQ%^Euj@Q(@bZ&+1aC1v@{UNCr zFD0W>$3*pW6z#o40I}dtcngC)9F1|X^BDTQAo9xJp^HE6J@~bXq48R>czyB(p09FA z2u&z!WY@I0cVCT9N4NohM*C^j>lRPy((w=Xf7OTyCPqA1O}U~qZ<}>Xs-!XFPL$$U zHB`wkw1dO711t<*I^Gt(q*QJZTc8R+f-8*)BZP`~QUN(xU3acvS&`zBzr1GUe975U z{7tr`l|bs^udjg#8tU+d40$b>!@Vm1ofn|t{pHj9Ap$_qNXy)w#XSkYDLj~s$i33B zG%Up@!THveOc|)PlxqT42yY~viCoT<0i~{lT1=>7Pj-5B7RJSZ%FR5`e3n+`&Z6(sfvN&Vuffj|KAOhVZ-iPhH!-Y$hW>7#kcB~%kqZ!I(K>c zq^dE}jomRL5uB zHg$GBzF2>3^0d(Ko4zl@rwM+w=>2wT5S@?yIJ^*ER@=Aq*9F#^^{ax$ere4f zWADndq1@{)9S^j$6$fMHUci%ebf*>C4-#u&wqdoaNt%(T*gc|O3GC_1 zZc3~divf&|%dklc?0N$M?O(K!cYQ|w*77{8Hh)~bX{DM|8(0!8%d10p@ORL1u_r1m%TX94uqQ^k7MdhN1vL=$iln;4X5WYAL(?o*S7S#%&3T%Oj_toeg0yQRvMj9^-bdk0)~Z zip$%)k! zXx?&Ot9u|`_x&VZ=Y|*Gi*3;m_N>Q0g}IP{o;&;~WxN+bi|f;$=}WLXj{X7GBKVzU z7p(KKzZa2to?5E2A=!)-6@TkXf5m`PiRIwyPGc z_)j);4C_tSaMo2`*AB2n(In6Z<kwoH`IwD!cdeslYCOyWP5&4nFWH=cK=z=R)a`17W}*x>nUiApgv()qhE=Nv^m z5H;Zc+o%~JI+SFv%{GrAe$sj%X}sM=utHHV{XKvdcM!?kpf{EJ7fy4&NzUInF(`Y~ zMtN)V2ni!?@r>Q?4^PU_Xo4@8SifeFx|S3`Rg-)qp!ahea0ck^eRRDlnS!!| z0+S&aa__-oYnLM)f=zx|%PH3f6$_f8b*H2bS&zZ+)fcQ)i>h9KfcM*37Yd~T=f7wH zOk&rDu(EKfQw=Q&Bu#ys424dy;Lqj0)X6)+f@7AEI4`CFJqvY$t{F2p zdG~X2u5O&22u1j5+I;%?Kl}9q_|_UYL>xgOnl`h?FMUjhW0k~!P0)qQTYzWVkKs~S z12|Op4T^TYo^VZ+%;_Uz9($z0%TH95Et4YaFKC3B6|mq4?O&higE_z3$TTMyNRz73 zF=a)4*ZXJ3QG0b3onbRK#3VUh*0owY#Hdb(4UWo~MsNRkgn zVFJ|+%ZfH#U@`EINE-fxs`J^9iO%$))1+pM5RHiG+qB|zRf!}nq~pQ5)ji<~a2$;& z|H9(m`S#-()fd?w3P!bih*gS;x{pXV`-tReOGr7vTwvU3e~+GZ1|TR4#bkDR@Ra$d@y^Q>&w`10 z1>hrXAz6q4%krl!09FA_Fk)&_ttE56N?+GcNirc`CCzstS@I z>(8$XZ}6x<(?Z%dYTiQJXm!4rdy1K8yp&1WP(_7tN~2oj3Wk8u3E&8AVzrN+1tM55 zZ>jJm$Aszd7E@R2rlC{$<$I2~T{`|u-y^IhCUYv1)*eG^3&Dyrmv9UIK%y$jJIe`u zb>fAKsf|VjAWf*xK~r4B!v0y9z}Aul$Q0>wDsljxoJ7+*Ab-@51}wZ~6Jl!IP~B={ zZZ6foI?@+X&-yA@^K_<40hn4K8fyU073Q3t# z-V<{3>QH1c{hFMitwWJFqmn_YmX7I2S+lII#gBQpv&I7|_X^OXI-P#%T!r^CG+*F@ zWa+S(3g<-M(idAf7wGGlTA7Z$xU4uc-1JeBuY^21Bz*!QPu_I+E{6m_YG=!-UE758 z^_RYdBt}#IZG$@+p&8t7zmHrj+(X zeqhg<1_Q?Po5*)g($3(;x}vX$AL~yv89eu>G4&>?Ztj` z>!PN3Mwlw_LPq0L!d|weUf(E%Qa>SU7#6k|F2Mk(4H4C#$owG$rPap5jv@lF6>`mJ5x$!J4-_7MdI(MzZpg#g7d(*QKFl)fb)y1} z+}C@Z3c%E=ICl^~_yx5E$qi22)V&Hd0+EUeb(CNvhyjJ@>0B=?;GFFI^zoT4kQZs) z?)Z>$c9QY@KQs*cp7vErI*%x?>lSpUEqu$+S~t-{Vs*Vwr)iM4H{U$1huBr^8Yhs4 zoMe^IXNomdCEcV$XmE@s)~j!-`L8W8&!u!84MQPQP7ueRzGe5vgxLgDhRUz6LMvTA z%rIvE-Jq`C1~r2&ittkqYkaHauTeCaLfZ}DOqf?6yzzD#X$(Sqt{$1yoDTEhAnf~z&**FUwJS{rZ1s>7#tXs>(^1O>vA7+|=Z`As> zV~cwJtANk(dzbG!h{5|^pkCc?o(T)bNG-;% zHO~%GQyL= zO~KU^iT5gNGl5TA_WjcMg^Cyw9nsCHawYHG6Hf6-d~G7i|6rIs1ryk~vnX=aT5>G& zW7CAxiLlKIt4k;MLg=SuWy$0^1@g?R#!YTVX=A_kx{2Nb$WtRy@_y;2-`j%@pUw2j zow%|zC&-~~8ua}jXU3&P{0Q?;SRet}t4Ir7ox5ofa3@J+Fdt+MclYrf` zFj+;Wvbx0ifR;l?9K$d4)8Ee)c995^UO0jA0v(-HTaC~cGEv^v*4zV zHGwSV!mqE#rJyd_&q?axVTs5GiS8{1`(GbWXnE#k$X#x1(N{U43AXNoWEB`HE1dG zOh3Ae9R(`QM-nR;!N8Zzle>wK5FR@7mwhFN&Me4*{5UN=^!BwOtJNBJDWcoy1e}3) zhyKjRjI#4oBrLe^a(TSv*&)cBhW^E7qDDr91Yi~;UIpNbj4IlAusfCpT&(dH`*Dbr zJ%%XK7FUogUY1~W*u8)*dXb`z$ zkhQQepJ}d76zhLw0)l8DEKThgy=X5D4N)&v9)ov|DLH4Zg+3`MUZ7xjo@SMZCJ&(F znR_)8Em0i9iP84Qu?QDuN;Klo4DzppmlYF$v*GaMl?%6T{0QE3=tZzV#TJwVF~05M z7^5GR`n>q6Uu!AU;0Dl2O`~b5q88OB+Fw0~_JT&~Q;s?o@R25?0s@om^aQxMxqYZ< zyDdxBH0sUDw+u7_ub#Hy?FsZtvoT%#sqdKcAhh4tJ|&bEA{6N zRYr;#<3Q=(p;yPK0Ld}TVY>vwI=6~K<~tK;!3PxSUM0Trp(>BVqrHmbs8O}lkf5%B z>`8}?Icf;BP7A!dy03b&77&yTW1kX|n$-~g+Dh^bdXj0;I4i{ASg~oZ8megle;EOu zy(ka0CB#zF9-yKHrUAQ}$;0Y9M530u*&|bxf)s+Wxd^0!{$X*4ClE_?zSE>w`SZYb zF={rjks(T!y&hd&F`rs!XiW3AWbwX4>3*2D?~X7!e?c)Yk^aPf)fl2b{ROMug3fa< z*)>au8#{eg-SVY##U4vl!!75%6U$VxX)wfvOZ`#9Nr9*ZJw+U-9=UJX!JU%k z^pf$Yi7*U!_a{srL*+eLMy@!A*kgf+{G}#N3alNhpYD>!l>YT|Pw*-qiM0`)WwZWn zekm_3=(fHh0Eo$R`4d#Qi(7yMr8Plg7upeP%@k>}V=4-u0x?(tdOsZ&7O`73QPP%( zbQ+Xt6repMPwJ!adwK;iXs}}f$CF8A3i66NWp=(sI>>Z4b-o%k&cEc;m-bAiY!p%U z2j9{|nad`#M8)00eq_wWxur;lV5yl}k&u$`;q-<2n9`^4yU*p*N^Qu7#4_|14-seV z_d~K#dG4-je1l;_dpGs`t(h3R`nC_a9C{B_TNN|&=k9$o$iqzvn0YT~N?LA!olE{savan+CZOJ=^o-Uz zCg=5;gE`D@q=7vYQ?_umhIvI*IKq;h#E0e9Mt~O|;fSH3z97hdQ5+R(%}#A3mWwu( zA)88Epv4nFtc}>+C#ozZ3|@toDjndKM*kSi#3Kfe#PaVkN%jH3Tr5Wo?L>4a7kUxw zzsSw0J$`(KcC`CP+tTsPbd_qIdpgJUXSJyopIvb=iIj2ppaTdbz|Nn{3pL&LVJhM z_UJ@cU-9%=!5rFh5NdmEBhGv|kjyF32$ML?&C#A5L4*WE#GUbw_!&{%h7OpFE4V90<$I(!#?iiBGxga!Y{NqvWjuoYn#mPI}%_cG9Z7V zd`uk2iK6~~S5hRc)k9v$hWgu(xm&qOi@K0xkzrb;prC1_Sm9ofTySmT9)7y6HRGjgaFw=4fELcxL7kf<%e%?F#;{2Jjx+Ygz@-vBTnO_}j+h=covSPYQz`RBdlS&@{C({^0- zr{Al-6jJVWe-rznL+f+cHe9@d{i8XhR2IVTb$H$={-|xu5udw6L-=lzAAdAj8e@3- zTZyT0{8)^bEe^tfI2OV1p5w{nLK9Q%J*$U;Ak_6ha6taSopXWX-?{Ic?bR9Y>0GMT z+>P#=|Mc+9VahdwRW_Y+kMIjPox%3~Mc$#UI6iMKXr9b6NKZm@Bm9=54ht{d^kKx ztma;Yy6G#yY5h`fGU|E4H$VZAF;n?D4s7h4&GiwVQpIpY_XKfcX0nBpw1*R_@yjQV6nsOsHCbK?fQ+x=x&7k+JSs&imk)k{q&8` zoO$l}Dch7?K@pheu(I;qc#Q&qK4&?xXHp&>%a}z;(R_ePr(knWy zLrxN|b^NSg&hz!n$c1KFp~Dtk5f}f;L$~`vO4EHoWa}_2A)`Ik&J17xBQ30ABI6}l z0dZ!aDv?l0O**1b60Z3>r(-(s7<{ew+~dFLJc^HxQwVPefcWb)^|-x7GDT5dH`<#o zcA$8i$Wlx3#8C#KxCao5y|WiClpUFIO)w9VxV^zJ)~#^gQ7Tr!a8B|>+`2GRuJdk3 zuU6(k&x0~HyZBD2!%1JdtJ-dvUUk}HKmHs$AjfEbZsBu($nscRkNwbbC=2)=Q`v@~ zt(ysqrtxvuhkoLgRV)Ta8@e3o`m5mjVP(r!r5V5=fev_k2CV=u$8_%VDgH`FH3;+? zfZTokj3yOuv(bO=@qu+4_O9ridc}|wNiqbTQcAY#SWuz)gbh%XD+Z@dU)Um-ED?R) z5{IY14Nr|jqcCvv^OfGunSr1G1^HYbP+LdtxRv1&VE_&o;^^<@KaCQ^7JOia*lFYJ&o#9M9hII64l@(gm4ITmEiV%a z#2u^{Z0|P!$?Gt=3fI71^D5t7Q$~XbPt?L7;~*M*_?aqlEL?|!67$kqch%?Gub7L% zYEU24T{^~f`FU>g4#bKOM%3bv*syRiAYBL4px~4|GuEObscKy;qoO`|BPM38EeT5l z*b&6ykxCz%jjX~`SFKa{#=mGUQ(y8y zlFAwlH`mUcv(g-l!A>GiJ_v-EL9%QMsGz3a+?@@EZHwY(aNX`J6CEbIX76%uY+wYh zZEpV>KROvQIUPL8AL;-f&Od*1Z}Bdb+exq*Aq2!Rh#XAR(CT5W(V4{IdTCWyu*+U{ zcKuw`9UMsd5_Rb#C!kFH=44(v0N3^aaH&1}uPBqcVz-DML89KXni^_E^0QP37cX$n z{oXmCs_y(lf){*UDDDWRKLjM)kZ7$;X-E2}2;h5YNKF>@=(sbEeeX#Y;2vdUz~c(r zU$gK_pfBEqy}6tE<0!Gf>XIA+nGh&Ne)?+dNKBlJEtUNH6f)@y<|hl=CjA=ng_I*+kx2^}xb7b})vxGuHSoDe9cg6WDl~68cJZ|2gUO;MUz5ll7;pYp z3%NIW0^%9RKOU-;1**CBk5Epdl8j000dGiR=D_~SJ=fQg2_t#*JNwReQDC4{IqOM| z63PM|j$}_xx_qedwX3aADyFDD^UPosoyr5=1~p?R445WQc;>oKy}AI4n}9tS=@Tvy zrZ{7bip;*bF`owux??Ze4T%LYB{^(g1;Ked4Gn#5S$#)Q0t1@`a%0dhNThv)W?-}c zlV2uS9?Y6;t3QhZ)uqvy0W_FI3_Z%%SM7b-xADoDZx%l?E?1Zu9Dc>C4dpbcn52k7 ze2E1N!1fQhj$=hak*fR3N>zsQ`PJ^p0pl8vGoegfDl5W#;qgbgB;M*T#sBjxVaf2) z>H)k}V1@@xLhEc67~zHtM6f()C@qT)j-smW*GB`{JOi7D+DTckRNWbFA1F^hmb6UN zKoKLW&^(k2oZ|l9d^E>(EalV&+f=_zF|sOnUw3>2jRe?O`S|kMk;L9Tnq_y%N#TDoto zH-0>f!lEe*cv*_8_`jnJ@_i#rDYsMH`FZhxCrtQn(zfJ}3b7<1j+aY%hh3&Cs=OVAarNgS$s+GSDjRMj;wSZ(nwnP&A`8Qc@ov=J!Y>PHI|F#>^o5 zl?uCGuxXiTd4&bb*GE-}*FI)Ei7>3UYCeUA{Fk!m@b?7vgt;G@)xyYQfm-O-QqU2@ zBgMuA=5&_SSLSFvjE3jsi>{B|sB@NbNBu4Y|Br4x9$*KH)&Z>S5`VT(n=^R!!Ho6!Nsi`Aik(StNd^GfdopqaJl9E`5NR|^%QZ9wZj6uB z*Zb4)7VKsweFX_}bvPtPO3eACszrFMcOP0mOCXAKq zNOIw|QkD;nGi2TmUTTu8JmpKXfx7i(E{Znr$6clta4~iO%LednR7_qy%Ox(6p1+0y z{SgY%ki7no`i$tx=IgUz>$4uzV~dY}dWUzo-Gu0NtkUwB#?e>)3Djo)rf6%JQ2{ySIxs4XL#{hr$vcco) zr`D#$g~s`jeu4bOuVWVFv(>S`4`FmnIQd_X&@xm*NSMcMhqBUe(bJ+1TQ0qGmhTVh zeH15LK@+JP(YH`}ATL!z`n>!?0 zHOTTh_j7T!0|jI+h1{GhHpfwJGLk(Qa8c?2NLWvP?5sNcDnFGwd5-0;+EmcRqp6I5 zz*l%9eSU05xn|Sn^=rd)C2AjSS zYo`T~$>A2Sv9@M6AKeC;DH8MJsjlZ@8owUww4rirwAI5noBUG>%^kTyv2pRYk5E`8 zbBlm|tJkx0Vzfspx)xeU+*W7I|bhy=OazflBJ?u}(B7Ec56IffI%iLElpUo=4DsA<>;T6C;ot zBv?-+70Bi^8$K09NE~DuZlxU$-q^@4rWmMBwZjj}`-XR=9mQb##9Ol?71m$YtC*2q zr*TrO&k#C{ip&@_i+~VHddM^JdP6viMJM9XSgPLy zEdkOmiy-mR!#TkUR4&q+Bs^ulk*7ohtjbli&P0sLox$P=+_SZ)Qt+UGJL!!PH-+kq zlG&sIO}|~(v2$f(D&i6G??`{YJP27|dXnRPb0+kn1^BPR=sSMdodPV*^>XI7{2p_h z?;C=A>4~*@vg*J~FrLE>Hkw)Pvw)_IuXq_bA7CF0w9L(T;HjjUBgdpBSXw80=A8?cMP)dmJEeo{BMQ}=@hFyrnT1Ith7lfwBMgQfk*?c ztb0gkvBI*mS#zd?_p~6iX9$7GhLT~mE7i>y@&NeMyMHk``1=zKAk}6bZ*$i1QC1CF zYZExpda$|WSEmh6#hV0%?8Oj+k;qh?%ci2_uH`7yC=V3}e=@o0wKA@Z0g~oiBO~vw6r-z*nD>no3;;;1ny>d7}h{a>y;5;LGkm%Yp>6g@CQ}y_*46T>K0ZH)rEdJ(QO!xoxzM@&O*|%M0FZWddus5s%)3$LEL*kXZST4*(eA!lg8Q}-lELWm0E4 zEK_#gnXw$!x7&P0j1Y&(DJTlxZ4d@~18d=PxZzSq8FNgiGT^6)k9P+P!eHc&|Rp_T()_Vz3HT`@yN+0NNrCG~BoS^91L_F^7oD&_lw4`h3 zMAn`hK}=`FrwKYG3Tbw_zDDO&WETXAh*l=_AD1$$}Pd>BAI&Ul!eRA`Z(w9#ETxoVl= zFj$55iq;e4C#$MaXN{L1Iw0z_SjB5iU}ad(vIop9NWBb?AgG(RaMI%Dy{!3@JX`#4 zpZ#-gZ)DXj_xrGYfpS{uBz0L=(g-RlSQwnt$|6FGzDs73B(pdp#{XP5qOQ)X6 z5L69yH)e3bk=J^3?exIV?@q)W-dxNA2H>QLmsGZ^sYJVGrw;m*oD>w4cwj!`+oOQ2 zlxsKp$44XYoS{S2qtRE*!)w#aPW3lYrg-J(S`b%o_c|UHU?(-j`k7B2KE$>=%~(dUVf@$ zSEFSJhSluYW+Ng>AUu~gsaQ}feZn1UWN@qko8)xKOFEbcr~*}h@+kOvgMmkBrS}+3 zP>Ag&?!)SH(r@9%1HXR!w)5CXEZlo@R?PAB;a||}hFDka=a)#sxw|JnN_-q*g<+Lt zeJnN~4N@Df?)`?1QtvXkBIsb6u2spc_h%o5co_H|<=j>JHTSyw+)2wIxS>W{G9e@E zaw~pQ@ofsUZHHmSJ=dIMvQ@R5J{`!nRyV6&gYZPsW!BG<#vsw^qBsKv{N9+fgybvH zMTwpXjjU1eR8AKC3HhiE3(YTDYXcUU!*&|fA`W!ai6RWD63sn(eiRMs_sn3~I(I7c zf*vL{ufa8($$?MDzvdiNzBf=UEQimM(RF!Uf8zds_v zat~Opws+TP{nlpxJrFy!LpW~gLd)!`t zWB(M*F&NhDNW!Vz#=fs>0Qt~Xc}4+_3JW%P9aqb>sl_O_M?J<5$__)NJ^?>;EH%*EHug}D)GtZr=NvMtA5Bzq;P z>FIIk7cMC8AA&JqEjGy!Q0i}gyZJRj@)^hF{zNX8Xg+3*$Spta2 zk38#_)=Xy_gbcKxb8hHy+vP&brJE9?D8#{&?q;i&{e{ zMtbh+!7JV)x+j+YcGs?R5M1Axo8l^f#OJ4^}q9@x@6y_t(aWb)SbsD5+g_g zeK~*wVi;*W?o$8sN3DAv za>lw)xaR&L|C$&y`6*pqD?PB!-gEK&2M+9>Lw$5e^MRndJr2NT?UF>=8c|CUl>Zrn zq}SzCQ8ps>zr*)?P7POo_FE5wMpn+}d+_?Ht*b8Q=5(Z85Lr|bDkXak((1q;`DA*Q zhv!#GSY(30r7RC0wzS?UP7ASo8*@vgMFL`jT*D{(o39Vd=E`Oq!>iZ5B#uiva*7i*kZ z{FmB=hkp7LJVg2Z44H3RCG4?>I#W~v8E?{=nSyOE`CT3i$owpd$1=g{!;o8Oh`pWx zq=&YG>=1tgeL+IUyU-$l7KmjC90i8WH<}_wKkE6A*^NGbHN3@U@QV&MR4qSVI#+6& zHJ2IP^ST)lIpsI0v(VhzfTAClzmHTB%d4Ro0NFB6c&vssMg zDT^ES3jY>x|MWMUsH`1#fLB9Flweb<6^N`u#h=5(bOk8@w8S#b{aeH#K3^kK+lp$p zQGrj%ZrX;gZu$Ly_7Q|?rc5ZP}(#z`R)Uw0%9C6C%5(@$48Q_aT< zw^j;vSY?DaPU^A09+4N`N_no+W>z$1ZLx9ce_m>S+72p$;&mT|oH(}ECOyH5D~!n_iS|o$1{g8(u?2? z3duDIR=pwSg=j-R+W9M*`)VmRezre3eveZ(*eo>f!x(0S)K_$r9?0nq`gF+MX z-A%?z*Mts(o`n&+5~nvP1GKKC=O) zZW{8`8$hjPmUgNJ6&ZtFn5y35rhn3z*{$IE$Iser(uMx>WmLigKV`5(OxkD+rr}LS zaeJq~$-lzx!Nog%LRpBhdGz~+bpp)ytV|dTws&wUCthgItiAq`;~sCy_+{I}^t((> zy?>xv`v)$XbWz4g2vA-$I~*Z+;-P8|m`{D;S4Imc<-S*FK<2do3+TI%I-*-V&`?T1 z(%=3Su}GM#03?l9WAYwkNKW_jm%E_L1d6nFl}bFFSJ9S68U}coKdv_hKfko|Fz%fh z4158#AC*Uksj|AfD$+=A4-_8{v0y;(_tsQ5Vx_%ADJ%VkwqRA;RJjX9vj3G>vGCBe z+L8w^YdWg{2NlcWL*?cso+b!cI^{U3XZ|2!Q%bDUnsr1Ktr@VY+b>q+N%9Bv%5ia1plH>5OjW9F&1kKVvHFC0s(n%!0sE5rlRE~YFWp5pF*`RvN} zVuq#WTubV=teNE0Nz?s*t}fKgl#OBUdBz0?l-}5Mbh3Yr1$!~n{U#v=C*b(Nruc9u z|D5K$eLW|QPC+4?P&?hqa|$6#k@GX*B#P8G{2?bfMrS@SDR*|?ccJL10;J4HJ7Mz2 zwO{W`|2Co!Mng_?R`7T8UFKoKrcYPD^Q6Gm?^K!L&t51EmA@XjCeEBX<@siqz&OP8 z(kty3#v2UivM386m~@Ar!d~xH8Teri{EP)!JZ&Cklen@&-NIu&NTA%(A(ZOjdO zPB%7HxhF)E5!7hQmZ}22R$?6%XCM|vIRckB8DK$I{WT69NpOitiPi&LqghFP_jg8( z;V^`XuJB3Br8(XCD`0f3!YrZw@zdX`@cHe-MP40Yu%M{PgOt;imVN|=fgw{qEC>rT zevvH-MA#n?E+2>aJNdj|0U|*7sqVh$zpafQI1NU#iqU$|RIgM$`%L{Kot^+XU8rz= zyt{wxwQoJTy5V0)j{ya@Cz|~HGqmpcL#9Jsj9UH{|Vu+N}|rMF?N{@e`jrj{d)om_5$OV>oYc(PZv+J z44R5fR&bu7xR+%x&|vAkOLpqamy>#qY-kh!|2210p&*yprc%3Kh`Gvv!>P z_yoW8qfvj>S_ljL_KV;CER|*-(KOlflj@p)*NBX+#hZ)0t=c_7RA<%+R5yYa(bgxc zLb#y)1OGtHi8}fimu~wMOZ@~fkZi0T}-dvqwnh&6Vy8+Mb6~b!@gq%4rQg6K8k720ZOy)ei@wYWXc0Vz`@7hEv{vq~- zB=Yx!@ibLPO;z8#{^)k}^7qIn^qK4%+o>u2b;}8zlGq1sH>6TFJ=!%!)_SmzA`^Do z0L1A&ZOS3}e<%WFH1EUx3)<;N%}lZ2O7~UXUudA`DT(3(dG#v@K zi7d}_QFrE+{_%d5%^mRhPgLx|_7S!aeBLk?kP@D29$}^&t%}{={Ot}{Kpf@LUJF+= za{-1uT5dt{wcM$!DFPY)sf+W3Vsx^hM@^%7XX zoIeY>1=H#5k10?#cqs0r+qHMx@x%ZWrQwRxG!4)@0pEa-*E{WmWUfG8kg{Bjhfo2M z-uSuk78P^=O;#3#JU7_0zQINx<@t8rW*)Fz&{F?9^}_??vfwFyC?&bDGIabmY<1-nl zD5;KJ2Knaa{aR}x;7s<)wyDQ8Uh|^NN^9+p`f>){f~Di_dJf7xuxR!oys?ZChNOS- zIQvU)jQmTQJm+x9@rS+QXe7=+sg53yUt~jXhajhHOIONx2GTcEGH2CR;bSxd1IS41 zfK4O+(nGgzmjo}J0)az5AH79saI%LMpXTL-800E{nXQB4D)sQn)!`94VvK|Yi|~gR z|7)rc2@E?arXgks44?9aab-#_Dy>|@Hdx^|M@su~<1Li75* ziYJ%9Cx?ik)ymhMY$&}OfFO&*GusoT#>r^LX%N)Q^n%VmH)5fL|>yx z_W{Bb`aPHpe6yf>-j7Z!?$>7(k2FD%>&%WrNvLSgW(nT0&PTKjXV?FnnRi zr>O^uBXDjalR}|exglz$cMJNtNQ1*^$$l9i8{GQsoxz#&-A#_0@N)Yz`;3nn&I!6W zn4+NO4;R)IVAI;(6IaAdFp91Is)||srUVpTR!iuIxzRE zx(5{-kM58TRO;_voRxe-`}^H7&C`4GlZGSVys=ZdfalB2JGz%SFN}LmQ$aZ+zr!pw z2NLa?L~H^yc=o^8>*r~L0nmL#c(6sip|r-VN702zt|r4dWk1O)Z*1~B%hcg73ym;3 zgC`Bx9m)9U2kud*^d9U2#MyEj}K!o4v)qmt{9C^TEA|D5e!7s^eYb(5{9RAzSMPJo8YJi~95T z{#+a!nSsGCl5bpy0&u)?*E2e(V8Io)RH-slkp$ljMv{bLnw2Dikw%_Sk_;m{59_N_ z7lZXm<4JE*QcC#1O;z8A^K?J{qLUsumGm%Wx0ngI)X|#+eZtrinw`@VCXJ3W*7o=$ zzW?}$TFH*`;q}YY9_%_+W^k-6$!Rk(7E$;u6)q+dO zI^DoH4)7=d!Qpm=+HZX}LbX~N)S#-%)8i2y#QlSmdL^kBRETo;B?6;5aZZrm4IxgcJ5!BI%^%&`1`Nb!{wf8yqlrA^5Q~DZH3#2 z9bJ;kxfTsxkP&Zx#P%VK{k*#==oJ~|x7JVYZgqn;X2H~VV5#&FCxW1>)AF1cx!?m4lyM1hmB8`+FM-ua{JMWpJizwfh=Kx<1(81i6x zOInSj(Sf!2xvNRrbDO;&O#;z`UUr3NFFbB6vwR5`aR8N_R7~Ozj~bQnzq14CXC}sU ziH{c4cIi*g*7aA$H(O|p%`2--Blsj+m>x=Jz({lN@rl!Da?@H@BF?k;2sTDtW-EtW z*IPWTFAls4N#?(1X#QZ@Oe-16g#Ja&v`~7Eb<&^*O>MBy%i&@j#8?LV_n0?K}JR zDp=Kd-4<6!@)#jU)q8Q^>$Zb{n$aI^&8sf--X%+qk|I)9o+;fbqwtB4L24pkOYM z1wc!PR;cW08Du73@k)3&Wlj{x`j0Hvtm|?tq!7(OAY`-$+UonS+?+(jKfnd2sGilu zMqI~aNQc2}uJ?h|`eS0+Dmf$v2%yIN*sz0g_wFDEa^Z1=uO@-GMV zB^}d`?DxnrTh}v!#C$j1%pjAlq99!alzi@4T_U-OTM)n#6;MMYM2b`dF5Rn~{1D*f zpFRD#!z<=>dl$Ao{rPf4h8!y(cF+?exJSJ%mve_AKOl*VUheI1hJsBr9-cHCpPmY^ zV)nowtdA58w5XpU@9=1sRwNd&07M_1R&D020bUoz7zhxMi<3&e4qnav;X`;GHPRzz z>`;TS|EJFfetH)EpfI%xe9JT=Yw8OJv2`s<=nnUHq^NS(AB;u z>n?-Rbvpb{hr5=U(=51QxzWW|o8!ZX#rw4X7MJ$Jj4ks^arWoXkmIciptD;H&HwE( zH92??7x;0v4auv9Ep|@Q-k!q&bQG}{(%*p7P*I+&M1-eEIIishc4Ig5 z#L;Y7a;a7y+IWI-8y?gfap0d~B2d)c&=6gZ`Xy4K^Hx*jQJO(f-f{&5-#K?4^T9R6 z{JPEsy5`$hk*uVvECAQI{rGpw+mowwi`nQ2&P2XdqIl9ej|dh7_TyMLn7M1#{Z#Fk z=ZRjkD1~!|-0zet2ihFP?x8%KwzG=A&yHe3`L+HF&)l)eq*|r$7YAc~IoNq};Z%71 z<^Bpl*W(y)RBIb{zW-_Gv;RH2cN?XPRN;_cpCo)40pzx9C?q7!2s8jxR5&W4Ky2u| zg(Ofmyn6mu@8V6!APTQ?2GxeiZQ+-QD)~!GIhf#)6Wxcy*}yQ zUSznC^B8m%D}O$C^jz@0#|@9c-FgijN~Srrko<@LwZ$Lv6tSw znEf^5iMNZtKArWp=6C&b`ISV*AG<1jUU;VpQ1oj`QEunnz>d0KJT7p=c5_?_JG7U7 znD^)#fZjd*Z`@8;>l>we-r^rkV8r=X7V0E3W(R8s(rxhG3LhmA+P9NOzO62%($4E0 z#R+4^_ZA&TT1N3va1_>IzhBa$JMfQa=-nPPToomhoLF){VPe)rsnZGOyxsBO@8ZPq zy~p|C3+}zc!k~VmPlN^G{#vv>q{)^=wtS~-!&c1njuu6k>Xx1?+MirlaJ0f={V*`Gd*ZL} z)0MaI_}9VT@kx^s9yrWVCbRWM0@LL=_lnd? zhra#xYz8meMx8m#A(tJ8hXXZiS604@@`MtQTU)F}yvA+jd7!9%x@oVpo z$n3^`uYR-nwM2Wp^L*s&oS`Ptw_}m(uO1P0dNIUF>G7j&tRXG=xaB1_GYfYlE|u0C z!^y+wUMKvgG&`vIxp(KYnP`m?(!vxvTX!YvsR$&cDjjzDgNnfCAuZC$fPMr`0WP>N z{_LiJvP0R=p=H`$6Q0B8QSY9rcx}CDu=w$|&{N)YX@Sl`^9rKj!r4oIU(ySxH$=12 zn)Irg+!alN%93jli1$^?G5olNi_P4e=Rz4q0^QT;&P#>AtkL(jMi*)W%9>Y~-;dgo zb{wyEF0_jd%vCMD8i%%`tFpGSe>h%wAsEJPu8zXpc^;%NaKm-uBg?da*nQd&R|Foe zepQC!sRd}F@{HQMzmEd;nYw<5E>|o`LD%)&V&Lzq-H)fe-?Vj{whzWd0hZ$_K3As; zM9VAdKNfJyee`En z-a!i@50pCo36hj;3m&GHZ{ej!l=CH|mq;qBW(}fEz{r=}iT5z1*Zv4`>P3C=%=-CJ58%dya7 z-PeCB{a)dPrQm3MWOJI1y+e!|R*;hf>?os|oEVOQoC}<5n@zZ$xL&LxGbXt&;%^rz z^7D}GphZ-#$Ic$gA|S{j@`W5RI~}O|BUvVS(W1)26oo4u%wPb9JWwK~ed|5>Ps*|G zORzi1>Zw9d4gEo*L6S%HXPCiPx{;>m3136s=9v%`^v&MfSo_-?9O5)<1F#8~en<5) zPq=%;JVVW};X@SY0Sz2#IB%dBN=;DKFU>XM0SOZ0y$;b!OZ=bTY}L9OfJH24C!W5x z>SAS@05=@xZ(%Qn$A?AN_6eyRZ`dG+ZE8iBV#sRH;KXVveOJbWGy!#Ut0$s=CP3=> zU709S61ttGUe<2^pqGK$lB{nWV(uv>A;k1W##?UoQ?U%f0lO97#5)-~hwT?LD!+M? zLyboY->v*=LV3sfiUi;L7y$uVF;xK{EfaUXG=p$aTG$<4F`}kl2ilEc6&6+gFko-% zJPAn(rkr=k0Zq{L-o1rGfXg~}Rsy=$hs6|=w)L(;9G%&k5Z4=Xdt78)+e(u@>;Yiw zCXfuI3IzDmQ;snYb-DKeJ=stywKheMMEK=YRM4~N5s3v|sPAI!kMQX9sWE^+N+kBW zGUBmbCT)`Bmu=GmQ)e94v{paBM;wI~!v$Y;zwq=<`E=i_r3)g1dl{qNM>3nQy|r3b%*gZV9~Ic8pHRRCAzNYi0Cf@&xYq8Hb=jREz{tgv6NY1L z>4PGBDZ1SNcNjKba}h#M7TI+lt~VAlfW1!=X^X>gaBOOr`}B0T_3ETuSDX23b`Z;K zquA)W*2LXOEyRp0LyT+28YA%5V9hfTBeh2do%?rZ>IMQG(bzu^(-i`d2JQsIr0O)% z%-i&BMMfkNyGBgRgZsWs1tW-jTeuKU{4)Z_xMArY z&qgsISY~oTfNPhZ<%92t8nbwWw*GAnt&54Zh8U8i!>Vy9 zWK3*EcoN-vQ1gH%VSo5Q+aDJeehFGC+ARGwXQo3?s7%%MYrXS_-=W;vkLy z;Wp~E!DB9nXn=+8`}sDS&emJ==`dw!%4Tfr_A{nftVi70sxspI@d zsrVf!`B7r~-4HfU=L^^cRE4EjY`UX)idQv)x955kR5fFT$SZU_IGP(Y_Lw$tIHq6A zO9$EQS^D0&De=man;m_I`$C!rE>X{0)^_TBV#tCDfHKMiW2e45n$8J<2;MxKcP6J0 zz7#}wXWxQ&o&SjraQe_Eg&zMz2Yk>^mGY4$8%Quf4LvFUvOuo+C`eAg2KnqW|0RXw z1dPxX3?v~yK`#27kgq;HBugNLuKtr7ko>(UAtfOxDJi3+^j8qNK>C*sdNDbqHGn}c zB!b?8{V&%&kCwN!E57evli-ZgR!7@_5O{m9tX#<;{_!6pkrC0|22$6f?U-3aXL z5F}_gm;|fT51FC}^Dj?&0m!30fog>fr&lnx2hKwbIHqX`>V*LgJwtvJ7_5%A{JvZR z)dT>Y#pT7eJT3%*()9M5R{<+elP#41u9uq2uPNwD^aF_OH2!vF3ichNx)q7kz(3!% z)}MCQW6WVU-_KTrlb7C~4&s}`eKEL`&aVu|Jah*Y@s>(FtvRZnWI5&}YehGSj{B07|K# z!iU&bSSAY3Knrs($nayF`zWv69?AX3pJ3MR(IrnT^G_bJH@ zaXh4#Mb}Y~jB8iWrF$Be`%k+z3j<#vaZan=yXH@{>`K@PlINk z|C5AuAL3gUeUD>ot;3=W&W<8EY9nk|^TbEAX7YTi8_;A3*L&HNhfpLQ%D9)G-ALiH$l zzc$I;jj+!(TKsLahzSWUMn5l!WBvVWgLv;{J?3A{@iYV z+9%d(V64z#2OSjucs?W?cw<1kfp6z2@D`IBU*nFoPIzDf!wR!;GhpyoPboz%G_Y9D zoq*wWYEpIZbrh#yyurH@%);@QJ{IU^F?71c5Gn$gCeuUy?DzY8k*5GyvS*K^jQbF! z4Syghvilz#)ltz*PzS%d;kY7&!5JL*877IPS>AY0QIzs6G7Ua0gwz9C{(!mJ71=@3mO1j**3hAd5r ztHy)B*Xb{6s*nep(3hy**rjTADlw%oc=+C(1=z;(5eAf=`5rbU_arVZ>s`Knb>;KY zOc#^-o5feYi2v*!?%hNMq@b7H0^oy z9dru9!vR>HH%TrWWxM2tjk!tzpaY%fCsa@WK8!0UdLiur#nu>FRIH>rN`N0=Rp9{1 z{xkGz;vbnea3l)Ud4}B6o16&^^M63BMQ02#SE?LTAsA|$mnIqFH&|PR&}ktC2jS0E zVEs6I148;$K#tW`{zLJx!0>}f8aDEh|4Z}Cj|KFPToaJ|)}I)yuk!*P0KOqW9Vf4P zJv84H!>C|OCz{0IccmNF$ru%1=p}-~v65c+R#j|Svt1(4MouXS@5V z5o6l1l;cRL*!9`U+&s7N*lX4Gzae4BSCp(i)D)Xc4+;F^{lzrrOh(ALRiVgm^a=&= zZ4K`?B^q26(Uv3PzX(I(Jl&tcEdbr=3F#f^K05<^Y?oS?26D`Evw_w`?cuUF5BYdRJ@Eqq zBeMrmi$@3$Gqb$Ks%CP+`e%9NO^e}m?p!x-s*$;5XzczJ4b@o^>D>-FQ+^qDeg6E$ zUyHdXqL{DjEU3x6exI9-z;& z&|93BclVoxCA|fBw^(V{&XmT!4{5Vxzgq}O`j;|5^@GJF_?-d@%r;`no(txhU!Or&^E)g`Wf^P{$62~OwRLsVh=6Iw8MGQ{on58|MB zFO8cjl+m``YsnZ65;#OOPe1q_HsmtGO`*{fvuJl@B7^f01ff_mHnGP+#Xd?|Cz4!O z9P&It(cwn1Ffgml4Od~VQ=P;MP8XY^QeKMcXfr=dHRj>JN^dx2n|XzM#aSv`g1O>| zd}M}+qu*LTr2yv(BKR_e>%>U%)-H5^5Wh!~k2Wd?f;H1z|Z^CeqjRY1UQy*bJK zmd03MBFTZ^-Ntz?5A~ndtla*`)G=lgz6$!7z(XQNyvIO+fTfw-fJKlBOe{Yy3nHXk z9i|6gX`Zig^6&%XhXqO;C>TC&*nl)&aNMVBe9&o|)HmWAA9pnfZ#MLDvHJCam{0L% z(R3nEB)%VZqF$31r2>Zi4WIK23cdAZkngM_T8+Gat_Dv5kDnD2|=8~&X3K7NQk7a z@|d}T6&Q_^yVQrzacx>(2)hh+MTMp0=0|rMQ<9qCt}oWmULO*d4r)-~R0@i3?R`O4 zh3lu2m6?!3$?W^cgKOfeWAEB#<|Dqg|C<$L0DturY({Ps#s?-3-t*@U549tWcpz)} z0T}oc{+1WumRP)zU+0s_uv%@epdw5y-B-(fb?9HygxC3ozGuGA3Pm&+hdi1*$$W3g z;Jw}e!<$}M_!aQEXS%v4f|!UDCG;jPOAyKKD!rC9!B*o7vLcJlOnkIrh>tKafH?d4RAyWHE{ zaU3oCgDNGVVi)VXldnX0!6=>NKwftL!S{~b-DVZ{o$ljC^7j4vjq`%om~7_%&KJC2 zCj8DSmf*iZBU?rbu#1a)HJzX7V?>%9+U&~o8IcE05wztmX( zV5l?(Gi~`!L+p{u*y+T@+FVbv6IlpoHG3MOeO-7NV+u&cev!Kih+ZZJ$l}}jan-qk zHUQ<0(hFKg!;ZU>ufyp`b~j6N z18O_F(^^Y|%HgY5u%SeOAfu0viW`J^wqS&+mT;}vzgTuxIcsW326EzPfa9ZgAD_5ZW#ifeifhDY^cx< zeej|AeZutT0K@$k8kg5UR#FEy{9Zn%Kfk08 z)uu7ncX*GpcEEE(siKj&Mc3rf%A|qiK#RUl} z1`2YYjt#w9iXz`_ra)x8ZZM@>zgq5G?M_8xlll*n_RCK%XK!gfKeeAzi?*{esd>!_ z-fN=0SoX^Ps6Cup`8x2cd5%U4Msv;XJ7%15q2<<%ln9!7G7x@==$mDhypUyub-EV+ zPnaKkIgVjX^rL!JbIl3eBu}qf7WL-ehGtC;0VyxfOaH~=2|g=iU(vHt)V?q9vZWJS zi~%EZ(WdGk7AqM5*F6p^5V*{M#Q=t0sJ2DS zw23ujLBh9$g%XtGDoBvT1tEt?N!D`$tm>wfpOj_kK&H>M%c^J$!ioB_-k%O5^oW<- zr;r$S!NMUIu~&bpt6|`|qgDN+Z6)8y{cy#&xD3&%(Zu@7dhZ4r5JF+d)wOyr1n3sjYJ9%(9i9HOrmO#!5F8W`-NJvbO!kGn;f1+VSgk4?9AS>9sHpCzTk>2p#g8q0hT;gm# z`_+7zBbO5cc7Xfq=UFMCxNXxuLtH=y(}D>l8Kg7Rh!U?Z9q_;cE0bb!+@U3qX}tA6FvWmWRYDm+#J z=H`~rN`E~nHphZk2ng;gjIEW^qHIWZydG^8;A zG!)N9QzHPJKbpR>0nn8i=;A?vmI?^srlG2%(JCX70IP*s{={IT*mcrJw2X^n-;J-m?kL)oA#B5d*zq;guJC3n0!?~mmDTs1_pLz z9ZoAIQBA^@5`zre7?mo5t0ujf5k3RgK$jO^;`;RK4(o0MRfRZM@?ZR+fmXoZJ45B32pH*4{T-7B%6xecmA2oDsN;Y}}%wg-{oi4>U6ZC{4#be&fqfxCF) zx7b+%Q6(F+4-FkE_Di~FNPy0!%{DVZ7RO6e2CUg79TD)zYdWMjfQwd5(#wU3SrDc? z9^s6P43{(v?Q1&yXQ%(rFd)YH?xP6#?`KW<3^+A1 z{bFOzWK2N3AfFH(Vy%}xq)};m*eF!5o(N?-E$vTk-D7UzJB4}WA=Xttx!xkvN%e`O zhuYeVRE4*)@9ro7#n}#L?jb^2BQw6P0%T_I1A84-e_6AhDRSW9-^;IpCUze{i-YC} z>BwWgFE1K{Q;oSndGNwP-A=<2K7(h@x7ik<{ocW6D2w{mNd&C1qQYDV5E$KOh9%<) zcJAomK1FpdZKU< zd;l9C zn%5H{R%41hV9%9a8hkxphJ77_siODLM!8iZ34pJw172oTBh*i#CD5{l6ecU@@>G!% z*Nd8W3%WKvKxgrTyo5gjb%&%m)^u=_h1Yuuj(0`dN1Uye; zs#l<}q&gNf!NWk1+8cevxB;9txnEoFV(G4dh3GsumGJQY%U*!nn@G{%jP}n$LM~^T zfVi=tk9sR}^U+B1V-IKyS|amPl}r;%xKLkQEGX_P&T+_hW4Mwd{}8QHOgUGCzBLRs;q zE+qpK{}-@dvznWencTlP%k^lBw~Wq)5-7Oo%Oj!Ik+N@gOyTxrD(O%e++pgklvvTr z=u5g9YN#g&*6H$3MN60WLahF-)~YaZ67X#^WfkXuS60IKo{ObDnX@4|clJl#G`sk4 zG;=m@lCt7={l3rAgncGxF34>})lOb1cTA%exK@*H-*-O$L&>F2nAb=^_AiwA|1(X_ zq_Pi>=&_Yg@Al{G%jD6c^{?lGNSS4Cj2lrnXMftCFvb^XDmvn(f@VX5m+R~p*_8`L zuI7fsxaez(lb1hdRSJC}-)}<@-k0c?j$M&Zq8saJm&SA(FT)BX!S(jqrYZ8TPhO9J zHAf^6JNzr*F*<0#-z5Cn(I??@p;mLaevAql%>6XygJW+kMLFbL%#;o6C9Q6X4egw` z`EgSr&nQXj-cQL=K67&t`nW}D0lDcbb6n>pz9By0nxthItM@BVze}-Sy-UK$i2KJe5EBcwG|}C)5|JQ=aGWLnrh%+xQpsCWi(>T$usi{?o};D3O7jFs zu8j?vDkO*b%NtK)+_aN*enH-(5a0gpv+%>x>#zRUNW>toe0@PR`;8{^F~8*)5lsn6 zdj-J44AM650fI#6RI=EMYJ~{=7dsMoW3{N^c`}^*CkpZK>b96{cJdD}* zs#4JdiOK*Yjrb5#;YSG6T@f$^+~Wn;7+S~;+Z^!^v4$}&NX9@n?a$if!GB&iVI~<9 zyjW@q-o{pY=UhwWOH`wzUnvE^ZuK;4SpMBguXd`9)!$+A9T%r4&8a%ycE z-YKU;Me~Gp9ZvXu^hBzL9mrV8^!yqoL3vmk*vvP1x5q2w`w@c2MaV4(vMn%N%FmXb zDaFj@Rp~PO<%cxyy73w`S)gsDs^b^3R?tJmxrOFhy1me=-G)1X@mv}eHr-Ta zBH%9PzbYaDzJZYaEO{q2-8tO^BABjj=Al3!ZRHag$c*vH1pK9eWQ=(qLJwyo4(j$e zsjk`v^0G9#m;t2m+0)=#1J47zKgRcB@c!PsQvPFqX%^w`4u_u7E*J3MzuvTv3W9Wo zVYfn>_(Jnp>#XD8u5oP^2s#L;?*U0X$g-R2m2|w5-y`V;FT!PW4V7;V8cbjhUG=|l z2dJX81`Ov$M>b3MZ5GLKd;V*8?bv!Ej_#GUyLtmsq+{`#_7~~F1`Ec!&4or#zN}) zkIn?HHfw&S%D=No>dfMMNi?^yRfM5YYa|}44w7Jag^Yno7-8hgl3V~Y3C7WBXP|Bh zwg#MT7*f5Wg4Ck2TyGg5Y2w4X8tg|k4sP^>7Sl$DW>Yt2oGsvGUF3fJln(!+w3KB&=$DVW40m!$p3?#VDPvr!W? z?Kgn~5{IUcYcFSozWaR+FN?b>38#0|);2-pszj?TX~;YnT<$Rb;_=(eGQ=!Ufcb%N z93`UiOz9hmp-Y<-59o{hrb1U?KmqOvwCpX+FKW`KanZc(9^sueI(YZBM*VWU7K!V< zIv*HD0vd|xsDU$D8MZB0UiV{EZaWw&h-q^i(W~RqLgD>SjsWgmOT#4??$HdFP*sx~ zPR&@PjvO#$|4|1m&9q=T1&Ukvxvmidz&n2K)gNFu6a0W0ulGgK1ll%N!}DK3eOsbmnASi#EzYr{U9{81GDam1)PF|`67w$u-CBMv5?@1FFv~^VNroJ|&$8agX;hAly zxp7`iA4eQ_++B~tCaFO$N7qLfwZ5tZ*KyFRcbb0 zgCqDp4G>A&PmAFNFH;#7>!HZT?>7%|z`wQMNub6!okz0Yb zGYoQ4EVz=6m2Nf^>AC|VsYLVkQ)Emam7V@1h6f}MVB!U3*WQ`D2Fh{-`xvaR zkpzNH^Z1F=5vVWyef)!5(w|FRz-+a=PXVy1bmQQ zvQX`PAQ`4PuBkj3VcX5`lDK3CX?>#y!Lqcow5E(!XJ)V3ikopx$Ea-bm2uX4Bz#f3 zQX?}0n7AI;PR%JiwBt!-5Jt_DAOGL+m}2;KFZ)jo!kZ8TJmFxG%>AhDt)KBT)~X6f z={{~9x+Mav-yJwStJ5HrG+|RAb_0bsfAp9O0wf^6Q3`E8I~Sqcjud|Lz=@1Yh3jdH z?mSWU>9dAR{(OYNzsb_D zDiLV|q8wM7(6czqRrCMspUZY{+h<;!|3a^I;tk8P-VVuSRQ5pn*pIoW>Xw1wTPv^T z89>Y2rcTlE2J)_dSOsqG8xTBxygUD@*X+sFwoM2NUGX$)c%=Ex>aO?jK)JVhK)dx8 zxo*d%qF>B*7JRb0|L*$5hj8qsQMO&JPfqx1?&5BU2G|Ir>d1hhg(o>a)Yu7a&dQeD z-Q$Df^)Dr51lPINkUkY-99Q$KRFlFdO^;D83AyqkWgBLY%+5qnI5U~aVre|OY!O&I?G>Qdes+?k0-QYJccXlS=`wn<2jwdx3`{TjtGO!zpc-94mHQ$IrFYJ z*p6mtd$!if;9g^<;$ySyL|mT2cq~`EBZKEp-c))?+bEe3K`m*APlnERkAENkDSf+i zQ%d*En)OdduyDzVq&eLxbk;i@AcqB5T4vri&o8_ScFe_4^GN`b?N+DBH)`qShfEc@E)cNwF)E3DFY z@829de_!=(K8QE^Veu!Q*BJu(N~0?tJY0U-lFzO^xkiii$gZ-ecO(I7=1+DgvTN@3 zu>_v|{u3VLqQ>M(iu*m$uG;x6;H-^9-f}PTm6{*snp4mRqi0hhiR*h?+~rjokJCth zoTI?Wpy}`3=JFQD>(o(Nm%8m%o;FrJ)Q?_;U@xfA)8RLp)|$VPUwnh#=`GjIg2pGUh>UXPK%MUY#AN6XyCKPVm zsc2mum3-qk#mJC5ROGf8*%+KP%ZO!j;Hvl(PyFV4l83sVIFeXWuwkY!hKYRUd0)r_ zm^;WOna1PcLRYvRUP&wN_3YR5WO@FRBC@HA)doQz9&ZfO{d&=c=$!Js&e|*X3a0>k z*OfAa$gm27#oyOMg6j?D7j|3p=~5BmX=BW#ZL9uEw3?Mu6a6iUP@4O2=JT`snd=R7 z-xB`NkXQe4v#88x6ma|+)qq&N2=Grh&qIpK&&?6GVtm=pP#}C;Qp#`8zfbQX#PI`G zh#gqLhHwA6ASt-Av6q_9b{BQ*h#i06!&DIbCH@vY6iST~T0cF%nm1!h;R>s}ON4)g zz#-1x59PE!3hU`A>2NTz+PqOA#SE}1)08jXVqn;zuCX%opG-0Mbx}^+)Z5ks3dbq~ zyvTF{v6GW_4oSMUuQ@d*0*Pn6MvryISVzy1DB5vt9LcCadRH4E##TeTrnO5ri5j(KPBTE0ex@%FAuoYCnSTpk^7k~ z+Y|;O^dAB!7w&vl#-*hh($_!cS?6Ig-?*%A+?{RP$>f>2Nj|-b zIM;UF*_9Z1-+B%EsTUl%Jgv+Bd+IY>5c@He{eF@rf^Z88OfTOK3LDSA&*)BwUjQ=` zga(%O%fl)0IdI5-kg-~b49rc22DE5_Tz&S3_p<8XBX#=dup?5!Cli~`0Ti665k}$$ zMdlWF#)NPO9w&R9^T(r+$=L|P+$GRPODKT%cUsK}^h09sSW7A0*Wen?z&*~puM<2@ z9L<#fz|2@`)Eb`nLVmL>3h7KL2N{iFhzgn_WFrK{(6O}9D&mFwU#ecP$`{=raX0iP z5*ZYj1%913lCU{;3VLyYq!o336!E8RGfoW}%fjTue74Fa#vZ2ThmSrmqVFm+IWb_x zT>X)Q^QZbhOO+PEvNrnH=0M)~7cVmE3;nlAG-h^lz7!Ae^-wQ!yirE1LLa4-pWC88MnuTQqDZpEvNHAe_V?}2!g0t_2G3zlM&v3_v)$IOvNn*V{ zvFS7@AdY{>sfxz>8h`#7PdWTm;<2F*F^usvU=i09nUT??(Gy+EE)fq=+u~4*`dzbx4bWQr+|!=_riQWzyG`RxR$d*UM3^C%=ITZ)O(EiMT`t*zBMcjQaQuC;gm%v;-?#y+oxet}l9Cbs^x4G~4ys;b|! zTO*e#f-}vl3tn4jK6!RR)Fy<_e=fBl? zl)W1qjYWdNm9f@a1uSwEmvi=2qx8^S+I&?X6!u-1o@xJ$l{{&PHhFjGkV4S9(i zQj}ibJU+b71hs65x7SaoLV*j&y~!==3>SJC(|S-4FvgWl0!9uVPkVuJ#Fx#d*R~W4 zj-l@1>kO}E_JW$LJ)j_eOE(!+S}Fk)gB9wiq7w4)`kOsL&5UHN zl#o@h!U!YYS-)T~>91P#7b8SedEF^v$;q;<;nYSNs3-K``BI_Lt-g3Id7zia0k+V< z+CG83tkEhcK@b=pg+PHWEI7%%3KDk^Z-}F`jd&@i;*e-xtx#bc1t2h$_kk4aEK<(p zOMSc9nWP=hx$rN=7k8xCc*%?UY6sV`k*;B^K_Y=3!UZAbMM|-UWKPLb<_nkMC@G=>VMro z#&n^Mzzgm&M{ZmJvK{;3b@~bE&h7CipvbH)%mgF0c`L{qK=O# zKs%AIfB|qYB;9Fq?rfP=$YzE|k3C`WJ%^zseioAC10eS(uh4)oVkUs0+6}-cAMVav z703dC3*~S@^MWjU(^8`)BF<>&GRxZOu|@&iYUZ@~O>B3%VDe z31Yhy!SWv>-IivOH8Jp!^hIn)iWi{Qa!s{RK%;q_77)L=mS@cY*&S!4z~GM)%T!@v-f0^(v+s7`Q# z??uAy-<2o)5b%Csb&w-h-OB#``b871_x3A=QySxWP|}PSI2}cqTJ~lNIhA zV?oo$wUr(?8Bs9|kPBSY54ALu)hdT=^YT=6IP)hYsPkH&Ih|e2g^l(Odc3;rIQOO$*4h<|6(OYutnb!uboL)s6=| z1nl(r)us zm*%nRULuaRd;d)ZkNRhSC3YWn^R!^1QO)1%ib;__Xh@KsE)W&KH`JPnKs*etHuT=B zI;d@oy8tLmb)%xkzv?;LHO`X@(5>)5cmrqdH*PU@nbva+wM0wc^Zje%yUL^F2})`= z&Z)tW9PWprXE^82ncMb_A>QSG+jX;lqFwWbk4dCTx7*^6J_T^f=6&;Y49W3oc*-7f z5(_ArGrwgW)hQFLnGoRfd^0asXpVoIQwCBUX|6sypC~s_imva z2R_u65|!MX%r-V}O7~QU89skMMZfv$`Y#1T*|+Y; z0&*F$F|*68UykJST4P@vTY#;pH@xbXJ<2;VMR>yopPt^? zZb}>agmlgN;iH1kI&z`aWOU!>{xg#M#2qhSQ@ocIS?F9~$;XJ$qEez@Iqb>Ss2P zecAOIHF=c4(7`N|f^s}9VW$8#=}Omvk)@V>9-Rre;}2A-?g^?IZHoCJGXk0($;l_j zM;?%GRu;*m#V;F--$8<(m-Dw$(K6KEzRQ+zef^?pR}z6>sq4O^#6m#No$@A~+C0SK zAl)>B{TUPNr%=QU{=Dbn3wRNJzq3jQ@9og)e6V5tfcqv1_^**a?(F|_>Mug`Ojs-_ z$Ko#;iZ*__Re}{!P{Dh^lA4X01z@LJD@1$Q=C>%xr|!F>@Hx&#oScVfdqc(d89pBl zOAIrO*3y);l$}Y-Ro!8c2HawJUf%?Yba<)2du`dvZwApY16%}Wgm|I}mYmXy%?v+~ zKia6LxH>J1Fr0U|h5J6H0GV&`{eE(LX6V6;4i7_pXv(9hBe&e@0e6A0=e<0u6tf>W&g66eUg%l5W5ZvT0&YE2XPpB&hRm^BSrUX{+EwwlrM^6OSgZk zkX?cOlM>`1HDv-ds*sb9?L{|p6*!@ly0y`n%nb(bIps4Wz@Vw`9Bdg|I-o#0ejXUT z2P>~V`$JwQw36N^KFi|rWfQn}?v*KB@%!DCSov%a;cSE|a97|&mu(2iVDDRv=WJs! z-T#lJ>j0>k&I(BtX_9#?J>0`^NW2UkrTe2xSB(%-UWM)-V zRuTVC-{1doU34AC74PSLpZ9t0=YH;6@Wpvh;LTH7<0nD3BNocR1-wu-GE9eajT;r5 z-~q62Cr0eD+8B{-&=eB?5l<0M-mi$!91?7q`l&?wGyp?zrZK-+e^X30skb+ff$N>- zP{MHzG*T|~-nF@(C*fxbbr!02=oN^`+Ohm0tGLOaB#tUco0*WKi6~Sak9cPO(;Hn; z;`;8SnaX|S!MxVA4@-*ZoNDJ^IJ`h8Kn>qm%_|*ven>wvB`JKlEJabFH`s<{4wl=V zcfo9HB$ErVeHg%dJj@N|j->8Upa_t*Y1)Ty9}1jq4&AnCR5g95pahO_V{3<8FQTU?oW4oukofL5l}yT^Ev{E zqpc4mEogu{X8=uc7&8PqF9i>X8I4?Xy?D_XO`Ie)x&3)DczYta`(6{C{E#+|p?Q^o zpWm#37Wy^@qurKzz+1~u60-{q527CZa#kvaT}@~!QaF$(V&S!_UO_f6V{%MVB0!Q* z^1|4#FgAIq7+F_7(%8~R*FvF0aiIO~G7{XZYJ07?%_LLH2D`o_@_S2Sh@)ZU%pAJ> zdxnb`eXeki1WW5Dj7ngioA77IfpO)QtvN-q>NX9pt0B0|KZ7c9<@A~CXE&WnCBh91 zcwcBq9N)ap{iD1`Ypn6bot@nVjM6F0vwpXY|GGH^aePb#`K*@=M_xOn!QvSkL01Y} zkDv)k+9{)6%)t4}JQ=J=8AmvIyRDFnPKFbI{xZ!(n)&%&tv}oiZm*?PR&&NAaJdRS&H1bSt8@z&)5a{{(8=;IC7vjtWBAMF2fJiORNQGwvsmOc1}5q>{>yo?9{&IJ=|0 z_sN%6(j-whbiB^4XyK^&>ZgE#3X#D=XW@XDRT4+@G1i~MaO|-9jCEnd@PEmE-!Bwn zFOaBHmyt-%1R{70xA$ZmoVS8mXLDq)r=MYe_WiQFfNmm-gy{|WO)5NtKK*mT;ko-3 z-%KBs@kBRD{0xx$m4Um!ZGRqBSOE(1JFL-2ytnp^zZS6T!hm^iD=qbzI-!A)ISGWC zQcgg|f+dpB&S{th`lO=Q4gquie{7hiSbTdko`{-RFyWDh3<8*0t?&6ZGW_df0(T@lx;R%tL-!Hw`^d~F|Sn*fw z9NqQ6^8RBR)`nBDyPn1I7Wsk43E!hUP~Le>#A<%!vq@^7*l%&}!eni@{9rnl-05#d zF(fk=cFLywY?$%#SN#u<-Mee=dmBsezEc@<%7s>763wnIt z1i))m>4!dx?*AnDG*7PJf#jblsY)#uKvo5g2c1c0efmJT1Sn8%RY8+8q~|#RVHX^! zn!4~;PG1M9aOvl{0yqtNu@R=B0e+%Ez}N;W^x@`ofneU{H7rn^Il<|`_i>PeKv!hd zJbxXbXz~(6DMv}qv#)(u{pulkLUy(Nv|ONa0{RxMw0@M`g(Cp)LHF)5+gQ1iO!+W$ z1~tY89Jt1c2^%3=Au8TO$CA!2(-;ZSsV)p;({}th5LNiWi`ZqgMrK7b>Gc@Wo#sa? z9BlxbE|(h$UObZ`QaxxK1E)3OruNbw*8-LgHlK^{)}GmEXl9B`;F^*TWsCsOhs6u) z-D{3~>S-HT^&G?!6ID{_erAa59It*Vn0cXREsP2)HzK(rsVM^^LeWYR!1Q@Rq%N(u z#4ZDf-egj+M=*mh_3B^LXHTmdza;ttE&4ss&tt7hG0*GGWm=^5!9?>xQtx)+ZEHp- zcr2olDVE)#XqZ z_}jKer=iz!j37uit>HPfmcG*o?}(uRu!|yVL}igzWzpt*54PK12NUL(5(P z?(NpnS!-P!Ht?KLaC$cac7WI**&CTl0_P#<<^3xC#TZ5N@oEKS|GEf^R$%+SSx+VI-uE2fPE#x353D!C&2rbelS*Bk7$Tf@Z(k(E^?_zJcTIKLH5Ss zQ4qrJj;AE4fG)staRHY}w-Rc#j^*LUi++_7(Lq`PNP?#%{8*F;OG#B$LVr{069<#} zDsAqR1hwmYNqS{bXeUy{v@17T#IKUsQFsl&-Zp}WB-#{nt*>dTXo|LGbw~AB;`Tz> z7$jRlBxkbA^VIvWxEkg>De;y&67bX}{zuf~!KBPyrMFEG_br}v`Wp)W4drp?X@g28 zkhRT3+$f7(bmdGVRp9`4E~}IvA>P{Xi3J>6k>DCu_WB7=#8KxB5T$ivbEZBI0X03m z6-5h>!1#w|ukUJ!Trd;3Ef=^lkOs*Fuio$n^9riTm+oxi&_qKk%ZypS(-0#8=$g@Q zfFE?nW+X@TGo7rCnl~pFcb9Oa3f`p?eg%))-+t@-$ydxuI`auZs7;fJ_MslT;FnZ} zZ7ojQ3861Z`?Y+8&hT)o&&&MI*Mivszd0_sWsvG=^b?J}7#TmAH^ecMiFk%3f~y0lOxLL zKd=nhTzTqI>KmUp$?(!DIkuZ~aL?YhHe|2I{!g@#YNTWhZOikts}E#<#MB~|ay5it zj^?BNUWu!Yr_;FISUX4dx+cKLOJqz8w7n3NY0=a$i&{ zHZ{A_5!SEc6QyCE(Q|qOE8#->AIS|M-Tx*Jop0ABVBPN*fnXjx=-4NB+TN9I^=meO zmEo`Mmc6rO4hp|yt4dFGX8^q44=NG!hGgGMgC0f&Adaa#S`;R+B_SYe#;U$spP8Mt z01ijdxh;;9bvdm=ATkNWLkUVQ>rBXd+7Ms}DIB zFu{wlu=XI_d9$xjd|vH$$?LyL_E(oR{6ZYkmaT2ifLtJUjed5drHkz)oq@n~>xyGPCFD}YnlO`RI5cP!( z*|PN#_DK`FfgyS$p8ffz0I*TX$HlsRiDw5&TfVrX`M$fcj9s*9a;H%B-|YU5hh<7M zvUYz=>$j{%k*1gV@G#44>B(KK`!g&O&*G9}~Kum+uR5H_8R)E$+P2-l9 zS0oH*_Bnk63)E{Yt6#!XcP{p>2)a8pL$nYLCuDUS7MevMh(E4e+5d4dJ*PH+2KX!m zty;QVejYNf1}O9(%?+_ zz&WlkJm_LUDMhupyNDs}^*UM&tz{($7nCSwPb6GUr*GvTZ+CnMw+a)#%!h2J^`mzQW3$t5F`mdL-QRIi=S{Qe>T`&J zInMLaYTe3LCedIBkMpy-5SbYP@_0NKdc711KQIe_Ts}0`tNK~_dud5GZbT&JsI&y> zVqZID2Kk=|0@p6c-~ed3^PGaN*&uNiOFtwNQQY$AJvs1Xs$2OQ zd{&td9jhbH6R-b^n+sw{pKG*v2LrgF&9>`TNR``I>Q`Q;vOJggc%Nu>JB{5OLjf$Q zcc5s~Y;$n?#nftw=MaA$PtU^AiKPB;>!)QAm@t{=$>E=xQ?GFp1rOd1n>_|+STF=M z)4;fakn~kTFnA?54IyftIdj+mz|#Atg$DdA3cue=3&;`A-5DTSn3aRL&T<@FTH-{& zK0%R>Uiu-=Gt^r+dR_dA2UXF3>l|vTw~WhiuqR&$Dy$3*Y)}_0cKx+7kgh=t?h0$g zs;6T;CfMrEd_yLC_@DA>46p+2N78=KMy0vg)NhYzo#;gyA_=LS8p%-wx88EoKmmV- z(Ef$4x7hJCpBk=qdoU-wF-E)&&2!k=1uI*9QP#Y6K}N;<->`d$AD#XVJ}SOe&!A8_ zFhgDFt1-D{$A{N!+2+H{P~f8U(ZW2BOY0`yO{8UC@%s-!>1s*+s0=R7XaDKw7hDZM z!T2VWullhkS}@xB7(*tTt1xUPEg*Eg9X4U6WKLd%B^skF)&c#sAWURGd}Z`Efr61Q zEh4B2OmN$V6vv;L!Y`d+!(Y${VodClm8{~RIprVfO^g&2QPriN77filjt)8H#YsT* zBfcHHRJaGrPD}SHOY(q)kSrCo5NRUC^ce$B%v^S*!#6@>dTwP!(#GIDevnh|YuFQY z?P|IH1Bz*Cp9*7lg=dA<#gCnw&0}{uV``9h|1{IDYrl+6+tG4u7SVn0U+D4+7EV}6 zqu6RZjZPOBKSu3gR7;;xto@9*BlwP}1J611bkFA*waVV-|A9L+Q4r1FDQu*-`ZKQJ!A(~|qX;Z?B^JWN9*lu*qE<0baV4sA}T*(l3ny>TfSqX!l(lTrJG>R?{OB?iK3Pt%#3~D{qSrWVqiLnrPqR=FR*~*JdIDc`DB5*{)^loJ+s^3{ zFH19G3Wl?o|I4}Rst|DGYy^&mvZhB`%Ckpk7b$oEa&O8S!d2f`$wAXq8XzcP$qh1? zzps_T(y+v28P1IvM8R$;xrjOA#>@-8W5O(;VS7pQn%Iu2+7KXacDw$MJ68;y z@rPQe7%_!@Kawy&6X;@(VWTnsdbw7~2uCD0B?D>REK_55$szM~NlgY9p^Ab4#ArSP zuT6%-qnW{(y#FRWoDvsx<7i|NwLvD|xV{)EGqe3b3WQZ=Fb zaJQEWo`xOkj`IP5a#RejwY&fCw7a_jR{!GX+FhfzpB1zN&qcdd6qA47jVUj^YjI?F zSiQY=hUPzG1&c}`1ikh__M4OjOqQV+f|>M0D=Bc>G-cuZh9D)=@hKS%DC^AE=yw^a zuSO$z`aoC9eJOayjZbQ@hmlEoGIAjV0Nomxy>j{K3*nyUi(?RDzbTgZ_+-KgyH&jV z&kODIfR^xRqSF)LiLJf_R)v`syaF^)Fe%Pa8^wf|WbxI7MmfjE810yy;Gt$_kIG&ec?gSWBpv_QL!*=$*l{{AMd?^yVdhKG0_vH*%x;;k4jQG)#ZdKq)iEGC(m5VX))Om*r3wKv$7| zES0^#^9PQhpyE}r5m%};IPvba>gfw=;N#G}dnJ;k=Z&68968UiGGLXNmS|tb%!Xca z#z1`bB`UMG8qriz|3<-9Ha#tK^>?;XP(Z*FcW-ZIo`n0{KDwZdGbQfp{O#D*k6k{F_cK7#ZyQ^F6gwWLtmX5ayVnRE^ukS1B=kR`}KXC!^uidX)@E#Uy z7)}MU@pX3uG3OSm%t;7vk1y@U0|W@19y)#(HgpU>wN9l+{2E2VX%v;pk1joGz_l^gZshXi(`HqiBnJ3mhf6)~*G`lp!gc;38F7VWBpb|X z1DxJSN=K>h?x+h3QH=`^OLUkak%B+zoYWxYGeSp5w7JCrc
nYM=;6e#~!Bl=Rz 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