diff --git a/_maps/map_files/dun_manor/dun_manor.dmm b/_maps/map_files/dun_manor/dun_manor.dmm index d0f4f66772c..2b9f7e7de77 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" = ( @@ -18403,7 +18403,9 @@ dir = 1; locked = 1; lockid = "manor"; - name = "keep entrance" + name = "keep entrance"; + ridethrough = 1; + desc = "a large door. It seems big enough to fit a mount." }, /turf/open/floor/rogue/cobblerock, /area/rogue/indoors/town/garrison) @@ -20576,7 +20578,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/_maps/templates/smalldungeons.dm b/_maps/templates/smalldungeons.dm index e07ab7c5a2f..11ef70b3ead 100644 --- a/_maps/templates/smalldungeons.dm +++ b/_maps/templates/smalldungeons.dm @@ -143,7 +143,7 @@ /obj/item/clothing/suit/roguetown/armor/plate/bikini = 1, /obj/item/clothing/suit/roguetown/armor/plate = 1, /obj/item/clothing/suit/roguetown/armor/longcoat = 2, - /obj/item/clothing/suit/roguetown/armor/blacksteel/cuirass = 1, + /obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate = 1, //food @@ -322,8 +322,7 @@ /obj/item/clothing/suit/roguetown/armor/plate/bikini = 1, /obj/item/clothing/suit/roguetown/armor/plate = 1, /obj/item/clothing/suit/roguetown/armor/longcoat = 2, - /obj/item/clothing/suit/roguetown/armor/blacksteel/cuirass = 1, - + /obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate = 1, ) lootcount = 1 diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 4d2bd566d83..b70509d873b 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -135,8 +135,10 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define MOBILITY_STORAGE (1<<5) /// can pull things #define MOBILITY_PULL (1<<6) +/// can stand, can be on floor or not. Mostly used for AI. Revisit this bitflag +#define MOBILITY_CANSTAND (1<<7) -#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL) +#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL | MOBILITY_CANSTAND) #define MOBILITY_FLAGS_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE) // radiation diff --git a/code/__DEFINES/roguetown.dm b/code/__DEFINES/roguetown.dm index c1179e73d0a..3e85e8d80a5 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/sound.dm b/code/__DEFINES/sound.dm index 490d03f663a..f7867fe1236 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -182,6 +182,10 @@ 'sound/ambience/noises/birds (6).ogg',\ 'sound/ambience/noises/birds (7).ogg') +#define SFX_CHAIN_STEP "chain_step" +#define SFX_PLATE_STEP "plate_step" +#define SFX_PLATE_COAT_STEP "plate_coat_step" +#define SFX_JINGLE_BELLS "jingle_bells" #define INTERACTION_SOUND_RANGE_MODIFIER 0 #define EQUIP_SOUND_VOLUME 100 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ce1804ebe3e..025070bdd05 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -70,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 @@ -169,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."), diff --git a/code/datums/gods/patrons/divine_pantheon.dm b/code/datums/gods/patrons/divine_pantheon.dm index 75acb1a6315..e416838c4c9 100644 --- a/code/datums/gods/patrons/divine_pantheon.dm +++ b/code/datums/gods/patrons/divine_pantheon.dm @@ -131,7 +131,11 @@ 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) + 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/objects/items/rogueitems/bells.dm b/code/game/objects/items/rogueitems/bells.dm index af9cb520783..32800fbe5dc 100644 --- a/code/game/objects/items/rogueitems/bells.dm +++ b/code/game/objects/items/rogueitems/bells.dm @@ -93,3 +93,16 @@ else return ..() + +/obj/item/jingle_bells + name = "jingling bells" + desc = "A set of little bells that make a satifying ring when jostled." + icon = 'icons/roguetown/items/misc.dmi' + icon_state = "bells" + throwforce = 5 + dropshrink = 0.5 + drop_sound = SFX_JINGLE_BELLS + +/obj/item/jingle_bells/Initialize() + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_JINGLE_BELLS) 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/lighting/rogue_fires.dm b/code/game/objects/lighting/rogue_fires.dm index 50001466a39..7deb6b5a7ae 100644 --- a/code/game/objects/lighting/rogue_fires.dm +++ b/code/game/objects/lighting/rogue_fires.dm @@ -2,6 +2,8 @@ name = "brazier" icon = 'icons/roguetown/misc/lighting.dmi' icon_state = "stonefire1" + bulb_colour = "#ffa35c" + brightness = 12 density = TRUE // pixel_y = 10 base_state = "stonefire" @@ -100,7 +102,8 @@ name = "fireplace" icon_state = "wallfire1" base_state = "wallfire" - bulb_colour = "#ff9648" + brightness = 10 + bulb_colour = "#ffa35c" density = FALSE fueluse = 0 crossfire = FALSE @@ -169,7 +172,6 @@ name = "sconce" icon_state = "torchwall1" base_state = "torchwall" - brightness = 5 density = FALSE var/obj/item/flashlight/flare/torch/torchy fueluse = FALSE //we use the torch's fuel diff --git a/code/game/sound.dm b/code/game/sound.dm index 7d905bd5978..97d7dc2974a 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -380,9 +380,29 @@ soundin = pick('sound/combat/wooshes/blunt/wooshlarge (1).ogg','sound/combat/wooshes/blunt/wooshlarge (2).ogg','sound/combat/wooshes/blunt/wooshlarge (3).ogg') if("punchwoosh") soundin = pick('sound/combat/wooshes/punch/punchwoosh (1).ogg','sound/combat/wooshes/punch/punchwoosh (2).ogg','sound/combat/wooshes/punch/punchwoosh (3).ogg') - - - - - + if(SFX_CHAIN_STEP) + soundin = pick( + 'sound/foley/footsteps/armor/chain (1).ogg', + 'sound/foley/footsteps/armor/chain (2).ogg', + 'sound/foley/footsteps/armor/chain (3).ogg', + ) + if(SFX_PLATE_STEP) + soundin = pick( + 'sound/foley/footsteps/armor/plate (1).ogg', + 'sound/foley/footsteps/armor/plate (2).ogg', + 'sound/foley/footsteps/armor/plate (3).ogg', + ) + if(SFX_PLATE_COAT_STEP) + soundin = pick( + 'sound/foley/footsteps/armor/coatplates (1).ogg', + 'sound/foley/footsteps/armor/coatplates (2).ogg', + 'sound/foley/footsteps/armor/coatplates (3).ogg', + ) + if(SFX_JINGLE_BELLS) + soundin = pick( + 'sound/items/jinglebell1.ogg', + 'sound/items/jinglebell2.ogg', + 'sound/items/jinglebell3.ogg', + 'sound/items/jinglebell4.ogg', + ) return soundin diff --git a/code/modules/antagonists/roguetown/villain/lich.dm b/code/modules/antagonists/roguetown/villain/lich.dm index 492d32bbd01..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/blacksteel/cuirass - 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/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm index f5c9ce14e74..57222d8d5e2 100644 --- a/code/modules/antagonists/roguetown/villain/vampirelord.dm +++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm @@ -186,7 +186,6 @@ GLOBAL_LIST_EMPTY(vampire_objects) armor = list("blunt" = 100, "slash" = 100, "stab" = 90, "piercing" = 0, "fire" = 0, "acid" = 0) prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) blocksound = PLATEHIT - do_sound = FALSE drop_sound = 'sound/foley/dropsound/armor_drop.ogg' anvilrepair = /datum/skill/craft/armorsmithing resistance_flags = FIRE_PROOF | ACID_PROOF @@ -231,7 +230,6 @@ GLOBAL_LIST_EMPTY(vampire_objects) nodismemsleeves = TRUE max_integrity = 500 allowed_sex = list(MALE, FEMALE) - do_sound_plate = TRUE anvilrepair = /datum/skill/craft/armorsmithing smeltresult = /obj/item/ingot/steel equip_delay_self = 40 diff --git a/code/modules/cargo/packsrogue/Brigand.dm b/code/modules/cargo/packsrogue/Brigand.dm index c598f13c1a6..d5dabc3a543 100644 --- a/code/modules/cargo/packsrogue/Brigand.dm +++ b/code/modules/cargo/packsrogue/Brigand.dm @@ -62,7 +62,7 @@ /datum/supply_pack/rogue/Brigand/blksteelcuirass name = "Blacksteel Cuirass" cost = 50 - contains = list(/obj/item/clothing/suit/roguetown/armor/blacksteel/cuirass) + contains = list(/obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate) /datum/supply_pack/rogue/Brigand/Bevor diff --git a/code/modules/cargo/packsrogue/Knight.dm b/code/modules/cargo/packsrogue/Knight.dm index 5b6d7090356..092d9c075aa 100644 --- a/code/modules/cargo/packsrogue/Knight.dm +++ b/code/modules/cargo/packsrogue/Knight.dm @@ -44,7 +44,7 @@ /datum/supply_pack/rogue/Knight/blacksteelfullplate name = "Blacksteel Full plate" cost = 150 - contains = list(/obj/item/clothing/suit/roguetown/armor/blacksteel/platechest) + contains = list(/obj/item/clothing/suit/roguetown/armor/plate/blacksteel_full_plate) /datum/supply_pack/rogue/Knight/hauberk name = "Hauberk" @@ -95,7 +95,7 @@ /datum/supply_pack/rogue/Knight/blkplatechausses name = "Blacksteel Plate Chausses" cost = 100 - contains = list(/obj/item/clothing/under/roguetown/blacksteel/platelegs) + contains = list(/obj/item/clothing/under/roguetown/platelegs/blacksteel) /datum/supply_pack/rogue/Knight/plateboots name = "Plated boots" diff --git a/code/modules/cargo/packsrogue/Sellsword.dm b/code/modules/cargo/packsrogue/Sellsword.dm index 845b485ee63..9a53ad1089b 100644 --- a/code/modules/cargo/packsrogue/Sellsword.dm +++ b/code/modules/cargo/packsrogue/Sellsword.dm @@ -88,7 +88,7 @@ /datum/supply_pack/rogue/Sellsword/steelcuirass name = "Blacksteel Cuirass" cost = 50 - contains = list(/obj/item/clothing/suit/roguetown/armor/blacksteel/cuirass) + contains = list(/obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate) /datum/supply_pack/rogue/Sellsword/Bevor diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index cb39b281f01..e8f15f152da 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -537,3 +537,6 @@ BLIND // can't see anything else return FALSE return TRUE + +/obj/item/clothing/proc/step_action() //this was made to rewrite clown shoes squeaking + SEND_SIGNAL(src, COMSIG_CLOTHING_STEP_ACTION) diff --git a/code/modules/clothing/rogueclothes/armor.dm b/code/modules/clothing/rogueclothes/armor.dm index 793a4ab8d39..e4e0f852eae 100644 --- a/code/modules/clothing/rogueclothes/armor.dm +++ b/code/modules/clothing/rogueclothes/armor.dm @@ -1,22 +1,5 @@ -/obj/item/clothing/proc/step_action() //this was made to rewrite clown shoes squeaking - SEND_SIGNAL(src, COMSIG_CLOTHING_STEP_ACTION) - -/obj/item/clothing/suit - var/do_sound_chain = FALSE - var/do_sound_plate = FALSE - -/obj/item/clothing/suit/Initialize() - . = ..() - if(do_sound_chain) - AddComponent(/datum/component/squeak, list('sound/foley/footsteps/armor/chain (1).ogg',\ - 'sound/foley/footsteps/armor/chain (2).ogg',\ - 'sound/foley/footsteps/armor/chain (3).ogg'), 100) - else if(do_sound_plate) - AddComponent(/datum/component/squeak, list('sound/foley/footsteps/armor/plate (1).ogg',\ - 'sound/foley/footsteps/armor/plate (2).ogg',\ - 'sound/foley/footsteps/armor/plate (3).ogg'), 100) - +//armor parent obj /obj/item/clothing/suit/roguetown/armor slot_flags = ITEM_SLOT_ARMOR body_parts_covered = CHEST @@ -42,320 +25,7 @@ nodismemsleeves = TRUE flags_inv = HIDEBOOB|HIDECROTCH -/obj/item/clothing/suit/roguetown/armor/chainmail - slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_SHIRT - name = "haubergeon" - desc = "A steel maille shirt." - body_parts_covered = CHEST|GROIN|ARMS|VITALS - icon_state = "haubergeon" - armor = list("blunt" = 60, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) - prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT) - blocksound = CHAINHIT - do_sound_chain = TRUE - drop_sound = 'sound/foley/dropsound/chain_drop.ogg' - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - armor_class = ARMOR_CLASS_MEDIUM - -/obj/item/clothing/suit/roguetown/armor/chainmail/iron - icon_state = "ichainmail" - name = "chainmaille" - desc = "A chain vest made of heavy iron rings. Better than nothing." - body_parts_covered = CHEST|GROIN|VITALS - smeltresult = /obj/item/ingot/iron - -/obj/item/clothing/suit/roguetown/armor/chainmail/hauberk - slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_SHIRT - name = "hauberk" - desc = "A longer steel maille that protects the legs." - body_parts_covered = CHEST|GROIN|ARMS|LEGS|VITALS - icon_state = "hauberk" - item_state = "hauberk" - armor = list("blunt" = 60, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) - smeltresult = /obj/item/ingot/steel - do_sound_chain = TRUE - armor_class = ARMOR_CLASS_MEDIUM - smelt_bar_num = 2 - -/obj/item/clothing/suit/roguetown/armor/chainmail/hauberk/fluted - name = "fluted hauberk" - desc = "A steel maille, of a pattern popularized by Otavan templars." - icon_state = "flutedhauberk" - item_state = "flutedhauberk" - - -/obj/item/clothing/suit/roguetown/armor/chainmail/bikini - name = "chainmail bikini" - desc = "Not very comfortable against the skin." - icon_state = "chainkini" - item_state = "chainkini" - allowed_sex = list(FEMALE) - allowed_race = CLOTHED_RACES_TYPES - body_parts_covered = CHEST|GROIN - armor_class = ARMOR_CLASS_LIGHT - -/obj/item/clothing/suit/roguetown/armor/plate - slot_flags = ITEM_SLOT_ARMOR - name = "steel half-plate" - desc = "\'Adventurer-fit\' plate armor with pauldrons." - body_parts_covered = CHEST|GROIN|VITALS - icon_state = "halfplate" - item_state = "halfplate" - armor = list("blunt" = 80, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) - prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) - nodismemsleeves = TRUE - max_integrity = 500 - allowed_sex = list(MALE, FEMALE) - do_sound_plate = TRUE - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - equip_delay_self = 4 SECONDS - unequip_delay_self = 4 SECONDS - armor_class = ARMOR_CLASS_HEAVY - smelt_bar_num = 3 - -/obj/item/clothing/suit/roguetown/armor/otavan - slot_flags = ITEM_SLOT_ARMOR - name = "otavan half-plate" - desc = "half-plate armor with pauldrons." - body_parts_covered = CHEST|GROIN|VITALS - icon_state = "corsethalfplate" - item_state = "corsethalfplate" - adjustable = CAN_CADJUST - armor = list("blunt" = 80, "slash" = 100, "stab" = 80, "piercing" = 100, "fire" = 0, "acid" = 0) - prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) - nodismemsleeves = TRUE - max_integrity = 500 - allowed_sex = list(MALE, FEMALE) - do_sound_plate = TRUE - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - equip_delay_self = 4 SECONDS - unequip_delay_self = 4 SECONDS - armor_class = ARMOR_CLASS_HEAVY - smelt_bar_num = 3 - allowed_race = NON_DWARVEN_RACE_TYPES - -/obj/item/clothing/suit/roguetown/armor/otavan/AdjustClothes(mob/user) - if(loc == user) - playsound(user, "sound/foley/dropsound/cloth_drop.ogg", 100, TRUE, -1) - if(adjustable == CAN_CADJUST) - adjustable = CADJUSTED - icon_state = "fancyhalfplate" - body_parts_covered = CHEST|GROIN|VITALS - flags_cover = null - emote_environment = 0 - update_icon() - if(ishuman(user)) - var/mob/living/carbon/H = user - H.update_inv_armor() - block2add = null - else if(adjustable == CADJUSTED) - ResetAdjust(user) - emote_environment = 3 - update_icon() - if(user) - if(ishuman(user)) - var/mob/living/carbon/H = user - H.update_inv_armor() - -/obj/item/clothing/suit/roguetown/armor/plate/bikini - name = "half-plate bikini" - desc = "Half plate in bikini form, still just as protective somehow. Save for the stomach." - body_parts_covered = CHEST|GROIN - icon_state = "halfplatekini" - item_state = "halfplatekini" - allowed_sex = list(FEMALE) - armor_class = ARMOR_CLASS_MEDIUM - smelt_bar_num = 2 - -/obj/item/clothing/suit/roguetown/armor/plate/half - slot_flags = ITEM_SLOT_ARMOR - name = "steel cuirass" - desc = "A basic cuirass of steel. Lightweight and durable." - body_parts_covered = CHEST|VITALS - icon_state = "cuirass" - item_state = "cuirass" - armor = list("blunt" = 80, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) - allowed_race = CLOTHED_RACES_TYPES - nodismemsleeves = TRUE - do_sound_plate = TRUE - blocking_behavior = null - max_integrity = 300 - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - armor_class = ARMOR_CLASS_MEDIUM - smelt_bar_num = 2 - -/obj/item/clothing/suit/roguetown/armor/plate/full - name = "plate armor" - desc = "Full plate. Leg protecting tassets, groin cup, armored vambraces." - icon_state = "plate" - body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS - equip_delay_self = 12 SECONDS - unequip_delay_self = 12 SECONDS - equip_delay_other = 3 SECONDS - strip_delay = 6 SECONDS - smelt_bar_num = 4 - -/obj/item/clothing/suit/roguetown/armor/plate/full/bikini - name = "fullplate bikini" - desc = "Full plate in bikini form, full package and full exposure." - icon_state = "platekini" - allowed_sex = list(FEMALE) - body_parts_covered = CHEST|GROIN|LEGS|ARMS - equip_delay_self = 8 SECONDS - unequip_delay_self = 8 SECONDS - equip_delay_other = 3 SECONDS - strip_delay = 6 SECONDS - smelt_bar_num = 3 - -/obj/item/clothing/suit/roguetown/armor/plate/half/iron - name = "iron breastplate" - desc = "A basic cuirass of iron, protective and moderately durable." - icon_state = "ibreastplate" - max_integrity = 200 - smeltresult = /obj/item/ingot/iron - armor_class = ARMOR_CLASS_MEDIUM - smelt_bar_num = 2 - -/obj/item/clothing/suit/roguetown/armor/plate/half/elven - name = "elven guardian cuirass" - desc = "A cuirass made of steel with a thin decorative gold plating. Lightweight and durable." - color = COLOR_ASSEMBLY_GOLD - -/obj/item/clothing/suit/roguetown/armor/plate/scale - slot_flags = ITEM_SLOT_ARMOR - name = "scalemail" - desc = "Metal scales interwoven intricately to form flexible protection!" - body_parts_covered = CHEST|VITALS|GROIN|LEGS - allowed_sex = list(MALE, FEMALE) - icon_state = "lamellar" - max_integrity = 200 - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - equip_delay_self = 4 SECONDS - armor_class = ARMOR_CLASS_MEDIUM - smelt_bar_num = 2 - -/obj/item/clothing/suit/roguetown/armor/heartfelt/lord - slot_flags = ITEM_SLOT_ARMOR - name = "coat of armor" - desc = "A lordly coat of armor." - body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS - icon_state = "heartfelt" - item_state = "heartfelt" - armor = list("blunt" = 90, "slash" = 90, "stab" = 80, "fire" = 0, "acid" = 0) - prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) - allowed_sex = list(MALE, FEMALE) - nodismemsleeves = TRUE - blocking_behavior = null - max_integrity = 400 - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - armor_class = ARMOR_CLASS_HEAVY - smelt_bar_num = 4 - -/obj/item/clothing/suit/roguetown/armor/heartfelt/hand - slot_flags = ITEM_SLOT_ARMOR - name = "coat of armor" - desc = "A lordly coat of armor." - body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS - icon_state = "heartfelt_hand" - item_state = "heartfelt_hand" - armor = list("blunt" = 90, "slash" = 90, "stab" = 80, "fire" = 0, "acid" = 0) - prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) - allowed_sex = list(MALE, FEMALE) - nodismemsleeves = TRUE - blocking_behavior = null - max_integrity = 400 - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - armor_class = ARMOR_CLASS_HEAVY - smelt_bar_num = 4 - -/obj/item/clothing/suit/roguetown/armor/brigandine - slot_flags = ITEM_SLOT_ARMOR - name = "brigandine" - desc = "A coat with plates concealed inside an exterior fabric." - icon_state = "brigandine" - blocksound = SOFTHIT - body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS - armor = list("blunt" = 90, "slash" = 60, "stab" = 70, "fire" = 0, "acid" = 0) - prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) - allowed_sex = list(MALE, FEMALE) - nodismemsleeves = TRUE - max_integrity = 350 - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - equip_delay_self = 4 SECONDS - armor_class = ARMOR_CLASS_HEAVY - sleeved_detail = FALSE - boobed_detail = FALSE - -/obj/item/clothing/suit/roguetown/armor/brigandine/Initialize() - . = ..() - AddComponent(/datum/component/squeak, list('sound/foley/footsteps/armor/coatplates (1).ogg',\ - 'sound/foley/footsteps/armor/coatplates (2).ogg',\ - 'sound/foley/footsteps/armor/coatplates (3).ogg'), 100) - -/obj/item/clothing/suit/roguetown/armor/brigandine/attack_right(mob/user) - if(detail_tag) - return - var/the_time = world.time - var/pickedcolor = input(user, "Select a color.","Brigandine Color") as null|anything in CLOTHING_COLOR_NAMES - if(!pickedcolor) - return - if(world.time > (the_time + 30 SECONDS)) - return - detail_tag = "_det" - detail_color = clothing_color2hex(pickedcolor) - update_icon() - if(ismob(loc)) - var/mob/L = loc - L.update_inv_armor() - -/obj/item/clothing/suit/roguetown/armor/brigandine/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/suit/roguetown/armor/brigandine/sheriff/Initialize() - . = ..() - if(GLOB.lordprimary) - lordcolor(GLOB.lordprimary,GLOB.lordsecondary) - GLOB.lordcolor += src - -/obj/item/clothing/suit/roguetown/armor/brigandine/sheriff/lordcolor(primary,secondary) - detail_tag = "_det" - detail_color = primary - update_icon() - if(ismob(loc)) - var/mob/L = loc - L.update_inv_armor() - -/obj/item/clothing/suit/roguetown/armor/brigandine/sheriff/Destroy() - GLOB.lordcolor -= src - return ..() - -/obj/item/clothing/suit/roguetown/armor/brigandine/coatplates - slot_flags = ITEM_SLOT_ARMOR - name = "coat of plates" - desc = "A leather coat with plates attached to it to increase protection while retaining mobility" - icon_state = "coat_of_plates" - blocksound = PLATEHIT - body_parts_covered = CHEST|GROIN|VITALS|ARMS - armor = list("blunt" = 90, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) - prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) - max_integrity = 250 - anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/steel - armor_class = ARMOR_CLASS_HEAVY - smelt_bar_num = 2 +//LIGHT ARMOR// /obj/item/clothing/suit/roguetown/armor/armordress slot_flags = ITEM_SLOT_ARMOR @@ -379,6 +49,8 @@ /obj/item/clothing/suit/roguetown/armor/armordress/alt icon_state = "armordressalt" +//gambeson family + /obj/item/clothing/suit/roguetown/armor/gambeson slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_SHIRT name = "gambeson" @@ -443,6 +115,21 @@ allowed_race = NON_DWARVEN_RACE_TYPES icon_state = "shadowrobe" +/obj/item/clothing/suit/roguetown/armor/gambeson/hierophant + name = "hierophant's shawl" + icon_state = "desertrobe" + item_state = "desertrobe" + desc = "A thick robe intervowen with spell-laced fabrics. Thick and protective while remaining light and breezy; the perfect gear for protecting one from the threats of the sun, the desert and the daemons, yet still allowing one to cast spells aptly." + naledicolor = TRUE + +/obj/item/clothing/suit/roguetown/armor/gambeson/heavy/pontifex + name = "pontifex's kaftan" + icon_state = "monkleather" + item_state = "monkleather" + desc = "Tight boiled leathers that stretch and fit to one's frame perfectly." + +//leather family + /obj/item/clothing/suit/roguetown/armor/leather name = "leather armor" desc = "Flexible cowhide armor. Lightweight, better than nothing." @@ -671,66 +358,329 @@ allowed_sex = list(MALE, FEMALE) allowed_race = CLOTHED_RACES_TYPES -/obj/item/clothing/suit/roguetown/armor/silkcoat/Initialize() +/obj/item/clothing/suit/roguetown/armor/silkcoat/Initialize() + . = ..() + color = pick(CLOTHING_PURPLE, null,CLOTHING_GREEN, CLOTHING_RED) + +//MEDIUM ARMOR// + +/obj/item/clothing/suit/roguetown/armor/chainmail + slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_SHIRT + name = "haubergeon" + desc = "A steel maille shirt." + body_parts_covered = CHEST|GROIN|ARMS|VITALS + icon_state = "haubergeon" + armor = list("blunt" = 60, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT) + blocksound = CHAINHIT + drop_sound = 'sound/foley/dropsound/chain_drop.ogg' + anvilrepair = /datum/skill/craft/armorsmithing + smeltresult = /obj/item/ingot/steel + armor_class = ARMOR_CLASS_MEDIUM + +/obj/item/clothing/suit/roguetown/armor/chainmail/Initialize(mapload) + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle) + +/obj/item/clothing/suit/roguetown/armor/chainmail/iron + icon_state = "ichainmail" + name = "chainmaille" + desc = "A chain vest made of heavy iron rings. Better than nothing." + body_parts_covered = CHEST|GROIN|VITALS + smeltresult = /obj/item/ingot/iron + +/obj/item/clothing/suit/roguetown/armor/chainmail/hauberk + slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_SHIRT + name = "hauberk" + desc = "A longer steel maille that protects the legs." + body_parts_covered = CHEST|GROIN|ARMS|LEGS|VITALS + icon_state = "hauberk" + item_state = "hauberk" + armor = list("blunt" = 60, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) + smeltresult = /obj/item/ingot/steel + armor_class = ARMOR_CLASS_MEDIUM + smelt_bar_num = 2 + +/obj/item/clothing/suit/roguetown/armor/chainmail/hauberk/fluted + name = "fluted hauberk" + desc = "An ornate cuirass, flanked with sleeves of steel maille." + icon_state = "flutedhauberk" + item_state = "flutedhauberk" + + +/obj/item/clothing/suit/roguetown/armor/chainmail/bikini + name = "chainmail bikini" + desc = "Not very comfortable against the skin." + icon_state = "chainkini" + item_state = "chainkini" + allowed_sex = list(FEMALE) + allowed_race = CLOTHED_RACES_TYPES + body_parts_covered = CHEST|GROIN + armor_class = ARMOR_CLASS_LIGHT //placed in the medium category to keep it with its parent obj + +/obj/item/clothing/suit/roguetown/armor/plate/bikini + name = "half-plate bikini" + desc = "Half plate in bikini form, still just as protective somehow. Save for the stomach." + body_parts_covered = CHEST|GROIN + icon_state = "halfplatekini" + item_state = "halfplatekini" + allowed_sex = list(FEMALE) + armor_class = ARMOR_CLASS_MEDIUM + smelt_bar_num = 2 + +/obj/item/clothing/suit/roguetown/armor/plate/half + slot_flags = ITEM_SLOT_ARMOR + name = "steel cuirass" + desc = "A basic cuirass of steel. Lightweight and durable." + body_parts_covered = CHEST|VITALS + icon_state = "cuirass" + item_state = "cuirass" + armor = list("blunt" = 80, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) + allowed_race = CLOTHED_RACES_TYPES + nodismemsleeves = TRUE + blocking_behavior = null + max_integrity = 300 + anvilrepair = /datum/skill/craft/armorsmithing + smeltresult = /obj/item/ingot/steel + armor_class = ARMOR_CLASS_MEDIUM + smelt_bar_num = 2 + +/obj/item/clothing/suit/roguetown/armor/plate/half/iron + name = "iron breastplate" + desc = "A basic cuirass of iron, protective and moderately durable." + icon_state = "ibreastplate" + max_integrity = 200 + smeltresult = /obj/item/ingot/iron + armor_class = ARMOR_CLASS_MEDIUM + smelt_bar_num = 2 + +/obj/item/clothing/suit/roguetown/armor/plate/half/elven + name = "elven guardian cuirass" + desc = "A cuirass made of steel with a thin decorative gold plating. Lightweight and durable." + color = COLOR_ASSEMBLY_GOLD + +/obj/item/clothing/suit/roguetown/armor/plate/scale + slot_flags = ITEM_SLOT_ARMOR + name = "scalemail" + desc = "Metal scales interwoven intricately to form flexible protection!" + body_parts_covered = CHEST|VITALS|GROIN|LEGS + allowed_sex = list(MALE, FEMALE) + icon_state = "lamellar" + max_integrity = 200 + anvilrepair = /datum/skill/craft/armorsmithing + smeltresult = /obj/item/ingot/steel + equip_delay_self = 4 SECONDS + armor_class = ARMOR_CLASS_MEDIUM + smelt_bar_num = 2 + +//HEAVY ARMOR// + +/obj/item/clothing/suit/roguetown/armor/plate + slot_flags = ITEM_SLOT_ARMOR + name = "steel half-plate" + desc = "\'Adventurer-fit\' plate armor with pauldrons." + body_parts_covered = CHEST|GROIN|VITALS + icon_state = "halfplate" + item_state = "halfplate" + armor = list("blunt" = 80, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) + nodismemsleeves = TRUE + max_integrity = 500 + allowed_sex = list(MALE, FEMALE) + anvilrepair = /datum/skill/craft/armorsmithing + smeltresult = /obj/item/ingot/steel + equip_delay_self = 4 SECONDS + unequip_delay_self = 4 SECONDS + armor_class = ARMOR_CLASS_HEAVY + smelt_bar_num = 3 + +/obj/item/clothing/suit/roguetown/armor/plate/Initialize(mapload) . = ..() - color = pick(CLOTHING_PURPLE, null,CLOTHING_GREEN, CLOTHING_RED) + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_STEP) - //--------------- BLACKSTEEL --------------------- +/obj/item/clothing/suit/roguetown/armor/plate/full + name = "plate armor" + desc = "Full plate. Leg protecting tassets, groin cup, armored vambraces." + icon_state = "plate" + body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS + equip_delay_self = 12 SECONDS + unequip_delay_self = 12 SECONDS + equip_delay_other = 3 SECONDS + strip_delay = 6 SECONDS + smelt_bar_num = 4 -/obj/item/clothing/suit/roguetown/armor/blacksteel/platechest +/obj/item/clothing/suit/roguetown/armor/plate/full/bikini + name = "fullplate bikini" + desc = "Full plate in bikini form, full package and full exposure." + icon_state = "platekini" + allowed_sex = list(FEMALE) + body_parts_covered = CHEST|GROIN|LEGS|ARMS + equip_delay_self = 8 SECONDS + unequip_delay_self = 8 SECONDS + equip_delay_other = 3 SECONDS + strip_delay = 6 SECONDS + smelt_bar_num = 3 + +/obj/item/clothing/suit/roguetown/armor/heartfelt/lord slot_flags = ITEM_SLOT_ARMOR - name = "Blacksteel Plate Armor" - desc = "A suit of Full Plate smithed of durable blacksteel." + name = "coat of armor" + desc = "A lordly coat of armor." body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS - icon = 'icons/roguetown/clothing/special/blkknight.dmi' - mob_overlay_icon = 'icons/roguetown/clothing/special/onmob/blkknight.dmi' - icon_state = "bkarmor" - item_state = "bkarmor" - armor = list("blunt" = 90, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) - allowed_race = CLOTHED_RACES_TYPES + icon_state = "heartfelt" + item_state = "heartfelt" + armor = list("blunt" = 90, "slash" = 90, "stab" = 80, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) + allowed_sex = list(MALE, FEMALE) nodismemsleeves = TRUE - do_sound_plate = TRUE blocking_behavior = null - max_integrity = 600 + max_integrity = 400 anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/blacksteel + smeltresult = /obj/item/ingot/steel armor_class = ARMOR_CLASS_HEAVY - equip_delay_self = 12 SECONDS - unequip_delay_self = 12 SECONDS - equip_delay_other = 3 SECONDS - strip_delay = 6 SECONDS smelt_bar_num = 4 -/obj/item/clothing/suit/roguetown/armor/blacksteel/cuirass +/obj/item/clothing/suit/roguetown/armor/heartfelt/hand slot_flags = ITEM_SLOT_ARMOR - name = "Blacksteel Cuirass" - desc = "A basic cuirass forged from blacksteel. It's somewhat more durable than regular steel." - body_parts_covered = CHEST|VITALS - icon_state = "grenzelcuirass" - item_state = "grenzelcuirass" - sleeved = 'icons/roguetown/clothing/onmob/helpers/stonekeep_merc.dmi' - armor = list("blunt" = 80, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) - allowed_race = CLOTHED_RACES_TYPES + name = "coat of armor" + desc = "A lordly coat of armor." + body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS + icon_state = "heartfelt_hand" + item_state = "heartfelt_hand" + armor = list("blunt" = 90, "slash" = 90, "stab" = 80, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) + allowed_sex = list(MALE, FEMALE) nodismemsleeves = TRUE blocking_behavior = null max_integrity = 400 anvilrepair = /datum/skill/craft/armorsmithing - smeltresult = /obj/item/ingot/blacksteel - armor_class = ARMOR_CLASS_MEDIUM - smelt_bar_num = 2 + smeltresult = /obj/item/ingot/steel + armor_class = ARMOR_CLASS_HEAVY + smelt_bar_num = 4 -/obj/item/clothing/suit/roguetown/armor/gambeson/hierophant - name = "hierophant's shawl" - icon_state = "desertrobe" - item_state = "desertrobe" - desc = "A thick robe intervowen with spell-laced fabrics. Thick and protective while remaining light and breezy; the perfect gear for protecting one from the threats of the sun, the desert and the daemons, yet still allowing one to cast spells aptly." - naledicolor = TRUE +/obj/item/clothing/suit/roguetown/armor/otavan + slot_flags = ITEM_SLOT_ARMOR + name = "otavan half-plate" + desc = "half-plate armor with pauldrons." + body_parts_covered = CHEST|GROIN|VITALS + icon_state = "corsethalfplate" + item_state = "corsethalfplate" + adjustable = CAN_CADJUST + armor = list("blunt" = 80, "slash" = 100, "stab" = 80, "piercing" = 100, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) + nodismemsleeves = TRUE + max_integrity = 500 + allowed_sex = list(MALE, FEMALE) + anvilrepair = /datum/skill/craft/armorsmithing + smeltresult = /obj/item/ingot/steel + equip_delay_self = 4 SECONDS + unequip_delay_self = 4 SECONDS + armor_class = ARMOR_CLASS_HEAVY + smelt_bar_num = 3 + allowed_race = NON_DWARVEN_RACE_TYPES -/obj/item/clothing/suit/roguetown/armor/gambeson/heavy/pontifex - name = "pontifex's kaftan" - icon_state = "monkleather" - item_state = "monkleather" - desc = "Tight boiled leathers that stretch and fit to one's frame perfectly." +/obj/item/clothing/suit/roguetown/armor/otavan/AdjustClothes(mob/user) + if(loc == user) + playsound(user, "sound/foley/dropsound/cloth_drop.ogg", 100, TRUE, -1) + if(adjustable == CAN_CADJUST) + adjustable = CADJUSTED + icon_state = "fancyhalfplate" + body_parts_covered = CHEST|GROIN|VITALS + flags_cover = null + emote_environment = 0 + update_icon() + if(ishuman(user)) + var/mob/living/carbon/H = user + H.update_inv_armor() + block2add = null + else if(adjustable == CADJUSTED) + ResetAdjust(user) + emote_environment = 3 + update_icon() + if(user) + if(ishuman(user)) + var/mob/living/carbon/H = user + H.update_inv_armor() + +/obj/item/clothing/suit/roguetown/armor/brigandine + slot_flags = ITEM_SLOT_ARMOR + name = "brigandine" + desc = "A coat with plates concealed inside an exterior fabric." + icon_state = "brigandine" + blocksound = SOFTHIT + body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS + armor = list("blunt" = 90, "slash" = 60, "stab" = 70, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) + allowed_sex = list(MALE, FEMALE) + nodismemsleeves = TRUE + max_integrity = 350 + anvilrepair = /datum/skill/craft/armorsmithing + smeltresult = /obj/item/ingot/steel + equip_delay_self = 4 SECONDS + armor_class = ARMOR_CLASS_HEAVY + sleeved_detail = FALSE + boobed_detail = FALSE + +/obj/item/clothing/suit/roguetown/armor/brigandine/Initialize() + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_COAT_STEP) + +/obj/item/clothing/suit/roguetown/armor/brigandine/attack_right(mob/user) + if(detail_tag) + return + var/the_time = world.time + var/pickedcolor = input(user, "Select a color.","Brigandine Color") as null|anything in CLOTHING_COLOR_NAMES + if(!pickedcolor) + return + if(world.time > (the_time + 30 SECONDS)) + return + detail_tag = "_det" + detail_color = clothing_color2hex(pickedcolor) + update_icon() + if(ismob(loc)) + var/mob/L = loc + L.update_inv_armor() + +/obj/item/clothing/suit/roguetown/armor/brigandine/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/suit/roguetown/armor/brigandine/sheriff/Initialize() + . = ..() + if(GLOB.lordprimary) + lordcolor(GLOB.lordprimary,GLOB.lordsecondary) + GLOB.lordcolor += src + +/obj/item/clothing/suit/roguetown/armor/brigandine/sheriff/lordcolor(primary,secondary) + detail_tag = "_det" + detail_color = primary + update_icon() + if(ismob(loc)) + var/mob/L = loc + L.update_inv_armor() + +/obj/item/clothing/suit/roguetown/armor/brigandine/sheriff/Destroy() + GLOB.lordcolor -= src + return ..() + +/obj/item/clothing/suit/roguetown/armor/brigandine/coatplates + slot_flags = ITEM_SLOT_ARMOR + name = "coat of plates" + desc = "A leather coat with plates attached to it to increase protection while retaining mobility" + icon_state = "coat_of_plates" + blocksound = PLATEHIT + body_parts_covered = CHEST|GROIN|VITALS|ARMS + armor = list("blunt" = 90, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) + max_integrity = 250 + anvilrepair = /datum/skill/craft/armorsmithing + smeltresult = /obj/item/ingot/steel + armor_class = ARMOR_CLASS_HEAVY + smelt_bar_num = 2 /obj/item/clothing/suit/roguetown/armor/brigandine/sheriff/coat name = "coat of the commander" @@ -741,6 +691,8 @@ sleeved_detail = TRUE boobed_detail = TRUE + + /obj/item/clothing/suit/roguetown/armor/brigandine/sheriff/coat/attack_right(mob/user) if(picked) return @@ -775,3 +727,58 @@ equip_delay_self = 40 armor_class = ARMOR_CLASS_MEDIUM w_class = WEIGHT_CLASS_BULKY + +/obj/item/clothing/suit/roguetown/armor/plate/scale/inqcoat + slot_flags = ITEM_SLOT_ARMOR + name = "inquisitorial duster" + desc = "Metal plates reinforce this heavy coat, only the finest for the inquisition." + body_parts_covered = CHEST|VITALS|GROIN|LEGS|ARMS + allowed_sex = list(MALE, FEMALE) + icon_state = "inqcoat" + item_state = "inqcoat" + sleevetype = "shirt" + max_integrity = 200 + anvilrepair = /datum/skill/craft/armorsmithing + smeltresult = /obj/item/ingot/steel + equip_delay_self = 4 SECONDS + armor_class = ARMOR_CLASS_MEDIUM + smelt_bar_num = 2 + blocksound = SOFTHIT + + //--------------- BLACKSTEEL --------------------- + +/obj/item/clothing/suit/roguetown/armor/plate/blacksteel_full_plate + name = "Blacksteel Plate Armor" + desc = "A suit of Full Plate smithed of durable blacksteel." + body_parts_covered = CHEST|GROIN|VITALS|LEGS|ARMS + icon = 'icons/roguetown/clothing/special/blkknight.dmi' + mob_overlay_icon = 'icons/roguetown/clothing/special/onmob/blkknight.dmi' + icon_state = "bkarmor" + item_state = "bkarmor" + armor = list("blunt" = 90, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) + allowed_race = CLOTHED_RACES_TYPES + blocking_behavior = null + max_integrity = 400 + smeltresult = /obj/item/ingot/blacksteel + equip_delay_self = 12 SECONDS + unequip_delay_self = 12 SECONDS + equip_delay_other = 3 SECONDS + strip_delay = 6 SECONDS + smelt_bar_num = 4 + +/obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate + name = "Blacksteel Cuirass" + desc = "A basic cuirass forged from blacksteel. It's somewhat more durable than regular steel." + body_parts_covered = CHEST|VITALS + icon_state = "grenzelcuirass" + item_state = "grenzelcuirass" + sleeved = 'icons/roguetown/clothing/onmob/helpers/stonekeep_merc.dmi' + allowed_race = CLOTHED_RACES_TYPES + blocking_behavior = null + max_integrity = 400 + smeltresult = /obj/item/ingot/blacksteel + armor_class = ARMOR_CLASS_MEDIUM + smelt_bar_num = 2 + + + 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 460b47f031e..861763d36c2 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" @@ -172,6 +173,10 @@ resistance_flags = null sewrepair = TRUE +/obj/item/clothing/shoes/roguetown/jester/Initialize(mapload) + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_JINGLE_BELLS) + /obj/item/clothing/shoes/roguetown/grenzelhoft name = "grenzelhoft boots" icon_state = "grenzelboots" @@ -208,6 +213,12 @@ sewrepair = TRUE armor = list("blunt" = 5, "slash" = 5, "stab" = 5, "fire" = 0, "acid" = 0) //Thinks its fair for a piece of cloth and fiber. +/obj/item/clothing/shoes/roguetown/otavan/inqboots + name = "inquisitorial boots" + desc = "Finely crafted boots, made to stomp out darkness." + icon_state = "inqboots" + item_state = "inqboots" + // ----------------- BLACKSTEEL ----------------------- diff --git a/code/modules/clothing/rogueclothes/gloves.dm b/code/modules/clothing/rogueclothes/gloves.dm index ad151ea35cd..3057cb88284 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" @@ -118,6 +119,12 @@ sewrepair = TRUE allowed_race = NON_DWARVEN_RACE_TYPES +/obj/item/clothing/gloves/roguetown/otavan/inqgloves + name = "inquisitorial leather gloves" + desc = "Masterfully crafted leather gloves, psycross included." + icon_state = "inqgloves" + item_state = "inqgloves" + //rogtodo sprites for this /obj/item/clothing/gloves/roguetown/plate name = "plate gauntlets" diff --git a/code/modules/clothing/rogueclothes/hats.dm b/code/modules/clothing/rogueclothes/hats.dm index bae6cca8205..1d52c24a4ab 100644 --- a/code/modules/clothing/rogueclothes/hats.dm +++ b/code/modules/clothing/rogueclothes/hats.dm @@ -248,6 +248,10 @@ sewrepair = TRUE flags_inv = HIDEEARS +/obj/item/clothing/head/roguetown/jester/Initialize() + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_JINGLE_BELLS, 2) + /obj/item/clothing/head/roguetown/strawhat name = "straw hat" desc = "Keeps the sun off your head while toiling the fields." @@ -397,6 +401,13 @@ //dropshrink = 0.75 dynamic_hair_suffix = null +/obj/item/clothing/head/roguetown/inqhat + name = "inquisitorial hat" + desc = "To keep ones vision away from the heavens, and focused on the sin beneath the soil." + icon_state = "inqhat" + item_state = "inqhat" + sewrepair = TRUE + /obj/item/clothing/head/roguetown/headband/red color = CLOTHING_RED @@ -552,16 +563,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) ..() @@ -940,9 +941,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 @@ -977,6 +985,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" @@ -1453,12 +1469,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 a3076f66fe3..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 @@ -366,3 +368,21 @@ desc = "A peculiar icon of worship from a foreign land. Forming the three-progned Psydonite cross in a circular ring, this bracelet embodies the Naledian belief of Psydon's eternity." icon_state = "psybracelet" item_state = null + +/obj/item/clothing/neck/roguetown/collar + name = "collar" + desc = "A band of leather which signifies bondage to another." + icon_state = "collar" + item_state = "collar" + resistance_flags = FIRE_PROOF + dropshrink = 0.5 + +/obj/item/clothing/neck/roguetown/collar/bell_collar + name = "bell collar" + desc = "A band of leather with a bell protects the local zads from the local catfolk." + icon_state = "bell_collar" + icon_state = "bell_collar" + +/obj/item/clothing/neck/roguetown/collar/bell_collar/Initialize(mapload) + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_JINGLE_BELLS) diff --git a/code/modules/clothing/rogueclothes/pants.dm b/code/modules/clothing/rogueclothes/pants.dm index d39b5831963..f232a2118e9 100644 --- a/code/modules/clothing/rogueclothes/pants.dm +++ b/code/modules/clothing/rogueclothes/pants.dm @@ -174,13 +174,11 @@ gender = PLURAL icon_state = "chain_legs" item_state = "chain_legs" -// adjustable = CAN_CADJUST sewrepair = FALSE armor = list("blunt" = 60, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT) blocksound = CHAINHIT max_integrity = 300 - var/do_sound = FALSE drop_sound = 'sound/foley/dropsound/chain_drop.ogg' anvilrepair = /datum/skill/craft/armorsmithing smeltresult = /obj/item/ingot/steel @@ -189,6 +187,9 @@ resistance_flags = FIRE_PROOF armor_class = ARMOR_CLASS_MEDIUM +/obj/item/clothing/under/roguetown/chainlegs/Initialize(mapload) + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle) /obj/item/clothing/under/roguetown/splintlegs name = "brigandine chausses" @@ -209,6 +210,10 @@ resistance_flags = FIRE_PROOF sewrepair = FALSE +/obj/item/clothing/under/roguetown/splintlegs/Initialize(mapload) + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_COAT_STEP) + /obj/item/clothing/under/roguetown/brayette name = "brayette" desc = "" @@ -248,7 +253,6 @@ prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT) blocksound = PLATEHIT max_integrity = 400 - var/do_sound = FALSE drop_sound = 'sound/foley/dropsound/armor_drop.ogg' anvilrepair = /datum/skill/craft/armorsmithing smeltresult = /obj/item/ingot/steel @@ -258,6 +262,9 @@ resistance_flags = FIRE_PROOF armor_class = ARMOR_CLASS_HEAVY +/obj/item/clothing/under/roguetown/platelegs/Initialize(mapload) + . = ..() + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_STEP) /obj/item/clothing/under/roguetown/chainlegs/skirt name = "steel chain skirt" @@ -343,7 +350,7 @@ //----------------- BLACKSTEEL--------------------- -/obj/item/clothing/under/roguetown/blacksteel/platelegs +/obj/item/clothing/under/roguetown/platelegs/blacksteel name = "Blacksteel Plate Chausses" desc = "Reinforced leg plates forged of durable blacksteel." gender = PLURAL @@ -351,21 +358,15 @@ mob_overlay_icon = 'icons/roguetown/clothing/special/onmob/blkknight.dmi' icon_state = "bklegs" item_state = "bklegs" -// adjustable = CAN_CADJUST sewrepair = FALSE armor = list("blunt" = 90, "slash" = 100, "stab" = 80, "fire" = 0, "acid" = 0) prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT) blocksound = PLATEHIT max_integrity = 500 - var/do_sound = FALSE drop_sound = 'sound/foley/dropsound/armor_drop.ogg' anvilrepair = /datum/skill/craft/armorsmithing smeltresult = /obj/item/ingot/blacksteel - r_sleeve_status = SLEEVE_NOMOD - l_sleeve_status = SLEEVE_NOMOD smelt_bar_num = 2 - resistance_flags = FIRE_PROOF - armor_class = ARMOR_CLASS_HEAVY /obj/item/clothing/under/roguetown/trou/leather/pontifex name = "pontifex's chaqchur" diff --git a/code/modules/jobs/job_types/roguetown/Inquisition/puritan.dm b/code/modules/jobs/job_types/roguetown/Inquisition/puritan.dm index d52c27622f9..2618d8f22ef 100644 --- a/code/modules/jobs/job_types/roguetown/Inquisition/puritan.dm +++ b/code/modules/jobs/job_types/roguetown/Inquisition/puritan.dm @@ -180,14 +180,14 @@ shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/puritan belt = /obj/item/storage/belt/rogue/leather/knifebelt/black/psydon neck = /obj/item/clothing/neck/roguetown/psicross/silver - shoes = /obj/item/clothing/shoes/roguetown/boots + shoes = /obj/item/clothing/shoes/roguetown/otavan/inqboots pants = /obj/item/clothing/under/roguetown/tights/black - cloak = /obj/item/clothing/cloak/cape/puritan - backr = /obj/item/storage/backpack/rogue/satchel/black + backr = /obj/item/storage/backpack/rogue/satchel beltr = /obj/item/storage/belt/rogue/pouch/coins/rich - head = /obj/item/clothing/head/roguetown/puritan - gloves = /obj/item/clothing/gloves/roguetown/leather + head = /obj/item/clothing/head/roguetown/inqhat + gloves = /obj/item/clothing/gloves/roguetown/otavan/inqgloves beltl = /obj/item/rogueweapon/sword/rapier + armor = /obj/item/clothing/suit/roguetown/armor/plate/scale/inqcoat backpack_contents = list(/obj/item/storage/keyring/puritan = 1, /obj/item/rogueweapon/huntingknife/idagger/silver) if(H.mind) H.mind.adjust_skillrank(/datum/skill/combat/swords, 4, TRUE) diff --git a/code/modules/jobs/job_types/roguetown/church/monk.dm b/code/modules/jobs/job_types/roguetown/church/monk.dm index f1f55c475ae..a5f4b0f83e3 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) @@ -75,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 @@ -88,6 +96,12 @@ 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.AddSpell(new /obj/effect/proc_holder/spell/invoked/malum_flame_rogue) 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) diff --git a/code/modules/jobs/job_types/roguetown/church/templar.dm b/code/modules/jobs/job_types/roguetown/church/templar.dm index 0fb4c73f13f..eba5c844109 100644 --- a/code/modules/jobs/job_types/roguetown/church/templar.dm +++ b/code/modules/jobs/job_types/roguetown/church/templar.dm @@ -75,9 +75,11 @@ if(/datum/patron/divine/malum) neck = /obj/item/clothing/neck/roguetown/psicross/malum cloak = /obj/item/clothing/cloak/tabard/crusader/malum + armor = /obj/item/clothing/suit/roguetown/armor/leather/heavy/coat pants = /obj/item/clothing/under/roguetown/tights/black - wrists = /obj/item/clothing/wrists/roguetown/wrappings + wrists = /obj/item/clothing/wrists/roguetown/bracers shoes = /obj/item/clothing/shoes/roguetown/sandals + r_hand = /obj/item/rogueweapon/katar if(H.mind) H.mind.adjust_skillrank(/datum/skill/misc/athletics, 4, TRUE) H.mind.adjust_skillrank(/datum/skill/combat/wrestling, 4, TRUE) @@ -149,6 +151,7 @@ wrists = /obj/item/clothing/neck/roguetown/psicross/malum cloak = /obj/item/clothing/cloak/templar/malumite head = /obj/item/clothing/head/roguetown/helmet/heavy/malum + H.AddSpell(new /obj/effect/proc_holder/spell/invoked/malum_flame_rogue) if(/datum/patron/old_god) wrists = /obj/item/clothing/neck/roguetown/psicross cloak = /obj/item/clothing/cloak/tabard/crusader/psydon @@ -156,9 +159,9 @@ gloves = /obj/item/clothing/gloves/roguetown/chain neck = /obj/item/clothing/neck/roguetown/chaincoif pants = /obj/item/clothing/under/roguetown/chainlegs - shirt = /obj/item/clothing/suit/roguetown/armor/gambeson - shoes = /obj/item/clothing/shoes/roguetown/boots - armor = /obj/item/clothing/suit/roguetown/armor/chainmail/hauberk + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail/hauberk + shoes = /obj/item/clothing/shoes/roguetown/boots/armor + armor = /obj/item/clothing/suit/roguetown/armor/plate ///Half-Plate not fullplate if(H.mind) H.mind.adjust_skillrank(/datum/skill/combat/swords, 3, TRUE) H.mind.adjust_skillrank(/datum/skill/combat/maces, 3, TRUE) diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/grenzelhoft.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/grenzelhoft.dm index 698c77a44a6..c52ce87408f 100644 --- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/grenzelhoft.dm +++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/grenzelhoft.dm @@ -70,7 +70,7 @@ neck = /obj/item/clothing/neck/roguetown/gorget shirt = /obj/item/clothing/suit/roguetown/shirt/grenzelhoft head = /obj/item/clothing/head/roguetown/grenzelhofthat - armor = /obj/item/clothing/suit/roguetown/armor/blacksteel/cuirass + armor = /obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate pants = /obj/item/clothing/under/roguetown/grenzelpants shoes = /obj/item/clothing/shoes/roguetown/grenzelhoft gloves = /obj/item/clothing/gloves/roguetown/grenzelgloves diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 91c96c061f2..311389fd3e9 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -631,6 +631,8 @@ if(!internal_organs.len) break //Guess we're out of organs! var/obj/item/organ/guts = pick(internal_organs) + if(istype(guts, /obj/item/organ/brain)) //Don't hurl brains for mind sanity reasons + continue var/turf/T = get_turf(src) guts.Remove(src) guts.forceMove(T) diff --git a/code/modules/mob/living/carbon/human/npc/_npc.dm b/code/modules/mob/living/carbon/human/npc/_npc.dm index 3f5d9b00359..81bfa238df8 100644 --- a/code/modules/mob/living/carbon/human/npc/_npc.dm +++ b/code/modules/mob/living/carbon/human/npc/_npc.dm @@ -23,6 +23,7 @@ var/next_passive_detect = 0 var/flee_in_pain = FALSE var/stand_attempts = 0 + var/resist_attempts = 0 var/attack_speed = 0 var/returning_home = FALSE @@ -50,16 +51,19 @@ update_cone_show() if(stat == CONSCIOUS) if(on_fire || buckled || restrained() || pulledby) - resisting = TRUE - walk_to(src,0) - resist() - resisting = FALSE - if(!(mobility_flags & MOBILITY_STAND) && (stand_attempts < 3)) + if(resist_attempts < 1) + resisting = TRUE + walk_to(src,0) + resist() + resist_attempts += 1 + resisting = FALSE + if((mobility_flags & MOBILITY_CANSTAND) && (stand_attempts < 3)) resisting = TRUE npc_stand() resisting = FALSE else stand_attempts = 0 + resist_attempts = 0 if(!handle_combat()) if(mode == AI_IDLE && !pickupTarget) npc_idle() @@ -328,10 +332,11 @@ swap_hand() Weapon = get_active_held_item() OffWeapon = get_inactive_held_item() - if(!(mobility_flags & MOBILITY_STAND)) - aimheight_change(rand(10,19)) + + if(!(mobility_flags & MOBILITY_STAND)) // If not standing stand, aim low + aimheight_change(rand(1, 10)) else - aimheight_change(rand(10,19)) + aimheight_change(rand(10, 19)) // attack with weapon if we have one if(Weapon) diff --git a/code/modules/mob/living/carbon/human/npc/goblin.dm b/code/modules/mob/living/carbon/human/npc/goblin.dm index 9e69cbc9443..cfcf81fbf3e 100644 --- a/code/modules/mob/living/carbon/human/npc/goblin.dm +++ b/code/modules/mob/living/carbon/human/npc/goblin.dm @@ -337,8 +337,8 @@ r_hand = /obj/item/rogueweapon/flail 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) + //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/human/species_types/furry/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm index df83cd54f41..25cd244313e 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm @@ -48,7 +48,7 @@ ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, ORGAN_SLOT_EYES = /obj/item/organ/eyes, ORGAN_SLOT_EARS = /obj/item/organ/ears, - ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm index dd418cf7574..e3d9253722c 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm @@ -46,7 +46,7 @@ ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, ORGAN_SLOT_EYES = /obj/item/organ/eyes, ORGAN_SLOT_EARS = /obj/item/organ/ears, - ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm index 67aa0808e9d..54169db7d4f 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm @@ -35,6 +35,17 @@ ) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ) bodypart_features = list( /datum/bodypart_feature/hair/head, /datum/bodypart_feature/hair/facial, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm index 3f28393004e..80182086373 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm @@ -51,7 +51,7 @@ ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, ORGAN_SLOT_EYES = /obj/item/organ/eyes, ORGAN_SLOT_EARS = /obj/item/organ/ears/lupian, - ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm index 9a275ad48f0..0d03fc0621e 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm @@ -45,7 +45,7 @@ ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, ORGAN_SLOT_EYES = /obj/item/organ/eyes, ORGAN_SLOT_EARS = /obj/item/organ/ears/cat, - ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm index c00ebf1f866..0a060955d32 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm @@ -42,7 +42,7 @@ ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, ORGAN_SLOT_EYES = /obj/item/organ/eyes, ORGAN_SLOT_EARS = /obj/item/organ/ears/vulpkanin, - ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, diff --git a/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm b/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm index 1f39895c9a0..77defca5bb8 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm @@ -95,5 +95,16 @@ used = list('sound/vo/female/gen/se/sexlight (1).ogg','sound/vo/female/gen/se/sexlight (2).ogg','sound/vo/female/gen/se/sexlight (3).ogg','sound/vo/female/gen/se/sexlight (4).ogg','sound/vo/female/gen/se/sexlight (5).ogg','sound/vo/female/gen/se/sexlight (6).ogg','sound/vo/female/gen/se/sexlight (7).ogg') if("sexmoanhvy") used = list('sound/vo/female/gen/se/sex (1).ogg','sound/vo/female/gen/se/sex (2).ogg','sound/vo/female/gen/se/sex (3).ogg','sound/vo/female/gen/se/sex (4).ogg','sound/vo/female/gen/se/sex (5).ogg','sound/vo/female/gen/se/sex (6).ogg','sound/vo/female/gen/se/sex (7).ogg','sound/vo/female/gen/se/sex (8).ogg') - + if("meow") + used = list('sound/vo/mobs/cat/cat_meow1.ogg', 'sound/vo/mobs/cat/cat_meow2.ogg', 'sound/vo/mobs/cat/cat_meow3.ogg') + if("purr") + used = list('sound/vo/mobs/cat/cat_purr1.ogg', 'sound/vo/mobs/cat/cat_purr2.ogg', 'sound/vo/mobs/cat/cat_purr3.ogg', 'sound/vo/mobs/cat/cat_purr4.ogg') + if("moo") + used = list('sound/vo/mobs/minotaur/minoidle.ogg', 'sound/vo/mobs/minotaur/minoidle2.ogg', 'sound/vo/mobs/minotaur/minoidle3.ogg') + if("bark") + used = list('sound/vo/mobs/vw/bark (1).ogg', 'sound/vo/mobs/vw/bark (2).ogg', 'sound/vo/mobs/vw/bark (3).ogg', 'sound/vo/mobs/vw/bark (4).ogg', 'sound/vo/mobs/vw/bark (5).ogg', 'sound/vo/mobs/vw/bark (6).ogg', 'sound/vo/mobs/vw/bark (7).ogg') + if("growl") + used = list('sound/vo/mobs/vw/idle (1).ogg', 'sound/vo/mobs/vw/idle (2).ogg', 'sound/vo/mobs/vw/idle (3).ogg', 'sound/vo/mobs/vw/idle (4).ogg') + if("bleat") + used = list('sound/vo/mobs/goat/idle (1).ogg', 'sound/vo/mobs/goat/idle (2).ogg', 'sound/vo/mobs/goat/idle (3).ogg') return used diff --git a/code/modules/mob/living/carbon/human/voicepacks/genmale.dm b/code/modules/mob/living/carbon/human/voicepacks/genmale.dm index 297bd999ca1..a07d7aa7e6c 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/genmale.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/genmale.dm @@ -98,5 +98,17 @@ used = list('sound/vo/clap (1).ogg','sound/vo/clap (2).ogg','sound/vo/clap (3).ogg','sound/vo/clap (4).ogg') if("psst") used = 'sound/vo/psst.ogg' + if("meow") + used = list('sound/vo/mobs/cat/cat_meow1.ogg', 'sound/vo/mobs/cat/cat_meow2.ogg', 'sound/vo/mobs/cat/cat_meow3.ogg') + if("purr") + used = list('sound/vo/mobs/cat/cat_purr1.ogg', 'sound/vo/mobs/cat/cat_purr2.ogg', 'sound/vo/mobs/cat/cat_purr3.ogg', 'sound/vo/mobs/cat/cat_purr4.ogg') + if("moo") + used = list('sound/vo/mobs/minotaur/minoidle.ogg', 'sound/vo/mobs/minotaur/minoidle2.ogg', 'sound/vo/mobs/minotaur/minoidle3.ogg') + if("bark") + used = list('sound/vo/mobs/vw/bark (1).ogg', 'sound/vo/mobs/vw/bark (2).ogg', 'sound/vo/mobs/vw/bark (3).ogg', 'sound/vo/mobs/vw/bark (4).ogg', 'sound/vo/mobs/vw/bark (5).ogg', 'sound/vo/mobs/vw/bark (6).ogg', 'sound/vo/mobs/vw/bark (7).ogg') + if("growl") + used = list('sound/vo/mobs/vw/idle (1).ogg', 'sound/vo/mobs/vw/idle (2).ogg', 'sound/vo/mobs/vw/idle (3).ogg', 'sound/vo/mobs/vw/idle (4).ogg') + if("bleat") + used = list('sound/vo/mobs/goat/idle (1).ogg', 'sound/vo/mobs/goat/idle (2).ogg', 'sound/vo/mobs/goat/idle (3).ogg') return used diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 598afee4808..2123273d50e 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -9,7 +9,6 @@ key_third_person = "blushes" message = "blushes." - /datum/emote/living/pray key = "pray" key_third_person = "prays" @@ -1291,3 +1290,111 @@ set category = "Emotes" emote("squint", intentional = TRUE) + +/datum/emote/living/meow + key = "meow" + key_third_person = "meows!" + message = "meows!" + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + message_muffled = "makes a muffled sound!" + vary = TRUE + show_runechat = FALSE + +/mob/living/carbon/human/verb/emote_meow() + if(istype(usr.getorganslot(ORGAN_SLOT_TONGUE), /obj/item/organ/tongue/wild_tongue)) + set name = "Meow" + set category = "Noises" + emote("meow", intentional = TRUE) + else + to_chat(usr, span_warning("Your tongue doesn't do that")) + return + +/datum/emote/living/purr + key = "purr" + key_third_person = "purrs!" + message = "purrs!" + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + message_muffled = "makes a muffled sound!" + vary = TRUE + show_runechat = FALSE + +/mob/living/carbon/human/verb/emote_purr() + if(istype(usr.getorganslot(ORGAN_SLOT_TONGUE), /obj/item/organ/tongue/wild_tongue)) + set name = "Purr" + set category = "Noises" + emote("purr", intentional = TRUE) + else + to_chat(usr, span_warning("Your tongue doesn't do that")) + return + +/datum/emote/living/moo + key = "moo" + key_third_person = "moos!" + message = "moos!" + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + message_muffled = "makes a muffled sound!" + vary = TRUE + show_runechat = FALSE + +/mob/living/carbon/human/verb/emote_moo() + if(istype(usr.getorganslot(ORGAN_SLOT_TONGUE), /obj/item/organ/tongue/wild_tongue)) + set name = "Moo" + set category = "Noises" + emote("moo", intentional = TRUE) + else + to_chat(usr, span_warning("Your tongue doesn't do that")) + return + +/datum/emote/living/bark + key = "bark" + key_third_person = "barks!" + message = "barks!" + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + message_muffled = "makes a muffled sound!" + vary = TRUE + show_runechat = FALSE + +/mob/living/carbon/human/verb/emote_bark() + if(istype(usr.getorganslot(ORGAN_SLOT_TONGUE), /obj/item/organ/tongue/wild_tongue)) + set name = "Bark" + set category = "Noises" + emote("bark", intentional = TRUE) + else + to_chat(usr, span_warning("Your tongue doesn't do that")) + return + +/datum/emote/living/growl + key = "growl" + key_third_person = "growls!" + message = "growls!" + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + message_muffled = "makes a muffled sound!" + vary = TRUE + show_runechat = FALSE + +/mob/living/carbon/human/verb/emote_growl() + if(istype(usr.getorganslot(ORGAN_SLOT_TONGUE), /obj/item/organ/tongue/wild_tongue)) + set name = "Growl" + set category = "Noises" + emote("growl", intentional = TRUE) + else + to_chat(usr, span_warning("Your tongue doesn't do that")) + return + +/datum/emote/living/bleat + key = "bleat" + key_third_person = "bleats!" + message = "bleats!" + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + message_muffled = "makes a muffled sound!" + vary = TRUE + show_runechat = FALSE + +/mob/living/carbon/human/verb/emote_bleat() + if(istype(usr.getorganslot(ORGAN_SLOT_TONGUE), /obj/item/organ/tongue/wild_tongue)) + set name = "Bleat" + set category = "Noises" + emote("bleat", intentional = TRUE) + else + to_chat(usr, span_warning("Your tongue doesn't do that")) + return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a60b34dc5a3..e6fe6f51c05 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1520,6 +1520,12 @@ stickstand = TRUE var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyzed && ( ignore_legs || ((has_legs >= 2) || (has_legs == 1 && stickstand)) ) && !(buckled && buckled.buckle_lying) + + if(canstand_involuntary) + mobility_flags |= MOBILITY_CANSTAND + else + mobility_flags &= ~MOBILITY_CANSTAND + var/canstand = canstand_involuntary && !resting var/should_be_lying = !canstand diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 93d7f47f604..5ab2f0c993c 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -25,7 +25,11 @@ unsuitable_atmos_damage = 1 animal_species = /mob/living/simple_animal/pet/cat childtype = list(/mob/living/simple_animal/pet/cat/kitten) - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1, /obj/item/organ/ears/cat = 1, /obj/item/organ/tail/cat = 1) + butcher_results = list( + /obj/item/reagent_containers/food/snacks/meat/slab = 1, + /obj/item/organ/ears/cat = 1, + /obj/item/organ/tail/cat = 1, + ) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" @@ -214,6 +218,18 @@ set_resting(FALSE) else emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) + + else if (prob(1)) + playsound(src, pick( + 'sound/vo/mobs/cat/cat_meow1.ogg', + 'sound/vo/mobs/cat/cat_meow2.ogg', + 'sound/vo/mobs/cat/cat_meow3.ogg', + 'sound/vo/mobs/cat/cat_purr1.ogg', + 'sound/vo/mobs/cat/cat_purr2.ogg', + 'sound/vo/mobs/cat/cat_purr3.ogg', + 'sound/vo/mobs/cat/cat_purr4.ogg', + ), 100, TRUE) + ..() make_babies() @@ -263,8 +279,6 @@ if(M && stat != DEAD) emote("me", 1, "hisses!") - - /mob/living/simple_animal/pet/cat/inn/attack_hand(mob/living/carbon/human/M) // Gato Basado - not all pets are welcome . = ..() if((isdarkelf(M))) // l´cursed bonbonbon diff --git a/code/modules/mob/living/simple_animal/rogue/game/saiga.dm b/code/modules/mob/living/simple_animal/rogue/game/saiga.dm index 5a5dbe3f814..66688c2e7e4 100644 --- a/code/modules/mob/living/simple_animal/rogue/game/saiga.dm +++ b/code/modules/mob/living/simple_animal/rogue/game/saiga.dm @@ -1,44 +1,11 @@ -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/find_food() - ..() - var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc - if(SV) - SV.eat(src) - food = max(food + 30, 100) - -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/update_icon() - cut_overlays() - ..() - if(stat != DEAD) - if(ssaddle) - var/mutable_appearance/saddlet = mutable_appearance(icon, "saddle-f-above", 4.3) - add_overlay(saddlet) - saddlet = mutable_appearance(icon, "saddle-f") - add_overlay(saddlet) - if(has_buckled_mobs()) - var/mutable_appearance/mounted = mutable_appearance(icon, "saiga_mounted", 4.3) - add_overlay(mounted) - -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/tamed() - ..() - deaggroprob = 30 - if(can_buckle) - var/datum/component/riding/D = LoadComponent(/datum/component/riding) - D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 8), TEXT_SOUTH = list(0, 8), TEXT_EAST = list(-2, 8), TEXT_WEST = list(2, 8))) - D.set_vehicle_dir_layer(SOUTH, OBJ_LAYER) - D.set_vehicle_dir_layer(NORTH, OBJ_LAYER) - D.set_vehicle_dir_layer(EAST, OBJ_LAYER) - D.set_vehicle_dir_layer(WEST, OBJ_LAYER) - -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/death() - unbuckle_all_mobs() - .=..() +//the saiga /mob/living/simple_animal/hostile/retaliate/rogue/saiga - icon = 'icons/roguetown/mob/monster/saiga.dmi' - name = "saiga" + name = "saiga doe" desc = "" + icon = 'icons/roguetown/mob/monster/saiga.dmi' icon_state = "saiga" icon_living = "saiga" icon_dead = "saiga_dead" @@ -50,14 +17,21 @@ turns_per_move = 5 see_in_dark = 6 move_to_delay = 8 - animal_species = /mob/living/simple_animal/hostile/retaliate/rogue/saigabuck - butcher_results = list(/obj/item/reagent_containers/food/snacks/rogue/meat/steak = 4, + animal_species = /mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigabuck + butcher_results = list( + /obj/item/reagent_containers/food/snacks/rogue/meat/steak = 4, /obj/item/reagent_containers/food/snacks/fat = 2, - /obj/item/natural/hide = 4, /obj/item/natural/bundle/bone/full =1) + /obj/item/natural/hide = 4, + /obj/item/natural/bundle/bone/full = 1, + ) base_intents = list(/datum/intent/simple/headbutt) health = 156 maxHealth = 156 - food_type = list(/obj/item/reagent_containers/food/snacks/grown/wheat,/obj/item/reagent_containers/food/snacks/grown/oat,/obj/item/reagent_containers/food/snacks/grown/apple) + food_type = list( + /obj/item/reagent_containers/food/snacks/grown/wheat, + /obj/item/reagent_containers/food/snacks/grown/oat, + /obj/item/reagent_containers/food/snacks/grown/apple, + ) tame_chance = 25 bonus_tame_chance = 15 footstep_type = FOOTSTEP_MOB_SHOE @@ -72,7 +46,10 @@ STASPD = 15 STACON = 8 STASTR = 12 - childtype = list(/mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigakid = 70, /mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigaboy = 30) + childtype = list( + /mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigakid = 70, + /mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigaboy = 30, + ) pixel_x = -8 attack_sound = list('sound/vo/mobs/saiga/attack (1).ogg','sound/vo/mobs/saiga/attack (2).ogg') can_buckle = TRUE @@ -81,42 +58,24 @@ aggressive = 1 remains_type = /obj/effect/decal/remains/saiga -/obj/effect/decal/remains/saiga - name = "remains" - gender = PLURAL - icon_state = "skele" - icon = 'icons/roguetown/mob/monster/saiga.dmi' - -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/get_sound(input) - switch(input) - if("aggro") - return pick('sound/vo/mobs/saiga/attack (1).ogg','sound/vo/mobs/saiga/attack (2).ogg') - if("pain") - return pick('sound/vo/mobs/saiga/pain (1).ogg','sound/vo/mobs/saiga/pain (2).ogg','sound/vo/mobs/saiga/pain (3).ogg') - if("death") - return pick('sound/vo/mobs/saiga/death (1).ogg','sound/vo/mobs/saiga/death (2).ogg') - if("idle") - return pick('sound/vo/mobs/saiga/idle (1).ogg','sound/vo/mobs/saiga/idle (2).ogg','sound/vo/mobs/saiga/idle (3).ogg','sound/vo/mobs/saiga/idle (4).ogg','sound/vo/mobs/saiga/idle (5).ogg','sound/vo/mobs/saiga/idle (6).ogg','sound/vo/mobs/saiga/idle (7).ogg') - - /mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigakid - icon = 'icons/roguetown/mob/monster/saiga.dmi' - name = "saiga" + name = "saiga calf" desc = "" icon_state = "saigakid" icon_living = "saigakid" icon_dead = "saigakid_dead" icon_gib = "saigakid_gib" animal_species = null - butcher_results = list(/obj/item/reagent_containers/food/snacks/rogue/meat/steak = 1, /obj/item/natural/bone = 3) - base_intents = list(/datum/intent/simple/headbutt) + butcher_results = list( + /obj/item/reagent_containers/food/snacks/rogue/meat/steak = 1, + /obj/item/natural/bone = 3, + ) health = 20 pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL maxHealth = 20 melee_damage_lower = 1 melee_damage_upper = 6 - gender = FEMALE STACON = 5 STASTR = 5 STASPD = 5 @@ -127,6 +86,136 @@ can_buckle = FALSE aggressive = 1 +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigabuck + name = "saiga buck" + desc = "" + icon_state = "buck" + icon_living = "buck" + icon_dead = "buck_dead" + icon_gib = "buck_gib" + gender = MALE + emote_see = list("stares.") + speak_chance = 1 + turns_per_move = 3 + see_in_dark = 6 + move_to_delay = 8 + butcher_results = list( + /obj/item/reagent_containers/food/snacks/rogue/meat/steak = 4, + /obj/item/reagent_containers/food/snacks/fat = 1, + /obj/item/natural/hide = 4, + /obj/item/natural/bundle/bone/full = 1, + /obj/item/clothing/head/roguetown/helmet/leather/saiga = 1, + ) + faction = list("saiga") + attack_verb_continuous = "headbutts" + attack_verb_simple = "headbutt" + health = 400 + maxHealth = 400 + melee_damage_lower = 60 + melee_damage_upper = 90 + environment_smash = ENVIRONMENT_SMASH_NONE + retreat_distance = 0 + minimum_distance = 0 + retreat_health = 0.3 + milkies = FALSE //what the fuck + STACON = 15 + STASTR = 12 + STASPD = 12 + attack_sound = list('sound/vo/mobs/saiga/attack (1).ogg','sound/vo/mobs/saiga/attack (2).ogg') + buckle_lying = 0 + tame_chance = 25 + bonus_tame_chance = 15 + aggressive = 1 + remains_type = /obj/effect/decal/remains/saiga + +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigaboy + name = "saiga calf" + desc = "" + gender = MALE + icon_state = "saigaboy" + icon_living = "saigaboy" + icon_dead = "saigaboy_dead" + icon_gib = "saigaboy_gib" + animal_species = null + butcher_results = list( + /obj/item/reagent_containers/food/snacks/rogue/meat/steak = 1, + /obj/item/natural/bone = 3, + ) + health = 20 + maxHealth = 20 + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + milkies = FALSE + melee_damage_lower = 1 + melee_damage_upper = 6 + STACON = 5 + STASTR = 5 + STASPD = 5 + adult_growth = /mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigabuck + tame = TRUE + can_buckle = FALSE + aggressive = 1 + +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/tame + tame = TRUE + +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigabuck/tame + tame = TRUE + +//the saiga's procs + +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/find_food() + ..() + var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc + if(SV) + SV.eat(src) + food = max(food + 30, 100) + +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/update_icon() + cut_overlays() + ..() + if(stat != DEAD) + if(ssaddle) + var/mutable_appearance/saddlet = mutable_appearance(icon, "saddle-f-above", 4.3) + add_overlay(saddlet) + saddlet = mutable_appearance(icon, "saddle-f") + add_overlay(saddlet) + if(has_buckled_mobs()) + var/mutable_appearance/mounted = mutable_appearance(icon, "saiga_mounted", 4.3) + add_overlay(mounted) + +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/tamed() + ..() + deaggroprob = 30 + if(can_buckle) + var/datum/component/riding/D = LoadComponent(/datum/component/riding) + D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 8), TEXT_SOUTH = list(0, 8), TEXT_EAST = list(-2, 8), TEXT_WEST = list(2, 8))) + D.set_vehicle_dir_layer(SOUTH, OBJ_LAYER) + D.set_vehicle_dir_layer(NORTH, OBJ_LAYER) + D.set_vehicle_dir_layer(EAST, OBJ_LAYER) + D.set_vehicle_dir_layer(WEST, OBJ_LAYER) + +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/death() + unbuckle_all_mobs() + .=..() + +/obj/effect/decal/remains/saiga + name = "remains" + gender = PLURAL + icon_state = "skele" + icon = 'icons/roguetown/mob/monster/saiga.dmi' + +/mob/living/simple_animal/hostile/retaliate/rogue/saiga/get_sound(input) + switch(input) + if("aggro") + return pick('sound/vo/mobs/saiga/attack (1).ogg','sound/vo/mobs/saiga/attack (2).ogg') + if("pain") + return pick('sound/vo/mobs/saiga/pain (1).ogg','sound/vo/mobs/saiga/pain (2).ogg','sound/vo/mobs/saiga/pain (3).ogg') + if("death") + return pick('sound/vo/mobs/saiga/death (1).ogg','sound/vo/mobs/saiga/death (2).ogg') + if("idle") + return pick('sound/vo/mobs/saiga/idle (1).ogg','sound/vo/mobs/saiga/idle (2).ogg','sound/vo/mobs/saiga/idle (3).ogg','sound/vo/mobs/saiga/idle (4).ogg','sound/vo/mobs/saiga/idle (5).ogg','sound/vo/mobs/saiga/idle (6).ogg','sound/vo/mobs/saiga/idle (7).ogg') + /mob/living/simple_animal/hostile/retaliate/rogue/saiga/simple_limb_hit(zone) if(!zone) return "" @@ -168,53 +257,6 @@ return ..() -/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck - icon = 'icons/roguetown/mob/monster/saiga.dmi' - name = "saiga" - icon_state = "buck" - icon_living = "buck" - icon_dead = "buck_dead" - icon_gib = "buck_gib" - gender = MALE - emote_see = list("stares.") - speak_chance = 1 - turns_per_move = 3 - see_in_dark = 6 - move_to_delay = 8 - base_intents = list(/datum/intent/simple/headbutt) - butcher_results = list(/obj/item/reagent_containers/food/snacks/rogue/meat/steak = 4, - /obj/item/reagent_containers/food/snacks/fat = 1, - /obj/item/natural/hide = 4, /obj/item/natural/bundle/bone/full = 1, - /obj/item/clothing/head/roguetown/helmet/leather/saiga = 1) - faction = list("saiga") - mob_biotypes = MOB_ORGANIC|MOB_BEAST - attack_verb_continuous = "headbutts" - attack_verb_simple = "headbutt" - health = 400 - maxHealth = 400 - melee_damage_lower = 60 - melee_damage_upper = 90 - environment_smash = ENVIRONMENT_SMASH_NONE - retreat_distance = 0 - minimum_distance = 0 - retreat_health = 0.3 - milkies = FALSE - food_type = list(/obj/item/reagent_containers/food/snacks/grown/wheat,/obj/item/reagent_containers/food/snacks/grown/oat,/obj/item/reagent_containers/food/snacks/grown/apple) - footstep_type = FOOTSTEP_MOB_SHOE - pooptype = /obj/item/natural/poo/horse - STACON = 15 - STASTR = 12 - STASPD = 12 - pixel_x = -8 - attack_sound = list('sound/vo/mobs/saiga/attack (1).ogg','sound/vo/mobs/saiga/attack (2).ogg') - can_buckle = TRUE - buckle_lying = 0 - can_saddle = TRUE - tame_chance = 25 - bonus_tame_chance = 15 - aggressive = 1 - remains_type = /obj/effect/decal/remains/saiga - /mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/update_icon() cut_overlays() ..() @@ -315,39 +357,6 @@ return "foreleg" return ..() - -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/saigaboy - icon = 'icons/roguetown/mob/monster/saiga.dmi' - name = "saiga" - desc = "" - gender = MALE - icon_state = "saigaboy" - icon_living = "saigaboy" - icon_dead = "saigaboy_dead" - icon_gib = "saigaboy_gib" - animal_species = null - butcher_results = list(/obj/item/reagent_containers/food/snacks/rogue/meat/steak = 1, /obj/item/natural/bone = 3) - base_intents = list(/datum/intent/simple/headbutt) - health = 20 - maxHealth = 20 - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - milkies = FALSE - melee_damage_lower = 1 - melee_damage_upper = 6 - STACON = 5 - STASTR = 5 - STASPD = 5 - adult_growth = /mob/living/simple_animal/hostile/retaliate/rogue/saigabuck - tame = TRUE - can_buckle = FALSE - aggressive = 1 -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/tame - tame = TRUE - -/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame - tame = TRUE - /mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame/saddled/Initialize() . = ..() var/obj/item/natural/saddle/S = new(src) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d76af6a5551..471a55e3829 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -407,6 +407,21 @@ else to_chat(user, "I can't write.") return + + if(istype(P, /obj/item/paper)) + var/obj/item/paper/p = P + if(info && p.info) + var/obj/item/manuscript/M = new /obj/item/manuscript(get_turf(P.loc)) + M.page_texts = list(src.info, p.info) + M.compiled_pages = "

