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"