diff --git a/maplestation.dme b/maplestation.dme index 1c9322709cb1..28189726e034 100644 --- a/maplestation.dme +++ b/maplestation.dme @@ -6442,6 +6442,7 @@ #include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\skrell.dm" #include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\species.dm" #include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\vampire.dm" +#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\werewolf.dm" #include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\synth\synth.dm" #include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\synth\synth_ion.dm" #include "maplestation_modules\code\modules\mob\living\silicon\robot\robot_defines.dm" @@ -6482,9 +6483,11 @@ #include "maplestation_modules\code\modules\surgery\organs\autosurgeon.dm" #include "maplestation_modules\code\modules\surgery\organs\ears.dm" #include "maplestation_modules\code\modules\surgery\organs\eyes.dm" +#include "maplestation_modules\code\modules\surgery\organs\heart.dm" #include "maplestation_modules\code\modules\surgery\organs\liver.dm" #include "maplestation_modules\code\modules\surgery\organs\tails.dm" #include "maplestation_modules\code\modules\surgery\organs\tongue.dm" +#include "maplestation_modules\code\modules\surgery\organs\werewolf_parts.dm" #include "maplestation_modules\code\modules\uplink\uplink_devices.dm" #include "maplestation_modules\code\modules\uplink\uplink_infiltrator.dm" #include "maplestation_modules\code\modules\uplink\uplink_items.dm" diff --git a/maplestation_modules/code/__DEFINES/DNA.dm b/maplestation_modules/code/__DEFINES/DNA.dm index c4249c288de3..8e4959f01702 100644 --- a/maplestation_modules/code/__DEFINES/DNA.dm +++ b/maplestation_modules/code/__DEFINES/DNA.dm @@ -5,3 +5,4 @@ #define SPECIES_REPLOID "reploid" #define SPECIES_SYNTH "synth" #define SPECIES_ORNITHID "ornithid" +#define SPECIES_WEREWOLF "werewolf" diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/werewolf.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/werewolf.dm new file mode 100644 index 000000000000..2536a4e953e6 --- /dev/null +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/werewolf.dm @@ -0,0 +1,76 @@ +/datum/species/werewolf + name = "werewolf" + id = SPECIES_WEREWOLF + inherent_traits = list( + TRAIT_USES_SKINTONES, + TRAIT_NO_UNDERWEAR, + TRAIT_NO_AUGMENTS, + TRAIT_IGNOREDAMAGESLOWDOWN, + TRAIT_PUSHIMMUNE, + TRAIT_STUNIMMUNE, + TRAIT_PRIMITIVE, + TRAIT_CAN_STRIP, + TRAIT_CHUNKYFINGERS + ) + mutanttongue = /obj/item/organ/internal/tongue/werewolf + mutantears = /obj/item/organ/internal/ears/werewolf + mutanteyes = /obj/item/organ/internal/eyes/werewolf + mutantbrain = /obj/item/organ/internal/brain/werewolf + mutantliver = obj/item/organ/internal/liver/werewolf + mutantheart = obj/item/organ/internal/heart/werewolf + external_organs = list( + /obj/item/organ/external/tail/cat = "Cat", + ) + skinned_type = /obj/item/stack/sheet/animalhide/human + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING | ITEM_SLOT_SUITSTORE + + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/werewolf, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/werewolf, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/werewolf, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/werewolf, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/werewolf, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/werewolf, + ) + +/obj/item/organ/internal/brain/werewolf/get_attacking_limb(mob/living/carbon/human/target) + name = "werewolf brain" + desc = "a strange mixture of a human and wolf brain" + organ_traits = list(TRAIT_PRIMITIVE, TRAIT_CAN_STRIP) + + if(target.body_position == LYING_DOWN) + return owner.get_bodypart(BODY_ZONE_HEAD) + return ..() + +/datum/species/werewolf/prepare_human_for_preview(mob/living/carbon/human/human) + human.set_haircolor("#bb9966", update = FALSE) // brown + human.set_hairstyle("Business Hair", update = TRUE) + +/datum/species/werewolf/get_species_description() + return "N/A" + +/datum/species/human/get_species_lore() + return list( + "N/A", + ) + +/datum/species/werewolf/create_pref_unique_perks() + var/list/to_add = list() + + to_add += list( + list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "paw", + SPECIES_PERK_NAME = "Primal Primate", + SPECIES_PERK_DESC = "Werewolves are monstrous humans, and can't do most things a human can do. Computers are impossible, \ + complex machines are right out, and most clothes don't fit your larger form.", + ), + list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "assistive-listening-systems", + SPECIES_PERK_NAME = "Sensitive Hearing", + SPECIES_PERK_DESC = "Werewolves are more sensitive to loud sounds, such as flashbangs.", + )) + + return to_add diff --git a/maplestation_modules/code/modules/surgery/organs/ears.dm b/maplestation_modules/code/modules/surgery/organs/ears.dm index c3a7380ce876..95697de99fbe 100644 --- a/maplestation_modules/code/modules/surgery/organs/ears.dm +++ b/maplestation_modules/code/modules/surgery/organs/ears.dm @@ -31,3 +31,14 @@ icon_state = "catcyber" icon = 'maplestation_modules/icons/mob/mutant_bodyparts.dmi' locked = TRUE + +/obj/item/organ/internal/ears/werewolf + name = "wolf ears" + icon = 'icons/obj/clothing/head/costume.dmi' + icon_state = "kitty" + desc = "Allows the user to more easily hear whispers. The user becomes extra vulnerable to loud noises, however" + // Same sensitivity as felinid ears + damage_multiplier = 2 +/obj/item/organ/internal/ears/werewolf/on_mob_insert(mob/living/carbon/ear_owner) + . = ..() + organ_traits = list(TRAIT_GOOD_HEARING) diff --git a/maplestation_modules/code/modules/surgery/organs/eyes.dm b/maplestation_modules/code/modules/surgery/organs/eyes.dm index 1515021eb4b6..a7e9a9e94279 100644 --- a/maplestation_modules/code/modules/surgery/organs/eyes.dm +++ b/maplestation_modules/code/modules/surgery/organs/eyes.dm @@ -5,3 +5,9 @@ /mob/living/carbon /// Overlay file to take (missing) eye icons from var/missing_eye_file = 'icons/mob/human/human_face.dmi' + +/obj/item/organ/internal/eyes/werewolf + name = "wolf eyes" + desc = "Large and powerful eyes." + sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) diff --git a/maplestation_modules/code/modules/surgery/organs/heart.dm b/maplestation_modules/code/modules/surgery/organs/heart.dm new file mode 100644 index 000000000000..29b445e90659 --- /dev/null +++ b/maplestation_modules/code/modules/surgery/organs/heart.dm @@ -0,0 +1,10 @@ +/obj/item/organ/internal/heart/werewolf + name = "massive heart" + desc = "An absolutely monstrous heart." + icon_state = "heart-on" + base_icon_state = "heart" + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD +/obj/item/organ/internal/heart/wolf/Initialize(mapload) + . = ..() + transform = transform.Scale(1.5) + diff --git a/maplestation_modules/code/modules/surgery/organs/liver.dm b/maplestation_modules/code/modules/surgery/organs/liver.dm index c31b633e2529..4909875fe62b 100644 --- a/maplestation_modules/code/modules/surgery/organs/liver.dm +++ b/maplestation_modules/code/modules/surgery/organs/liver.dm @@ -12,3 +12,23 @@ /obj/item/organ/internal/liver/lizard/Initialize(mapload) . = ..() disease_free_foods = typecacheof(/obj/item/food/deadmouse) + +/obj/item/organ/internal/liver/werewolf + + name = "Beastly liver" + desc = "A large monstrous liver." + icon_state = "liver" + organ_traits = list(TRAIT_STABLELIVER|ORGAN_UNREMOVABLE) + ///Var for brute healing via blood + var/blood_brute_healing = 2.5 + ///Var for burn healing via blood + var/blood_burn_healing = 2.5 + +/obj/item/organ/internal/liver/werewolf/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) + . = ..() + // parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing + if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING)) + return + if(istype(chem, /datum/reagent/silver)) + organ_owner.adjustStaminaLoss(7.5 * REM * seconds_per_tick, updating_stamina = TRUE) + organ_owner.adjustFireLoss(5.0 * REM * seconds_per_tick, updating_health = TRUE) diff --git a/maplestation_modules/code/modules/surgery/organs/tongue.dm b/maplestation_modules/code/modules/surgery/organs/tongue.dm index e7c13530e991..4c1e3e8fb789 100644 --- a/maplestation_modules/code/modules/surgery/organs/tongue.dm +++ b/maplestation_modules/code/modules/surgery/organs/tongue.dm @@ -36,3 +36,38 @@ /obj/item/organ/internal/tongue/lizard/get_possible_languages() return ..() + /datum/language/impdraconic + +/obj/item/organ/internal/tongue/werewolf + name = "wolf tongue" + desc = "A large tongue that looks like a mix of a human's and a wolf's." + icon_state = "werewolf_tongue" + icon = 'maplestation_modules/icons/mob/mutant_bodyparts.dmi' + say_mod = "growls" + modifies_speech = TRUE + taste_sensitivity = 5 + liked_foodtypes = GROSS | MEAT | RAW | GORE + disliked_foodtypes = SUGAR + +/obj/item/organ/internal/tongue/werewolf/modify_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + + // all occurrences of characters "eiou" (case-insensitive) are replaced with "r" + message = replacetext(message, regex(@"[eiou]", "ig"), "r") + // all characters other than "zhrgbmna .!?-" (case-insensitive) are stripped + message = replacetext(message, regex(@"[^zhrgbmna.!?-\s]", "ig"), "") + // multiple spaces are replaced with a single (whitespace is trimmed) + message = replacetext(message, regex(@"(\s+)", "g"), " ") + + var/list/old_words = splittext(message, " ") + var/list/new_words = list() + for(var/word in old_words) + // lower-case "r" at the end of words replaced with "rh" + word = replacetext(word, regex(@"\lr\b"), "rh") + // an "a" or "A" by itself will be replaced with "hra" + word = replacetext(word, regex(@"\b[Aa]\b"), "hra") + new_words += word + + message = new_words.Join(" ") + message = capitalize(message) + speech_args[SPEECH_MESSAGE] = message diff --git a/maplestation_modules/code/modules/surgery/organs/werewolf_parts.dm b/maplestation_modules/code/modules/surgery/organs/werewolf_parts.dm new file mode 100644 index 000000000000..0765ae15e3f0 --- /dev/null +++ b/maplestation_modules/code/modules/surgery/organs/werewolf_parts.dm @@ -0,0 +1,127 @@ +///WEREWOLF +/obj/item/bodypart/head/werewolf + limb_id = SPECIES_WEREWOLF + icon_greyscale = 'maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi' + is_dimorphic = FALSE + should_draw_greyscale = TRUE + +/obj/item/bodypart/head/werewolf/update_limb(dropping_limb, is_creating) + . = ..() + var/mob/living/carbon/human/wolf = owner + species_color = wolf.hair_color + draw_color = species_color + burn_modifier = 0.75 + brute_modifier = 0.25 + unarmed_attack_verb = "bite" + grappled_attack_verb = "maul" + unarmed_attack_effect = ATTACK_EFFECT_BITE + unarmed_attack_sound = 'sound/weapons/bite.ogg' + unarmed_miss_sound = 'sound/weapons/bite.ogg' + unarmed_damage_low = 60 + unarmed_damage_high = 75 + unarmed_effectiveness = 50 + dmg_overlay_type = null + biological_state = (BIO_FLESH|BIO_BLOODED) + head_flags = HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN|HEAD_HAIR + +/obj/item/bodypart/chest/werewolf + limb_id = SPECIES_WEREWOLF + icon_greyscale = 'maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi' + is_dimorphic = TRUE + should_draw_greyscale = TRUE + +/obj/item/bodypart/chest/werewolf/update_limb(dropping_limb, is_creating) + . = ..() + var/mob/living/carbon/human/wolf = owner + species_color = wolf.hair_color + draw_color = species_color + burn_modifier = 0.75 + brute_modifier = 0.25 + dmg_overlay_type = null + biological_state = (BIO_FLESH|BIO_BLOODED) + bodypart_traits = list(TRAIT_NO_JUMPSUIT, TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_PUSHIMMUNE, TRAIT_STUNIMMUNE) + wing_types = NONE + +/obj/item/bodypart/arm/left/werewolf + limb_id = SPECIES_WEREWOLF + icon_greyscale = 'maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi' + should_draw_greyscale = TRUE + +/obj/item/bodypart/arm/left/werewolf/update_limb(dropping_limb, is_creating) + . = ..() + var/mob/living/carbon/human/wolf = owner + species_color = wolf.hair_color + draw_color = species_color + unarmed_attack_verb = "slash" + grappled_attack_verb = "lacerate" + unarmed_attack_effect = ATTACK_EFFECT_CLAW + unarmed_attack_sound = 'sound/weapons/slice.ogg' + unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + unarmed_damage_low = 20 + unarmed_damage_high = 25 + unarmed_effectiveness = 20 + burn_modifier = 0.75 + brute_modifier = 0.25 + dmg_overlay_type = null + bodypart_traits = list(TRAIT_CHUNKYFINGERS) + biological_state = (BIO_FLESH|BIO_BLOODED) + +/obj/item/bodypart/arm/right/werewolf + limb_id = SPECIES_WEREWOLF + icon_greyscale = 'maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi' + should_draw_greyscale = TRUE + +/obj/item/bodypart/arm/right/werewolf/update_limb(dropping_limb, is_creating) + . = ..() + var/mob/living/carbon/human/wolf = owner + species_color = wolf.hair_color + draw_color = species_color + unarmed_attack_verb = "slash" + grappled_attack_verb = "lacerate" + unarmed_attack_effect = ATTACK_EFFECT_CLAW + unarmed_attack_sound = 'sound/weapons/slice.ogg' + unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + unarmed_damage_low = 20 + unarmed_damage_high = 25 + unarmed_effectiveness = 20 + burn_modifier = 0.75 + brute_modifier = 0.25 + dmg_overlay_type = null + bodypart_traits = list(TRAIT_CHUNKYFINGERS) + biological_state = (BIO_FLESH|BIO_BLOODED) + +/obj/item/bodypart/leg/left/werewolf + limb_id = SPECIES_WEREWOLF + icon_greyscale = 'maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi' + should_draw_greyscale = TRUE + +/obj/item/bodypart/leg/left/werewolf/update_limb(dropping_limb, is_creating) + . = ..() + var/mob/living/carbon/human/wolf = owner + species_color = wolf.hair_color + draw_color = species_color + burn_modifier = 0.75 + brute_modifier = 0.25 + speed_modifier = 3 + dmg_overlay_type = null + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE + footstep_type = FOOTSTEP_MOB_CLAW + biological_state = (BIO_FLESH|BIO_BLOODED) + +/obj/item/bodypart/leg/right/werewolf + limb_id = SPECIES_WEREWOLF + icon_greyscale = 'maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi' + should_draw_greyscale = TRUE + +/obj/item/bodypart/leg/right/werewolf/update_limb(dropping_limb, is_creating) + . = ..() + var/mob/living/carbon/human/wolf = owner + species_color = wolf.hair_color + draw_color = species_color + burn_modifier = 0.75 + brute_modifier = 0.25 + speed_modifier = 3 + dmg_overlay_type = null + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE + footstep_type = FOOTSTEP_MOB_CLAW + biological_state = (BIO_FLESH|BIO_BLOODED) diff --git a/maplestation_modules/icons/mob/mutant_bodyparts.dmi b/maplestation_modules/icons/mob/mutant_bodyparts.dmi index eb3e768f68d7..8b9d547aa121 100644 Binary files a/maplestation_modules/icons/mob/mutant_bodyparts.dmi and b/maplestation_modules/icons/mob/mutant_bodyparts.dmi differ diff --git a/maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi b/maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi new file mode 100644 index 000000000000..677d2081622e Binary files /dev/null and b/maplestation_modules/icons/mob/werewolf_parts_greyscale.dmi differ