[Semi-modular] (The big) Akula species revamp (#20131)

* initial i think

* stuff

* test

* fix

* close to publishing

* k

* raise akula tail 1 px

* beginning of clothing

* akula species trait initial

* reviews and CI

* head.dm runtime

* some reviews

* oops

* oops 2x

* review

* job equipping

* clothing flavor

* forgot the .dme

* runtime test

* foundation to more clothing

* errors

* almost ready now

* forgot

* new loadout species restriction

* null runtime

* runtime test

* sprite error

* atleast fill this in

* screenshot test

* lots of descriptions

* i forgot to add job clothing values

* get_species_lore

* prepare_human_for_preview fix

will need new screenshot test probably

* screenshot test fix

https://github.com/Skyrat-SS13/Skyrat-tg/issues/20284

* loreupdate

* write it better

* forgor 💀

* dixel fix

* sprite fix

* job outfit armor changes

* reviews

* extra

* desc formatting

* linter

* reviews part 1

* forgot

* reviews part 2

* reviews part 3

* reviews part 4

* forgot

* fixes

* fix for aquatic digilegs

* small

* fire/water balancing like yin and yang

* modularity thing

* aquatic rename

* A fix and change

* moves sphere 1px and loadout thing

* hair bugfiex

* Te Velu Akko

* head internals

* more patches

* akula eyenudge
This commit is contained in:
theOOZ
2023-06-27 18:19:38 +01:00
committed by GitHub
parent ddba2fd5a9
commit f8afe4d8c6
56 changed files with 1119 additions and 88 deletions
+1
View File
@@ -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
@@ -0,0 +1,3 @@
/// The axis of the `offset_features` list in the species datum
#define INDEX_X 1
#define INDEX_Y 2
+3
View File
@@ -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.
+1
View File
@@ -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'
@@ -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
+9
View File
@@ -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"
@@ -370,23 +370,6 @@
mood_change = -1
timeout = 30 SECONDS
//SKYRAT EDIT START: Mainly surgery for now.
/datum/mood_event/mild_surgery
description = "<span class='warning'>Even if I couldn't feel most of it, it feels wrong being awake while somebody works on your body. Ugh!</span>\n"
mood_change = -1
timeout = 5 MINUTES
/datum/mood_event/severe_surgery
description = "<span class='boldwarning'>Wait, THEY CUT ME OPEN - AND I FELT EVERY SECOND OF IT!</span>\n"
mood_change = -4
timeout = 15 MINUTES
/datum/mood_event/robot_surgery
description = "<span class='warning'>Having my robotic parts messed with while I was conscious felt wrong... if only I had a sleep mode!</span>\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
+8
View File
@@ -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.
+15
View File
@@ -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!"))
+15
View File
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -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
@@ -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."
@@ -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"
@@ -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"
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
)
@@ -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),
)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

@@ -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"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

@@ -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
@@ -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
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -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
@@ -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
@@ -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)
@@ -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
@@ -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"
@@ -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
@@ -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)
@@ -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
@@ -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
*/
@@ -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
@@ -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
@@ -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: <br>")
for(var/job_type in item.restricted_roles)
composed_message += span_green("[job_type] <br>")
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: <br>")
for(var/species_type in item.restricted_species)
composed_message += span_green("[species_type] <br>")
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))
@@ -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))
Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

+12
View File
@@ -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"