diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 5aa20d74c..ce8bdd11b 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -99,6 +99,8 @@ GLOBAL_LIST_INIT(our_forest_sex, typecacheof(list( #define ishalforc(A) (is_species(A, /datum/species/halforc)) #define isargonian(A) (is_species(A, /datum/species/lizard/brazil)) #define isgoblinp(A) (is_species(A, /datum/species/goblinp)) +#define isanthrom(A) (is_species(A, /datum/species/anthromacro)) +#define isdemim(A) (is_species(A, /datum/species/demimacro)) //more carbon mobs #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm b/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm index d0fde5e9b..8f31a30f9 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm @@ -41,6 +41,25 @@ GLOBAL_VAR_INIT(adventurer_hugbox_duration_still, 3 MINUTES) H.advsetup = 1 H.invisibility = INVISIBILITY_MAXIMUM H.become_blind("advsetup") + if(H.dna?.species) + if(isanthrom(H)) + H.change_stat("strength", 8) + H.change_stat("constitution", 8) + H.change_stat("endurance", 8) + H.change_stat("speed", -8) + H.change_stat("speed", -4) + H.transform = H.transform.Scale(2.25, 2.25) + H.transform = H.transform.Translate(0, (0.25 * 16)) + H.update_transform() + if(isdemim(H)) + H.change_stat("strength", 8) + H.change_stat("constitution", 8) + H.change_stat("endurance", 8) + H.change_stat("speed", -8) + H.change_stat("speed", -4) + H.transform = H.transform.Scale(2.25, 2.25) + H.transform = H.transform.Translate(0, (0.25 * 16)) + H.update_transform() if(GLOB.adventurer_hugbox_duration) ///FOR SOME RETARDED FUCKING REASON THIS REFUSED TO WORK WITHOUT A FUCKING TIMER IT JUST FUCKED SHIT UP diff --git a/code/modules/jobs/job_types/roguetown/adventurer/pilgrim.dm b/code/modules/jobs/job_types/roguetown/adventurer/pilgrim.dm index 2be3b67ee..3c87faeee 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/pilgrim.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/pilgrim.dm @@ -33,6 +33,25 @@ H.advsetup = 1 H.invisibility = INVISIBILITY_MAXIMUM H.become_blind("advsetup") + if(H.dna?.species) + if(isanthrom(H)) + H.change_stat("strength", 8) + H.change_stat("constitution", 8) + H.change_stat("endurance", 8) + H.change_stat("speed", -8) + H.change_stat("speed", -4) + H.transform = H.transform.Scale(2.25, 2.25) + H.transform = H.transform.Translate(0, (0.25 * 16)) + H.update_transform() + if(isdemim(H)) + H.change_stat("strength", 8) + H.change_stat("constitution", 8) + H.change_stat("endurance", 8) + H.change_stat("speed", -8) + H.change_stat("speed", -4) + H.transform = H.transform.Scale(2.25, 2.25) + H.transform = H.transform.Translate(0, (0.25 * 16)) + H.update_transform() if(GLOB.adventurer_hugbox_duration) ///FOR SOME RETARDED FUCKING REASON THIS REFUSED TO WORK WITHOUT A FUCKING TIMER IT JUST FUCKED SHIT UP diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromacro.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromacro.dm new file mode 100644 index 000000000..7d1ead9a3 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromacro.dm @@ -0,0 +1,176 @@ +/mob/living/carbon/human/species/anthromacro + race = /datum/species/anthromacro + +/datum/species/anthromacro + name = "Goliath" + id = "anthromacro" + desc = "Some species of Wild-Kin hail from Graggarite touched bloodlines, and have the size, and temper to match. (ONLY WORKS FOR ADVENTURER AND PILGRIM!!!)" + default_color = "444" + species_traits = list( + MUTCOLORS, + EYECOLOR, + LIPS, + HAIR, + ) + inherent_traits = list(TRAIT_NOMOBSWAP) + inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID + attack_verb = "slash" + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + possible_ages = ALL_AGES_LIST + limbs_icon_m = 'icons/roguetown/mob/bodies/m/mt.dmi' + limbs_icon_f = 'icons/roguetown/mob/bodies/f/fm.dmi' + dam_icon = 'icons/roguetown/mob/bodies/dam/dam_male.dmi' + dam_icon_f = 'icons/roguetown/mob/bodies/dam/dam_female.dmi' + + + soundpack_m = /datum/voicepack/male + soundpack_f = /datum/voicepack/female + offset_features = list( + OFFSET_ID = list(0,1), OFFSET_GLOVES = list(0,1), OFFSET_WRISTS = list(0,1),\ + OFFSET_CLOAK = list(0,1), OFFSET_FACEMASK = list(0,1), OFFSET_HEAD = list(0,1), \ + OFFSET_FACE = list(0,1), OFFSET_BELT = list(0,1), OFFSET_BACK = list(0,1), \ + OFFSET_NECK = list(0,1), OFFSET_MOUTH = list(0,1), OFFSET_PANTS = list(0,1), \ + OFFSET_SHIRT = list(0,1), OFFSET_ARMOR = list(0,1), OFFSET_HANDS = list(0,1), OFFSET_UNDIES = list(0,1), \ + OFFSET_ID_F = list(0,-1), OFFSET_GLOVES_F = list(0,0), OFFSET_WRISTS_F = list(0,0), OFFSET_HANDS_F = list(0,0), \ + OFFSET_CLOAK_F = list(0,0), OFFSET_FACEMASK_F = list(0,-1), OFFSET_HEAD_F = list(0,-1), \ + OFFSET_FACE_F = list(0,-1), OFFSET_BELT_F = list(0,0), OFFSET_BACK_F = list(0,-1), \ + OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ + OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ + ) + specstats = list("strength" = 0, "perception" = 1, "intelligence" = -1, "constitution" = 0, "endurance" = 1, "speed" = -1, "fortune" = 0) + specstats_f = list("strength" = -1, "perception" = 0, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 0) + race_bonus = list(STAT_PERCEPTION = 1) + enflamed_icon = "widefire" + organs = list( + 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, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + //ORGAN_SLOT_TESTICLES = /obj/item/organ/testicles, + //ORGAN_SLOT_PENIS = /obj/item/organ/penis/knotted, + //ORGAN_SLOT_BREASTS = /obj/item/organ/breasts, + //ORGAN_SLOT_VAGINA = /obj/item/organ/vagina, + ) + bodypart_features = list( + /datum/bodypart_feature/hair/head, + /datum/bodypart_feature/hair/facial, + ) + customizers = list( + /datum/customizer/organ/eyes/humanoid, + /datum/customizer/bodypart_feature/hair/head/humanoid, + /datum/customizer/bodypart_feature/hair/facial/humanoid, + /datum/customizer/bodypart_feature/accessory, + /datum/customizer/bodypart_feature/face_detail, + /datum/customizer/bodypart_feature/underwear, + /datum/customizer/organ/tail/, + /datum/customizer/organ/tail_feature/, + /datum/customizer/organ/snout/, + /datum/customizer/organ/ears/, + /datum/customizer/organ/horns/, + /datum/customizer/organ/frills/, + /datum/customizer/organ/wings/, + /datum/customizer/organ/neck_feature/, + /datum/customizer/organ/testicles/, + /datum/customizer/organ/penis/, + /datum/customizer/organ/breasts/animal, + /datum/customizer/organ/vagina/, + ) + body_marking_sets = list( + /datum/body_marking_set/none, + /datum/body_marking_set/belly, + /datum/body_marking_set/bellysocks, + /datum/body_marking_set/tiger, + /datum/body_marking_set/tiger_dark, + ) + body_markings = list( + /datum/body_marking/plain, + /datum/body_marking/tiger, + /datum/body_marking/tiger/dark, + /datum/body_marking/sock, + /datum/body_marking/socklonger, + /datum/body_marking/tips, + /datum/body_marking/bellyscale, + /datum/body_marking/bellyscaleslim, + /datum/body_marking/bellyscalesmooth, + /datum/body_marking/bellyscaleslimsmooth, + /datum/body_marking/buttscale, + /datum/body_marking/belly, + /datum/body_marking/bellyslim, + /datum/body_marking/butt, + /datum/body_marking/tie, + /datum/body_marking/tiesmall, + /datum/body_marking/backspots, + /datum/body_marking/front, + /datum/body_marking/drake_eyes, + /datum/body_marking/tonage, + /datum/body_marking/spotted, + ) + descriptor_choices = list( + /datum/descriptor_choice/height, + /datum/descriptor_choice/body, + /datum/descriptor_choice/stature, + /datum/descriptor_choice/face, + /datum/descriptor_choice/face_exp, + /datum/descriptor_choice/skin_all, + /datum/descriptor_choice/voice, + /datum/descriptor_choice/prominent_one_wild, + /datum/descriptor_choice/prominent_two_wild, + /datum/descriptor_choice/prominent_three_wild, + /datum/descriptor_choice/prominent_four_wild, + ) + +/datum/species/anthromacro/on_species_gain(mob/living/carbon/C, datum/species/old_species) + ..() + RegisterSignal(C, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/anthromacro/on_species_loss(mob/living/carbon/C) + . = ..() + UnregisterSignal(C, COMSIG_MOB_SAY) + +/datum/species/anthromacro/check_roundstart_eligible() + return TRUE + +/datum/species/anthromacro/qualifies_for_rank(rank, list/features) + return TRUE + +/datum/species/anthromacro/get_random_features() + var/list/returned = MANDATORY_FEATURE_LIST + var/main_color + var/second_color + var/third_color + var/random = rand(1,6) + switch(random) + if(1) + main_color = "FFFFFF" + second_color = "333333" + third_color = "333333" + if(2) + main_color = "FFFFDD" + second_color = "DD6611" + third_color = "AA5522" + if(3) + main_color = "DD6611" + second_color = "FFFFFF" + third_color = "DD6611" + if(4) + main_color = "CCCCCC" + second_color = "FFFFFF" + third_color = "FFFFFF" + if(5) + main_color = "AA5522" + second_color = "CC8833" + third_color = "FFFFFF" + if(6) + main_color = "FFFFDD" + second_color = "FFEECC" + third_color = "FFDDBB" + returned["mcolor"] = main_color + returned["mcolor2"] = second_color + returned["mcolor3"] = third_color + return returned + diff --git a/code/modules/mob/living/carbon/human/species_types/furry/demimacro.dm b/code/modules/mob/living/carbon/human/species_types/furry/demimacro.dm new file mode 100644 index 000000000..138fb525a --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/furry/demimacro.dm @@ -0,0 +1,137 @@ +/mob/living/carbon/human/species/demimacro + race = /datum/species/demimacro + +/datum/species/demimacro + name = "Half-Giants" + id = "demimacro" + desc = "Similar to Goliaths, these beasts trace their lineage to graggarite roots. They may be a tad more friendly however. Just a bit. (ONLY WORKS WITH ADVENTURERS AND PILGRIMS)" + skin_tone_wording = "Ancestry" + default_color = "FFFFFF" + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,STUBBLE,OLDGREY,MUTCOLORS_PARTSONLY) + inherent_traits = list(TRAIT_NOMOBSWAP) + default_features = MANDATORY_FEATURE_LIST + use_skintones = TRUE + possible_ages = ALL_AGES_LIST + skinned_type = /obj/item/stack/sheet/animalhide/human + disliked_food = NONE + liked_food = NONE + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + limbs_icon_m = 'icons/roguetown/mob/bodies/m/mt.dmi' + limbs_icon_f = 'icons/roguetown/mob/bodies/f/fm.dmi' + dam_icon = 'icons/roguetown/mob/bodies/dam/dam_male.dmi' + dam_icon_f = 'icons/roguetown/mob/bodies/dam/dam_female.dmi' + soundpack_m = /datum/voicepack/male + soundpack_f = /datum/voicepack/female + offset_features = list( + OFFSET_ID = list(0,1), OFFSET_GLOVES = list(0,1), OFFSET_WRISTS = list(0,1),\ + OFFSET_CLOAK = list(0,1), OFFSET_FACEMASK = list(0,1), OFFSET_HEAD = list(0,1), \ + OFFSET_FACE = list(0,1), OFFSET_BELT = list(0,1), OFFSET_BACK = list(0,1), \ + OFFSET_NECK = list(0,1), OFFSET_MOUTH = list(0,1), OFFSET_PANTS = list(0,1), \ + OFFSET_SHIRT = list(0,1), OFFSET_ARMOR = list(0,1), OFFSET_HANDS = list(0,1), OFFSET_UNDIES = list(0,1), \ + OFFSET_ID_F = list(0,-1), OFFSET_GLOVES_F = list(0,0), OFFSET_WRISTS_F = list(0,0), OFFSET_HANDS_F = list(0,0), \ + OFFSET_CLOAK_F = list(0,0), OFFSET_FACEMASK_F = list(0,-1), OFFSET_HEAD_F = list(0,-1), \ + OFFSET_FACE_F = list(0,-1), OFFSET_BELT_F = list(0,0), OFFSET_BACK_F = list(0,-1), \ + OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ + OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ + ) + specstats = list("strength" = 0, "perception" = 1, "intelligence" = -1, "constitution" = 0, "endurance" = 1, "speed" = -1, "fortune" = 0) + specstats_f = list("strength" = -1, "perception" = 0, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 0) + race_bonus = list(STAT_PERCEPTION = 1) + enflamed_icon = "widefire" + bodypart_features = list( + /datum/bodypart_feature/hair/head, + /datum/bodypart_feature/hair/facial, + ) + customizers = list( + /datum/customizer/organ/eyes/humanoid, + /datum/customizer/bodypart_feature/hair/head/humanoid, + /datum/customizer/bodypart_feature/hair/facial/humanoid, + /datum/customizer/bodypart_feature/accessory, + /datum/customizer/bodypart_feature/face_detail, + /datum/customizer/bodypart_feature/underwear, + /datum/customizer/organ/ears/demihuman, + /datum/customizer/organ/horns/demihuman, + /datum/customizer/organ/tail/demihuman, + /datum/customizer/organ/testicles/human, + /datum/customizer/organ/penis/canine, + /datum/customizer/organ/breasts/animal, + /datum/customizer/organ/vagina/animal, + ) + body_marking_sets = list( + /datum/body_marking_set/none, + /datum/body_marking_set/socks, + ) + body_markings = list( + /datum/body_marking/tonage, + /datum/body_marking/socklonger, + /datum/body_marking/tips, + ) + descriptor_choices = list( + /datum/descriptor_choice/height, + /datum/descriptor_choice/body, + /datum/descriptor_choice/stature, + /datum/descriptor_choice/face, + /datum/descriptor_choice/face_exp, + /datum/descriptor_choice/skin, + /datum/descriptor_choice/voice, + /datum/descriptor_choice/prominent_one_wild, + /datum/descriptor_choice/prominent_two_wild, + /datum/descriptor_choice/prominent_three_wild, + /datum/descriptor_choice/prominent_four_wild, + ) + +/datum/species/demimacro/check_roundstart_eligible() + return TRUE + +/datum/species/demimacro/qualifies_for_rank(rank, list/features) + return TRUE + +/datum/species/demimacro/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + RegisterSignal(C, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/demimacro/on_species_loss(mob/living/carbon/C) + . = ..() + UnregisterSignal(C, COMSIG_MOB_SAY) + +/datum/species/demimacro/get_random_features() + var/list/returned = MANDATORY_FEATURE_LIST + var/main_color + var/random = rand(1,8) + //Choose from a variety of mostly brightish, animal, matching colors + switch(random) + if(1) + main_color = ORANGE_FUR + if(2) + main_color = LIGHTGREY_FUR + if(3) + main_color = DARKGREY_FUR + if(4) + main_color = LIGHTORANGE_FUR + if(5) + main_color = LIGHTBROWN_FUR + if(6) + main_color = WHITEBROWN_FUR + if(7) + main_color = DARKBROWN_FUR + if(8) + main_color = BLACK_FUR + returned["mcolor"] = main_color + returned["mcolor2"] = main_color + returned["mcolor3"] = main_color + return returned + +/datum/species/demihuman/get_skin_list() + return list( + "Grenzelhoft" = SKIN_COLOR_GRENZELHOFT, + "Hammerhold" = SKIN_COLOR_HAMMERHOLD, + "Avar" = SKIN_COLOR_AVAR, + "Rockhill" = SKIN_COLOR_ROCKHILL, + "Otava" = SKIN_COLOR_OTAVA, + "Etrusca" = SKIN_COLOR_ETRUSCA, + "Gronn" = SKIN_COLOR_GRONN, + "Giza" = SKIN_COLOR_GIZA, + "Shalvistine" = SKIN_COLOR_SHALVISTINE, + "Lalvestine" = SKIN_COLOR_LALVESTINE, + "Ebon" = SKIN_COLOR_EBON, + ) diff --git a/roguetown.dme b/roguetown.dme index a2761549c..7d957f8a9 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -3576,4 +3576,6 @@ #include "modular_hearthstone\code\modules\mob\living\simple_animal\rogue\simple_skeleton.dm" #include "modular_hearthstone\code\modules\reagents\reagent_containers\lux.dm" #include "modular_hearthstone\code\modules\spells\roguetown\wizard.dm" +#include "code\modules\mob\living\carbon\human\species_types\furry\anthromacro.dm" +#include "code\modules\mob\living\carbon\human\species_types\furry\demimacro.dm" // END_INCLUDE