[src.info]

[p.info]

" + qdel(p) + if(user.Adjacent(M)) + M.add_fingerprint(user) + user.update_inv_hands() + user.put_in_active_hand(src) + user.put_in_inactive_hand(M) + . = ..() + return qdel(src) add_fingerprint(user) return ..() diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index d611ffcf4d8..f671dc26ab4 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -647,7 +647,7 @@ if(current_cycle >=33 && prob(15)) C.spew_organ() C.vomit(0, TRUE, TRUE, 4) - to_chat(C, span_danger("I feel something lumpy come up as you vomit.")) + to_chat(C, span_danger("I feel something lumpy come up...")) /datum/reagent/toxin/curare name = "Curare" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 5853dbb0213..b0449d9f63f 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -69,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." @@ -76,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/roguecrafting/items.dm b/code/modules/roguetown/roguecrafting/items.dm index e6d2c9af686..0890042987c 100644 --- a/code/modules/roguetown/roguecrafting/items.dm +++ b/code/modules/roguetown/roguecrafting/items.dm @@ -751,3 +751,18 @@ /obj/item/rogueweapon/shield/heater/crafted sellprice = 6 + +/datum/crafting_recipe/roguetown/collar + name = "Collar" + result = /obj/item/clothing/neck/roguetown/collar + reqs = list(/obj/item/natural/hide = 1) + craftdiff = 0 + +/datum/crafting_recipe/roguetown/bell_collar + name = "Bell Collar" + result = /obj/item/clothing/neck/roguetown/collar/bell_collar + reqs = list( + /obj/item/natural/hide = 1, + /obj/item/jingle_bells = 1, + ) + craftdiff = 0 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/blacksmith/anvil_recipes/armor.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/armor.dm index ede9b2795a6..d6837aea8c5 100644 --- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/armor.dm +++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/armor.dm @@ -419,21 +419,21 @@ name = "Blacksteel Cuirass (+1 B.Steel)" req_bar = /obj/item/ingot/blacksteel additional_items = list(/obj/item/ingot/blacksteel) - created_item = /obj/item/clothing/suit/roguetown/armor/blacksteel/cuirass + created_item = /obj/item/clothing/suit/roguetown/armor/plate/blacksteel_half_plate craftdiff = 5 /datum/anvil_recipe/armor/blacksteel/platechest name = "Blacksteel Plate Armor (+3 B.Steel)" req_bar = /obj/item/ingot/blacksteel additional_items = list(/obj/item/ingot/blacksteel, /obj/item/ingot/blacksteel, /obj/item/ingot/blacksteel) - created_item = /obj/item/clothing/suit/roguetown/armor/blacksteel/platechest + created_item = /obj/item/clothing/suit/roguetown/armor/plate/blacksteel_full_plate craftdiff = 5 /datum/anvil_recipe/armor/blacksteel/platelegs name = "Blacksteel Plate Chausses (+1 B.Steel)" req_bar = /obj/item/ingot/blacksteel additional_items = list(/obj/item/ingot/blacksteel) - created_item = /obj/item/clothing/under/roguetown/blacksteel/platelegs + created_item = /obj/item/clothing/under/roguetown/platelegs/blacksteel craftdiff = 5 /datum/anvil_recipe/armor/blacksteel/bucket diff --git a/code/modules/roguetown/roguejobs/engineer/anvil_recipes/mechanical.dm b/code/modules/roguetown/roguejobs/engineer/anvil_recipes/mechanical.dm index 77ef5e57607..9b41ff3f77d 100644 --- a/code/modules/roguetown/roguejobs/engineer/anvil_recipes/mechanical.dm +++ b/code/modules/roguetown/roguejobs/engineer/anvil_recipes/mechanical.dm @@ -3,6 +3,13 @@ appro_skill = /datum/skill/craft/engineering craftdiff = 1 +/datum/anvil_recipe/engineering/jingle_bells + name = "Jingling Bells" + req_bar = /obj/item/ingot/iron + created_item = /obj/item/jingle_bells + createditem_num = 5 + craftdiff = 1 + // --------- BRONZE RECIPES ----------- /datum/anvil_recipe/engineering/bronze/locks diff --git a/code/modules/spells/roguetown/_roguetown.dm b/code/modules/spells/roguetown/_roguetown.dm index 8792550c1c3..28b6f045123 100644 --- a/code/modules/spells/roguetown/_roguetown.dm +++ b/code/modules/spells/roguetown/_roguetown.dm @@ -57,6 +57,15 @@ return FALSE if(!can_cast(caller) || !cast_check(FALSE, ranged_ability_user)) return FALSE + var/client/client = caller.client + var/percentage_progress = client?.chargedprog + var/charge_progress = client?.progress // This is in seconds, same unit as chargetime + var/goal = src.get_chargetime() //if we have no chargetime then we can freely cast (and no early release flag was not set) + if(src.no_early_release) //This is to stop half-channeled spells from casting as the repeated-casts somehow bypass into this function. + if(percentage_progress < 100 && charge_progress < goal)//Conditions for failure: a) not 100% progress, b) charge progress less than goal + to_chat(usr, span_warning("[src.name] was not finished charging! It fizzles.")) + src.revert_cast() + return FALSE if(perform(list(target), TRUE, user = ranged_ability_user)) return TRUE 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/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 8570f9a33eb..450474a52d5 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -239,3 +239,6 @@ else new_message += message[i] speech_args[SPEECH_MESSAGE] = new_message + +/obj/item/organ/tongue/wild_tongue + name = "wild tongue" diff --git a/icons/roguetown/clothing/armor.dmi b/icons/roguetown/clothing/armor.dmi index fe858398728..a3b12bef687 100644 Binary files a/icons/roguetown/clothing/armor.dmi and b/icons/roguetown/clothing/armor.dmi differ diff --git a/icons/roguetown/clothing/feet.dmi b/icons/roguetown/clothing/feet.dmi index 6ec98198603..47b3ecba6c1 100644 Binary files a/icons/roguetown/clothing/feet.dmi and b/icons/roguetown/clothing/feet.dmi differ diff --git a/icons/roguetown/clothing/gloves.dmi b/icons/roguetown/clothing/gloves.dmi index c9a8bead514..728bb45788e 100644 Binary files a/icons/roguetown/clothing/gloves.dmi and b/icons/roguetown/clothing/gloves.dmi differ diff --git a/icons/roguetown/clothing/head.dmi b/icons/roguetown/clothing/head.dmi index 2488444326e..461ece79990 100644 Binary files a/icons/roguetown/clothing/head.dmi and b/icons/roguetown/clothing/head.dmi differ diff --git a/icons/roguetown/clothing/neck.dmi b/icons/roguetown/clothing/neck.dmi index c649a60a0d6..9064612db5a 100644 Binary files a/icons/roguetown/clothing/neck.dmi and b/icons/roguetown/clothing/neck.dmi differ diff --git a/icons/roguetown/clothing/onmob/armor.dmi b/icons/roguetown/clothing/onmob/armor.dmi index 0c90345972f..c0b142087f5 100644 Binary files a/icons/roguetown/clothing/onmob/armor.dmi and b/icons/roguetown/clothing/onmob/armor.dmi differ diff --git a/icons/roguetown/clothing/onmob/feet.dmi b/icons/roguetown/clothing/onmob/feet.dmi index a5445bf5c45..31ed82a165b 100644 Binary files a/icons/roguetown/clothing/onmob/feet.dmi and b/icons/roguetown/clothing/onmob/feet.dmi differ diff --git a/icons/roguetown/clothing/onmob/gloves.dmi b/icons/roguetown/clothing/onmob/gloves.dmi index 15744d14609..23b60f07edd 100644 Binary files a/icons/roguetown/clothing/onmob/gloves.dmi and b/icons/roguetown/clothing/onmob/gloves.dmi differ diff --git a/icons/roguetown/clothing/onmob/head.dmi b/icons/roguetown/clothing/onmob/head.dmi index 145b6b5ac22..7848b31efb1 100644 Binary files a/icons/roguetown/clothing/onmob/head.dmi and b/icons/roguetown/clothing/onmob/head.dmi differ diff --git a/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi b/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi index 35e422d7bed..29f785d1989 100644 Binary files a/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi and b/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi differ diff --git a/icons/roguetown/clothing/onmob/neck.dmi b/icons/roguetown/clothing/onmob/neck.dmi index bbc794c94ee..1582eb3aa44 100644 Binary files a/icons/roguetown/clothing/onmob/neck.dmi and b/icons/roguetown/clothing/onmob/neck.dmi differ diff --git a/icons/roguetown/items/misc.dmi b/icons/roguetown/items/misc.dmi index 61f4d6da767..1f6460b90f0 100644 Binary files a/icons/roguetown/items/misc.dmi and b/icons/roguetown/items/misc.dmi differ diff --git a/modular_azurepeak/code/datums/item_equipped_movement_rustle.dm b/modular_azurepeak/code/datums/item_equipped_movement_rustle.dm new file mode 100644 index 00000000000..d8d05f45230 --- /dev/null +++ b/modular_azurepeak/code/datums/item_equipped_movement_rustle.dm @@ -0,0 +1,67 @@ + +/* ported from tgstation: https://github.com/tgstation/tgstation/blob/master/code/datums/components/item_equipped_movement_rustle.dm +with light edits to work with roguecode */ + + +/datum/component/item_equipped_movement_rustle + + ///sound that plays, use an SFX define if there is multiple. + var/rustle_sounds = SFX_CHAIN_STEP + + ///what move are we on. + var/move_counter = 0 + ///how many moves to take before playing the sound. + var/move_delay = 4 + + ///volume at which the sound plays. + var/volume = 100 + ///does the sound vary? + var/sound_vary = TRUE + ///extra-range for this component's sound. + var/sound_extra_range = -1 + ///sound exponent for the rustle. + var/sound_falloff_exponent = 5 + ///when sounds start falling off for the rustle rustle. + var/sound_falloff_distance = 1 + +/datum/component/item_equipped_movement_rustle/Initialize(custom_sounds, move_delay_override, volume_override, extrarange, falloff_exponent, falloff_distance) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_unequip)) + + if(custom_sounds) + rustle_sounds = custom_sounds + if(isnum(volume_override)) + volume = volume_override + if(isnum(move_delay_override)) + move_delay = move_delay_override + if(isnum(extrarange)) + sound_extra_range = extrarange + if(isnum(falloff_exponent)) + sound_falloff_exponent = falloff_exponent + if(isnum(falloff_distance)) + sound_falloff_distance = falloff_distance + +/datum/component/item_equipped_movement_rustle/proc/on_equip(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + RegisterSignal(equipper, COMSIG_MOVABLE_MOVED, PROC_REF(try_step), override = TRUE) + + +/datum/component/item_equipped_movement_rustle/proc/on_unequip(datum/source, mob/dropped) + SIGNAL_HANDLER + move_counter = 0 + UnregisterSignal(dropped, COMSIG_MOVABLE_MOVED) + +/datum/component/item_equipped_movement_rustle/proc/try_step(obj/item/clothing/source)//(mob/source) + SIGNAL_HANDLER + /*if (source.moving_diagonally == FIRST_DIAG_STEP) //you can uncomment these if someone ever implements diagonal movement + return*/ + move_counter++ + if(move_counter >= move_delay) + play_rustle_sound(source) + move_counter = 0 + +/datum/component/item_equipped_movement_rustle/proc/play_rustle_sound(obj/item/clothing/source)//(mob/source) + playsound(source, rustle_sounds, volume, sound_vary, sound_extra_range, sound_falloff_exponent, falloff = sound_falloff_distance) diff --git a/modular_azurepeak/code/datums/loadout.dm b/modular_azurepeak/code/datums/loadout.dm index 997da7691da..c0636e0fec9 100644 --- a/modular_azurepeak/code/datums/loadout.dm +++ b/modular_azurepeak/code/datums/loadout.dm @@ -203,3 +203,11 @@ GLOBAL_LIST_EMPTY(loadout_items) /datum/loadout_item/feather name = "Feather" path = /obj/item/natural/feather + +/datum/loadout_item/collar + name = "Collar" + path = /obj/item/clothing/neck/roguetown/collar + +/datum/loadout_item/bell_collar + name = "Bell Collar" + path = /obj/item/clothing/neck/roguetown/collar/bell_collar diff --git a/roguetown.dme b/roguetown.dme index 73d98d751bc..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" @@ -1886,6 +1887,7 @@ #include "modular_azurepeak\_statpacks.dm" #include "modular_azurepeak\_virtue.dm" #include "modular_azurepeak\code\datums\autopunctuation.dm" +#include "modular_azurepeak\code\datums\item_equipped_movement_rustle.dm" #include "modular_azurepeak\code\datums\loadout.dm" #include "modular_azurepeak\code\datums\mind.dm" #include "modular_azurepeak\code\game\area\areas.dm" diff --git a/sound/items/credits.txt b/sound/items/credits.txt new file mode 100644 index 00000000000..e4d216d547e --- /dev/null +++ b/sound/items/credits.txt @@ -0,0 +1,11 @@ +- jinglebell1.ogg (originally collarbell1.ogg) +- jinglebell2.ogg (originally collarbell2.ogg) +license: published without license +Made by Kevak +source: https://github.com/Rotwood-Vale/Ratwood-Keep/pull/1910 + +- jinglebell3.ogg (originally jesterstep1.ogg) +- jinglebell4.ogg (originally jesterstep2.ogg) +license: "CC-BY-SA-3.0" +Made and posted by GentleJester#8754 on the SS14 discord. +source: https://discord.com/channels/310555209753690112/311537926376783886/1097222920813674527 diff --git a/sound/items/jinglebell1.ogg b/sound/items/jinglebell1.ogg new file mode 100644 index 00000000000..4a6a055fcf6 Binary files /dev/null and b/sound/items/jinglebell1.ogg differ diff --git a/sound/items/jinglebell2.ogg b/sound/items/jinglebell2.ogg new file mode 100644 index 00000000000..4b259130720 Binary files /dev/null and b/sound/items/jinglebell2.ogg differ diff --git a/sound/items/jinglebell3.ogg b/sound/items/jinglebell3.ogg new file mode 100644 index 00000000000..0868c81990f Binary files /dev/null and b/sound/items/jinglebell3.ogg differ diff --git a/sound/items/jinglebell4.ogg b/sound/items/jinglebell4.ogg new file mode 100644 index 00000000000..f596209ccb4 Binary files /dev/null and b/sound/items/jinglebell4.ogg differ diff --git a/sound/vo/mobs/cat/cat_meow1.ogg b/sound/vo/mobs/cat/cat_meow1.ogg new file mode 100644 index 00000000000..a1889e18fbf Binary files /dev/null and b/sound/vo/mobs/cat/cat_meow1.ogg differ diff --git a/sound/vo/mobs/cat/cat_meow2.ogg b/sound/vo/mobs/cat/cat_meow2.ogg new file mode 100644 index 00000000000..919a071a871 Binary files /dev/null and b/sound/vo/mobs/cat/cat_meow2.ogg differ diff --git a/sound/vo/mobs/cat/cat_meow3.ogg b/sound/vo/mobs/cat/cat_meow3.ogg new file mode 100644 index 00000000000..dc811610996 Binary files /dev/null and b/sound/vo/mobs/cat/cat_meow3.ogg differ diff --git a/sound/vo/mobs/cat/cat_purr1.ogg b/sound/vo/mobs/cat/cat_purr1.ogg new file mode 100644 index 00000000000..c90d78282bf Binary files /dev/null and b/sound/vo/mobs/cat/cat_purr1.ogg differ diff --git a/sound/vo/mobs/cat/cat_purr2.ogg b/sound/vo/mobs/cat/cat_purr2.ogg new file mode 100644 index 00000000000..0b4aa509e91 Binary files /dev/null and b/sound/vo/mobs/cat/cat_purr2.ogg differ diff --git a/sound/vo/mobs/cat/cat_purr3.ogg b/sound/vo/mobs/cat/cat_purr3.ogg new file mode 100644 index 00000000000..5a59adea586 Binary files /dev/null and b/sound/vo/mobs/cat/cat_purr3.ogg differ diff --git a/sound/vo/mobs/cat/cat_purr4.ogg b/sound/vo/mobs/cat/cat_purr4.ogg new file mode 100644 index 00000000000..8ad7a053018 Binary files /dev/null and b/sound/vo/mobs/cat/cat_purr4.ogg differ diff --git a/sound/vo/mobs/cat/credit.txt b/sound/vo/mobs/cat/credit.txt new file mode 100644 index 00000000000..9569702b9ce --- /dev/null +++ b/sound/vo/mobs/cat/credit.txt @@ -0,0 +1,9 @@ +{ +cat_meow1.ogg +cat_meow2.ogg +cat_meow3.ogg +cat_purr1.ogg +cat_purr2.ogg +cat_purr3.ogg +cat_purr4.ogg +} - made by sadboysuss, License: CC-BY-SA