diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 38b31b04328..01e5670e213 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -437,6 +437,7 @@ #define OFFSET_NECK "neck" #define OFFSET_HELD "held" #define OFFSET_ACCESSORY "accessory" // Skyrat edit - addition +#define OFFSET_HAIR "hair" // Skyrat edit - addition - Akulas //MINOR TWEAKS/MISC //#define AGE_MIN 17 //youngest a character can be //ORIGINAL diff --git a/code/__DEFINES/~skyrat_defines/_HELPERS/offset_index.dm b/code/__DEFINES/~skyrat_defines/_HELPERS/offset_index.dm new file mode 100644 index 00000000000..cbe4c508686 --- /dev/null +++ b/code/__DEFINES/~skyrat_defines/_HELPERS/offset_index.dm @@ -0,0 +1,3 @@ +/// The axis of the `offset_features` list in the species datum +#define INDEX_X 1 +#define INDEX_Y 2 diff --git a/code/__DEFINES/~skyrat_defines/combat.dm b/code/__DEFINES/~skyrat_defines/combat.dm index a8eb98d6990..6ce9519992c 100644 --- a/code/__DEFINES/~skyrat_defines/combat.dm +++ b/code/__DEFINES/~skyrat_defines/combat.dm @@ -19,6 +19,9 @@ //Grab breakout odds #define OVERSIZED_GRAB_RESIST_BONUS 10 /// For those with the oversized trait, they get this. +//Grab breakout bonus for akulas when at 10+ wet_stacks +#define AKULA_GRAB_RESIST_BONUS 10 + // Damage modifiers #define OVERSIZED_HARM_DAMAGE_BONUS 5 /// Those with the oversized trait do 5 more damage. diff --git a/code/__DEFINES/~skyrat_defines/mobs.dm b/code/__DEFINES/~skyrat_defines/mobs.dm index 8fde92fb39d..469f332bbfc 100644 --- a/code/__DEFINES/~skyrat_defines/mobs.dm +++ b/code/__DEFINES/~skyrat_defines/mobs.dm @@ -16,6 +16,7 @@ #define BODYPART_ICON_HUMAN 'modular_skyrat/modules/bodyparts/icons/human_parts_greyscale.dmi' #define BODYPART_ICON_MAMMAL 'modular_skyrat/modules/bodyparts/icons/mammal_parts_greyscale.dmi' #define BODYPART_ICON_AKULA 'modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi' +#define BODYPART_ICON_AQUATIC 'modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi' #define BODYPART_ICON_GHOUL 'modular_skyrat/modules/bodyparts/icons/ghoul_bodyparts.dmi' #define BODYPART_ICON_INSECT 'modular_skyrat/modules/bodyparts/icons/insect_parts_greyscale.dmi' #define BODYPART_ICON_LIZARD 'modular_skyrat/modules/bodyparts/icons/lizard_parts_greyscale.dmi' diff --git a/code/__DEFINES/~skyrat_defines/signals.dm b/code/__DEFINES/~skyrat_defines/signals.dm index 86af4f6913d..1645b301f65 100644 --- a/code/__DEFINES/~skyrat_defines/signals.dm +++ b/code/__DEFINES/~skyrat_defines/signals.dm @@ -59,6 +59,9 @@ ///from base of /obj/effect/abstract/liquid_turf/Initialize() (/obj/effect/abstract/liquid_turf/liquids) #define COMSIG_TURF_LIQUIDS_CREATION "turf_liquids_creation" +/// listens to wet_stacks, if wetting a mob above 10 stacks it will signal the akula race trait to apply its buffs and nerfs +#define COMSIG_MOB_TRIGGER_WET_SKIN "mob_trigger_wet_skin" + //when someone casts their fishing rod #define COMSIG_START_FISHING "start_fishing" //when someone pulls back their fishing rod diff --git a/code/__DEFINES/~skyrat_defines/traits.dm b/code/__DEFINES/~skyrat_defines/traits.dm index f949db61027..f6bfc4fa6f3 100644 --- a/code/__DEFINES/~skyrat_defines/traits.dm +++ b/code/__DEFINES/~skyrat_defines/traits.dm @@ -33,6 +33,15 @@ /// One can breath under water, you get me? #define TRAIT_WATER_BREATHING "water_breathing" +/// The trait which Akulas inherit, for their species mechanic revolving around wet_stacks +#define TRAIT_SLICK_SKIN "slick_skin" +/// The trait which is applied when a `slick skin` trait haver actually gets wet_stacks +#define TRAIT_SLIPPERY "slippery" +/// The minimum amount of tiles a TRAIT_SLIPPERY haver will slide on slip +#define SLIPPERY_MIN 5 +/// The maximum amount of tiles a TRAIT_SLIPPERY haver will slide on slip +#define SLIPPERY_MAX 9 + /// Under the effect of a numbling agent, such as morphine, for surgery. #define TRAIT_NUMBED "numbed" diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index ee7901c5f8d..1fd94e5dbc8 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -370,23 +370,6 @@ mood_change = -1 timeout = 30 SECONDS -//SKYRAT EDIT START: Mainly surgery for now. -/datum/mood_event/mild_surgery - description = "Even if I couldn't feel most of it, it feels wrong being awake while somebody works on your body. Ugh!\n" - mood_change = -1 - timeout = 5 MINUTES - -/datum/mood_event/severe_surgery - description = "Wait, THEY CUT ME OPEN - AND I FELT EVERY SECOND OF IT!\n" - mood_change = -4 - timeout = 15 MINUTES - -/datum/mood_event/robot_surgery - description = "Having my robotic parts messed with while I was conscious felt wrong... if only I had a sleep mode!\n" - mood_change = -4 - timeout = 10 MINUTES -//SKYRAT EDIT END - /datum/mood_event/gamer_withdrawal description = "I wish I was gaming right now..." mood_change = -5 diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 240b9765948..8cc063aa1d1 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -279,6 +279,14 @@ // Stops sliding slide_distance = 0 + // SKYRAT EDIT START - Akula species + if(HAS_TRAIT(slipper, TRAIT_SLIPPERY)) + if(!(lube & SLIDE_ICE)) + lube |= SLIDE + + slide_distance = rand(SLIPPERY_MIN, SLIPPERY_MAX) + // SKYRAT EDIT END + var/obj/buckled_obj if(slipper.buckled) if(!(lube & GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 40fc3c941e5..51d0127aaf8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1133,6 +1133,10 @@ altered_grab_state-- //SKYRAT EDIT END var/resist_chance = BASE_GRAB_RESIST_CHANCE /// see defines/combat.dm, this should be baseline 60% //SKYRAT EDIT ADDITION + // Akula grab resist + if(HAS_TRAIT(src, TRAIT_SLIPPERY)) + resist_chance += AKULA_GRAB_RESIST_BONUS + // Oversized grab resist if(HAS_TRAIT(src, TRAIT_OVERSIZED)) resist_chance += OVERSIZED_GRAB_RESIST_BONUS if(HAS_TRAIT(pulledby, TRAIT_OVERSIZED)) @@ -1140,6 +1144,17 @@ //SKYRAT EDIT END resist_chance = (resist_chance/altered_grab_state) ///Resist chance divided by the value imparted by your grab state. It isn't until you reach neckgrab that you gain a penalty to escaping a grab. if(prob(resist_chance)) + //SKYRAT EDIT ADDITION + // Akula break-out flavor + if(HAS_TRAIT(src, TRAIT_SLIPPERY)) + visible_message(span_cyan("[src] slips free of [pulledby]'s grip!"), \ + span_cyan("You slip free of [pulledby]'s grip!"), null, null, pulledby) + to_chat(pulledby, span_cyan("[src] slips free of your grip!")) + playsound(loc, 'sound/misc/slip.ogg', 50, TRUE, -1) + log_combat(pulledby, src, "broke grab") + pulledby.stop_pulling() + return FALSE + //SKYRAT EDIT END visible_message(span_danger("[src] breaks free of [pulledby]'s grip!"), \ span_danger("You break free of [pulledby]'s grip!"), null, null, pulledby) to_chat(pulledby, span_warning("[src] breaks free of your grip!")) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 2dc654fa7af..77e81cfda81 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -230,6 +230,11 @@ var/image/hair_overlay = image(sprite2.icon, "[sprite2.icon_state]", -HAIR_LAYER, SOUTH) hair_overlay.color = hair_color hair_overlay.alpha = hair_alpha + // SKYRAT ADD - Hair offset + if(LAZYFIND(owner?.dna?.species?.offset_features, OFFSET_HAIR)) + hair_overlay.pixel_x = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_X] + hair_overlay.pixel_y = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_Y] + // SKYRAT ADD END . += hair_overlay @@ -268,8 +273,18 @@ else if(!hair_hidden && hair_overlay && (HAIR in species_flags_list)) hair_overlay.alpha = hair_alpha + // SKYRAT ADD - Hair offset + if(LAZYFIND(owner?.dna?.species?.offset_features, OFFSET_HAIR)) + hair_overlay.pixel_x = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_X] + hair_overlay.pixel_y = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_Y] + // SKYRAT ADD END . += hair_overlay if(hair_gradient_overlay) + // SKYRAT ADD - Hair offset + if(LAZYFIND(owner?.dna?.species?.offset_features, OFFSET_HAIR)) + hair_gradient_overlay.pixel_x = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_X] + hair_gradient_overlay.pixel_y = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_Y] + // SKYRAT ADD END . += hair_gradient_overlay /// Returns an appropriate debrained icon state diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_akula.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_akula.png index 99b989476e8..acb7c061011 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_akula.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_akula.png differ diff --git a/modular_skyrat/master_files/code/datums/mood_events/generic_negative_events.dm b/modular_skyrat/master_files/code/datums/mood_events/generic_negative_events.dm new file mode 100644 index 00000000000..6090b958ab3 --- /dev/null +++ b/modular_skyrat/master_files/code/datums/mood_events/generic_negative_events.dm @@ -0,0 +1,20 @@ +// Species trait debuffs +/datum/mood_event/dry_skin + description = "My skin feels awfully dry...\n" + mood_change = -2 + +// Surgery mood debuffs +/datum/mood_event/mild_surgery + description = "Even if I couldn't feel most of it, it feels wrong being awake while somebody works on your body. Ugh!\n" + mood_change = -1 + timeout = 5 MINUTES + +/datum/mood_event/severe_surgery + description = "Wait, THEY CUT ME OPEN - AND I FELT EVERY SECOND OF IT!\n" + mood_change = -4 + timeout = 15 MINUTES + +/datum/mood_event/robot_surgery + description = "Having my robotic parts messed with while I was conscious felt wrong... if only I had a sleep mode!\n" + mood_change = -4 + timeout = 10 MINUTES diff --git a/modular_skyrat/master_files/code/game/objects/items/encryptionkey.dm b/modular_skyrat/master_files/code/game/objects/items/encryptionkey.dm index cbe17f639b4..793371eff89 100644 --- a/modular_skyrat/master_files/code/game/objects/items/encryptionkey.dm +++ b/modular_skyrat/master_files/code/game/objects/items/encryptionkey.dm @@ -65,6 +65,11 @@ desc = "An encryption key that automatically encodes Siik'tajr heard through the radio into common." translated_language = /datum/language/siiktajr +/obj/item/encryptionkey/translation/akula + name = "\improper Te Velu Akko translation key" + desc = "An encryption key that automatically encodes Te Velu Akko heard through the radio into common." + translated_language = /datum/language/akulan + /obj/item/encryptionkey/translation/terrum name = "\improper Terrum translation key" desc = "An encryption key that automatically encodes Terrum heard through the radio into common." diff --git a/modular_skyrat/master_files/code/modules/clothing/head/akula_official.dm b/modular_skyrat/master_files/code/modules/clothing/head/akula_official.dm new file mode 100644 index 00000000000..b763c0fa076 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/clothing/head/akula_official.dm @@ -0,0 +1,20 @@ +/obj/item/clothing/head/hats/caphat/azulean + icon_state = "oldbloodcap" + icon = 'modular_skyrat/master_files/icons/obj/clothing/head/akula_official.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head/akula_official.dmi' + +/obj/item/clothing/head/hats/caphat/azulean/old_blood + name = "\improper Oldblood's royal cap" + desc = "A peaked cap typically seen on nobles and high-rankers of the Agurkrral Royal Navy, this service hat has a long history in the Old Principalities. \ + Comfortable and lightweight, the purpose of this cap has gradually shifted to becoming yet another method to flex rank. \n\n\ + Threaded gold is often seen in the campaign cords attached to it, and the emblems on them grow more and more complex based on ranking; \ + and of course, importance to the King." + icon_state = "oldbloodcap" + +/obj/item/clothing/head/hats/caphat/azulean/upstart + name = "\improper Upstart's noble cap" + desc = "A peaked cap widely seen across the New Principalities. \n\ + Combining ideas from both the NRI and the Old Principalities, this cloneleather cap was made to be both inexpensive and easier to maintain than the elaborate headpieces worn by the older nobility. \ + Border princes of all make and model are known to put their own personal emblems on these instead of any coherent ranking system, \ + and the cap features a wider brim in order to shield Azulean eyes from the alien suns they intend to grasp." + icon_state = "upstartcap" diff --git a/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm b/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm new file mode 100644 index 00000000000..ebbabeea7a4 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm @@ -0,0 +1,82 @@ +/// A space-worthy skinsuit to be combined with the skinsuit armor +/obj/item/clothing/under/skinsuit + name = "\improper Voidcrosser stardress" + desc = "The 'Voidcrosser'-pattern Stardress is a long-standing template upon which most Azulean spacesuits are made. \n\ + This EVA suit is a single skintight garment, designed for flexibility and maneuverability while using jetpacks or any sort of thruster; \ + Azuleans preferring to use more familiar swimming motions than most EVA workers. The 'Voidcrosser' applies similar technologies to traditional Shoredresses, \ + utilizing high-tech fabrics and water pumps to exert pressure over the Azulean's body. \n\n\ + An attached Shoredress helm is often used in conjunction with a third-party oxygen supply to allow one to breathe, \ + and open pores in the suit allow the body to be cooled by the perspiration of internal water. \n\ + These suits are reputable among orbital workers for having very little interference with movement, and easy storage by simply folding them inside of any bubble-shaped helmet." + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi' + icon_state = "skinsuit" + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + armor_type = /datum/armor/wetsuit_under + cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF + resistance_flags = NONE + female_sprite_flags = NO_FEMALE_UNIFORM + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/under/skinsuit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wetsuit) + +/obj/item/clothing/under/skinsuit/Destroy() + . = ..() + qdel(GetComponent(/datum/component/wetsuit)) + +/obj/item/clothing/head/helmet/space/skinsuit_helmet + name = "\improper Stardress helm" + desc = "A reinforced type of 'Glass' often used particularly by Azulean boarding teams, this offshoot of the ones seen in Shoredresses is built to last. \n\ + These make use of laminated glass rather than the typical 'flexiglass' of civilian models, allowing them not only durability, but to hold together when a shatter does occur; \ + and for what remains to stay in the frame. These are typically made of up to four layers of the stuff, working unintentionally to ensure the faces of their wearers are difficult to identify. \n\n\ + In addition, the interlayer gives the helms sound insulation properties, and the ability to block UV radiation. \ + These helmets are known for being distinctly uncomfortable in comparison to their civilian counterparts; cramped and with only the most barebones climate control tech." + icon = 'modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi' + icon_state = "skinsuithelmet" + +/obj/item/clothing/head/helmet/space/skinsuit_helmet/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wetsuit) + +/obj/item/clothing/head/helmet/space/skinsuit_helmet/Destroy() + . = ..() + qdel(GetComponent(/datum/component/wetsuit)) + +/obj/item/clothing/suit/armor/riot/skinsuit_armor + name = "\improper Shorebreaker plating" + desc = "'Shorebreaker'-pattern Stardress plating was developed for Azulean boarding teams in service of the New Principalities. \ + Kept resilient and maneuverable, Shorebreaker armor is built predominantly close-quarters breaching. \n\n\ + Having sparse plating around the wearer's arms and legs, boarding teams are encouraged after their pod lands to do one thing: \ + make use of their rapid movement, and render their enemies past tense. The armor is relatively hardy against ranged weapons, \ + but the alloys involved are primarily constructed around resisting strikes from boarding axes, lances, and other common pirate-repellant weapons." + icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/akula.dmi' + icon_state = "skinsuitarmor" + base_icon_state = "skinsuitarmor" + + +/obj/item/clothing/suit/armor/riot/skinsuit_armor/equipped(mob/user, slot) + . = ..() + if(slot != ITEM_SLOT_ICLOTHING) + return + + check_tail(user) + update_appearance() + +/obj/item/clothing/suit/armor/riot/skinsuit_armor/dropped(mob/user) + . = ..() + check_tail(user) + update_appearance() + +/// Pick an icon_state that matches nicer with tails if one is found on the wearer +/obj/item/clothing/suit/armor/riot/skinsuit_armor/proc/check_tail(mob/living/carbon/human/user) + icon_state = base_icon_state + if(!user.dna.species.mutant_bodyparts["tail"]) + return + + icon_state = "skinsuitarmor_cutback" diff --git a/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm b/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm new file mode 100644 index 00000000000..370e51ff457 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm @@ -0,0 +1,284 @@ +/// The DMI containing the tail overlay sprites +#define TAIL_OVERLAY_DMI 'modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi' +/// The proper layer to render the tail overlays onto +#define TAIL_OVERLAY_LAYER 5.9 + +/obj/item/clothing/under/akula_wetsuit + name = "Shoredress wetsuit" + desc = "The 'Wetworks'-pattern Shoredress is a long-standing template upon which most Azulean 'wetsuits' are made. \ + This atmospheric exploration suit is a single form-fitting garment, designed to keep wearers comfortable in the harsh environment of dry land; \ + even sometimes worn underneath orbital suits such as MODs. \n\n\ + Shoredresses apply active thermal channels and motion-powered micropumps to allow for water of the wearer's temperature choice to circulate; \ + ensuring ample flow over not only the gills, but the rest of the wearer's skin, at the cost of occasional movement being needed when the wearer is still. \n\ + These suits are known to come with luminescent panels that take on a bright glow when underwater, meant for signalling as well as higher visibility in deep waters. \ + The system is meant to only be able to process water, fresh or otherwise; but unofficially, \ + a great many chemicals or even drinks have been loaded in by adventurous or careless explorers of the New Principalities-- at fantastic personal risk to their gills. " + icon_state = "default" + base_icon_state = "default" + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi' + armor_type = /datum/armor/wetsuit_under + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + can_adjust = FALSE + female_sprite_flags = NO_FEMALE_UNIFORM + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + /// If an akula tail accessory is present, we can overlay an additional icon + var/tail_overlay + + +/obj/item/clothing/under/akula_wetsuit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wetsuit) + update_appearance() + +/obj/item/clothing/under/akula_wetsuit/Destroy() + . = ..() + var/mob/user = loc + if(!istype(user)) + return + + if(tail_overlay) + user.cut_overlay(tail_overlay) + tail_overlay = null + + qdel(GetComponent(/datum/component/wetsuit)) + +/obj/item/clothing/under/akula_wetsuit/equipped(mob/user, slot) + . = ..() + if(slot != ITEM_SLOT_ICLOTHING) + return + + check_physique(user) + add_tail_overlay(user) + update_appearance() + +/obj/item/clothing/under/akula_wetsuit/dropped(mob/user) + . = ..() + if(tail_overlay) + user.cut_overlay(tail_overlay) + tail_overlay = null + + update_appearance() + +/// This will check the wearer's bodytype and change the wetsuit worn sprite according to if its male/female +/obj/item/clothing/under/akula_wetsuit/proc/check_physique(mob/living/carbon/human/user) + icon_state = base_icon_state + if(user.physique == FEMALE) + icon_state = "[icon_state]_f" + return TRUE + +/// If the wearer has a compatible tail for the `tail_overlay` variable, render it +/obj/item/clothing/under/akula_wetsuit/proc/add_tail_overlay(mob/living/carbon/human/user) + if(!user.dna.species.mutant_bodyparts["tail"]) + return + + var/tail = user.dna.species.mutant_bodyparts["tail"][MUTANT_INDEX_NAME] + switch(tail) + if("Akula") + tail_overlay = mutable_appearance(TAIL_OVERLAY_DMI, "overlay_akula", -(TAIL_OVERLAY_LAYER)) + if("Shark") + tail_overlay = mutable_appearance(TAIL_OVERLAY_DMI, "overlay_shark", -(TAIL_OVERLAY_LAYER)) + if("Shark (No Fin)") + tail_overlay = mutable_appearance(TAIL_OVERLAY_DMI, "overlay_shark_no_fin", -(TAIL_OVERLAY_LAYER)) + if("Fish") + tail_overlay = mutable_appearance(TAIL_OVERLAY_DMI, "overlay_fish", -(TAIL_OVERLAY_LAYER)) + else + tail_overlay = null + + if(tail_overlay) + user.add_overlay(tail_overlay) + + /// Suit armor +/datum/armor/wetsuit_under + bio = 10 + wound = 5 + +/obj/item/clothing/under/akula_wetsuit/job + /// Our large examine text + var/extended_desc = "The 'Wetworks'-pattern Shoredress is a long-standing template upon which most Azulean 'wetsuits' are made. \ + This atmospheric exploration suit is a single form-fitting garment, designed to keep wearers comfortable in the harsh environment of dry land; \ + even sometimes worn underneath orbital suits such as MODs. \n\n\ + Shoredresses apply active thermal channels and motion-powered micropumps to allow for water of the wearer's temperature choice to circulate; \ + ensuring ample flow over not only the gills, but the rest of the wearer's skin, at the cost of occasional movement being needed when the wearer is still. \n\ + These suits are known to come with luminescent panels that take on a bright glow when underwater, meant for signalling as well as higher visibility in deep waters. \ + The system is meant to only be able to process water, fresh or otherwise; but unofficially, \ + a great many chemicals or even drinks have been loaded in by adventurous or careless explorers of the New Principalities-- at fantastic personal risk to their gills." + +/obj/item/clothing/under/akula_wetsuit/job/examine(mob/user) + . = ..() + . += span_notice("This item could be examined further...") + +/obj/item/clothing/under/akula_wetsuit/job/examine_more(mob/user) + . = ..() + . += extended_desc + +/obj/item/clothing/under/akula_wetsuit/job/engineering + name = "engineer Shoredress wetsuit" + desc = "The 'Engineering'-Type Shoredress is a ubiquitous model used by a wide variety of companies, only hardly changed from its' original Azulean design. \n\ + The luminescent panels on the arms have been given higher flow of power for greater visibility, and the entire suit has been focused \ + first and foremost on the incorporation of heat-resistant alloys and skintight heatsinks to protect against fires. \n\ + Additionally, the materials used to construct this wetsuit have rendered it extremely hardy against corrosive liquids and gasses." + icon_state = "engi" + base_icon_state = "engi" + armor_type = /datum/armor/wetsuit_under/engineering + +/datum/armor/wetsuit_under/engineering + fire = 95 + acid = 95 + +/obj/item/clothing/under/akula_wetsuit/job/cargo + name = "cargo Shoredress wetsuit" + desc = "The 'Cargo'-Type Shoredress was made as a partnership between the Free Trade Union and the New Principalities of Agurkrral, predominantly \ + designed for comfort. \n\ + Warehouse workers on land and sea are treated to low-powered actuators meant to help distribute heavy loads when lifting, \ + and the plush interior of 'Medical'-Type Shoredresses has been expanded on three times over to ensure maximum cushioning for the wearer's body. \n\n\ + Systems around the neck are capable of slightly flavoring any Shoredress Glasses with over five hundred different choices, \ + and the temperature-control pumps are some of the best available to those that aren't royalty." + icon_state = "cargo" + base_icon_state = "cargo" + armor_type = /datum/armor/wetsuit_under/cargo + +/datum/armor/wetsuit_under/cargo + fire = 40 + +/obj/item/clothing/under/akula_wetsuit/job/science + name = "science Shoredress wetsuit" + desc = "The 'Science'-Type Shoredress is yet another model commissioned by NanoTrasen. This suit has been adapted from 'Ordnance'-Type Shoredresses \ + used in the New Principalities predominantly by mining teams. \n\ + It is made of a special polymer that provides some minor protection against explosives \ + such as abandoned naval or land-based mines, and features an inbuilt external sterilization field to protect against biohazards typically found in strange places." + icon_state = "sci" + base_icon_state = "sci" + armor_type = /datum/armor/wetsuit_under/science + +/datum/armor/wetsuit_under/science + bomb = 40 + acid = 95 + +/obj/item/clothing/under/akula_wetsuit/job/medical + name = "medical Shoredress wetsuit" + desc = "The 'Medical'-Type Shoredress is yet another model commissioned by NanoTrasen. This suit has been adapted from exploration \ + Shoredresses meant for use in murky or even outright toxic environments, being predominantly composed of self-sterilizing polymers with \ + a system able to filter out all sorts of hazardous particles in the air or water including fumes, smoke, allergens, or ocean-bound toxins. \n\ + This has made it convenient for the Company's medical division, let alone the plush interior to allow for greater comfortable standing hours." + icon_state = "medical" + base_icon_state = "medical" + armor_type = /datum/armor/wetsuit_under/medical + +/datum/armor/wetsuit_under/medical + acid = 95 + bio = 95 + +/obj/item/clothing/under/akula_wetsuit/job/security + name = "security Shoredress wetsuit" + desc = "The 'Security'-Type Shoredress is a model commissioned by Lopland; but the origins of this wetsuit lie in designs belonging to \ + rank-and-file warriors and fighters in the New Principalities. Designed to be protective over comfortable, these suits are no true \ + replacement for true armor, but make an excellent undersuit for even civilian plate carriers. \n\ + The systems inside have been reinforced to their logical endpoint, though their temperatures -- much like the attitude of their wearers, tends to run a bit hot due to a possible manufacturing defect." + icon_state = "sec" + base_icon_state = "sec" + armor_type = /datum/armor/rank_security + +/obj/item/clothing/under/akula_wetsuit/job/command + name = "command Shoredress wetsuit" + desc = "The 'Command'-Type Shoredress is yet another model commissioned by NanoTrasen; but the origins of this wetsuit lie in designs belonging to, \ + typically, high-ranking officials and managers in the Old Principalities. \n\ + The bright luminescent panels on the arms have been further set apart by similar paneling on the chest, meant to ensure the wearer looks distinct both in the water, on land, and even on camera. \n\ + The temperature systems have been upgraded, as well as the choice to use more comfortable fabrics in the construction." + icon_state = "command" + base_icon_state = "command" + + +/obj/item/clothing/head/helmet/space/akula_wetsuit + name = "\improper Shoredress helm" + desc = "Known simply as a 'Glass' throughout Azulean society as a whole, these spheroidal helmets are often the main source of comfort for workers on land; domestic and abroad. \ + More advanced than humans would ever give them credit for, a Shoredress's Glass is a piece of technology unto itself. \n\n\ + These helmets employ a near-invisible system of cameras and sensors to prevent refraction from the water kept inside. \ + The 'flexiglass' glass comprising the unit is chemically strengthened to be thin, light, and damage-resistant, but capable of bending even in half without shattering; all to allow you to touch your face. \n\ + Some have taken to putting electronic displays around the face to help express emotion, or to signal nonverbally. \ + These helms are normally attached to Shoredresses or Stardresses, but comes with a fitted neoprene collar to allow wear on essentially anything." + icon = 'modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi' + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT | HEADINTERNALS + icon_state = "helmet" + inhand_icon_state = "helmet" + strip_delay = 6 SECONDS + armor_type = /datum/armor/wetsuit_helmet + resistance_flags = FIRE_PROOF + /// Variable for storing hats which are worn inside the bubble helmet + var/obj/item/clothing/head/attached_hat + flags_inv = null + flags_cover = HEADCOVERSMOUTH | PEPPERPROOF + + /// Helmet armor +/datum/armor/wetsuit_helmet + bio = 100 + fire = 100 + +/obj/item/clothing/head/helmet/space/akula_wetsuit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wetsuit) + update_appearance() + +/obj/item/clothing/head/helmet/space/akula_wetsuit/Destroy() + . = ..() + var/mob/user = loc + if(attached_hat) + attached_hat.forceMove(drop_location()) + + if(!istype(user)) + return + + qdel(GetComponent(/datum/component/wetsuit)) + +// Wearing hats inside the wetworks helmet +/obj/item/clothing/head/helmet/space/akula_wetsuit/examine() + . = ..() + if(attached_hat) + . += span_notice("There's [attached_hat] placed in the helmet.") + . += span_bold("Right-click to remove it.") + else + . += span_notice("There's nothing placed in the helmet.") + +/obj/item/clothing/head/helmet/space/akula_wetsuit/attackby(obj/item/hitting_item, mob/living/user) + . = ..() + if(!istype(hitting_item, /obj/item/clothing/head)) + return + var/obj/item/clothing/hitting_hat = hitting_item + if(hitting_hat.clothing_flags & PLASMAMAN_HELMET_EXEMPT) + balloon_alert(user, "doesn't fit!") + return + if(attached_hat) + balloon_alert(user, "already something inside!") + return + + attached_hat = hitting_hat + balloon_alert(user, "[hitting_hat] put inside") + hitting_hat.forceMove(src) + icon_state = "empty" + update_appearance() + +/obj/item/clothing/head/helmet/space/akula_wetsuit/worn_overlays(mutable_appearance/standing, isinhands) + . = ..() + if(!attached_hat || isinhands) + return + + var/mutable_appearance/attached_hat_appearance = mutable_appearance(attached_hat.worn_icon, attached_hat.icon_state, -(HEAD_LAYER-0.1)) + attached_hat_appearance.add_overlay(mutable_appearance(worn_icon, "helmet", -HEAD_LAYER)) + . += attached_hat_appearance + + +/obj/item/clothing/head/helmet/space/akula_wetsuit/attack_hand_secondary(mob/user) + ..() + if(!attached_hat) + return + + user.put_in_active_hand(attached_hat) + balloon_alert(user, "[attached_hat] removed") + attached_hat = null + icon_state = "helmet" + update_appearance() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +#undef TAIL_OVERLAY_DMI +#undef TAIL_OVERLAY_LAYER diff --git a/modular_skyrat/master_files/code/modules/clothing/under/akula_official.dm b/modular_skyrat/master_files/code/modules/clothing/under/akula_official.dm new file mode 100644 index 00000000000..faaba2f476b --- /dev/null +++ b/modular_skyrat/master_files/code/modules/clothing/under/akula_official.dm @@ -0,0 +1,35 @@ +/obj/item/clothing/under/rank/azulean + icon_state = "oldblood" + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi' + female_sprite_flags = NO_FEMALE_UNIFORM + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/under/rank/azulean/old_blood + name = "\improper Agurkrral Oldblood's royal regalia" + desc = "A service dress uniform of the Old Principalities of Agurkrral, a fashion shared by the majority of the nobility. \ + These outfits are known to normally be accessorized with gold trims and other rare metals, \ + constructed and treated specially for use in underwater environments; the dwellings of most of the crown's old guard. \n\n\ + Actual fish-leather is often used for the subtle pattern of scaling, and to ensure proper hydrodynamics while swimming. \ + Due to being constructed for comfort and flash rather than practicality, the technology used in Shoredresses to hydrate the wearer could not be implemented; \ + only a mount for a Shoredress's helm." + icon_state = "oldblood" + +/obj/item/clothing/under/rank/azulean/old_blood/skirt + name = "\improper Agurkrral Oldblood's royal regalia" + icon_state = "oldblood_skirt" + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + +/obj/item/clothing/under/rank/azulean/upstart + name = "\improper Agurkrral Upstart's noble getup" + desc = "Patterned off the dress uniforms of the Old Principalities, this sort of style belongs to the border princes of the New Principalities. \ + These outfits rebuke tradition to incorporate the use of imported leather, using reinforced clasps instead of shiny golden buttons. \n\n\ + Few decorations are normally seen in these clothing, owing to the tendency of their wearers to 'gallivant.' \ + Due to being constructed for a degree of expendability, the technology used in Shoredresses to hydrate the wearer is \ + an extremely rare sight in these outfits; only the mount for a Shoredress's helm." + icon_state = "upstart" + +/obj/item/clothing/under/rank/azulean/upstart/skirt + name = "\improper Agurkrral Upstart's noble getup" + icon_state = "upstart_skirt" + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/_job.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/_job.dm index 6340f10676f..c8fae95ee49 100644 --- a/modular_skyrat/master_files/code/modules/jobs/job_types/_job.dm +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/_job.dm @@ -1,2 +1,5 @@ /datum/job + /// The job's outfit that will be assigned for Vox var/vox_outfit = null + /// The job's outfit that will be assigned for Akula + var/akula_outfit = null diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/_job_attire.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/_job_attire.dm new file mode 100644 index 00000000000..a5de93b45dc --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/_job_attire.dm @@ -0,0 +1,183 @@ +// For now its just Akulas +/datum/job/assistant + akula_outfit = /datum/outfit/akula/assistant + +/datum/job/atmospheric_technician + akula_outfit = /datum/outfit/akula/station_engineer + +/datum/job/bartender + akula_outfit = /datum/outfit/akula + +/datum/job/botanist + akula_outfit = /datum/outfit/akula + +/datum/job/captain + akula_outfit = /datum/outfit/akula/command + +/datum/job/cargo_technician + akula_outfit = /datum/outfit/akula/cargo_technician + +/datum/job/chaplain + akula_outfit = /datum/outfit/akula + +/datum/job/chemist + akula_outfit = /datum/outfit/akula + +/datum/job/chief_engineer + akula_outfit = /datum/outfit/akula/station_engineer + +/datum/job/chief_medical_officer + akula_outfit = /datum/outfit/akula/doctor + +/datum/job/clown + akula_outfit = /datum/outfit/akula + +/datum/job/cook + akula_outfit = /datum/outfit/akula + +/datum/job/curator + akula_outfit = /datum/outfit/akula + +/datum/job/detective + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/geneticist + akula_outfit = /datum/outfit/akula/scientist + +/datum/job/head_of_personnel + akula_outfit = /datum/outfit/akula/command + +/datum/job/head_of_security + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/janitor + akula_outfit = /datum/outfit/akula + +/datum/job/lawyer + akula_outfit = /datum/outfit/akula + +/datum/job/doctor + akula_outfit = /datum/outfit/akula/doctor + +/datum/job/mime + akula_outfit = /datum/outfit/akula + +/datum/job/paramedic + akula_outfit = /datum/outfit/akula/doctor + +/datum/job/prisoner + akula_outfit = /datum/outfit/akula + +/datum/job/quartermaster + akula_outfit = /datum/outfit/akula/cargo_technician + +/datum/job/research_director + akula_outfit = /datum/outfit/akula/scientist + +/datum/job/roboticist + akula_outfit = /datum/outfit/akula/scientist + +/datum/job/scientist + akula_outfit = /datum/outfit/akula/scientist + +/datum/job/security_officer + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/shaft_miner + akula_outfit = /datum/outfit/akula + +/datum/job/station_engineer + akula_outfit = /datum/outfit/akula/station_engineer + +/datum/job/virologist + akula_outfit = /datum/outfit/akula/doctor + +/datum/job/warden + akula_outfit = /datum/outfit/akula/security_officer + +// Im not certain if having these matter +/datum/job/syndicate_cybersun_captain + akula_outfit = /datum/outfit/akula + +/datum/job/syndicate_cybersun + akula_outfit = /datum/outfit/akula + +/datum/job/battlecruiser_captain + akula_outfit = /datum/outfit/akula + +/datum/job/battlecruiser_crew + akula_outfit = /datum/outfit/akula + +/datum/job/hotel_staff + akula_outfit = /datum/outfit/akula + +/datum/job/escaped_prisoner + akula_outfit = /datum/outfit/akula + +/datum/job/space_syndicate + akula_outfit = /datum/outfit/akula + +/datum/job/space_bar_patron + akula_outfit = /datum/outfit/akula + +/datum/job/exile + akula_outfit = /datum/outfit/akula + +/datum/job/beach_bum + akula_outfit = /datum/outfit/akula + +/datum/job/hermit + akula_outfit = /datum/outfit/akula + +// Modular jobs +/datum/job/blueshield + akula_outfit = /datum/outfit/akula + +/datum/job/nanotrasen_consultant + akula_outfit = /datum/outfit/akula + +/datum/job/barber + akula_outfit = /datum/outfit/akula + +/datum/job/corrections_officer + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/orderly + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/science_guard + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/customs_agent + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/bouncer + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/engineering_guard + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/fleetmaster + akula_outfit = /datum/outfit/akula + +/datum/job/operations_inspector + akula_outfit = /datum/outfit/akula + +/datum/job/deck_crew + akula_outfit = /datum/outfit/akula + +/datum/job/bridge_officer + akula_outfit = /datum/outfit/akula + +/datum/job/freighter_crew + akula_outfit = /datum/outfit/akula + +/datum/job/tarkon + akula_outfit = /datum/outfit/akula + +/datum/job/blackmarket + akula_outfit = /datum/outfit/akula + +/datum/job/ds2 + akula_outfit = /datum/outfit/akula + diff --git a/modular_skyrat/master_files/code/modules/language/language_holder.dm b/modular_skyrat/master_files/code/modules/language/language_holder.dm index 6e90b80ba54..cf85ac7bad1 100644 --- a/modular_skyrat/master_files/code/modules/language/language_holder.dm +++ b/modular_skyrat/master_files/code/modules/language/language_holder.dm @@ -83,7 +83,8 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language/terrum = list(LANGUAGE_ATOM), /datum/language/sylvan = list(LANGUAGE_ATOM), /datum/language/siiktajr = list(LANGUAGE_ATOM), - /datum/language/canilunzt = list(LANGUAGE_ATOM) + /datum/language/canilunzt = list(LANGUAGE_ATOM), + /datum/language/akulan = list(LANGUAGE_ATOM) ) spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/uncommon = list(LANGUAGE_ATOM), @@ -110,6 +111,7 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language/terrum = list(LANGUAGE_ATOM), /datum/language/sylvan = list(LANGUAGE_ATOM), /datum/language/siiktajr = list(LANGUAGE_ATOM), - /datum/language/canilunzt = list(LANGUAGE_ATOM) + /datum/language/canilunzt = list(LANGUAGE_ATOM), + /datum/language/akulan = list(LANGUAGE_ATOM) ) diff --git a/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species.dm b/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species.dm index a4fc43f6f36..e3c87270afc 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species.dm @@ -11,3 +11,22 @@ /// Adding a language type to this in the form of /datum/language will allow the language to be displayed in preferences for that species, even if it is a secret language. /// Currently used for ashtongue in ashwalkers. var/list/language_prefs_whitelist + ///Clothing offsets. If a species has a different body than other species, you can offset clothing so they look less weird. + var/list/offset_features = list( + OFFSET_UNIFORM = list(0,0), + OFFSET_ID = list(0,0), + OFFSET_GLOVES = list(0,0), + OFFSET_GLASSES = list(0,0), + OFFSET_EARS = list(0,0), + OFFSET_SHOES = list(0,0), + OFFSET_S_STORE = list(0,0), + OFFSET_FACEMASK = list(0,0), + OFFSET_HEAD = list(0,0), + OFFSET_FACE = list(0,0), + OFFSET_BELT = list(0,0), + OFFSET_BACK = list(0,0), + OFFSET_SUIT = list(0,0), + OFFSET_NECK = list(0,0), + OFFSET_ACCESSORY = list(0, 0), + OFFSET_HAIR = list(0, 0), + ) diff --git a/modular_skyrat/master_files/icons/misc/language.dmi b/modular_skyrat/master_files/icons/misc/language.dmi index 94169b0ada6..b6af8960841 100644 Binary files a/modular_skyrat/master_files/icons/misc/language.dmi and b/modular_skyrat/master_files/icons/misc/language.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/body_markings/akula_markings.dmi b/modular_skyrat/master_files/icons/mob/body_markings/akula_markings.dmi new file mode 100644 index 00000000000..eb85e94098d Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/body_markings/akula_markings.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi b/modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi new file mode 100644 index 00000000000..0a126826c75 Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/head/akula_official.dmi b/modular_skyrat/master_files/icons/mob/clothing/head/akula_official.dmi new file mode 100644 index 00000000000..ff3d693439a Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/head/akula_official.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/suits/akula.dmi b/modular_skyrat/master_files/icons/mob/clothing/suits/akula.dmi new file mode 100644 index 00000000000..c565785da0c Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/suits/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi new file mode 100644 index 00000000000..6a6eccfa8a8 Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi index 24275dcdf09..df2e12adf8b 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi b/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi index 80cd4284997..0becc238d51 100644 Binary files a/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi and b/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi b/modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi new file mode 100644 index 00000000000..2c3c2836796 Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/head/akula_official.dmi b/modular_skyrat/master_files/icons/obj/clothing/head/akula_official.dmi new file mode 100644 index 00000000000..43fe78e0981 Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/clothing/head/akula_official.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/suits/akula.dmi b/modular_skyrat/master_files/icons/obj/clothing/suits/akula.dmi new file mode 100644 index 00000000000..57c5e3efe6d Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/clothing/suits/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi b/modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi new file mode 100644 index 00000000000..e7096dd2c77 Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi b/modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi index 1c0903c37a3..a54bb2a29a6 100644 Binary files a/modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi and b/modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi differ diff --git a/modular_skyrat/modules/aesthetics/flag/code/signs_flags.dm b/modular_skyrat/modules/aesthetics/flag/code/signs_flags.dm index 5e3170797de..e8e4a431989 100644 --- a/modular_skyrat/modules/aesthetics/flag/code/signs_flags.dm +++ b/modular_skyrat/modules/aesthetics/flag/code/signs_flags.dm @@ -70,6 +70,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/nri, 32) +/obj/structure/sign/flag/azulea + name = "flag of the Azulean Nation" + desc = "The foundations of this banner stretch back almost a millennium, devised by the first King among the Azulean people to unite them under it. \n\ + Dark blue, representing the seas of Azulean worlds, and light blue, representing the seas inbetween. \ + Both make waves on each other, but both are pulled in and swallowed by all of the people of Agurkrral coming together as one; as one violent, restless maelstrom. \n\n\ + It's common to see this banner just about everywhere in both the Old and New Principalities, reminding all of their purpose and unity." + icon_state = "flag_azulea" + item_flag = /obj/item/sign/flag/azulea + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/azulea, 32) + /// Please, for the love of God, use this in Black Mesa ONLY. NOWHERE ELSE. It's the only reason it was allowed in the game. /obj/structure/sign/flag/usa name = "flag of the United States of America" @@ -148,6 +159,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/syndicate, 32) icon_state = "folded_nri" sign_path = /obj/structure/sign/flag/nri +/obj/item/sign/flag/azulea + name = "folded flag of Azulea" + desc = "The folded flag of the Akulan nation Azulea." + icon_state = "folded_azulea" + sign_path = /obj/structure/sign/flag/azulea + /// Please, for the love of God, use this in Black Mesa ONLY. NOWHERE ELSE. It's the only reason it was allowed in the game. /obj/item/sign/flag/usa name = "folded flag of the United States of America" diff --git a/modular_skyrat/modules/aesthetics/flag/icons/flags.dmi b/modular_skyrat/modules/aesthetics/flag/icons/flags.dmi index f9904caef13..4d2c7bd471a 100644 Binary files a/modular_skyrat/modules/aesthetics/flag/icons/flags.dmi and b/modular_skyrat/modules/aesthetics/flag/icons/flags.dmi differ diff --git a/modular_skyrat/modules/akula/code/wetsuit.dm b/modular_skyrat/modules/akula/code/wetsuit.dm new file mode 100644 index 00000000000..07135607096 --- /dev/null +++ b/modular_skyrat/modules/akula/code/wetsuit.dm @@ -0,0 +1,41 @@ +/// How many wetstacks does the clothing's status effect apply to its wearer +#define STATUS_EFFECT_STACKS 5 + +/datum/component/wetsuit + dupe_mode = COMPONENT_DUPE_UNIQUE + +/datum/component/wetsuit/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(apply_wetsuit_status_effect)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(remove_wetsuit_status_effect)) + +/datum/component/wetsuit/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + )) + +/// A proc for all akula clothing which has the 'special tech' to keep their wearers slippery +/datum/component/wetsuit/proc/apply_wetsuit_status_effect(obj/item/source, mob/living/user, slot) + if(slot == ITEM_SLOT_HANDS) + return FALSE + if(!HAS_TRAIT(user, TRAIT_SLICK_SKIN)) + return FALSE + + user.apply_status_effect(/datum/status_effect/grouped/wetsuit, REF(source)) + +/// A proc to remove the wetsuit status effect +/datum/component/wetsuit/proc/remove_wetsuit_status_effect(obj/item/source, mob/living/user, slot) + user.remove_status_effect(/datum/status_effect/grouped/wetsuit, REF(source)) + +/// The status effect which `apply_wetsuit_status_effect` gives +/datum/status_effect/grouped/wetsuit + id = "wetsuit" + alert_type = null + tick_interval = 10 SECONDS + +/datum/status_effect/grouped/wetsuit/tick() + owner.set_wet_stacks(STATUS_EFFECT_STACKS) + +#undef STATUS_EFFECT_STACKS diff --git a/modular_skyrat/modules/bodyparts/code/akula_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/akula_bodyparts.dm index 7d48f7fddb9..afb1233b783 100644 --- a/modular_skyrat/modules/bodyparts/code/akula_bodyparts.dm +++ b/modular_skyrat/modules/bodyparts/code/akula_bodyparts.dm @@ -2,6 +2,7 @@ /obj/item/bodypart/head/mutant/akula icon_greyscale = BODYPART_ICON_AKULA limb_id = SPECIES_AKULA + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUTED /obj/item/bodypart/chest/mutant/akula icon_greyscale = BODYPART_ICON_AKULA @@ -18,17 +19,7 @@ /obj/item/bodypart/leg/left/mutant/akula icon_greyscale = BODYPART_ICON_AKULA limb_id = SPECIES_AKULA - digitigrade_type = /obj/item/bodypart/leg/left/digitigrade/akula /obj/item/bodypart/leg/right/mutant/akula icon_greyscale = BODYPART_ICON_AKULA limb_id = SPECIES_AKULA - digitigrade_type = /obj/item/bodypart/leg/right/digitigrade/akula - -/obj/item/bodypart/leg/left/digitigrade/akula - icon_greyscale = BODYPART_ICON_AKULA - base_limb_id = SPECIES_AKULA - -/obj/item/bodypart/leg/right/digitigrade/akula - icon_greyscale = BODYPART_ICON_AKULA - base_limb_id = SPECIES_AKULA diff --git a/modular_skyrat/modules/bodyparts/code/aquatic_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/aquatic_bodyparts.dm new file mode 100644 index 00000000000..4cbd97838c9 --- /dev/null +++ b/modular_skyrat/modules/bodyparts/code/aquatic_bodyparts.dm @@ -0,0 +1,33 @@ +// Akulas! +/obj/item/bodypart/head/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUTED + +/obj/item/bodypart/chest/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + +/obj/item/bodypart/arm/left/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + +/obj/item/bodypart/arm/right/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + +/obj/item/bodypart/leg/left/digitigrade/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + +/obj/item/bodypart/leg/right/digitigrade/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + +/obj/item/bodypart/leg/left/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + digitigrade_type = /obj/item/bodypart/leg/left/digitigrade/aquatic + +/obj/item/bodypart/leg/right/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + digitigrade_type = /obj/item/bodypart/leg/right/digitigrade/aquatic diff --git a/modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi b/modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi index 68cc71e5cc0..323178aff36 100644 Binary files a/modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi and b/modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi differ diff --git a/modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi b/modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi new file mode 100644 index 00000000000..a2bb6891a5e Binary files /dev/null and b/modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi differ diff --git a/modular_skyrat/modules/customization/modules/clothing/outfits/akula.dm b/modular_skyrat/modules/customization/modules/clothing/outfits/akula.dm new file mode 100644 index 00000000000..739e4675477 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/clothing/outfits/akula.dm @@ -0,0 +1,38 @@ +/datum/outfit/akula + name = "Akula" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + +/datum/outfit/akula/assistant + name = "Akula Assistant" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit + +/datum/outfit/akula/station_engineer + name = "Akula Engineer" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/engineering + +/datum/outfit/akula/cargo_technician + name = "Akula Cargo-Technician" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/cargo + +/datum/outfit/akula/scientist + name = "Akula Scientist" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/science + +/datum/outfit/akula/doctor + name = "Akula Doctor" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/medical + +/datum/outfit/akula/security_officer + name = "Akula Security-Officer" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/security + +/datum/outfit/akula/command + name = "Akula Command" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/command diff --git a/modular_skyrat/modules/customization/modules/language/te_velu_akko.dm b/modular_skyrat/modules/customization/modules/language/te_velu_akko.dm new file mode 100644 index 00000000000..c7a94272aa1 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/language/te_velu_akko.dm @@ -0,0 +1,24 @@ +/datum/language/akulan + name = "Te Velu Akko" + desc = "Translating to 'The Song of The King,' this language was singlehandedly invented and promulgated by the third King of Agurkrral, Akko the Uniter. \ + Records show that the King had personally created it so that those with little education, including aliens, could integrate easier with Azulean society. \ + To this end, the language is known for its rapid pace of learning, the written portion being readily mastered within two weeks, a tongue characterized by hard consonants followed by soft vowel strings. \ + An underwater component exists, fleshed out and codified by deepwater reformists in the later portions of Akko the Uniter's life; featuring great emphasis on close physical proximity, variations of pitch, high-frequency sounds, and clicking. \ + Alien tourists frequently either seek temporary genemods, or specialized organisms that dwell in the throat to be able to speak this portion., \n\n\ + Differences exist in dialect between the Old Principalities and New Principalities; \ + The Old sounds far slower and smoother, words flowing into each other in a very melodic way; befitting of the language's name. \ + The New is much faster, more harsh, and more aggressive in an attempt to be more efficient; however, rapidly adopting new loanwords from alien tongues. \ + A common greeting no matter where one is in Agurkrral is to essentially bump noses, allowing the other Azulean to feel the speaker's bioelectric field." + + + key = "Z" + flags = TONGUELESS_SPEECH + space_chance = 70 + // Syllables derived from the Maori language. + syllables = list ( + "ā", "ē", "ī", "ō", "a", "e", "i", "o", "u", "ha", "he", "hi", "ho", "hu", "ka", "ke", "ki", "ko", "ku", "ma", "me", "mi", "mo", "mu", "na", "ne", "ni", "no", "nu", + "nga", "nge", "ngi", "ngo", "ngu", "pa", "pe", "pi", "po", "pu", "ra", "re", "ri", "ro", "ru", "ta", "te", "ti", "to", "tu", "wa", "we", "wi", "wo", "wu", "wha", "whe", "whi", + ) + icon_state = "azulean" + icon = 'modular_skyrat/master_files/icons/misc/language.dmi' + default_priority = 94 diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_marking_sets.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_marking_sets.dm index c3ba09f5632..dab4129ed4f 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_marking_sets.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_marking_sets.dm @@ -195,6 +195,14 @@ name = "Plain" body_marking_list = list("Plain") +//AKULA MARKINGS +/datum/body_marking_set/akula + recommended_species = list(SPECIES_AKULA) + +/datum/body_marking_set/akula/akula + name = "Akula" + body_marking_list = list("Akula", "Akula Highlight") + //VOX MARKINGS /datum/body_marking_set/vox recommended_species = list(SPECIES_VOX) diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_markings_akula.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_markings_akula.dm new file mode 100644 index 00000000000..327f927e0e0 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_markings_akula.dm @@ -0,0 +1,14 @@ +/datum/body_marking/akula + icon = 'modular_skyrat/master_files/icons/mob/body_markings/akula_markings.dmi' + +/datum/body_marking/akula/secondary + name = "Akula" + icon_state = "akula" + affected_bodyparts = ARM_LEFT | ARM_RIGHT | HAND_LEFT | HAND_RIGHT | LEG_RIGHT | LEG_LEFT | CHEST | HEAD + default_color = DEFAULT_SECONDARY + +/datum/body_marking/akula/tertiary + name = "Akula Highlight" + icon_state = "akula_highlight" + affected_bodyparts = ARM_LEFT | ARM_RIGHT | LEG_RIGHT | LEG_LEFT | CHEST | HEAD + default_color = DEFAULT_TERTIARY diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm index 290e3536e86..e6c856c5d96 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -163,10 +163,6 @@ icon_state = "fennec" fluffy = TRUE -/datum/sprite_accessory/tails/mammal/wagging/fish - name = "Fish" - icon_state = "fish" - /datum/sprite_accessory/tails/mammal/wagging/vulpkanin/fox name = "Fox" icon_state = "fox" @@ -313,6 +309,10 @@ name = "Shade (Striped)" icon_state = "shadekinlongstriped_large" +/datum/sprite_accessory/tails/mammal/wagging/akula/akula + name = "Akula" + icon_state = "akula" + /datum/sprite_accessory/tails/mammal/wagging/akula/shark name = "Shark" icon_state = "shark" @@ -321,6 +321,10 @@ name = "Shark (No Fin)" icon_state = "sharknofin" +/datum/sprite_accessory/tails/mammal/wagging/akula/fish + name = "Fish" + icon_state = "fish" + /datum/sprite_accessory/tails/mammal/wagging/shepherd name = "Shepherd" icon_state = "shepherd" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm index 41c6803c4a9..cc7b0fd9d9c 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm @@ -1,6 +1,23 @@ +/// How long the akula will stay wet for, AKA how long until they get a mood debuff +#define DRY_UP_TIME 10 MINUTES +/// How many wetstacks an Akula will get upon creation +#define WETSTACK_INITIAL 5 +/// How many wetstacks an Akula needs to activate the TRAIT_SLIPPERY trait +#define WETSTACK_THRESHOLD 3 + /datum/species/akula name = "Akula" id = SPECIES_AKULA + lore_protected = TRUE + offset_features = list( + OFFSET_GLASSES = list(0, 1), + OFFSET_EARS = list(0, 2), + OFFSET_FACEMASK = list(0, 2), + OFFSET_HEAD = list(0, 2), + OFFSET_HAIR = list(0, 1), + ) + eyes_icon = 'modular_skyrat/modules/organs/icons/akula_eyes.dmi' + mutanteyes = /obj/item/organ/internal/eyes/akula species_traits = list( MUTCOLORS, EYECOLOR, @@ -13,15 +30,15 @@ TRAIT_CAN_USE_FLIGHT_POTION, TRAIT_LITERATE, TRAIT_WATER_BREATHING, + TRAIT_SLICK_SKIN, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID mutant_bodyparts = list() default_mutant_bodyparts = list( "tail" = ACC_RANDOM, - "snout" = ACC_RANDOM, - "ears" = ACC_RANDOM, "legs" = "Normal Legs" ) + outfit_important_for_life = /datum/outfit/akula payday_modifier = 0.75 liked_food = SEAFOOD | RAW disliked_food = CLOTH | DAIRY @@ -35,55 +52,120 @@ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/akula, BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/akula, ) - lore_protected = TRUE - -/datum/species/akula/randomize_features(mob/living/carbon/human/human_mob) - var/main_color - var/second_color - var/random = rand(1,5) - //Choose from a variety of sharkish colors, with a whiter secondary and tertiary - switch(random) - if(1) - main_color = "#668899" - second_color = "#BBCCDD" - if(2) - main_color = "#334455" - second_color = "#DDDDEE" - if(3) - main_color = "#445566" - second_color = "#DDDDEE" - if(4) - main_color = "#666655" - second_color = "#DDDDEE" - if(5) - main_color = "#444444" - second_color = "#DDDDEE" - human_mob.dna.features["mcolor"] = main_color - human_mob.dna.features["mcolor2"] = second_color - human_mob.dna.features["mcolor3"] = second_color - -/datum/species/akula/get_random_body_markings(list/passed_features) - var/name = "Shark" - var/datum/body_marking_set/BMS = GLOB.body_marking_sets[name] - var/list/markings = list() - if(BMS) - markings = assemble_body_markings_from_set(BMS, passed_features, src) - return markings + /// This variable stores the timer datum which appears if the mob becomes wet + var/dry_up_timer = TIMER_ID_NULL /datum/species/akula/get_species_description() return placeholder_description /datum/species/akula/get_species_lore() - return list(placeholder_lore) + return list("The Azuleans, known as 'Akulas' or 'Akulans' to humans, are a strong-willed and monarchist culture. A vast nation, the Kingdom of Agurkrral has achieved its status largely by sheer tenacity; Azuleans forcing themselves upwards from the depths of their home seas all the way to a monarchy that even dwarfs the Sol Federation. They are known to be an expansionist culture, collectivist opportunists that are driven by history and culture to push further, and to push onward. To keep moving, or to suffocate and stagnate.", + "Beginning their prehistory with total defeat of another intelligent species set to keep them in their waters forever, the Azuleans have forged themselves into a pioneering people willing to exploit even the most hostile lands; and turn foreign places, flora and fauna, and even people to their advantage. New colonies are being terraformed into 'Agurkrral-A-Likes' every day, strange bioengineered creatures released into the wilds and massive treatment machines being ran in the waters to accomodate the new biosphere. Even some foreign citizens have been forcibly turned into Azuleans through genemodding, before having their genes locked and unable to be altered by anyone else.", + "Their drive for constant expansion and 'the next great thing' has made the Kingdom a divided one; a culture split in two. Generations of Azuleans are separated not by age-based cohorts, but by distance; the 'Near' generations growing up in the Old Principalities, and the 'Far' generations growing up in the New Principalities.", + "The Old Principalities, coreward around their Homeworld, are a burgeoning place slowly falling victim to stagnation. The core worlds still cling to ancient traditions, ceremonies and expectation; old aristocratic houses, tracing their power from ancient ancestors placed to protect and shepherd their assigned lands, still thrive; and the King still rules over many systems of old. Constant reforms and false shake-ups of the status quo demand more and more. Longer bouts of service to achieve citizenship, reformation camps to 'iron out' those with physical and mental defects, and high reliance on exams, education, and pomp to create a hierarchy within its society.", + "The New Principalities, created and commandeered by edgerunning 'border princes' dwelling around the furthest reaches of the Kingdom, embody the Azulean spirit of opportunism and adventurism. Warlord-style nobles reign free, able to outswim any checks meant to control their power and influence. A laissez-faire approach is taken here, where anyone can do anything to become somebody; ambition and self-evolution valued far more than any birthright. Sprawling casino cities, pirate ports, and even luxurious resorts are known to be built up overnight, anyone being able to make money and become wealthy and even command naval ships on charisma and strength alone; fear being the second state currency right behind credits. Even some SolFed citizens are known to come here and profit as mercenaries, investors, gamblers, or even 'border princes.'", + "These generations split apart by distance are known for their animosity towards the other. To those in the New Principalities, their coreward cousins have lost the 'Azulean spirit;' rotting apart in their palaces, sitting in waters choked with ennui. Their forever expansion into the frontier colonies, their use of every useful material and lifeform is what they believe their Kingdom is fueled by. But to those in the Old Principalities, their edgeward descendants have lost their minds. They believe the spiritual and societal importance of their Homeworld has fallen on deaf ears, and the lackadaisical attitude about the core mechanisms and noble structures holding the Kingdom together has become nothing short of infuriating. It is the belief of many high-ranking members of the Monarchy that the ongoing terraforming processes in the frontiers are proof of the arrogance of the 'border princes' controlling them; each and every world made in the image of a planet the King himself is meant to protect.", + "Yet, despite their differences, all Agurkrral citizens swim freely in their kingdom's waters. Even the most controlling border princes, even those in the Old Principalities working the slave trade, know better than to openly erode a citizen's right to life, property, and speech. Any alien species can become an Agurkrral citizen, and even non-citizens enjoy the right to life, with executions outright banned. The aristocracy remains well-educated, even the edgerunner warlords of the New Principalities, and the Kingdom as a whole enjoys its status as a nation that's now a true rival to Sol. Larger, more populated, and better developed; though, having to 'integrate' Solarian technologies, goods, and peoples to fully succeed. The Azuleans are even known as an environmentally-focused people; although they hold no care for lands they cannot make use of, modern nobles are still in charge of maintaining the biosphere of lands they control, to allow their strangely engineered flora and fauna to thrive, and for the people to have healthy and clean waters to live in.", + ) -/datum/species/akula/prepare_human_for_preview(mob/living/carbon/human/human) - var/main_color = "#394b66" - var/secondary_color = "#818b9b" - human.dna.features["mcolor"] = main_color - human.dna.features["mcolor2"] = secondary_color - human.dna.features["mcolor3"] = secondary_color - human.dna.mutant_bodyparts["tail"] = list(MUTANT_INDEX_NAME = "Shark", MUTANT_INDEX_COLOR_LIST = list(main_color, secondary_color, secondary_color)) - human.dna.mutant_bodyparts["snout"] = list(MUTANT_INDEX_NAME = "hShark", MUTANT_INDEX_COLOR_LIST = list(main_color, secondary_color, secondary_color)) - human.dna.mutant_bodyparts["ears"] = list(MUTANT_INDEX_NAME = "Sergal", MUTANT_INDEX_COLOR_LIST = list(main_color, secondary_color, secondary_color)) - regenerate_organs(human, src, visual_only = TRUE) - human.update_body(TRUE) +/datum/species/akula/randomize_features(mob/living/carbon/human/human_mob) + var/main_color + var/secondary_color + var/tertiary_color + var/random = rand(1, 4) + switch(random) + if(1) + main_color = "#1CD3E5" + secondary_color = "#6AF1D6" + tertiary_color = "#CCF6E2" + if(2) + main_color = "#CF3565" + secondary_color = "#d93554" + tertiary_color = "#fbc2dd" + if(3) + main_color = "#FFC44D" + secondary_color = "#FFE85F" + tertiary_color = "#FFF9D6" + if(4) + main_color = "#DB35DE" + secondary_color = "#BE3AFE" + tertiary_color = "#F5E2EE" + human_mob.dna.features["mcolor"] = main_color + human_mob.dna.features["mcolor2"] = secondary_color + human_mob.dna.features["mcolor3"] = tertiary_color + +/datum/species/akula/prepare_human_for_preview(mob/living/carbon/human/akula) + var/main_color = "#1CD3E5" + var/secondary_color = "#6AF1D6" + var/tertiary_color = "#CCF6E2" + akula.dna.features["mcolor"] = main_color + akula.dna.features["mcolor2"] = secondary_color + akula.dna.features["mcolor3"] = tertiary_color + akula.dna.mutant_bodyparts["tail"] = list(MUTANT_INDEX_NAME = "Akula", MUTANT_INDEX_COLOR_LIST = list(main_color, secondary_color, tertiary_color)) + akula.dna.features["legs"] = "Normal Legs" + regenerate_organs(akula, src, visual_only = TRUE) + akula.update_body(TRUE) + +/obj/item/organ/internal/eyes/akula + // Eyes over hair as bandaid for the low amounts of head matching hair + eyes_layer = HAIR_LAYER-0.1 + +/datum/species/akula/get_random_body_markings(list/passed_features) + var/datum/body_marking_set/body_marking_set = GLOB.body_marking_sets["Akula"] + var/list/markings = list() + if(body_marking_set) + markings = assemble_body_markings_from_set(body_marking_set, passed_features, src) + return markings + +/datum/species/akula/pre_equip_species_outfit(datum/job/job, mob/living/carbon/human/equipping, visuals_only = FALSE) + if(job?.akula_outfit) + equipping.equipOutfit(job.akula_outfit, visuals_only) + else + give_important_for_life(equipping) + +// Wet_stacks handling +// more about grab_resists in `code\modules\mob\living\living.dm` at li 1119 +// more about slide_distance in `code\game\turfs\open\_open.dm` at li 233 +/// Lets register the signal which calls when we are above 10 wet_stacks +/datum/species/akula/on_species_gain(mob/living/carbon/akula, datum/species/old_species, pref_load) + . = ..() + RegisterSignal(akula, COMSIG_MOB_TRIGGER_WET_SKIN, PROC_REF(wetted), akula) + // lets give 15 wet_stacks on initial + akula.set_wet_stacks(WETSTACK_INITIAL, remove_fire_stacks = FALSE) + +/// Remove the signal on species loss +/datum/species/akula/on_species_loss(mob/living/carbon/akula, datum/species/new_species, pref_load) + . = ..() + UnregisterSignal(akula, COMSIG_MOB_TRIGGER_WET_SKIN) + +/// This proc is called when a mob with TRAIT_SLICK_SKIN gains over 10 wet_stacks +/datum/species/akula/proc/wetted(mob/living/carbon/akula) + SIGNAL_HANDLER + // Apply the slippery trait if its not there yet + if(!HAS_TRAIT(akula, TRAIT_SLIPPERY)) + ADD_TRAIT(akula, TRAIT_SLIPPERY, SPECIES_TRAIT) + + // Relieve the negative moodlet + akula.clear_mood_event("dry_skin") + // The timer which will initiate above 10 wet_stacks, and call dried() once the timer runs out + dry_up_timer = addtimer(CALLBACK(src, PROC_REF(dried), akula), DRY_UP_TIME, TIMER_UNIQUE | TIMER_STOPPABLE) + +/// This proc is called after a mob with the TRAIT_SLIPPERY has its related timer run out +/datum/species/akula/proc/dried(mob/living/carbon/akula) + // A moodlet which will not go away until the user gets wet + akula.add_mood_event("dry_skin", /datum/mood_event/dry_skin) + +/// A simple overwrite which calls parent to listen to wet_stacks +/datum/status_effect/fire_handler/wet_stacks/tick(delta_time) + . = ..() + if(!owner) + return + if(HAS_TRAIT(owner, TRAIT_SLICK_SKIN) && stacks >= WETSTACK_THRESHOLD) + SEND_SIGNAL(owner, COMSIG_MOB_TRIGGER_WET_SKIN) + + if(HAS_TRAIT(owner, TRAIT_SLIPPERY) && stacks <= 0.5) // Removed just before we hit 0 and delete the /status_effect/ + REMOVE_TRAIT(owner, TRAIT_SLIPPERY, SPECIES_TRAIT) + +#undef DRY_UP_TIME +#undef WETSTACK_INITIAL +#undef WETSTACK_THRESHOLD diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm index 7836cf010ea..775af3bfe41 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm @@ -1,5 +1,5 @@ /datum/species/aquatic - name = "Aquatic" + name = "Akula (Generic)" id = SPECIES_AQUATIC species_traits = list( MUTCOLORS, @@ -32,12 +32,12 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT examine_limb_id = SPECIES_AKULA bodypart_overrides = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/akula, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/akula, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mutant/akula, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mutant/akula, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/akula, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/akula, + BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/aquatic, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/aquatic, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mutant/aquatic, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mutant/aquatic, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/aquatic, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/aquatic, ) /datum/species/aquatic/randomize_features(mob/living/carbon/human/human_mob) diff --git a/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm b/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm index 19c10d966ea..9757619e909 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm @@ -50,6 +50,8 @@ GLOBAL_LIST_EMPTY(all_loadout_datums) var/list/ckeywhitelist /// If set, is a list of job names of which can get the loadout item var/list/restricted_roles + /// If set, is a list of species which can get the loadout item + var/list/restricted_species /// Whether the item is restricted to supporters var/donator_only /// Whether the item requires a specific season in order to be available diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm index 87f46bdfbe4..f48b9341ffa 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm @@ -292,6 +292,10 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea name = "Witch Hat" item_path = /obj/item/clothing/head/wizard/marisa/fake +/datum/loadout_item/head/akula_helmet + name = "Shoredress Helmet" + item_path = /obj/item/clothing/head/helmet/space/akula_wetsuit + /* * MISC */ @@ -537,6 +541,18 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea item_path = /obj/item/clothing/head/hats/imperial/white restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER) +/datum/loadout_item/head/azulea_oldblood + name = "Oldblood's Royal cap" + item_path = /obj/item/clothing/head/hats/caphat/azulean/old_blood + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/head/azulea_upstart + name = "Upstart's Noble cap" + item_path = /obj/item/clothing/head/hats/caphat/azulean/upstart + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + /* * JOB BERETS */ diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm index 78859a46803..021923154eb 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm @@ -94,3 +94,7 @@ GLOBAL_LIST_INIT(loadout_inhand_items, generate_loadout_items(/datum/loadout_ite /datum/loadout_item/inhand/flag_nri name = "Folded Novaya Rossiyskaya Imperiya Flag" item_path = /obj/item/sign/flag/nri + +/datum/loadout_item/inhand/flag_azulea + name = "Folded Azulea Flag" + item_path = /obj/item/sign/flag/azulea diff --git a/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm b/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm index 125caf12e78..75a8d094faa 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm @@ -59,6 +59,10 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ name = "Rainbow Jumpskirt" item_path = /obj/item/clothing/under/color/jumpskirt/rainbow +/datum/loadout_item/under/jumpsuit/akula_wetsuit + name = "Shoredress Wetsuit" + item_path = /obj/item/clothing/under/akula_wetsuit + /datum/loadout_item/under/jumpsuit/impcap name = "Captain's Naval Jumpsuit" item_path = /obj/item/clothing/under/rank/captain/skyrat/imperial @@ -859,6 +863,30 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ name = "Green Pencilskirt" item_path = /obj/item/clothing/under/suit/skyrat/pencil/green +/datum/loadout_item/under/formal/azulea_oldblood + name = " Oldblood's Royal regalia" + item_path = /obj/item/clothing/under/rank/azulean/old_blood + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/under/formal/azulea_oldblood/skirt + name = " Oldblood's Royal regalia (Skirt)" + item_path = /obj/item/clothing/under/rank/azulean/old_blood/skirt + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/under/formal/azulea_upstart + name = "Upstart's Noble Getup" + item_path = /obj/item/clothing/under/rank/azulean/upstart + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/under/formal/azulea_upstart/skirt + name = "Upstart's Noble Getup (Skirt)" + item_path = /obj/item/clothing/under/rank/azulean/upstart/skirt + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + /// DONATOR /datum/loadout_item/under/donator donator_only = TRUE diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm index 0fbdb262446..3603301a758 100644 --- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm +++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm @@ -100,6 +100,7 @@ if("display_restrictions") display_job_restrictions(interacted_item) + display_species_restrictions(interacted_item) // Clears the loadout list entirely. if("clear_all_items") @@ -225,12 +226,23 @@ owner.prefs.loadout_list[item.item_path] -= INFO_NAMED /datum/loadout_manager/proc/display_job_restrictions(datum/loadout_item/item) + if(!length(item.restricted_roles)) + return var/composed_message = span_boldnotice("The [initial(item.item_path.name)] is restricted to the following roles:
") for(var/job_type in item.restricted_roles) composed_message += span_green("[job_type]
") to_chat(owner, examine_block(composed_message)) +/// If only a certain species is allowed to equip this loadout item, display which +/datum/loadout_manager/proc/display_species_restrictions(datum/loadout_item/item) + if(!length(item.restricted_species)) + return + var/composed_message = span_boldnotice("\The [initial(item.item_path.name)] is restricted to the following species:
") + for(var/species_type in item.restricted_species) + composed_message += span_green("[species_type]
") + + to_chat(owner, examine_block(composed_message)) /// Rotate the dummy [DIR] direction, or reset it to SOUTH dir if we're showing all dirs at once. /datum/loadout_manager/proc/rotate_model_dir(dir) @@ -330,6 +342,7 @@ formatted_item["is_greyscale"] = !!(initial(loadout_atom.greyscale_config) && initial(loadout_atom.greyscale_colors) && (initial(loadout_atom.flags_1) & IS_PLAYER_COLORABLE_1)) formatted_item["is_renamable"] = item.can_be_named formatted_item["is_job_restricted"] = !isnull(item.restricted_roles) + formatted_item["is_species_restricted"] = !isnull(item.restricted_species) formatted_item["is_donator_only"] = !isnull(item.donator_only) formatted_item["is_ckey_whitelisted"] = !isnull(item.ckeywhitelist) if(LAZYLEN(item.additional_tooltip_contents)) diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm index 5fdf41fe2db..fc75d9688f1 100644 --- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm +++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm @@ -44,6 +44,11 @@ to_chat(src, span_warning("You were unable to get a loadout item([initial(item.item_path.name)]) due to job restrictions!")) continue + if(item.restricted_species && !(dna.species.id in item.restricted_species)) + if(client) + to_chat(src, span_warning("You were unable to get a loadout item ([initial(item.item_path.name)]) due to species restrictions!")) + continue + new item.item_path(briefcase) briefcase.name = "[preference_source.read_preference(/datum/preference/name/real_name)]'s travel suitcase" @@ -56,6 +61,11 @@ to_chat(src, span_warning("You were unable to get a loadout item([initial(item.item_path.name)]) due to job restrictions!")) continue + if(item.restricted_species && !(dna.species.id in item.restricted_species)) + if(client) + to_chat(src, span_warning("You were unable to get a loadout item ([initial(item.item_path.name)]) due to species restrictions!")) + continue + // Make sure the item is not overriding an important for life outfit item var/datum/outfit/outfit_important_for_life = dna.species.outfit_important_for_life if(!outfit_important_for_life || !item.pre_equip_item(equipped_outfit, outfit_important_for_life, src, visuals_only)) diff --git a/modular_skyrat/modules/organs/icons/akula_eyes.dmi b/modular_skyrat/modules/organs/icons/akula_eyes.dmi new file mode 100644 index 00000000000..518ee0440c1 Binary files /dev/null and b/modular_skyrat/modules/organs/icons/akula_eyes.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 09c8d6398cf..f940c1db90f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -412,6 +412,7 @@ #include "code\__DEFINES\~skyrat_defines\_globalvars\lists\mapping.dm" #include "code\__DEFINES\~skyrat_defines\_HELPERS\atmos_mapping_helpers.dm" #include "code\__DEFINES\~skyrat_defines\_HELPERS\lighting.dm" +#include "code\__DEFINES\~skyrat_defines\_HELPERS\offset_index.dm" #include "code\__HELPERS\_auxtools_api.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_planes.dm" @@ -5457,6 +5458,7 @@ #include "modular_skyrat\master_files\code\datums\id_trim\jobs.dm" #include "modular_skyrat\master_files\code\datums\id_trim\solfed.dm" #include "modular_skyrat\master_files\code\datums\id_trim\syndicate.dm" +#include "modular_skyrat\master_files\code\datums\mood_events\generic_negative_events.dm" #include "modular_skyrat\master_files\code\datums\mood_events\needs_events.dm" #include "modular_skyrat\master_files\code\datums\mutations\_mutations.dm" #include "modular_skyrat\master_files\code\datums\mutations\hulk.dm" @@ -5564,6 +5566,7 @@ #include "modular_skyrat\master_files\code\modules\clothing\glasses\_glasses.dm" #include "modular_skyrat\master_files\code\modules\clothing\glasses\nerve_staple.dm" #include "modular_skyrat\master_files\code\modules\clothing\head\_head.dm" +#include "modular_skyrat\master_files\code\modules\clothing\head\akula_official.dm" #include "modular_skyrat\master_files\code\modules\clothing\head\cowboy.dm" #include "modular_skyrat\master_files\code\modules\clothing\head\monkey_magnification_helmet.dm" #include "modular_skyrat\master_files\code\modules\clothing\masks\_masks.dm" @@ -5574,9 +5577,12 @@ #include "modular_skyrat\master_files\code\modules\clothing\shoes\wheelys.dm" #include "modular_skyrat\master_files\code\modules\clothing\suits\_suits.dm" #include "modular_skyrat\master_files\code\modules\clothing\suits\labcoat.dm" +#include "modular_skyrat\master_files\code\modules\clothing\suits\skinsuits.dm" #include "modular_skyrat\master_files\code\modules\clothing\suits\wintercoats.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\_under.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\accessories.dm" +#include "modular_skyrat\master_files\code\modules\clothing\under\akula_jobs.dm" +#include "modular_skyrat\master_files\code\modules\clothing\under\akula_official.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\color.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\costume.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\misc.dm" @@ -5596,6 +5602,7 @@ #include "modular_skyrat\master_files\code\modules\food_and_drinks\recipes\food_mixtures.dm" #include "modular_skyrat\master_files\code\modules\jobs\departments\departments.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\_job.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\_job_attire.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\blackmarket.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\chaplain.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\clown.dm" @@ -5741,6 +5748,7 @@ #include "modular_skyrat\modules\aesthetics\washing_machine\code\washing_machine.dm" #include "modular_skyrat\modules\aesthetics\windows\code\windows.dm" #include "modular_skyrat\modules\airlock_override\code\airlock_override.dm" +#include "modular_skyrat\modules\akula\code\wetsuit.dm" #include "modular_skyrat\modules\alerts\code\alert_sound_to_playing.dm" #include "modular_skyrat\modules\alerts\code\config.dm" #include "modular_skyrat\modules\alerts\code\default_announcer.dm" @@ -5900,6 +5908,7 @@ #include "modular_skyrat\modules\bluespace_miner\code\bluespace_miner.dm" #include "modular_skyrat\modules\bodyparts\code\_mutant_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\akula_bodyparts.dm" +#include "modular_skyrat\modules\bodyparts\code\aquatic_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\ghoul_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\golem_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\human_bodyparts.dm" @@ -6141,6 +6150,7 @@ #include "modular_skyrat\modules\customization\modules\clothing\neck\_neck.dm" #include "modular_skyrat\modules\customization\modules\clothing\neck\cloaks.dm" #include "modular_skyrat\modules\customization\modules\clothing\neck\collars.dm" +#include "modular_skyrat\modules\customization\modules\clothing\outfits\akula.dm" #include "modular_skyrat\modules\customization\modules\clothing\outfits\vox.dm" #include "modular_skyrat\modules\customization\modules\clothing\shoes\shoes.dm" #include "modular_skyrat\modules\customization\modules\clothing\storage\backpacks.dm" @@ -6193,6 +6203,7 @@ #include "modular_skyrat\modules\customization\modules\language\siiktajr.dm" #include "modular_skyrat\modules\customization\modules\language\skrell.dm" #include "modular_skyrat\modules\customization\modules\language\spacer.dm" +#include "modular_skyrat\modules\customization\modules\language\te_velu_akko.dm" #include "modular_skyrat\modules\customization\modules\language\terrum.dm" #include "modular_skyrat\modules\customization\modules\language\vox.dm" #include "modular_skyrat\modules\customization\modules\language\xerxian.dm" @@ -6201,6 +6212,7 @@ #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\sprite_accessories.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_marking_sets.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings.dm" +#include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings_akula.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings_moth.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings_synthliz.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings_vox.dm"