diff --git a/_maps/map_files/dun_manor/dun_manor.dmm b/_maps/map_files/dun_manor/dun_manor.dmm
index d0f4f66772c..040061ad91b 100644
--- a/_maps/map_files/dun_manor/dun_manor.dmm
+++ b/_maps/map_files/dun_manor/dun_manor.dmm
@@ -10124,9 +10124,9 @@
/area/rogue/under/town/sewer)
"jiL" = (
/obj/structure/closet/crate/roguecloset,
-/obj/item/clothing/shoes/roguetown/psydonboots,
-/obj/item/clothing/shoes/roguetown/psydonboots,
-/obj/item/clothing/shoes/roguetown/psydonboots,
+/obj/item/clothing/shoes/roguetown/boots/psydonboots,
+/obj/item/clothing/shoes/roguetown/boots/psydonboots,
+/obj/item/clothing/shoes/roguetown/boots/psydonboots,
/obj/item/clothing/head/roguetown/helmet/heavy/psydonhelm,
/obj/item/clothing/head/roguetown/helmet/heavy/psydonhelm,
/obj/item/clothing/head/roguetown/roguehood/psydon,
@@ -11117,7 +11117,7 @@
/obj/structure/table/wood{
icon_state = "longtable"
},
-/obj/item/clothing/head/roguetown/helmet/psydonbarbute,
+/obj/item/clothing/head/roguetown/helmet/heavy/psydonbarbute,
/turf/open/floor/rogue/tile,
/area/rogue/under/town/basement)
"khi" = (
@@ -20576,7 +20576,7 @@
dir = 1;
icon_state = "longtable"
},
-/obj/item/clothing/head/roguetown/helmet/psydonbarbute,
+/obj/item/clothing/head/roguetown/helmet/heavy/psydonbarbute,
/turf/open/floor/rogue/tile,
/area/rogue/under/town/basement)
"swd" = (
diff --git a/code/__DEFINES/roguetown.dm b/code/__DEFINES/roguetown.dm
index cc06f4e3cd1..b3ac06bab9a 100644
--- a/code/__DEFINES/roguetown.dm
+++ b/code/__DEFINES/roguetown.dm
@@ -138,7 +138,7 @@
#define ALL_PALADIN_PATRONS list(/datum/patron/divine/astrata, /datum/patron/divine/noc, /datum/patron/divine/abyssor, /datum/patron/divine/dendor, /datum/patron/divine/necra, /datum/patron/divine/pestra, /datum/patron/divine/ravox, /datum/patron/divine/malum, /datum/patron/divine/eora, /datum/patron/old_god)
-#define ALL_ACOLYTE_PATRONS list(/datum/patron/divine/astrata, /datum/patron/divine/noc, /datum/patron/divine/dendor, /datum/patron/divine/pestra, /datum/patron/divine/eora, /datum/patron/divine/necra, /datum/patron/divine/abyssor)
+#define ALL_ACOLYTE_PATRONS list(/datum/patron/divine/astrata, /datum/patron/divine/noc, /datum/patron/divine/dendor, /datum/patron/divine/pestra, /datum/patron/divine/eora, /datum/patron/divine/necra, /datum/patron/divine/abyssor, /datum/patron/divine/malum)
#define ALL_DIVINE_PATRONS list(/datum/patron/divine/astrata, /datum/patron/divine/noc, /datum/patron/divine/dendor, /datum/patron/divine/abyssor, /datum/patron/divine/ravox, /datum/patron/divine/necra, /datum/patron/divine/xylix, /datum/patron/divine/pestra, /datum/patron/divine/malum, /datum/patron/divine/eora)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 67375a8daa2..025070bdd05 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -47,6 +47,7 @@
#define TRAIT_WOODSMAN "Talented Woodsman"
#define TRAIT_INQUISITION "Member of the Otavan Inquisition"
#define TRAIT_GOODTRAINER "Good Trainer"
+#define TRAIT_OUTDOORSMAN "Outdoorsman"
//Hearthstone port (Tracking)
#define TRAIT_PERFECT_TRACKER "Perfect Tracker" //Will always find any tracks and analyzes them perfectly.
@@ -69,6 +70,7 @@
#define TRAIT_CHOSEN "Astrata's Chosen"
#define TRAIT_ABYSSOR_SWIM "Blessing of Abyssor" //less base fatigue drain when swimming
#define TRAIT_XYLIX "Blessing of Xylix" //secret thieves cant language
+#define TRAIT_FORGEBLESSED "Blessing of Malum" //Reduces the fatigue cost of smithing a bit.
// ASCENDANT CULTIST TRAITS (all of them recognize each other)
#define TRAIT_COMMIE "Blessing of Matthios" //recognized by bandits as an ally
@@ -168,6 +170,7 @@ GLOBAL_LIST_INIT(roguetraits, list(
TRAIT_LONGSTRIDER = "Each of my steps finds it's footing no matter how treacherous the terrain is.",
TRAIT_TRAINED_SMITH = span_info("I've spent long training, and with some more, I will be able to smith legendary items."),
TRAIT_DEATHSIGHT = span_info("I can feel when someone nearby draws the Undermaiden's attention."),
+ TRAIT_FORGEBLESSED = span_info("Countless long nights spent forging metal have honed my endurance, allowing me to work an anvil far longer than most without tiring."),
TRAIT_XYLIX = span_info("I know how to speak in code that only fellow tricksters can understand."),
TRAIT_CABAL = span_info("In secret, I have studied the ways of Her ascension, and know of others of the Cabal."),
TRAIT_HORDE = span_info("BY BLOOD AND BONE, I AM OF GRAGGAR'S ANOINTED! I FEEL THE STRENGTH IN OTHERS WHO ARE THE SAME."),
@@ -175,7 +178,8 @@ GLOBAL_LIST_INIT(roguetraits, list(
TRAIT_GUIDANCE = span_info("Arcyne assistance guides my weapons."),
TRAIT_DEPRAVED = span_info("The languid scent of Her debauchery is known to me, and I can detect its sordid presence upon others."),
TRAIT_SILVER_BLESSED = span_info("I am anointed with holy silver, which preserves me from curses that bite."),
- TRAIT_GOODTRAINER = span_info("I am a good teacher, and when it comes to weaponry I can train others to be just as skilled as I am.")
+ TRAIT_GOODTRAINER = span_info("I am a good teacher, and when it comes to weaponry I can train others to be just as skilled as I am."),
+ TRAIT_OUTDOORSMAN = span_info("My experience in the wilds allows me to fall asleep on surfaces like treebranches as if they were beds.")
))
// trait accessor defines
diff --git a/code/datums/gods/patrons/divine_pantheon.dm b/code/datums/gods/patrons/divine_pantheon.dm
index 75acb1a6315..8e6e01d1939 100644
--- a/code/datums/gods/patrons/divine_pantheon.dm
+++ b/code/datums/gods/patrons/divine_pantheon.dm
@@ -131,7 +131,12 @@
domain = "God of Fire, Destruction and Rebirth"
desc = "Opinionless god of the crafts. He teaches that great works for killing or saving are great works, either way. The well-oiled guillotine and the well-sharpened axe are tools, and there is no good and evil to their craft."
worshippers = "Smiths, Miners, Engineers"
- t1 = /obj/effect/proc_holder/spell/invoked/sacred_flame_rogue
+ mob_traits = list(TRAIT_FORGEBLESSED)
+ t0 = /obj/effect/proc_holder/spell/invoked/malum_flame_rogue
+ t1 = /obj/effect/proc_holder/spell/invoked/vigorousexchange
+ t2 = /obj/effect/proc_holder/spell/invoked/heatmetal
+ t3 = /obj/effect/proc_holder/spell/invoked/hammerfall
+ t4 = /obj/effect/proc_holder/spell/invoked/craftercovenant
confess_lines = list(
"MALUM IS MY MUSE!",
"TRUE VALUE IS IN THE TOIL!",
diff --git a/code/game/area/roguetownareas.dm b/code/game/area/roguetownareas.dm
index 31528035e0b..3235588a9a2 100644
--- a/code/game/area/roguetownareas.dm
+++ b/code/game/area/roguetownareas.dm
@@ -24,6 +24,8 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town
. = ..()
if((src.town_area == TRUE) && HAS_TRAIT(guy, TRAIT_GUARDSMAN) && guy.z == 3 && !guy.has_status_effect(/datum/status_effect/buff/guardbuffone)) //man at arms
guy.apply_status_effect(/datum/status_effect/buff/guardbuffone)
+ if(HAS_TRAIT(guy, TRAIT_KNIGHTSMAN) && guy.has_status_effect(/datum/status_effect/buff/knightbuff))
+ guy.remove_status_effect(/datum/status_effect/buff/knightbuff)
/area/rogue/Entered(mob/living/carbon/human/guy)
@@ -34,8 +36,11 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town
/area/rogue/Entered(mob/living/carbon/human/guy)
. = ..()
- if((src.keep_area == TRUE) && HAS_TRAIT(guy, TRAIT_KNIGHTSMAN) && guy.z == 3 && !guy.has_status_effect(/datum/status_effect/buff/knightbuff)) //man at arms
+ if((src.keep_area == TRUE) && HAS_TRAIT(guy, TRAIT_KNIGHTSMAN) && guy.z == 3 && !guy.has_status_effect(/datum/status_effect/buff/knightbuff)) //royal guard
guy.apply_status_effect(/datum/status_effect/buff/knightbuff)
+ if(HAS_TRAIT(guy, TRAIT_GUARDSMAN) && guy.has_status_effect(/datum/status_effect/buff/guardbuffone))
+ guy.remove_status_effect(/datum/status_effect/buff/guardbuffone)
+
/area/rogue/indoors
name = "indoors rt"
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index 9023cc50617..9c210a4ac33 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -104,6 +104,21 @@
desc = ""
. = ..()
+/obj/effect/decal/cleanable/glass
+ name = "tiny shards"
+ desc = ""
+ icon = 'icons/effects/debris.dmi'
+ icon_state = "tiny"
+ beauty = -100
+
+/obj/effect/decal/cleanable/glass/Initialize(mapload)
+ . = ..()
+ setDir(pick(GLOB.cardinals))
+
+/obj/effect/decal/cleanable/glass/ex_act()
+ qdel(src)
+ return TRUE
+
/obj/effect/decal/cleanable/glitter
name = "generic glitter pile"
desc = ""
diff --git a/code/game/objects/items/rogueweapons/melee/flail.dm b/code/game/objects/items/rogueweapons/melee/flail.dm
index ddbdc18a6d1..ec9a5a3c8c9 100644
--- a/code/game/objects/items/rogueweapons/melee/flail.dm
+++ b/code/game/objects/items/rogueweapons/melee/flail.dm
@@ -44,10 +44,10 @@
/datum/intent/flail/strike/smash
name = "smash"
chargetime = 5
+ chargedrain = 2
no_early_release = TRUE
penfactor = 80
recovery = 10
- swingdelay = 7
damfactor = 1.2
chargedloop = /datum/looping_sound/flailswing
keep_looping = TRUE
@@ -60,12 +60,12 @@
/datum/intent/flail/strike/smashrange
name = "ranged smash"
chargetime = 25
+ chargedrain = 2
no_early_release = TRUE
penfactor = 50
recovery = 30
- damfactor = 1.5
+ damfactor = 1.2
reach = 2
- swingdelay = 8
chargedloop = /datum/looping_sound/flailswing
keep_looping = TRUE
icon_state = "insmash"
diff --git a/code/game/objects/items/rogueweapons/melee/swords.dm b/code/game/objects/items/rogueweapons/melee/swords.dm
index b7d92319e97..5840a22cfc5 100644
--- a/code/game/objects/items/rogueweapons/melee/swords.dm
+++ b/code/game/objects/items/rogueweapons/melee/swords.dm
@@ -147,6 +147,7 @@
gripped_intents = null
minstr = 4
wdefense = 4
+ wlength = WLENGTH_SHORT
/obj/item/rogueweapon/sword/long
force = 25
@@ -466,20 +467,23 @@
gripped_intents = null
minstr = 4
wdefense = 3
+ wlength = WLENGTH_SHORT
/obj/item/rogueweapon/sword/iron/short/chipped
force = 17
desc = "An ancient-looking iron sword."
icon_state = "iswordshort_d"
max_integrity = 75
+ wlength = WLENGTH_SHORT
/datum/intent/sword/cut/short
- clickcd = 10
- damfactor = 0.9
+ clickcd = 9
+ damfactor = 1
/datum/intent/sword/thrust/short
- clickcd = 10
+ clickcd = 8
damfactor = 1.1
+ penfactor = 30
/obj/item/rogueweapon/sword/iron/messer
name = "iron messer"
diff --git a/code/game/objects/structures/roguewindow.dm b/code/game/objects/structures/roguewindow.dm
index 1f30df974ae..f886f3bdf81 100644
--- a/code/game/objects/structures/roguewindow.dm
+++ b/code/game/objects/structures/roguewindow.dm
@@ -175,6 +175,7 @@
if(!brokenstate)
attacked_sound = list('sound/combat/hits/onwood/woodimpact (1).ogg','sound/combat/hits/onwood/woodimpact (2).ogg')
new /obj/item/natural/glass/shard (get_turf(src))
+ new /obj/effect/decal/cleanable/glass(get_turf(src))
climbable = TRUE
brokenstate = TRUE
opacity = FALSE
diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm
index d40c92bf676..a069600f08a 100644
--- a/code/game/objects/structures/stairs.dm
+++ b/code/game/objects/structures/stairs.dm
@@ -144,5 +144,9 @@
L.stop_pulling()
pulling.forceMove(newtarg)
L.start_pulling(pulling, supress_message = TRUE)
- if(was_pulled_buckled) // Assume this was a fireman carry since piggybacking is not a thing
- L.buckle_mob(pulling, TRUE, TRUE, 90, 0, 0)
+ if(was_pulled_buckled)
+ var/mob/living/M = pulling
+ if(M.mobility_flags & MOBILITY_STAND) // piggyback carry
+ L.buckle_mob(pulling, TRUE, TRUE, FALSE, 0, 0)
+ else // fireman carry
+ L.buckle_mob(pulling, TRUE, TRUE, 90, 0, 0)
diff --git a/code/modules/antagonists/roguetown/villain/lich.dm b/code/modules/antagonists/roguetown/villain/lich.dm
index dbb9f4420cf..fb12ea3acdd 100644
--- a/code/modules/antagonists/roguetown/villain/lich.dm
+++ b/code/modules/antagonists/roguetown/villain/lich.dm
@@ -12,6 +12,32 @@
var/list/phylacteries = list()
var/out_of_lives = FALSE
+ var/traits_lich = list(
+ TRAIT_NOROGSTAM,
+ TRAIT_NOHUNGER,
+ TRAIT_NOBREATH,
+ TRAIT_NOPAIN,
+ TRAIT_TOXIMMUNE,
+ TRAIT_STEELHEARTED,
+ TRAIT_NOSLEEP,
+ TRAIT_VAMPMANSION,
+ TRAIT_NOMOOD,
+ TRAIT_NOLIMBDISABLE,
+ TRAIT_SHOCKIMMUNE,
+ TRAIT_LIMBATTACHMENT,
+ TRAIT_SEEPRICES,
+ TRAIT_CRITICAL_RESISTANCE,
+ TRAIT_HEAVYARMOR,
+ TRAIT_CABAL,
+ TRAIT_DEATHSIGHT
+ )
+
+ var/STASTR = 10
+ var/STASPD = 10
+ var/STAINT = 10
+ var/STAEND = 10
+ var/STAPER = 10
+
/datum/antagonist/lich/on_gain()
var/datum/game_mode/C = SSticker.mode
C.liches |= owner
@@ -20,6 +46,8 @@
skele_look()
equip_lich()
greet()
+ save_stats()
+
return ..()
/datum/antagonist/lich/greet()
@@ -27,6 +55,20 @@
owner.announce_objectives()
..()
+/datum/antagonist/lich/proc/save_stats()
+ STASTR = owner.current.STASTR
+ STAPER = owner.current.STAPER
+ STAINT = owner.current.STAINT
+ STASPD = owner.current.STASPD
+ STAEND = owner.current.STAEND
+
+/datum/antagonist/lich/proc/set_stats()
+ owner.current.STASTR = src.STASTR
+ owner.current.STAPER = src.STAPER
+ owner.current.STAINT = src.STAINT
+ owner.current.STASPD = src.STASPD
+ owner.current.STAEND = src.STAEND
+
/datum/antagonist/lich/proc/skele_look()
var/mob/living/carbon/human/L = owner.current
L.hairstyle = "Bald"
@@ -37,57 +79,31 @@
/datum/antagonist/lich/proc/equip_lich()
owner.unknow_all_people()
- for(var/datum/mind/MF in get_minds())
+ for (var/datum/mind/MF in get_minds())
owner.become_unknown_to(MF)
+
var/mob/living/carbon/human/L = owner.current
- ADD_TRAIT(L, TRAIT_NOROGSTAM, "[type]")
- ADD_TRAIT(L, TRAIT_NOHUNGER, "[type]")
- ADD_TRAIT(L, TRAIT_NOBREATH, "[type]")
- ADD_TRAIT(L, TRAIT_NOPAIN, "[type]")
- ADD_TRAIT(L, TRAIT_TOXIMMUNE, "[type]")
- ADD_TRAIT(L, TRAIT_STEELHEARTED, "[type]")
- ADD_TRAIT(L, TRAIT_NOSLEEP, "[type]")
- ADD_TRAIT(L, TRAIT_VAMPMANSION, "[type]")
- ADD_TRAIT(L, TRAIT_NOMOOD, "[type]")
- ADD_TRAIT(L, TRAIT_NOLIMBDISABLE, "[type]")
- ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, "[type]")
- ADD_TRAIT(L, TRAIT_LIMBATTACHMENT, "[type]")
- ADD_TRAIT(L, TRAIT_SEEPRICES, "[type]")
- ADD_TRAIT(L, TRAIT_CRITICAL_RESISTANCE, "[type]")
- ADD_TRAIT(L, TRAIT_HEAVYARMOR, "[type]")
- ADD_TRAIT(L, TRAIT_CABAL, "[type]")
- ADD_TRAIT(L, TRAIT_DEATHSIGHT, "[type]")
+
L.cmode_music = 'sound/music/combat_cult.ogg'
L.faction = list("undead")
- if(L.charflaw)
+
+ if (L.charflaw)
QDEL_NULL(L.charflaw)
+
L.mob_biotypes |= MOB_UNDEAD
- var/obj/item/organ/eyes/eyes = L.getorganslot(ORGAN_SLOT_EYES)
- if(eyes)
- eyes.Remove(L,1)
- QDEL_NULL(eyes)
- eyes = new /obj/item/organ/eyes/night_vision/zombie
- eyes.Insert(L)
- for(var/obj/item/bodypart/B in L.bodyparts)
+ replace_eyes(L)
+
+ for (var/obj/item/bodypart/B in L.bodyparts)
B.skeletonize(FALSE)
+
+ equip_and_traits()
L.equipOutfit(/datum/outfit/job/roguetown/lich)
+
L.set_patron(/datum/patron/inhumen/zizo)
-/datum/outfit/job/roguetown/lich/pre_equip(mob/living/carbon/human/H)
+
+/datum/outfit/job/roguetown/lich/pre_equip(mob/living/carbon/human/H) //Equipment is located below
..()
- pants = /obj/item/clothing/under/roguetown/chainlegs
- shoes = /obj/item/clothing/shoes/roguetown/boots
- neck = /obj/item/clothing/neck/roguetown/chaincoif
- cloak = /obj/item/clothing/cloak/raincloak/mortus
- armor = /obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate
- shirt = /obj/item/clothing/suit/roguetown/shirt/tunic/ucolored
- wrists = /obj/item/clothing/wrists/roguetown/bracers
- gloves = /obj/item/clothing/gloves/roguetown/chain
- belt = /obj/item/storage/belt/rogue/leather/black
- backl = /obj/item/storage/backpack/rogue/satchel
- beltr = /obj/item/reagent_containers/glass/bottle/rogue/manapot
- beltl = /obj/item/rogueweapon/huntingknife/idagger/steel
- r_hand = /obj/item/rogueweapon/woodstaff/wise
H.mind.adjust_skillrank(/datum/skill/misc/reading, 6, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/alchemy, 5, TRUE)
@@ -122,6 +138,14 @@
addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, choose_name_popup), "LICH"), 5 SECONDS)
+/datum/antagonist/lich/proc/replace_eyes(mob/living/carbon/human/L)
+ var/obj/item/organ/eyes/eyes = L.getorganslot(ORGAN_SLOT_EYES)
+ if (eyes)
+ eyes.Remove(L, TRUE)
+ QDEL_NULL(eyes)
+ eyes = new /obj/item/organ/eyes/night_vision/zombie
+ eyes.Insert(L)
+
/datum/outfit/job/roguetown/lich/post_equip(mob/living/carbon/human/H)
..()
var/datum/antagonist/lich/lichman = H.mind.has_antag_datum(/datum/antagonist/lich)
@@ -132,28 +156,89 @@
H.equip_to_slot_or_del(new_phylactery,SLOT_IN_BACKPACK, TRUE)
/datum/antagonist/lich/proc/consume_phylactery(timer = 10 SECONDS)
- for(var/obj/item/phylactery/phyl in phylacteries)
- phyl.be_consumed(timer)
- phylacteries -= phyl
- return TRUE
+ if(phylacteries.len == 0)
+ return FALSE
+ else
+ for(var/obj/item/phylactery/phyl in phylacteries)
+ phyl.be_consumed(timer)
+ phylacteries -= phyl
+ return TRUE
+
+
+///Called post death to equip new body with armour and stats. Order of equipment matters
+/datum/antagonist/lich/proc/equip_and_traits()
+ var/mob/living/carbon/human/body = owner.current
+ var/list/equipment_slots = list(
+ SLOT_PANTS,
+ SLOT_SHOES,
+ SLOT_NECK,
+ SLOT_CLOAK,
+ SLOT_ARMOR,
+ SLOT_SHIRT,
+ SLOT_WRISTS,
+ SLOT_GLOVES,
+ SLOT_BELT,
+ SLOT_BELT_R,
+ SLOT_BELT_L,
+ SLOT_HANDS,
+ SLOT_BACK_L,
+ )
+
+ var/list/equipment_items = list(
+ /obj/item/clothing/under/roguetown/chainlegs,
+ /obj/item/clothing/shoes/roguetown/boots,
+ /obj/item/clothing/neck/roguetown/chaincoif,
+ /obj/item/clothing/cloak/raincloak/mortus,
+ /obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate,
+ /obj/item/clothing/suit/roguetown/shirt/tunic/ucolored,
+ /obj/item/clothing/wrists/roguetown/bracers,
+ /obj/item/clothing/gloves/roguetown/chain,
+ /obj/item/storage/belt/rogue/leather/black,
+ /obj/item/reagent_containers/glass/bottle/rogue/manapot,
+ /obj/item/rogueweapon/huntingknife/idagger/steel,
+ /obj/item/rogueweapon/woodstaff/wise,
+ /obj/item/storage/backpack/rogue/satchel,
+ )
+ for (var/i = 1, i <= equipment_slots.len, i++)
+ var/slot = equipment_slots[i]
+ var/item_type = equipment_items[i]
+ body.equip_to_slot_or_del(new item_type, slot, TRUE)
+
+ for (var/trait in traits_lich)
+ ADD_TRAIT(body, trait, "[type]")
/datum/antagonist/lich/proc/rise_anew()
- var/mob/living/carbon/human/bigbad = owner.current
- bigbad.revive(TRUE, TRUE)
+ if (!owner.current.mind)
+ CRASH("Lich: rise_anew called with no mind")
+
+ var/mob/living/carbon/human/old_body = owner.current
+ var/turf/phylactery_turf = get_turf(old_body)
+ var/mob/living/carbon/human/new_body = new /mob/living/carbon/human/species/human/northern(phylactery_turf)
+
+ old_body.mind.transfer_to(new_body)
+
+ if (new_body.charflaw)
+ QDEL_NULL(new_body.charflaw)
+
+ new_body.real_name = old_body.name
+ new_body.dna.real_name = old_body.real_name
+ new_body.mob_biotypes |= MOB_UNDEAD
+ new_body.set_patron(/datum/patron/inhumen/zizo)
+ new_body.mind.grab_ghost(force = TRUE)
+
+ for (var/obj/item/bodypart/body_part in new_body.bodyparts)
+ body_part.skeletonize(FALSE)
+
+ replace_eyes(new_body)
+ set_stats()
+ skele_look()
+ equip_and_traits()
+
+ // Delete the old body if it still exists
+ if (!QDELETED(old_body))
+ qdel(old_body)
- for(var/obj/item/bodypart/B in bigbad.bodyparts)
- B.skeletonize(FALSE)
- bigbad.faction = list("undead")
- if(bigbad.charflaw)
- QDEL_NULL(bigbad.charflaw)
- bigbad.mob_biotypes |= MOB_UNDEAD
- var/obj/item/organ/eyes/eyes = bigbad.getorganslot(ORGAN_SLOT_EYES)
- if(eyes)
- eyes.Remove(bigbad,1)
- QDEL_NULL(eyes)
- eyes = new /obj/item/organ/eyes/night_vision/zombie
- eyes.Insert(bigbad)
/obj/item/phylactery
@@ -182,6 +267,7 @@
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = -1) //start shaking
visible_message(span_warning("[src] begins to glow and shake violently!"))
+
spawn(timer)
possessor.owner.current.forceMove(get_turf(src))
possessor.rise_anew()
diff --git a/code/modules/client/customizer/customizers/bodypart_feature/hair.dm b/code/modules/client/customizer/customizers/bodypart_feature/hair.dm
index eb459535a5d..a27475184b4 100644
--- a/code/modules/client/customizer/customizers/bodypart_feature/hair.dm
+++ b/code/modules/client/customizer/customizers/bodypart_feature/hair.dm
@@ -381,6 +381,10 @@
/datum/sprite_accessory/hair/head/thicklong_alt,
/datum/sprite_accessory/hair/head/baum,
/datum/sprite_accessory/hair/head/mcsqueeb,
+ /datum/sprite_accessory/hair/head/highlander,
+ /datum/sprite_accessory/hair/head/royalcurls,
+ /datum/sprite_accessory/hair/head/dreadlocksmessy,
+ /datum/sprite_accessory/hair/head/suave,
)
/datum/customizer_choice/bodypart_feature/hair/head/humanoid/get_random_accessory(datum/customizer_entry/entry, datum/preferences/prefs)
diff --git a/code/modules/clothing/rogueclothes/armor.dm b/code/modules/clothing/rogueclothes/armor.dm
index f94be60976c..ac9ff0a6bf0 100644
--- a/code/modules/clothing/rogueclothes/armor.dm
+++ b/code/modules/clothing/rogueclothes/armor.dm
@@ -403,7 +403,7 @@
/obj/item/clothing/suit/roguetown/armor/chainmail/hauberk/fluted
name = "fluted hauberk"
- desc = "A steel maille, of a pattern popularized by Otavan templars."
+ desc = "An ornate cuirass, flanked with sleeves of steel maille."
icon_state = "flutedhauberk"
item_state = "flutedhauberk"
diff --git a/code/modules/clothing/rogueclothes/cloaks.dm b/code/modules/clothing/rogueclothes/cloaks.dm
index 07fb08ee1a6..52fd354b365 100644
--- a/code/modules/clothing/rogueclothes/cloaks.dm
+++ b/code/modules/clothing/rogueclothes/cloaks.dm
@@ -42,8 +42,8 @@
flags_inv = HIDECROTCH|HIDEBOOB
/obj/item/clothing/cloak/psydontabard
- name = "inquisitorial tabard"
- desc = "A long vest bearing Psydonian symbology"
+ name = "psydonian tabard"
+ desc = "A tabard worn by Psydon's disciples. Delicate stitchwork professes the psycross with pride."
color = null
icon_state = "psydontabard"
item_state = "psydontabard"
@@ -51,13 +51,13 @@
alternate_worn_layer = TABARD_LAYER
body_parts_covered = CHEST|GROIN
boobed = TRUE
- slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK
+ slot_flags = ITEM_SLOT_SHIRT|ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK
flags_inv = HIDECROTCH|HIDEBOOB
var/open_wear = FALSE
/obj/item/clothing/cloak/psydontabard/alt
- name = "open otavan tabard"
- desc = "A long vest bearing Psydonian symbology"
+ name = "opened psydonian tabard"
+ desc = "A tabard worn by Psydon's disciples, peeled back to reveal its enduring innards."
body_parts_covered = GROIN
icon_state = "psydontabardalt"
item_state = "psydontabardalt"
@@ -67,23 +67,23 @@
/obj/item/clothing/cloak/psydontabard/attack_right(mob/user)
switch(open_wear)
if(FALSE)
- name = "inquisitorial tabard"
- desc = "A long vest bearing Psydonian symbology"
+ name = "opened psydonian tabard"
+ desc = "A tabard worn by Psydon's disciples, peeled back to reveal its enduring innards."
body_parts_covered = GROIN
icon_state = "psydontabardalt"
item_state = "psydontabardalt"
open_wear = TRUE
flags_inv = HIDECROTCH // BARE YOUR CHEST, NOT YOUR WEEN!
- to_chat(usr, span_warning("Now wearing ENDURINGLY!"))
+ to_chat(usr, span_warning("ENDURING, like the MARTYRS who'll guide the faithful-and-pious to PARADISE."))
if(TRUE)
- name = "inquisitorial tabard"
- desc = "A long vest bearing Psydonian symbology"
+ name = "psydonian tabard"
+ desc = "A tabard worn by Psydon's disciples. Delicate stitchwork professes the psycross with pride."
body_parts_covered = CHEST|GROIN
icon_state = "psydontabard"
item_state = "psydontabard"
flags_inv = HIDECROTCH|HIDEBOOB
open_wear = FALSE
- to_chat(usr, span_warning("Now wearing normally!"))
+ to_chat(usr, span_warning("VEILED, like the CORPSES who've been shepherded by your steel to the AFTERLYFE."))
update_icon()
if(user)
if(ishuman(user))
diff --git a/code/modules/clothing/rogueclothes/feet.dm b/code/modules/clothing/rogueclothes/feet.dm
index 3e1562eda80..8fc369ca516 100644
--- a/code/modules/clothing/rogueclothes/feet.dm
+++ b/code/modules/clothing/rogueclothes/feet.dm
@@ -24,11 +24,12 @@
armor = list("blunt" = 30, "slash" = 10, "stab" = 20, "fire" = 0, "acid" = 0)
/obj/item/clothing/shoes/roguetown/psydonboots
- name = "enduring boots"
- desc = "A reliable pair of dark leather boots. Seems like they could endure the world!"
- color = "#d5c2aa"
+ name = "psydonian boots"
+ desc = "Blacksteel-heeled boots. The leather refuses to be worn down, no matter how far you march through these lands."
icon_state = "psydonboots"
item_state = "psydonboots"
+ sewrepair = TRUE
+ armor = list("blunt" = 30, "slash" = 10, "stab" = 20, "fire" = 0, "acid" = 0)
/obj/item/clothing/shoes/roguetown/nobleboot
name = "noble boots"
diff --git a/code/modules/clothing/rogueclothes/gloves.dm b/code/modules/clothing/rogueclothes/gloves.dm
index ad151ea35cd..349f5e79103 100644
--- a/code/modules/clothing/rogueclothes/gloves.dm
+++ b/code/modules/clothing/rogueclothes/gloves.dm
@@ -91,7 +91,8 @@
smeltresult = /obj/item/ingot/steel
/obj/item/clothing/gloves/roguetown/chain/psydon
- name = "otavan chain gauntlets"
+ name = "psydonian gloves"
+ desc = "Blacksteel-bound gauntlets. These ritualistic restraints, when left to dangle-and-sway, assist in the deflection of unpredictable blows."
icon_state = "psydongloveschain"
item_state = "psydongloveschains"
diff --git a/code/modules/clothing/rogueclothes/hats.dm b/code/modules/clothing/rogueclothes/hats.dm
index 5b98750dd37..c1b60ca8f7d 100644
--- a/code/modules/clothing/rogueclothes/hats.dm
+++ b/code/modules/clothing/rogueclothes/hats.dm
@@ -556,16 +556,6 @@
icon_state = "kettle"
body_parts_covered = HEAD|HAIR|EARS
armor = list("blunt" = 80, "slash" = 90, "piercing" = 100, "stab" = 70, "fire" = 0, "acid" = 0)
-
-/obj/item/clothing/head/roguetown/helmet/psydonbarbute
- name = "psydonian barbute"
- desc = "A barbute styled with Psydonian Imagery."
- icon_state = "psydonbarbute"
- item_state = "psydonbarbute"
- block2add = FOV_BEHIND
- flags_inv = HIDEEARS|HIDEFACE
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
- body_parts_covered = FULL_HEAD
/obj/item/clothing/head/roguetown/helmet/kettle/attackby(obj/item/W, mob/living/user, params)
..()
@@ -944,9 +934,16 @@
smeltresult = /obj/item/ingot/steel
smelt_bar_num = 2
+/obj/item/clothing/head/roguetown/helmet/heavy/psydonbarbute
+ name = "psydonian barbute"
+ desc = "A ceremonial barbute, masterfully forged to represent Psydon's divine authority. The Order of Saint Malum's artisans have chiseled this pronged visage into more statues than you could possibly imagine."
+ icon_state = "psydonbarbute"
+ item_state = "psydonbarbute"
+ flags_inv = HIDEEARS|HIDEFACE|HIDEHAIR
+
/obj/item/clothing/head/roguetown/helmet/heavy/psydonhelm
- name ="otavan armet"
- desc = "Headwear commonly worn by Templars in service to the Inquisition of Otava. PSYDON Endures."
+ name = "psydonian armet"
+ desc = "An ornate helmet, whose visor has been bound shut with blacksteel chains. The Order of Saint Eora often decorates these armets with flowers - not only as a lucky charm gifted to them by fair maidens and family, but also as a vibrant reminder that 'happiness has to be fought for.'"
icon_state = "psydonarmet"
item_state = "psydonarmet"
flags_inv = HIDEEARS|HIDEFACE|HIDEHAIR
@@ -981,6 +978,14 @@
var/mob/living/carbon/H = user
H.update_inv_head()
+/obj/item/clothing/head/roguetown/helmet/heavy/psydonhelm/update_icon()
+ cut_overlays()
+ if(get_detail_tag())
+ var/mutable_appearance/pic = mutable_appearance(icon(icon, "[icon_state][detail_tag]"))
+ pic.appearance_flags = RESET_COLOR
+ if(get_detail_color())
+ pic.color = get_detail_color()
+ add_overlay(pic)
/obj/item/clothing/head/roguetown/helmet/heavy/nochelm
name = "noc helmet"
@@ -1457,12 +1462,12 @@
/obj/item/clothing/head/roguetown/roguehood/psydon
name = "psydonian hood"
- desc = "A hood worn by those who favor Psydon. Forever enduring!"
+ desc = "A hood worn by Psydon's disciples, oft-worn in conjunction with its matching tabard."
icon_state = "psydonhood"
item_state = "psydonhood"
color = null
body_parts_covered = NECK
- slot_flags = ITEM_SLOT_HEAD
+ slot_flags = ITEM_SLOT_HEAD|ITEM_SLOT_MASK
dynamic_hair_suffix = ""
edelay_type = 1
adjustable = CAN_CADJUST
diff --git a/code/modules/clothing/rogueclothes/mask.dm b/code/modules/clothing/rogueclothes/mask.dm
index cf11b34a397..9c42a00a59a 100644
--- a/code/modules/clothing/rogueclothes/mask.dm
+++ b/code/modules/clothing/rogueclothes/mask.dm
@@ -113,8 +113,8 @@
smeltresult = /obj/item/ingot/iron
/obj/item/clothing/mask/rogue/facemask/psydonmask
- name = "Psydonian Mask"
- desc = "A symbolic mask typically worn by members of the Otavan Inquisition."
+ name = "psydonian mask"
+ desc = "A silver mask, forever locked in a rigor of uncontestable joy. The Order of Saint Xylix can't decide on whether it's meant to represent Psydon's 'mirthfulness', 'theatricality', or the unpredictable melding of both."
icon_state = "psydonmask"
item_state = "psydonmask"
diff --git a/code/modules/clothing/rogueclothes/neck.dm b/code/modules/clothing/rogueclothes/neck.dm
index 0f7cb919c9a..07eb1312f10 100644
--- a/code/modules/clothing/rogueclothes/neck.dm
+++ b/code/modules/clothing/rogueclothes/neck.dm
@@ -191,7 +191,7 @@
/obj/item/clothing/neck/roguetown/psicross
name = "psycross"
- desc = ""
+ desc = "'With every broken bone, I swore I lived!'"
icon_state = "psicross"
//dropshrink = 0.75
resistance_flags = FIRE_PROOF
@@ -247,12 +247,14 @@
/obj/item/clothing/neck/roguetown/psicross/wood
name = "wooden psycross"
+ desc = "'A man with nothing can still have faith!'"
icon_state = "psycross_w"
item_state = "psycross_w"
sellprice = 0
/obj/item/clothing/neck/roguetown/psicross/silver
name = "silver psycross"
+ desc = "'The horrors persist, but so do I!'"
icon_state = "psycross_s"
item_state = "psycross_s"
sellprice = 50
@@ -307,7 +309,7 @@
/obj/item/clothing/neck/roguetown/psicross/g
name = "golden psycross"
- desc = ""
+ desc = "'Purity afloat, for paradise awaits!'"
icon_state = "psycross_g"
item_state = "psycross_g"
//dropshrink = 0.75
diff --git a/code/modules/clothing/rogueclothes/rings.dm b/code/modules/clothing/rogueclothes/rings.dm
index 3bddccb1a2e..d471726f988 100644
--- a/code/modules/clothing/rogueclothes/rings.dm
+++ b/code/modules/clothing/rogueclothes/rings.dm
@@ -165,17 +165,17 @@
sellprice = 666
var/active_item
-/obj/item/clothing/ring/dragon_ring/equipped(mob/living/user)
+/obj/item/clothing/ring/dragon_ring/equipped(mob/living/user, slot)
. = ..()
if(active_item)
return
- else
+ else if(slot == SLOT_RING)
active_item = TRUE
to_chat(user, span_notice("Here be dragons."))
user.change_stat("strength", 2)
user.change_stat("constitution", 2)
user.change_stat("endurance", 2)
- return
+ return
/obj/item/clothing/ring/dragon_ring/dropped(mob/living/user)
..()
@@ -185,5 +185,5 @@
user.change_stat("constitution", -2)
user.change_stat("endurance", -2)
active_item = FALSE
- return
+ return
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 f68b13756a1..bb14982b8c2 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
@@ -6,7 +6,7 @@
allowed_sexes = list(MALE, FEMALE)
allowed_races = list(/datum/species/dwarf/mountain)
outfit = /datum/outfit/job/roguetown/adventurer/dranger
- traits_applied = list(TRAIT_MEDIUMARMOR)
+ traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_OUTDOORSMAN)
category_tags = list(CTAG_ADVENTURER)
/datum/outfit/job/roguetown/adventurer/dranger/pre_equip(mob/living/carbon/human/H)
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 dd0064272ca..26c0bf493f5 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
@@ -4,7 +4,7 @@
allowed_sexes = list(MALE, FEMALE)
allowed_races = RACES_ALL_KINDS
outfit = /datum/outfit/job/roguetown/adventurer/ranger
- traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_DODGEEXPERT)
+ traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_DODGEEXPERT, TRAIT_OUTDOORSMAN)
category_tags = list(CTAG_ADVENTURER)
/datum/outfit/job/roguetown/adventurer/ranger/pre_equip(mob/living/carbon/human/H)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/sentinel.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/sentinel.dm
index 2e50ba2ed86..f2b5e4e8e31 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/sentinel.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/sentinel.dm
@@ -9,7 +9,7 @@
/datum/species/elf/wood,
)
outfit = /datum/outfit/job/roguetown/adventurer/sentinel
- traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_DODGEEXPERT)
+ traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_DODGEEXPERT, TRAIT_OUTDOORSMAN)
category_tags = list(CTAG_ADVENTURER)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/hunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/hunter.dm
index 119a523a720..8752d02b7aa 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/hunter.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/hunter.dm
@@ -27,6 +27,7 @@
/obj/item/flashlight/flare/torch = 1,
)
gloves = /obj/item/clothing/gloves/roguetown/leather
+ ADD_TRAIT(H, TRAIT_OUTDOORSMAN, TRAIT_GENERIC)
if(H.mind)
H.mind.adjust_skillrank(/datum/skill/combat/swords, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/axes, 1, TRUE)
diff --git a/code/modules/jobs/job_types/roguetown/church/druid.dm b/code/modules/jobs/job_types/roguetown/church/druid.dm
index 03696cf25ec..3aea76b9b99 100644
--- a/code/modules/jobs/job_types/roguetown/church/druid.dm
+++ b/code/modules/jobs/job_types/roguetown/church/druid.dm
@@ -67,6 +67,7 @@
H.ambushable = FALSE
ADD_TRAIT(H, TRAIT_SEEDKNOW, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_OUTDOORSMAN, TRAIT_GENERIC)
var/datum/devotion/C = new /datum/devotion(H, H.patron)
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/job_types/roguetown/church/monk.dm b/code/modules/jobs/job_types/roguetown/church/monk.dm
index 3c77e65bc3e..7ad49339c42 100644
--- a/code/modules/jobs/job_types/roguetown/church/monk.dm
+++ b/code/modules/jobs/job_types/roguetown/church/monk.dm
@@ -22,7 +22,7 @@
name = "Acolyte"
jobtype = /datum/job/roguetown/monk
- allowed_patrons = list(/datum/patron/divine/pestra, /datum/patron/divine/astrata, /datum/patron/divine/eora, /datum/patron/divine/noc, /datum/patron/divine/necra, /datum/patron/divine/abyssor) //Eora content from Stonekeep
+ allowed_patrons = list(/datum/patron/divine/pestra, /datum/patron/divine/astrata, /datum/patron/divine/eora, /datum/patron/divine/noc, /datum/patron/divine/necra, /datum/patron/divine/abyssor, /datum/patron/divine/malum) //Eora content from Stonekeep
/datum/outfit/job/roguetown/monk/pre_equip(mob/living/carbon/human/H)
@@ -30,6 +30,7 @@
belt = /obj/item/storage/belt/rogue/leather/rope
beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
beltl = /obj/item/storage/keyring/churchie
+ backl = /obj/item/storage/backpack/rogue/satchel
switch(H.patron?.type)
if(/datum/patron/divine/astrata)
head = /obj/item/clothing/head/roguetown/roguehood/astrata
@@ -74,6 +75,14 @@
neck = /obj/item/clothing/neck/roguetown/psicross/eora
shoes = /obj/item/clothing/shoes/roguetown/sandals
armor = /obj/item/clothing/suit/roguetown/shirt/robe/eora
+ if(/datum/patron/divine/malum)
+ head = /obj/item/clothing/head/roguetown/roguehood
+ neck = /obj/item/clothing/neck/roguetown/psicross/malum
+ shoes = /obj/item/clothing/shoes/roguetown/boots
+ wrists = /obj/item/clothing/wrists/roguetown/wrappings
+ pants = /obj/item/clothing/under/roguetown/trou
+ cloak = /obj/item/clothing/cloak/templar/malumite
+ armor = /obj/item/clothing/suit/roguetown/armor/leather/vest
else
head = /obj/item/clothing/head/roguetown/roguehood/astrata
neck = /obj/item/clothing/neck/roguetown/psicross/astrata
@@ -87,6 +96,11 @@
if(H.patron?.type == /datum/patron/divine/pestra)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 1, TRUE)
ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC)
+ if(H.patron?.type == /datum/patron/divine/malum)
+ H.mind.adjust_skillrank(/datum/skill/craft/blacksmithing, 1, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/craft/armorsmithing, 1, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/craft/weaponsmithing, 1, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/craft/smelting, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/craft/cooking, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/craft/crafting, 3, TRUE)
@@ -103,6 +117,9 @@
ADD_TRAIT(H, TRAIT_SOUL_EXAMINE, TRAIT_GENERIC)
if(H.patron?.type == /datum/patron/divine/eora)
ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC)
+ if(H.patron?.type == /datum/patron/divine/abyssor)
+ H.mind.adjust_skillrank(/datum/skill/labor/fishing, 3, TRUE)
+ ADD_TRAIT(H, TRAIT_WATERBREATHING, TRAIT_GENERIC)
var/datum/devotion/C = new /datum/devotion(H, H.patron)
C.grant_spells_monk(H)
diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
index 2c96e3fd96d..a4d45bcbb43 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
@@ -73,4 +73,5 @@ Also given some non-combat skills that a peasent would have, just to support the
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_WOODSMAN, TRAIT_GENERIC)
-
+ ADD_TRAIT(H, TRAIT_OUTDOORSMAN, TRAIT_GENERIC)
+
diff --git a/code/modules/jobs/job_types/roguetown/nobility/knight.dm b/code/modules/jobs/job_types/roguetown/nobility/knight.dm
index ad4abe23c3c..c603f19a4b3 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/knight.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/knight.dm
@@ -89,10 +89,10 @@
H.mind.adjust_skillrank(/datum/skill/combat/knives, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/tracking, 2, TRUE)
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //Knights should be used to the horrors of war if they're tride-and-true.
- ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight
- ADD_TRAIT(H, TRAIT_KNIGHTSMAN, TRAIT_GENERIC) //if they can't figure out how to win vs someone in leather armor with this i literally can not help them anymore
- ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC) //Knights can train their squires.
+ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //Knights should be used to the horrors of war if they're tride-and-true.
+ ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight
+ ADD_TRAIT(H, TRAIT_KNIGHTSMAN, TRAIT_GENERIC) //if they can't figure out how to win vs someone in leather armor with this i literally can not help them anymore
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC) //Knights can train their squires.
H.dna.species.soundpack_m = new /datum/voicepack/male/knight() //For knightly voices; even though I despise them.
H.verbs |= /mob/proc/haltyell
@@ -157,10 +157,10 @@
H.mind.adjust_skillrank(/datum/skill/combat/knives, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/tracking, 2, TRUE)
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //Knights should be used to the horrors of war if they're tride-and-true.
- ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight.
- ADD_TRAIT(H, TRAIT_KNIGHTSMAN, TRAIT_GENERIC) //if they can't figure out how to win vs someone in leather armor with this i literally can not help them anymore
- ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC) //Knights can train their squires.
+ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //Knights should be used to the horrors of war if they're tride-and-true.
+ ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight.
+ ADD_TRAIT(H, TRAIT_KNIGHTSMAN, TRAIT_GENERIC) //if they can't figure out how to win vs someone in leather armor with this i literally can not help them anymore
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC) //Knights can train their squires.
H.dna.species.soundpack_m = new /datum/voicepack/male/knight() //For knightly voices; even though I despise them.
H.verbs |= /mob/proc/haltyell
@@ -219,10 +219,11 @@
H.mind.adjust_skillrank(/datum/skill/combat/knives, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/tracking, 3, TRUE)
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //Knights should be used to the horrors of war if they're tride-and-true.
- ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight.
- ADD_TRAIT(H, TRAIT_KNIGHTSMAN, TRAIT_GENERIC) //if they can't figure out how to win vs someone in leather armor with this i literally can not help them anymore
- ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC) //Knights can train their squires.
+ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //Knights should be used to the horrors of war if they're tride-and-true.
+ ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight.
+ ADD_TRAIT(H, TRAIT_KNIGHTSMAN, TRAIT_GENERIC) //if they can't figure out how to win vs someone in leather armor with this i literally can not help them anymore
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC) //Knights can train their squires.
+ ADD_TRAIT(H, TRAIT_GUARDSMAN, TRAIT_GENERIC) //Mounted Knights can roam the town (on their mounts)
H.dna.species.soundpack_m = new /datum/voicepack/male/knight() //For knightly voices; even though I despise them.
H.verbs |= /mob/proc/haltyell
@@ -287,10 +288,10 @@
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //Knights should be used to the horrors of war if they're tride-and-true.
- ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight.
- ADD_TRAIT(H, TRAIT_KNIGHTSMAN, TRAIT_GENERIC) //if they can't figure out how to win vs someone in leather armor with this i literally can not help them anymore
- ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC) //Knights can train their squires.
+ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //Knights should be used to the horrors of war if they're tride-and-true.
+ ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight.
+ ADD_TRAIT(H, TRAIT_KNIGHTSMAN, TRAIT_GENERIC) //if they can't figure out how to win vs someone in leather armor with this i literally can not help them anymore
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC) //Knights can train their squires.
H.dna.species.soundpack_m = new /datum/voicepack/male/knight() //For knightly voices; even though I despise them.
H.verbs |= /mob/proc/haltyell
diff --git a/code/modules/jobs/job_types/roguetown/youngfolk/prince.dm b/code/modules/jobs/job_types/roguetown/youngfolk/prince.dm
index cd435bf864c..7866a78969a 100644
--- a/code/modules/jobs/job_types/roguetown/youngfolk/prince.dm
+++ b/code/modules/jobs/job_types/roguetown/youngfolk/prince.dm
@@ -38,12 +38,12 @@
/datum/outfit/job/roguetown/heir/daring/pre_equip(mob/living/carbon/human/H)
..()
+ armor = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy
pants = /obj/item/clothing/under/roguetown/tights
shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/guard
- armor = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy
shoes = /obj/item/clothing/shoes/roguetown/nobleboot
belt = /obj/item/storage/belt/rogue/leather
- beltl = /obj/item/rogueweapon/sword
+ beltl = /obj/item/rogueweapon/sword/sabre
beltr = /obj/item/storage/keyring/heir
neck = /obj/item/storage/belt/rogue/pouch/coins/rich
backr = /obj/item/storage/backpack/rogue/satchel
@@ -56,8 +56,8 @@
H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/knives, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/swimming, 2, TRUE)
- H.mind.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE)
- H.mind.adjust_skillrank(/datum/skill/misc/athletics, 1, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/climbing, 3, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/athletics, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/riding, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE)
H.change_stat("strength", 1)
@@ -76,16 +76,22 @@
/datum/outfit/job/roguetown/heir/bookworm/pre_equip(mob/living/carbon/human/H)
..()
ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC)
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
- pants = /obj/item/clothing/under/roguetown/tights/random
- belt = /obj/item/storage/belt/rogue/leather/rope
+ if(H.pronouns == HE_HIM || H.pronouns == THEY_THEM || H.pronouns == IT_ITS)
+ pants = /obj/item/clothing/under/roguetown/tights/random
+ armor = /obj/item/clothing/suit/roguetown/armor/longcoat
+ shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
+ if(H.pronouns == SHE_HER || H.pronouns == THEY_THEM_F)
+ pants = /obj/item/clothing/under/roguetown/tights/stockings/silk/random
+ armor = /obj/item/clothing/suit/roguetown/shirt/dress/gen/black
+ shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
+ belt = /obj/item/storage/belt/rogue/leather/cloth/lady
beltr = /obj/item/storage/keyring/heir
- beltl = /obj/item/rogueweapon/huntingknife/idagger
+ beltl = /obj/item/rogueweapon/huntingknife/idagger/steel/special
backr = /obj/item/storage/backpack/rogue/satchel
shoes = /obj/item/clothing/shoes/roguetown/nobleboot
mask = /obj/item/clothing/mask/rogue/spectacles
neck = /obj/item/storage/belt/rogue/pouch/coins/rich
- armor = /obj/item/clothing/suit/roguetown/shirt/robe
+
if(H.mind)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 5, TRUE)
H.mind.adjust_skillrank(/datum/skill/magic/arcane, 1, TRUE)
@@ -98,6 +104,7 @@
H.change_stat("intelligence", 2)
H.change_stat("speed", 1)
H.change_stat("constitution", -1)
+ H.change_stat("fortune", 1)
/datum/advclass/heir/aristocrat
name = "Sheltered Aristocrat"
@@ -113,12 +120,13 @@
belt = /obj/item/storage/belt/rogue/leather
beltl = /obj/item/storage/keyring/heir
beltr = /obj/item/storage/belt/rogue/pouch/coins/rich
- if(H.gender == MALE)
+ backr = /obj/item/storage/backpack/rogue/satchel
+ if(H.pronouns == HE_HIM || H.pronouns == THEY_THEM || H.pronouns == IT_ITS)
pants = /obj/item/clothing/under/roguetown/tights
shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/guard
belt = /obj/item/storage/belt/rogue/leather
shoes = /obj/item/clothing/shoes/roguetown/nobleboot
- if(H.gender == FEMALE)
+ if(H.pronouns == SHE_HER || H.pronouns == THEY_THEM_F)
belt = /obj/item/storage/belt/rogue/leather/cloth/lady
head = /obj/item/clothing/head/roguetown/hennin
armor = /obj/item/clothing/suit/roguetown/armor/silkcoat
@@ -137,7 +145,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/riding, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/craft/cooking, 1, TRUE)
- H.mind.adjust_skillrank(/datum/skill/misc/sewing, 1, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/sewing, 3, TRUE)
H.change_stat("perception", 2)
H.change_stat("strength", -1)
H.change_stat("intelligence", 2)
@@ -161,7 +169,7 @@
if(H.pronouns == HE_HIM || H.pronouns == THEY_THEM || H.pronouns == IT_ITS)
pants = /obj/item/clothing/under/roguetown/tights
shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/guard
- belt = /obj/item/storage/belt/rogue/leather
+ belt = /obj/item/storage/belt/rogue/leather/cloth/lady
shoes = /obj/item/clothing/shoes/roguetown/nobleboot
if(H.pronouns == SHE_HER || H.pronouns == THEY_THEM_F)
belt = /obj/item/storage/belt/rogue/leather/cloth/lady
diff --git a/code/modules/mob/dead/new_player/sprite_accessory/hair.dm b/code/modules/mob/dead/new_player/sprite_accessory/hair.dm
index ff287823bab..0e32b65c27e 100644
--- a/code/modules/mob/dead/new_player/sprite_accessory/hair.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessory/hair.dm
@@ -1086,6 +1086,22 @@
name = "Ye Old McSqueeb"
icon_state = "mcsqueeb"
+/datum/sprite_accessory/hair/head/highlander
+ name = "Highlander"
+ icon_state = "highlander"
+
+/datum/sprite_accessory/hair/head/royalcurls
+ name = "Royal Curls"
+ icon_state = "royalcurls"
+
+/datum/sprite_accessory/hair/head/dreadlocksmessy
+ name = "Dreadlocks Messy"
+ icon_state = "dreadlong"
+
+/datum/sprite_accessory/hair/head/suave
+ name = "Suave"
+ icon_state = "suave"
+
/datum/sprite_accessory/hair/head/vulpkian
abstract_type = /datum/sprite_accessory/hair/head/vulpkian
icon = 'icons/mob/sprite_accessory/hair/vulpkian_hair.dmi'
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 8e659a94051..52d88d608fb 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -92,10 +92,9 @@
. += span_userdanger("OUTLAW!")
if(name in GLOB.court_agents)
- var/datum/job/J = SSjob.GetJob(user.mind.assigned_role)
- if(J)
- if(J.department_flag & GARRISON || J.department_flag & NOBLEMEN)
- . += span_greentext("[m1] an agent of the court!")
+ var/datum/job/J = SSjob.GetJob(user.mind?.assigned_role)
+ if(J?.department_flag & GARRISON || J?.department_flag & NOBLEMEN)
+ . += span_greentext("[m1] an agent of the court!")
var/villain_text = get_villain_text()
if(villain_text)
diff --git a/code/modules/mob/living/carbon/human/npc/goblin.dm b/code/modules/mob/living/carbon/human/npc/goblin.dm
index 2632639a24f..9e69cbc9443 100644
--- a/code/modules/mob/living/carbon/human/npc/goblin.dm
+++ b/code/modules/mob/living/carbon/human/npc/goblin.dm
@@ -335,8 +335,10 @@
r_hand = /obj/item/rogueweapon/mace/spiked
if(prob(20))
r_hand = /obj/item/rogueweapon/flail
- l_hand = /obj/item/rogueweapon/shield/wood
+ l_hand = /obj/item/rogueweapon/shield/wood
+ H.mind.adjust_skillrank(/datum/skill/combat/bows, 1, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 1, TRUE)
////////////////// INVADER ZIM //////////////////
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 817c4bea82e..98d4d530486 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -72,6 +72,11 @@
var/obj/structure/bed/rogue/bed = locate() in loc
if(bed)
sleepy_mod = bed.sleepy
+ else
+ if(HAS_TRAIT(src, TRAIT_OUTDOORSMAN))
+ var/obj/structure/flora/newbranch/branch = locate() in loc
+ if(branch)
+ sleepy_mod = 1.5 //Worse than a bedroll, better than nothing.
if(sleepy_mod > 0)
if(eyesclosed)
var/armor_blocked
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 6a9df209aba..a60b34dc5a3 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -163,6 +163,7 @@
if(m_intent == MOVE_INTENT_RUN && dir == get_dir(src, M))
if(isliving(M))
var/sprint_distance = sprinted_tiles
+ var/instafail = FALSE
toggle_rogmove_intent(MOVE_INTENT_WALK, TRUE)
var/mob/living/L = M
@@ -173,7 +174,8 @@
switch(sprint_distance)
// Point blank
if(0 to 1)
- self_points -= 4
+ self_points -= 99
+ instafail = TRUE
// One to two tile between the people
if(2 to 3)
self_points -= 2
@@ -199,11 +201,15 @@
var/playsound = FALSE
if(apply_damage(15, BRUTE, "head", run_armor_check("head", "blunt", damage = 20)))
playsound = TRUE
- if(L.apply_damage(15, BRUTE, "chest", L.run_armor_check("chest", "blunt", damage = 10)))
- playsound = TRUE
+ if(!instafail)
+ if(L.apply_damage(15, BRUTE, "chest", L.run_armor_check("chest", "blunt", damage = 10)))
+ playsound = TRUE
if(playsound)
playsound(src, "genblunt", 100, TRUE)
- visible_message(span_warning("[src] charges into [L]!"), span_warning("I charge into [L]!"))
+ if(!instafail)
+ visible_message(span_warning("[src] charges into [L]!"), span_warning("I charge into [L]!"))
+ else
+ visible_message(span_warning("[src] smashes into [L] with no headstart!"), span_warning("I charge into [L] too early!"))
return TRUE
//okay, so we didn't switch. but should we push?
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 4f625bf8589..93d7f47f604 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -80,6 +80,8 @@
/mob/living/simple_animal/pet/cat/rogue/inn
name = "inn cat"
desc = "This old, fat cat keeps the inn free of rats... allegedly. It seems like he mostly lazes about in the sun and asks for treats."
+ health = 5000
+ maxHealth = 5000
/mob/living/simple_animal/pet/cat/rogue/black
name = "black cat"
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 22a11384f00..0e1f6241a34 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -124,6 +124,9 @@
/mob/living/simple_animal/hostile/handle_automated_movement()
. = ..()
+ if(QDELETED(src))
+ return
+
if(dodging && target && in_melee && isturf(loc) && isturf(target.loc))
var/datum/cb = CALLBACK(src,PROC_REF(sidestep))
if(sidestep_per_cycle > 1) //For more than one just spread them equally - this could changed to some sensible distribution later
diff --git a/code/modules/mob/living/simple_animal/hostile/simple_skeleton.dm b/code/modules/mob/living/simple_animal/hostile/simple_skeleton.dm
index 88acd54b1a2..15c25f101a3 100644
--- a/code/modules/mob/living/simple_animal/hostile/simple_skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/simple_skeleton.dm
@@ -173,5 +173,5 @@
hitsound = 'sound/combat/hits/hi_arrow2.ogg'
embedchance = 100
woundclass = BCLASS_STAB
- flag = "bullet"
+ flag = "piercing"
speed = 2
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index bf9918cbc7a..33343f7a30d 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -587,6 +587,10 @@
rogue_sneaking = TRUE
return
var/turf/T = get_turf(src)
+
+ if(!T) //if the turf they're headed to is invalid
+ return
+
var/light_amount = T.get_lumcount()
var/used_time = 50
if(mind)
@@ -607,31 +611,40 @@
rogue_sneaking = TRUE
return
+///Checked whenever a mob tries to change their movement intent
/mob/proc/toggle_rogmove_intent(intent, silent = FALSE)
// If we're becoming sprinting from non-sprinting, reset the counter
if(!(m_intent == MOVE_INTENT_RUN && intent == MOVE_INTENT_RUN))
sprinted_tiles = 0
+
switch(intent)
if(MOVE_INTENT_SNEAK)
m_intent = MOVE_INTENT_SNEAK
update_sneak_invis()
+
if(MOVE_INTENT_WALK)
m_intent = MOVE_INTENT_WALK
+
if(MOVE_INTENT_RUN)
if(isliving(src))
var/mob/living/L = src
- if(L.rogfat >= L.maxrogfat)
- return
- if(L.rogstam <= 0)
+
+ //If mob is trying to switch to run, fail if any of these are true
+ if (L.rogfat >= L.maxrogfat || L.rogstam <= 0 || HAS_TRAIT(L, TRAIT_NORUN))
+ if (HAS_TRAIT(L, TRAIT_NORUN)) // If has trait blocker then inform them
+ to_chat(L, span_warning("My joints have decayed too much for running!"))
return
+
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(!H.check_armor_skill() || H.legcuffed)
return
+
m_intent = MOVE_INTENT_RUN
- if(hud_used && hud_used.static_inventory)
+ if(hud_used?.static_inventory) //Update UI
for(var/atom/movable/screen/rogmove/selector in hud_used.static_inventory)
selector.update_icon()
+
if(!silent)
playsound_local(src, 'sound/misc/click.ogg', 100)
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index ae4a3f77786..983f43db31f 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -312,6 +312,8 @@
var/list/cached_addictions = addiction_list
if(C)
expose_temperature(C.bodytemperature, 0.25)
+ if(HAS_TRAIT(C, TRAIT_CRACKHEAD))
+ can_overdose = FALSE
var/need_mob_update = 0
for(var/reagent in cached_reagents)
var/datum/reagent/R = reagent
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 530ad217a79..b0449d9f63f 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -51,8 +51,15 @@ GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/rt/wisdoms.txt"))
/obj/item/reagent_containers/glass/bottle/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum, do_splash = TRUE)
playsound(loc, 'sound/combat/hits/onglass/glassbreak (4).ogg', 100)
- new /obj/item/natural/glass/shard(get_turf(src))
+ shatter(get_turf(src))
..()
+
+/obj/item/reagent_containers/glass/bottle/proc/shatter(turf/T)
+ if(istransparentturf(T))
+ shatter(GET_TURF_BELOW(T))
+ return
+ new /obj/item/natural/glass/shard(get_turf(T))
+ new /obj/effect/decal/cleanable/glass(get_turf(T))
qdel(src)
/obj/item/reagent_containers/glass/bottle/rmb_self(mob/user)
@@ -62,6 +69,7 @@ GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/rt/wisdoms.txt"))
if(closed)
reagent_flags = TRANSPARENT
reagents.flags = reagent_flags
+ to_chat(user, span_notice("You carefully press the cork back into the mouth of the [src]."))
spillable = FALSE
if(!fancy)
desc = "A bottle with a cork."
@@ -69,6 +77,7 @@ GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/rt/wisdoms.txt"))
reagent_flags = OPENCONTAINER
reagents.flags = reagent_flags
playsound(user.loc,'sound/items/uncork.ogg', 100, TRUE)
+ to_chat(user, span_notice("You thumb off the cork from [src]."))
desc = desc_uncorked
spillable = TRUE
if(!fancy)
diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil.dm
index 495df76a09b..3b4eb38c6d9 100644
--- a/code/modules/roguetown/roguejobs/blacksmith/anvil.dm
+++ b/code/modules/roguetown/roguejobs/blacksmith/anvil.dm
@@ -89,7 +89,10 @@
var/mob/living/carbon/carbon_user = user
if(carbon_user.domhand)
used_str = carbon_user.get_str_arms(carbon_user.used_hand)
- carbon_user.rogfat_add(max(40 - (used_str * 3), 0)*advance_multiplier)
+ if(HAS_TRAIT(carbon_user, TRAIT_FORGEBLESSED))
+ carbon_user.rogfat_add(max(21 - (used_str * 3), 0)*advance_multiplier)
+ else
+ carbon_user.rogfat_add(max(40 - (used_str * 3), 0)*advance_multiplier)
var/total_chance = 7 * user.mind.get_skill_level(hingot.currecipe.appro_skill) * user.STAPER/10
var/breakthrough = 0
if(prob((1 + total_chance)*advance_multiplier)) //Small chance to flash
diff --git a/code/modules/roguetown/roguejobs/fisher/leeches.dm b/code/modules/roguetown/roguejobs/fisher/leeches.dm
index f6952257313..ae0a630e472 100644
--- a/code/modules/roguetown/roguejobs/fisher/leeches.dm
+++ b/code/modules/roguetown/roguejobs/fisher/leeches.dm
@@ -244,3 +244,6 @@
span_notice("I squeeze [src]. It will now extract blood."))
#undef MAX_LEECH_EVILNESS
+
+/obj/item/natural/worms/leech/attack_right(mob/user)
+ return
diff --git a/code/modules/roguetown/roguejobs/fisher/worms.dm b/code/modules/roguetown/roguejobs/fisher/worms.dm
index 1dc440a2d9f..60d30a58cb1 100644
--- a/code/modules/roguetown/roguejobs/fisher/worms.dm
+++ b/code/modules/roguetown/roguejobs/fisher/worms.dm
@@ -30,6 +30,9 @@
/obj/item/reagent_containers/food/snacks/fish/clownfish = 1,
)
+/obj/item/natural/worms/grubs/attack_right(mob/user)
+ return
+
/obj/item/natural/worms/update_icon()
icon_state = "worm[amt]"
if(amt > 1)
@@ -45,4 +48,4 @@
/obj/item/natural/worms/Initialize()
. = ..()
- dir = rand(0,8)
\ No newline at end of file
+ dir = rand(0,8)
diff --git a/code/modules/spells/roguetown/acolyte/malum.dm b/code/modules/spells/roguetown/acolyte/malum.dm
new file mode 100644
index 00000000000..cf856e7dbf2
--- /dev/null
+++ b/code/modules/spells/roguetown/acolyte/malum.dm
@@ -0,0 +1,430 @@
+/obj/effect/proc_holder/spell/invoked/vigorousexchange
+ name = "Vigorous Exchange"
+ overlay_state = "vigorousexchange"
+ releasedrain = 0
+ chargedrain = 0
+ chargetime = 0
+ range = 1
+ warnie = "sydwarning"
+ movement_interrupt = FALSE
+ no_early_release = TRUE
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
+ sound = 'sound/items/bsmithfail.ogg'
+ invocation = "Through flame and ash, let vigor rise, by Malum’s hand, let strength reprise!"
+ invocation_type = "shout"
+ associated_skill = /datum/skill/magic/holy
+ antimagic_allowed = FALSE
+ charge_max = 3 MINUTES
+ chargetime = 2 SECONDS
+ miracle = TRUE
+ charging_slowdown = 3
+ chargedloop = /datum/looping_sound/invokegen
+ devotion_cost = 30
+
+/obj/effect/proc_holder/spell/invoked/heatmetal
+ name = "Heat Metal"
+ overlay_state = "heatmetal"
+ releasedrain = 30
+ chargedrain = 0
+ chargetime = 0
+ range = 15
+ warnie = "sydwarning"
+ movement_interrupt = FALSE
+ no_early_release = TRUE
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
+ sound = 'sound/items/bsmithfail.ogg'
+ invocation = "With heat I wield, with flame I claim, Let metal serve in Malum's name!"
+ invocation_type = "shout"
+ associated_skill = /datum/skill/magic/holy
+ antimagic_allowed = FALSE
+ charge_max = 2 MINUTES
+ chargetime = 2 SECONDS
+ miracle = TRUE
+ charging_slowdown = 3
+ chargedloop = /datum/looping_sound/invokegen
+ devotion_cost = 40
+
+/obj/effect/proc_holder/spell/invoked/hammerfall
+ name = "Hammerfall"
+ overlay_state = "Hammerfall"
+ releasedrain = 30
+ chargedrain = 0
+ chargetime = 0
+ range = 15
+ warnie = "sydwarning"
+ movement_interrupt = FALSE
+ no_early_release = TRUE
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
+ sound = 'sound/items/bsmithfail.ogg'
+ invocation = "By molten might and hammer's weight, in Malum’s flame, the earth shall quake!"
+ invocation_type = "shout"
+ associated_skill = /datum/skill/magic/holy
+ antimagic_allowed = TRUE
+ charge_max = 5 MINUTES
+ chargetime = 2 SECONDS
+ miracle = TRUE
+ charging_slowdown = 3
+ chargedloop = /datum/looping_sound/invokegen
+ devotion_cost = 80
+
+/obj/effect/proc_holder/spell/invoked/craftercovenant
+ name = "The Crafter’s Covenant"
+ overlay_state = "craftercovenant"
+ releasedrain = 30
+ chargedrain = 0
+ chargetime = 0
+ range = 1
+ warnie = "sydwarning"
+ movement_interrupt = TRUE
+ no_early_release = TRUE
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
+ sound = 'sound/items/bsmithfail.ogg'
+ invocation = "Coins to ash, flame to form, in Malum’s name, let creation be born!"
+ invocation_type = "shout"
+ associated_skill = /datum/skill/magic/holy
+ antimagic_allowed = FALSE
+ charge_max = 25 MINUTES
+ chargetime = 10 SECONDS
+ miracle = TRUE
+ charging_slowdown = 3
+ chargedloop = /datum/looping_sound/invokegen
+ devotion_cost = 100
+
+/obj/effect/proc_holder/spell/invoked/heatmetal/cast(list/targets, mob/user = usr)
+ . = ..()
+ var/list/nosmeltore = list(/obj/item/rogueore/coal)
+ var/datum/effect_system/spark_spread/sparks = new()
+ var/target
+ for(var/i in targets)
+ target = i
+ if (!target)
+ return
+ if(target in nosmeltore)
+ return
+ if (istype(target, /obj/item))
+ handle_item_smelting(target, user, sparks, nosmeltore)
+ else if (iscarbon(target))
+ handle_living_entity(target, user, nosmeltore)
+
+/proc/show_visible_message(mob/user, text, selftext)
+ var/text_to_send = addtext("", text, "")
+ var/selftext_to_send = addtext("", selftext, "")
+ user.visible_message(text_to_send, selftext_to_send)
+
+/proc/handle_item_smelting(obj/item/target, mob/user, datum/effect_system/spark_spread/sparks, list/nosmeltore)
+ if (!target.smeltresult) return
+ var/obj/item/itemtospawn = target.smeltresult
+ show_visible_message(user, "After [user]'s incantation, [target] glows brightly and melts into an ingot.", null)
+ new itemtospawn(target.loc)
+ sparks.set_up(1, 1, target.loc)
+ sparks.start()
+ qdel(target)
+
+/proc/handle_living_entity(mob/target, mob/user, list/nosmeltore)
+ var/obj/item/targeteditem = get_targeted_item(user, target)
+ if (!targeteditem || targeteditem.smeltresult == /obj/item/ash || target.anti_magic_check(TRUE,TRUE))
+ show_visible_message(user, "After their incantation, [user] points at [target] but it seems to have no effect.", "After your incantation, you point at [target] but it seems to have no effect.")
+ return
+ if (istype(targeteditem, /obj/item/rogueweapon/tongs))
+ handle_tongs(targeteditem, user)
+ else if (should_heat_in_hand(user, target, targeteditem, nosmeltore))
+ handle_heating_in_hand(target, targeteditem, user)
+ else
+ handle_heating_equipped(target, targeteditem, user)
+
+/proc/get_targeted_item(mob/user, mob/target)
+ var/target_item
+ switch(user.zone_selected)
+ if (BODY_ZONE_PRECISE_R_HAND)
+ target_item = target.held_items[2]
+ if (BODY_ZONE_PRECISE_L_HAND)
+ target_item = target.held_items[1]
+ if (BODY_ZONE_HEAD)
+ target_item = target.get_item_by_slot(SLOT_HEAD)
+ if (BODY_ZONE_PRECISE_EARS)
+ target_item = target.get_item_by_slot(SLOT_HEAD)
+ if (BODY_ZONE_CHEST)
+ if(target.get_item_by_slot(SLOT_ARMOR))
+ target_item = target.get_item_by_slot(SLOT_ARMOR)
+ else if (target.get_item_by_slot(SLOT_SHIRT))
+ target_item = target.get_item_by_slot(SLOT_SHIRT)
+ if (BODY_ZONE_PRECISE_NECK)
+ target_item = target.get_item_by_slot(SLOT_NECK)
+ if (BODY_ZONE_PRECISE_R_EYE)
+ target_item = target.get_item_by_slot(ITEM_SLOT_MASK)
+ if ( BODY_ZONE_PRECISE_L_EYE)
+ target_item = target.get_item_by_slot(ITEM_SLOT_MASK)
+ if (BODY_ZONE_PRECISE_NOSE)
+ target_item = target.get_item_by_slot(ITEM_SLOT_MASK)
+ if (BODY_ZONE_PRECISE_MOUTH)
+ target_item = target.get_item_by_slot(ITEM_SLOT_MOUTH)
+ if (BODY_ZONE_L_ARM)
+ target_item = target.get_item_by_slot(ITEM_SLOT_WRISTS)
+ if (BODY_ZONE_R_ARM)
+ target_item = target.get_item_by_slot(ITEM_SLOT_WRISTS)
+ if (BODY_ZONE_L_LEG)
+ target_item = target.get_item_by_slot(ITEM_SLOT_PANTS)
+ if (BODY_ZONE_R_LEG)
+ target_item = target.get_item_by_slot(ITEM_SLOT_PANTS)
+ if (BODY_ZONE_PRECISE_GROIN)
+ target_item = target.get_item_by_slot(ITEM_SLOT_PANTS)
+ if (BODY_ZONE_PRECISE_R_FOOT)
+ target_item = target.get_item_by_slot(ITEM_SLOT_SHOES)
+ if (BODY_ZONE_PRECISE_L_FOOT)
+ target_item = target.get_item_by_slot(ITEM_SLOT_SHOES)
+ return target_item
+
+/proc/handle_tongs(obj/item/rogueweapon/tongs/T, mob/user) //Stole the code from smithing.
+ if (!T.hingot) return
+ var/tyme = world.time
+ T.hott = tyme
+ addtimer(CALLBACK(T, TYPE_PROC_REF(/obj/item/rogueweapon/tongs, make_unhot), tyme), 100)
+ T.update_icon()
+ show_visible_message(user, "After [user]'s incantation, the ingot inside [T] starts glowing.", "After your incantation, the ingot inside [T] starts glowing.")
+
+/proc/handle_heating_in_hand(mob/living/carbon/target, obj/item/targeteditem, mob/user)
+ var/datum/effect_system/spark_spread/sparks = new()
+ apply_damage_to_hands(target, user)
+ target.dropItemToGround(targeteditem)
+ show_visible_message(target, "[target]'s [targeteditem.name] glows brightly, searing their flesh.", "Your [targeteditem.name] glows brightly, It burns!")
+ target.emote("painscream")
+ playsound(target.loc, 'sound/misc/frying.ogg', 100, FALSE, -1)
+ sparks.set_up(1, 1, target.loc)
+ sparks.start()
+
+/proc/should_heat_in_hand(mob/user, mob/target, obj/item/targeteditem, list/nosmeltore)
+ return ((user.zone_selected == BODY_ZONE_PRECISE_L_HAND && target.held_items[1]) || (user.zone_selected == BODY_ZONE_PRECISE_R_HAND && target.held_items[2])) && !(targeteditem in nosmeltore) && targeteditem.smeltresult
+
+/proc/apply_damage_to_hands(mob/living/carbon/target, mob/user)
+ var/obj/item/bodypart/affecting
+ var/const/adth_damage_to_apply = 10 //How much damage should burning your hand before dropping the item do.
+ if (user.zone_selected == BODY_ZONE_PRECISE_R_HAND)
+ affecting = target.get_bodypart(BODY_ZONE_R_ARM)
+ else if (user.zone_selected == BODY_ZONE_PRECISE_L_HAND)
+ affecting = target.get_bodypart(BODY_ZONE_L_ARM)
+ affecting.receive_damage(0, adth_damage_to_apply)
+
+/proc/handle_heating_equipped(mob/living/carbon/target, obj/item/clothing/targeteditem, mob/user)
+ var/obj/item/armor = target.get_item_by_slot(SLOT_ARMOR)
+ var/obj/item/shirt = target.get_item_by_slot(SLOT_SHIRT)
+ var/armor_can_heat = armor && armor.smeltresult && armor.smeltresult != /obj/item/ash
+ var/shirt_can_heat = shirt && shirt.smeltresult && shirt.smeltresult != /obj/item/ash // Full damage if no shirt
+ var/damage_to_apply = 20 // How much damage should your armor burning you should do.
+ if (user.zone_selected == BODY_ZONE_CHEST)
+ if (armor_can_heat && (!shirt_can_heat && shirt))
+ damage_to_apply = damage_to_apply / 2 // Halve the damage if only armor can heat but shirt can't.
+ if (targeteditem == shirt & armor_can_heat) //this looks redundant but it serves to make sure the damage is doubled if both shirt and armor are metallic.
+ apply_damage_if_covered(target, list(BODY_ZONE_CHEST), armor, CHEST, damage_to_apply)
+ else if (targeteditem == armor & shirt_can_heat)
+ apply_damage_if_covered(target, list(BODY_ZONE_CHEST), shirt, CHEST, damage_to_apply)
+ apply_damage_if_covered(target, list(BODY_ZONE_CHEST), targeteditem, CHEST, damage_to_apply)
+ apply_damage_if_covered(target, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), targeteditem, ARMS|HANDS, damage_to_apply)
+ apply_damage_if_covered(target, list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG), targeteditem, GROIN|LEGS|FEET, damage_to_apply)
+ apply_damage_if_covered(target, list(BODY_ZONE_HEAD), targeteditem, HEAD|HAIR|NECK|NOSE|MOUTH|EARS|EYES, damage_to_apply)
+ show_visible_message(target, "[target]'s [targeteditem.name] glows brightly, searing their flesh.", "My [targeteditem.name] glows brightly, It burns!")
+ playsound(target.loc, 'sound/misc/frying.ogg', 100, FALSE, -1)
+
+/proc/apply_damage_if_covered(mob/living/carbon/target, list/body_zones, obj/item/clothing/targeteditem, mask, damage)
+ var/datum/effect_system/spark_spread/sparks = new()
+ var/obj/item/bodypart/affecting = null
+ for (var/zone in body_zones)
+ {
+ if (targeteditem.body_parts_covered & mask)
+ affecting = target.get_bodypart(zone)
+ if (affecting)
+ affecting.receive_damage(0, damage)
+ sparks.set_up(1, 1, target.loc)
+ sparks.start()
+ }
+
+/obj/effect/proc_holder/spell/invoked/vigorousexchange/cast(list/targets, mob/living/carbon/user = usr)
+ . = ..()
+ var/const/starminatoregen = 500 // How much stamina should the spell give back to the caster.
+ var/mob/target = targets[1]
+ if (!iscarbon(target))
+ return
+ if (target == user)
+ target.rogstam_add(starminatoregen)
+ show_visible_message(usr, "As [user] intones the incantation, vibrant flames swirl around them.", "As you intones the incantation, vibrant flames swirl around you, You feel refreshed.")
+ else if (user.rogstam > (starminatoregen * 2))
+ user.rogstam_add(-(starminatoregen * 2))
+ target.rogstam_add(starminatoregen * 2)
+ show_visible_message(target, "As [user] intones the incantation, vibrant flames swirl around them, a dance of energy flowing towards [target].", "As [user] intones the incantation, vibrant flames swirl around them, a dance of energy flowing towards you. You feel refreshed")
+
+/obj/effect/proc_holder/spell/invoked/craftercovenant/cast(list/targets, mob/user = usr)
+ . = ..()
+ var/tithe = 0
+ var/list/doable[][] = list()
+ var/const/divine_tax = 2 // Multiplier used to adjust the price that should be paid.
+ var/buyprice = 0
+ var/turf/altar
+ var/datum/effect_system/spark_spread/sparks = new()
+ altar = get_turf(targets[1])
+ if(!altar)
+ return
+ for (var/obj/item/sacrifice in altar.contents)
+ {
+ if (istype(sacrifice, /obj/item/roguecoin/))
+ var/obj/item/roguecoin/coincrifice = sacrifice
+ tithe += (coincrifice.quantity * coincrifice.sellprice)
+ else if (istype(sacrifice, /obj/item/roguestatue/) || istype(sacrifice, /obj/item/clothing/ring/) || istype(sacrifice, /obj/item/roguegem/))
+ tithe += sacrifice.sellprice
+ qdel(sacrifice)
+ }
+ buyprice = tithe / divine_tax
+ for (var/list/entry in anvil_recipe_prices)
+ {
+ var/obj/item/tentative_item = entry[1] // The recipe
+ var/total_sellprice = entry[2] // The precompiled material price
+ if (total_sellprice <= buyprice)
+ var/obj/itemtorecord = tentative_item
+ doable += list(list(itemtorecord.name, itemtorecord))
+ }
+ if (!doable.len)
+ show_visible_message(usr, "A wave of heat washes over the pile as [user] speaks Malum's name. The pile of valuables crumble into dust.", "A wave of heat washes over the pile as you speak Malum's name. The pile of valuables crumble into dust. Malum accepted your sacrifice. Yet it seems it wasn't enough.")
+ return
+ var/list/doablename = list()
+ var/list/item_map = list()
+ for (var/list/doableextract in doable)
+ {
+ doablename += list(doableextract[1])
+ item_map[doableextract[1]] = doableextract[2]
+ }
+ var/itemchoice = input(user, "Choose your boon", "Available boons") in (doablename)
+ if (itemchoice)
+ var/obj/item/itemtospawn = item_map[itemchoice]
+ if (itemtospawn)
+ new itemtospawn.type(altar)
+ sparks.set_up(1, 1, altar)
+ sparks.start()
+ show_visible_message(usr, "A wave of heat washes over the pile as [user] speaks Malum's name. The pile of valuables crumble into dust, only for the dust to reform into an item as if reborn from the flames. Malum has accepted the offering.", "A wave of heat washes over the pile as you speak Malum's name. The pile of valuables crumble into dust, only for the dust to reform into an item as if reborn from the flames. Malum has accepted the offering.")
+
+var/global/list/anvil_recipe_prices[][]
+/proc/add_recipe_to_global(var/datum/anvil_recipe/recipe)
+ var/total_sellprice = 0
+ var/obj/item/ingot/bar = recipe.req_bar
+ var/obj/item/itemtosend = null
+ if (bar)
+ total_sellprice += bar.sellprice
+ itemtosend = recipe.created_item
+ if (recipe.additional_items)
+ for (var/obj/additional_item in recipe.additional_items)
+ total_sellprice += additional_item.sellprice
+ if (istype(recipe.created_item, /list))
+ var/list/itemlist = recipe.created_item
+ total_sellprice = total_sellprice/itemlist.len
+ itemtosend = recipe.created_item[1]
+ if (!istype(recipe.created_item, /list))
+ itemtosend = recipe.created_item
+ if (total_sellprice > 0)
+ global.anvil_recipe_prices += list(list(itemtosend, total_sellprice))
+
+/proc/initialize_anvil_recipe_prices()
+ for (var/datum/anvil_recipe/armor/recipe)
+ {
+ add_recipe_to_global(recipe)
+ }
+ for (var/datum/anvil_recipe/tools/recipe)
+ {
+ add_recipe_to_global(recipe)
+ }
+ for (var/datum/anvil_recipe/weapons/recipe)
+ {
+ add_recipe_to_global(recipe)
+ }
+ global.anvil_recipe_prices += list(list(new /obj/item/rogue/instrument/flute, 10))
+ global.anvil_recipe_prices += list(list(new /obj/item/rogue/instrument/drum, 10))
+ global.anvil_recipe_prices += list(list(new /obj/item/rogue/instrument/harp, 20))
+ global.anvil_recipe_prices += list(list(new /obj/item/rogue/instrument/lute, 20))
+ global.anvil_recipe_prices += list(list(new /obj/item/rogue/instrument/guitar, 30))
+ global.anvil_recipe_prices += list(list(new /obj/item/rogue/instrument/accord, 30))
+ global.anvil_recipe_prices += list(list(new /obj/item/riddleofsteel, 400))
+ global.anvil_recipe_prices += list(list(new /obj/item/dmusicbox, 500))
+ // Add any other recipe types if needed
+
+/world/New()
+ ..()
+ initialize_anvil_recipe_prices() // Precompute recipe prices on startup
+
+/obj/effect/proc_holder/spell/invoked/hammerfall/cast(list/targets, mob/user = usr)
+ var/turf/fallzone = null
+ var/const/damage = 250 //Structural damage the spell does. At 250, it would take 4 casts (8 minutes and 320 devotion) to destroy a normal door.
+ var/const/radius = 1 //Radius of the spell
+ var/const/shakeradius = 7 //Radius of the quake
+ var/diceroll = 0
+ var/const/dc = 42 //Code will roll 2d20 and add target's perception and Speed then compare to this to see if they fall down or not. 42 Means they need to roll 2x 20 with Speed and Perception at I
+ var/const/delay = 2 SECONDS // Delay between the ground marking appearing and the effect playing.
+ fallzone = get_turf(targets[1])
+ if(!fallzone)
+ return
+ else
+ show_visible_message(usr, "[usr] raises their arm, conjuring a hammer wreathed in molten fire. As they hurl it toward the ground, the earth trembles under its impact, shaking its very foundations!", "You raise your arm, conjuring a hammer wreathed in molten fire. As you hurl it toward the ground, the earth trembles under its impact, shaking its very foundations!")
+ for (var/turf/open/visual in view(radius, fallzone))
+ var/obj/effect/temp_visual/lavastaff/Lava = new /obj/effect/temp_visual/lavastaff(visual)
+ animate(Lava, alpha = 255, time = 5)
+ sleep(delay)
+ for (var/mob/living/carbon/screenshaken in view(shakeradius, fallzone))
+ shake_camera(screenshaken, 5, 5)
+ for (var/mob/living/carbon/shaken in view(radius, fallzone))
+ diceroll = roll(2,20) + shaken.STAPER + shaken.STASPD
+ if (diceroll > dc)
+ shaken.apply_effect(1 SECONDS, EFFECT_IMMOBILIZE, 0)
+ show_visible_message(shaken, null, "The ground quakes but I manage to keep my footing.")
+ else
+ shaken.apply_effect(1 SECONDS, EFFECT_KNOCKDOWN, 0)
+ show_visible_message(shaken, null, "The ground quakes, making me fall over.")
+ for (var/obj/structure/damaged in view(radius, fallzone))
+ if(!istype(damaged, /obj/structure/flora/newbranch))
+ damaged.take_damage(damage,BRUTE,"blunt",1)
+ for (var/turf/closed/wall/damagedwalls in view(radius, fallzone))
+ damagedwalls.take_damage(damage,BRUTE,"blunt",1)
+ for (var/turf/closed/mineral/aoemining in view(radius, fallzone))
+ aoemining.lastminer = usr
+ aoemining.take_damage(damage,BRUTE,"blunt",1)
+
+/obj/effect/proc_holder/spell/invoked/malum_flame_rogue
+ name = "Malum's Fire"
+ overlay_state = "sacredflame"
+ releasedrain = 15
+ chargedrain = 0
+ chargetime = 0
+ range = 15
+ warnie = "sydwarning"
+ movement_interrupt = FALSE
+ chargedloop = null
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
+ sound = 'sound/magic/heal.ogg'
+ invocation = "Flame."
+ invocation_type = "whisper"
+ associated_skill = /datum/skill/magic/holy
+ antimagic_allowed = TRUE
+ charge_max = 15 SECONDS
+ miracle = TRUE
+ devotion_cost = 15
+
+/obj/effect/proc_holder/spell/invoked/malum_flame_rogue/cast(list/targets, mob/user = usr)
+ . = ..()
+ if(isliving(targets[1]))
+ var/mob/living/L = targets[1]
+ user.visible_message("[user] points at [L]!")
+ if(L.anti_magic_check(TRUE, TRUE))
+ return FALSE
+ L.adjust_fire_stacks(1)
+ L.IgniteMob()
+ return TRUE
+
+ // Spell interaction with ignitable objects (burn wooden things, light torches up)
+ else if(isobj(targets[1]))
+ var/obj/O = targets[1]
+ if(O.fire_act())
+ user.visible_message("[user] points at [O], igniting it with sacred flames!")
+ return TRUE
+ else
+ to_chat(user, span_warning("You point at [O], but it fails to catch fire."))
+ return FALSE
+ return FALSE
+
+
+/obj/effect/temp_visual/lavastaff
+ icon_state = "lavastaff_warn"
+ duration = 50
diff --git a/code/modules/spells/roguetown/necromancer.dm b/code/modules/spells/roguetown/necromancer.dm
index ece14fa99f0..f75142c506b 100644
--- a/code/modules/spells/roguetown/necromancer.dm
+++ b/code/modules/spells/roguetown/necromancer.dm
@@ -194,7 +194,8 @@
var/datum/antagonist/lich/lichman = user.mind.has_antag_datum(/datum/antagonist/lich)
if(lichman)
if(user.stat != DEAD)
- lichman.consume_phylactery(0)
+ if(!lichman.consume_phylactery(0)) //Use phylactery at 0 timer. Returns false if none left.
+ user.death() // If no more phylacteries, die
else
user.death()
diff --git a/code/modules/surgery/bodyparts/bodypart_dismemberment.dm b/code/modules/surgery/bodyparts/bodypart_dismemberment.dm
index 0b140e6d8aa..2059ff02f24 100644
--- a/code/modules/surgery/bodyparts/bodypart_dismemberment.dm
+++ b/code/modules/surgery/bodyparts/bodypart_dismemberment.dm
@@ -287,12 +287,6 @@
name = "[owner.real_name]'s head"
. = ..()
- if(brainmob)
- QDEL_NULL(brainmob)
- var/obj/item/organ/brain/BR = locate(/obj/item/organ/brain) in contents
- if(BR)
- if(BR.brainmob)
- QDEL_NULL(BR.brainmob)
//Attach a limb to a human and drop any existing limb of that type.
/obj/item/bodypart/proc/replace_limb(mob/living/carbon/C, special)
diff --git a/icons/effects/debris.dmi b/icons/effects/debris.dmi
new file mode 100644
index 00000000000..9746e680240
Binary files /dev/null and b/icons/effects/debris.dmi differ
diff --git a/icons/mob/sprite_accessory/hair/human_hair.dmi b/icons/mob/sprite_accessory/hair/human_hair.dmi
index ee8a19ce83c..4fbb1367f36 100644
Binary files a/icons/mob/sprite_accessory/hair/human_hair.dmi and b/icons/mob/sprite_accessory/hair/human_hair.dmi differ
diff --git a/modular/Mapping/icons/Mapping_aides.dm b/modular/Mapping/icons/Mapping_aides.dm
index 8fdc0c86496..7dc88292ed6 100644
--- a/modular/Mapping/icons/Mapping_aides.dm
+++ b/modular/Mapping/icons/Mapping_aides.dm
@@ -6,6 +6,7 @@
icon_state = "stickyweb1"
resistance_flags = FLAMMABLE
alpha = 109
+ max_integrity = 30
opacity = TRUE
debris = list(/obj/item/natural/silk = 1)
diff --git a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/orc.dm b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/orc.dm
index 47c2498219c..262f90b04ce 100644
--- a/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/orc.dm
+++ b/modular_hearthstone/code/modules/mob/living/simple_animal/rogue/orc.dm
@@ -193,7 +193,7 @@
hitsound = 'sound/combat/hits/hi_arrow2.ogg'
embedchance = 100
woundclass = BCLASS_STAB
- flag = "bullet"
+ flag = "piercing"
speed = 2
/mob/living/simple_animal/hostile/retaliate/rogue/orc/ranged
diff --git a/modular_hearthstone/code/modules/spells/roguetown/wizard.dm b/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
index 7c5f2412dcf..1be2832350c 100644
--- a/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
+++ b/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
@@ -1153,7 +1153,7 @@
armor_penetration = 10
woundclass = BCLASS_SMASH
nodamage = FALSE
- flag = "bullet"
+ flag = "magic"
hitsound = 'sound/combat/hits/blunt/shovel_hit2.ogg'
speed = 1
diff --git a/roguetown.dme b/roguetown.dme
index c2cfb2bd4a4..aedc5d7227b 100644
--- a/roguetown.dme
+++ b/roguetown.dme
@@ -1748,6 +1748,7 @@
#include "code\modules\spells\roguetown\acolyte\dendor.dm"
#include "code\modules\spells\roguetown\acolyte\eora.dm"
#include "code\modules\spells\roguetown\acolyte\general.dm"
+#include "code\modules\spells\roguetown\acolyte\malum.dm"
#include "code\modules\spells\roguetown\acolyte\necra.dm"
#include "code\modules\spells\roguetown\acolyte\noc.dm"
#include "code\modules\spells\roguetown\acolyte\pestra.dm"