Merge remote-tracking branch 'Citadel-Station-13/master' into Garlic

This commit is contained in:
Artur
2020-03-24 12:36:21 +02:00
1739 changed files with 401053 additions and 234616 deletions
@@ -1,7 +1,7 @@
/obj/item/organ/genital
color = "#fcccb3"
w_class = WEIGHT_CLASS_NORMAL
var/shape = "human"
var/shape
var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code
var/genital_flags //see citadel_defines.dm
var/masturbation_verb = "masturbate"
@@ -208,12 +208,6 @@
give_genital(/obj/item/organ/genital/breasts)
if(dna.features["has_cock"])
give_genital(/obj/item/organ/genital/penis)
/*
if(dna.features["has_ovi"])
give_genital(/obj/item/organ/genital/ovipositor)
if(dna.features["has_eggsack"])
give_genital(/obj/item/organ/genital/eggsack)
*/
/mob/living/carbon/human/proc/give_genital(obj/item/organ/genital/G)
if(!dna || (NOGENITALS in dna.species.species_traits) || getorganslot(initial(G.slot)))
@@ -312,7 +306,7 @@
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][dna.species.use_skintones ? "_s" : ""]_[aroused_state]_[layertext]"
if(layer == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES))
if(layers_num[layer] == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES))
genital_overlay.layer = -GENITALS_EXPOSED_LAYER
LAZYADD(fully_exposed, genital_overlay) // to be added to a layer with higher priority than clothes, hence the name of the bitflag.
else
@@ -137,14 +137,3 @@
/datum/sprite_accessory/breasts/sextuple
icon_state = "sextuple"
name = "Sextuple"
//OVIPOSITORS BE HERE
/datum/sprite_accessory/ovipositor
icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi'
icon_state = null
name = "Ovipositor" //the preview name of the accessory
color_src = "cock_color"
/datum/sprite_accessory/ovipositor/knotted
icon_state = "knotted"
name = "Knotted"
@@ -8,10 +8,10 @@
icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_BREASTS
size = "c" //refer to the breast_values static list below for the cups associated number values
size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values
fluid_id = /datum/reagent/consumable/milk
fluid_rate = MILK_RATE
shape = "pair"
shape = DEF_BREASTS_SHAPE
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE
masturbation_verb = "massage"
arousal_verb = "Your breasts start feeling sensitive"
@@ -1,14 +0,0 @@
/obj/item/organ/genital/eggsack
name = "Egg sack"
desc = "An egg producing reproductive organ."
icon_state = "egg_sack"
icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi'
zone = BODY_ZONE_PRECISE_GROIN
slot = ORGAN_SLOT_TESTICLES
genital_flags = GENITAL_INTERNAL|GENITAL_BLACKLISTED //unimplemented
linked_organ_slot = ORGAN_SLOT_PENIS
color = null //don't use the /genital color since it already is colored
var/egg_girth = EGG_GIRTH_DEF
var/cum_mult = CUM_RATE_MULT
var/cum_rate = CUM_RATE
var/cum_efficiency = CUM_EFFICIENCY
@@ -1,16 +0,0 @@
/obj/item/organ/genital/ovipositor
name = "Ovipositor"
desc = "An egg laying reproductive organ."
icon_state = "ovi_knotted_2"
icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi'
zone = BODY_ZONE_PRECISE_GROIN
slot = ORGAN_SLOT_PENIS
genital_flags = GENITAL_BLACKLISTED //unimplemented
shape = "knotted"
size = 3
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
var/girth = 0
var/girth_ratio = COCK_GIRTH_RATIO_DEF //citadel_defines.dm for these defines
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
var/list/oviflags = list()
@@ -11,12 +11,14 @@
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
linked_organ_slot = ORGAN_SLOT_TESTICLES
fluid_transfer_factor = 0.5
size = 2 //arbitrary value derived from length and girth for sprites.
shape = DEF_COCK_SHAPE
size = 2 //arbitrary value derived from length and diameter for sprites.
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
var/prev_length = 6
var/girth = 4.38
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
var/prev_length = 6 //really should be renamed to prev_length
var/diameter = 4.38
var/diameter_ratio = COCK_DIAMETER_RATIO_DEF //0.25; check citadel_defines.dm
/obj/item/organ/genital/penis/modify_size(modifier, min = -INFINITY, max = INFINITY)
var/new_value = CLAMP(length + modifier, min, max)
@@ -68,7 +70,7 @@
else if ((round(length) < round(prev_length)) && (length > 0.5))
to_chat(owner, "<span class='warning'>Your [pick(GLOB.gentlemans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.</b></span>")
icon_state = sanitize_text("penis_[shape]_[size]")
girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay?
diameter = (length * diameter_ratio)//Is it just me or is this ludicous, why not make it exponentially decay?
/obj/item/organ/genital/penis/update_appearance()
@@ -77,7 +79,8 @@
var/icon_shape = S ? S.icon_state : "human"
icon_state = "penis_[icon_shape]_[size]"
var/lowershape = lowertext(shape)
desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth."
desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(diameter, 0.25)] inch[round(diameter, 0.25) != 1 ? "es" : ""] in diameter."
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
@@ -97,6 +100,6 @@
else
color = "#[D.features["cock_color"]]"
length = D.features["cock_length"]
girth_ratio = D.features["cock_girth_ratio"]
diameter_ratio = D.features["cock_diameter_ratio"]
shape = D.features["cock_shape"]
prev_length = length
@@ -11,8 +11,7 @@
linked_organ_slot = ORGAN_SLOT_PENIS
genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION
var/size_name = "average"
shape = "Single"
var/sack_size = BALLS_SACK_SIZE_DEF
shape = DEF_BALLS_SHAPE
fluid_id = /datum/reagent/consumable/semen
masturbation_verb = "massage"
layer_index = TESTICLES_LAYER_INDEX
@@ -64,7 +63,6 @@
color = "#[skintone2hex(H.skin_tone)]"
else
color = "#[D.features["balls_color"]]"
sack_size = D.features["balls_sack_size"]
shape = D.features["balls_shape"]
if(D.features["balls_shape"] == "Hidden")
ENABLE_BITFIELD(genital_flags, GENITAL_INTERNAL)
@@ -6,6 +6,7 @@
zone = BODY_ZONE_PRECISE_GROIN
slot = "vagina"
size = 1 //There is only 1 size right now
shape = DEF_VAGINA_SHAPE
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
masturbation_verb = "finger"
arousal_verb = "You feel wetness on your crotch"
@@ -57,7 +57,7 @@
/datum/gear/geisha
name = "Geisha suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/geisha
path = /obj/item/clothing/under/costume/geisha
ckeywhitelist = list("atiefling")
/datum/gear/specialscarf
@@ -123,7 +123,7 @@
/datum/gear/mankini
name = "Mankini"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/mankini
path = /obj/item/clothing/under/misc/stripper/mankini
ckeywhitelist = list("zigfie")
/datum/gear/pinkshoes
@@ -160,7 +160,7 @@
/datum/gear/performersoutfit
name = "Bluish performer's outfit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/singery/custom
path = /obj/item/clothing/under/costume/singer/yellow/custom
ckeywhitelist = list("killer402402")
/datum/gear/vermillion
@@ -184,7 +184,7 @@
/datum/gear/naomisweater
name = "worn black sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/bb_sweater/black/naomi
path = /obj/item/clothing/under/sweater/black/naomi
ckeywhitelist = list("technicalmagi")
/datum/gear/naomicollar
@@ -196,7 +196,7 @@
/datum/gear/gladiator
name = "Gladiator Armor"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/under/gladiator
path = /obj/item/clothing/under/costume/gladiator
ckeywhitelist = list("aroche")
/datum/gear/bloodredtie
@@ -330,7 +330,7 @@ datum/gear/darksabresheath
/datum/gear/Divine_robes
name = "Divine robes"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/lunasune
path = /obj/item/clothing/under/custom/lunasune
ckeywhitelist = list("invader4352")
/datum/gear/gothcoat
@@ -348,7 +348,7 @@ datum/gear/darksabresheath
/datum/gear/sharkcloth
name = "Leon's Skimpy Outfit"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/under/leoskimpy
path = /obj/item/clothing/under/custom/leoskimpy
ckeywhitelist = list("spectrosis")
/datum/gear/mimemask
@@ -360,7 +360,7 @@ datum/gear/darksabresheath
/datum/gear/mimeoveralls
name = "Mime's Overalls"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/under/mimeoveralls
path = /obj/item/clothing/under/custom/mimeoveralls
ckeywhitelist = list("pireamaineach")
/datum/gear/soulneck
@@ -408,7 +408,7 @@ datum/gear/darksabresheath
/datum/gear/mw2_russian_para
name = "Russian Paratrooper Jumper"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/mw2_russian_para
path = /obj/item/clothing/under/custom/mw2_russian_para
ckeywhitelist = list("investigator77")
/datum/gear/longblackgloves
@@ -420,13 +420,13 @@ datum/gear/darksabresheath
/datum/gear/trendy_fit
name = "Trendy Fit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/trendy_fit
path = /obj/item/clothing/under/custom/trendy_fit
ckeywhitelist = list("midgetdragon")
/datum/gear/singery
name = "Yellow Performer Outfit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/singery
path = /obj/item/clothing/under/costume/singer/yellow
ckeywhitelist = list("maxlynchy")
/datum/gear/csheet
@@ -462,7 +462,7 @@ datum/gear/darksabresheath
/datum/gear/mikubikini
name = "starlight singer bikini"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/mikubikini
path = /obj/item/clothing/under/custom/mikubikini
ckeywhitelist = list("grandvegeta")
/datum/gear/mikujacket
@@ -14,21 +14,21 @@
/datum/gear/bluescrubs
name = "Blue Scrubs"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/medical/blue
path = /obj/item/clothing/under/rank/medical/doctor/blue
restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Geneticist", "Chemist", "Virologist")
restricted_desc = "Medical"
/datum/gear/greenscrubs
name = "Green Scrubs"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/medical/green
path = /obj/item/clothing/under/rank/medical/doctor/green
restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Geneticist", "Chemist", "Virologist")
restricted_desc = "Medical"
/datum/gear/purplescrubs
name = "Purple Scrubs"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/medical/purple
path = /obj/item/clothing/under/rank/medical/doctor/purple
restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Geneticist", "Chemist", "Virologist")
restricted_desc = "Medical"
@@ -42,6 +42,6 @@
/datum/gear/nursesuit
name = "Nurse Suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/nursesuit
path = /obj/item/clothing/under/rank/medical/doctor/nurse
restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Geneticist", "Chemist", "Virologist")
restricted_desc = "Medical"
@@ -1,7 +1,7 @@
/datum/gear/navyblueuniformhos
name = "Head of Security navyblue uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/head_of_security/navyblue
path = /obj/item/clothing/under/rank/security/head_of_security/formal
restricted_roles = list("Head of Security")
/datum/gear/navybluehosberet
@@ -31,7 +31,7 @@
/datum/gear/navyblueuniformofficer
name = "Security officer navyblue uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/security/navyblue
path = /obj/item/clothing/under/rank/security/officer/formal
restricted_roles = list("Security Officer")
/datum/gear/navybluejacketwarden
@@ -49,19 +49,19 @@
/datum/gear/navyblueuniformwarden
name = "Warden navyblue uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/warden/navyblue
path = /obj/item/clothing/under/rank/security/warden/formal
restricted_roles = list("Warden")
/datum/gear/secskirt
name = "Security skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/security/skirt
path = /obj/item/clothing/under/rank/security/officer/skirt
restricted_roles = list("Security Officer", "Warden", "Head of Security")
/datum/gear/hosskirt
name = "Head of security's skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/head_of_security/skirt
path = /obj/item/clothing/under/rank/security/head_of_security/skirt
restricted_roles = list("Head of Security")
/datum/gear/sechud
@@ -1,7 +1,7 @@
/datum/gear/greytidestationwide
name = "Staff Assistant's jumpsuit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/staffassistant
path = /obj/item/clothing/under/misc/staffassistant
restricted_roles = list("Assistant")
/datum/gear/neetsuit
@@ -1,136 +1,136 @@
/datum/gear/suitblack
name = "Black suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/suit_jacket
path = /obj/item/clothing/under/suit/black
/datum/gear/suitgreen
name = "Green suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/suit_jacket/green
path = /obj/item/clothing/under/suit/green
/datum/gear/suitred
name = "Red suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/suit_jacket/red
path = /obj/item/clothing/under/suit/red
/datum/gear/suitcharcoal
name = "Charcoal suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/suit_jacket/charcoal
path = /obj/item/clothing/under/suit/charcoal
/datum/gear/suitnavy
name = "Navy suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/suit_jacket/navy
path = /obj/item/clothing/under/suit/navy
/datum/gear/suitburgundy
name = "Burgundy suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/suit_jacket/burgundy
path = /obj/item/clothing/under/suit/burgundy
/datum/gear/suittan
name = "Tan suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/suit_jacket/tan
path = /obj/item/clothing/under/suit/tan
/datum/gear/suitwhite
name = "White suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/suit_jacket/white
path = /obj/item/clothing/under/suit/white
/datum/gear/assistantformal
name = "Assistant's formal uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/assistantformal
path = /obj/item/clothing/under/misc/assistantformal
/datum/gear/maidcostume
name = "Maid costume"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/maid
path = /obj/item/clothing/under/costume/maid
/datum/gear/mailmanuniform
name = "Mailman's jumpsuit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/mailman
path = /obj/item/clothing/under/misc/mailman
/datum/gear/skirtblack
name = "Black skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/skirt/black
path = /obj/item/clothing/under/dress/skirt
/datum/gear/skirtblue
name = "Blue skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/skirt/blue
path = /obj/item/clothing/under/dress/skirt/blue
/datum/gear/skirtred
name = "Red skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/skirt/red
path = /obj/item/clothing/under/dress/skirt/red
/datum/gear/skirtpurple
name = "Purple skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/skirt/purple
path = /obj/item/clothing/under/dress/skirt/purple
/datum/gear/skirtplaid
name = "Plaid skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/plaid_skirt
path = /obj/item/clothing/under/dress/skirt/plaid
/datum/gear/schoolgirlblue
name = "Blue Schoolgirl Uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/schoolgirl
path = /obj/item/clothing/under/costume/schoolgirl
/datum/gear/schoolgirlred
name = "Red Schoolgirl Uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/schoolgirl/red
path = /obj/item/clothing/under/costume/schoolgirl/red
/datum/gear/schoolgirlgreen
name = "Green Schoolgirl Uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/schoolgirl/green
path = /obj/item/clothing/under/costume/schoolgirl/green
/datum/gear/schoolgirlorange
name = "Orange Schoolgirl Uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/schoolgirl/orange
path = /obj/item/clothing/under/costume/schoolgirl/orange
/datum/gear/stripeddress
name = "Striped Dress"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/stripeddress
path = /obj/item/clothing/under/dress/striped
/datum/gear/sundresswhite
name = "White Sundress"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/sundresswhite
path = /obj/item/clothing/under/dress/sundress/white
/datum/gear/sundress
name = "Sundress"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/sundress
path = /obj/item/clothing/under/dress/sundress
/datum/gear/greendress
name = "Green Dress"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/greendress
path = /obj/item/clothing/under/dress/green
/datum/gear/pinkdress
name = "Pink Dress"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/pinkdress
path = /obj/item/clothing/under/dress/pink
/datum/gear/flowerdress
name = "Flower Dress"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/flowerdress
path = /obj/item/clothing/under/dress/flower
/datum/gear/sweptskirt
name = "Swept skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/sweptskirt
path = /obj/item/clothing/under/dress/skirt/swept
/datum/gear/croptop
name = "Croptop"
@@ -145,7 +145,7 @@
/datum/gear/kilt
name = "Kilt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/kilt
path = /obj/item/clothing/under/costume/kilt
/datum/gear/camoshorts
name = "Camo Pants"
@@ -222,54 +222,54 @@
/datum/gear/creamsweater
name = "Cream Commando Sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/bb_sweater
path = /obj/item/clothing/under/sweater
/datum/gear/blacksweater
name = "Black Commando Sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/bb_sweater/black
path = /obj/item/clothing/under/sweater/black
/datum/gear/purpsweater
name = "Purple Commando Sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/bb_sweater/purple
path = /obj/item/clothing/under/sweater/purple
/datum/gear/greensweater
name = "Green Commando Sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/bb_sweater/green
path = /obj/item/clothing/under/sweater/green
/datum/gear/redsweater
name = "Red Commando Sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/bb_sweater/red
path = /obj/item/clothing/under/sweater/red
/datum/gear/bluesweater
name = "Navy Commando Sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/bb_sweater/blue
path = /obj/item/clothing/under/sweater/blue
/datum/gear/keyholesweater
name = "Keyhole Sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/keyholesweater
path = /obj/item/clothing/under/misc/keyholesweater
/datum/gear/polykilt
name = "Polychromic Kilt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/polychromic/kilt
path = /obj/item/clothing/under/costume/kilt/polychromic
cost = 3
/datum/gear/polyshorts
name = "Polychromic Shorts"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/polychromic/shorts
path = /obj/item/clothing/under/misc/polyshorts
cost = 3
/datum/gear/polyshortpants
name = "Polychromic Athletic Shorts"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/polychromic/shortpants
path = /obj/item/clothing/under/shorts/polychromic
cost = 2
// Trekie things
@@ -277,21 +277,21 @@
/datum/gear/trekcmdtos
name = "TOS uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command
path = /obj/item/clothing/under/trek/command
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscitos
name = "TOS uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci
path = /obj/item/clothing/under/trek/medsci
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengtos
name = "TOS uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec
path = /obj/item/clothing/under/trek/engsec
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
@@ -299,21 +299,21 @@
/datum/gear/trekcmdtng
name = "TNG uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/next
path = /obj/item/clothing/under/trek/command/next
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscitng
name = "TNG uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/next
path = /obj/item/clothing/under/trek/medsci/next
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengtng
name = "TNG uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/next
path = /obj/item/clothing/under/trek/engsec/next
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
@@ -321,21 +321,21 @@
/datum/gear/trekcmdvoy
name = "VOY uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/voy
path = /obj/item/clothing/under/trek/command/voy
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscivoy
name = "VOY uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/voy
path = /obj/item/clothing/under/trek/medsci/voy
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengvoy
name = "VOY uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/voy
path = /obj/item/clothing/under/trek/engsec/voy
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
@@ -343,21 +343,21 @@
/datum/gear/trekcmdds9
name = "DS9 uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/ds9
path = /obj/item/clothing/under/trek/command/ds9
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscids9
name = "DS9 uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/ds9
path = /obj/item/clothing/under/trek/medsci/ds9
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengds9
name = "DS9 uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/ds9
path = /obj/item/clothing/under/trek/engsec/ds9
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
@@ -365,21 +365,21 @@
/datum/gear/trekcmdent
name = "ENT uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/ent
path = /obj/item/clothing/under/trek/command/ent
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscient
name = "ENT uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/ent
path = /obj/item/clothing/under/trek/medsci/ent
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengent
name = "ENT uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/ent
path = /obj/item/clothing/under/trek/engsec/ent
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
@@ -387,75 +387,75 @@
/datum/gear/gear_harnesses
name = "Gear Harness"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/gear_harness
path = /obj/item/clothing/under/misc/gear_harness
//Christmas
/*Commenting out Until next Christmas or made automatic
/datum/gear/christmasmaler
name = "Red Masculine Christmas Suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/christmas/christmasmaler
path = /obj/item/clothing/under/costume/christmas
/datum/gear/christmasmaleg
name = "Green Masculine Christmas Suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/christmas/christmasmaleg
path = /obj/item/clothing/under/costume/christmas/green
/datum/gear/christmasfemaler
name = "Red Feminine Christmas Suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/christmas/christmasfemaler
path = /obj/item/clothing/under/costume/christmas/croptop
/datum/gear/christmasfemaleg
name = "Green Feminine Christmas Suit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/christmas/christmasfemaleg
path = /obj/item/clothing/under/costume/christmas/croptop/green
/datum/gear/pinkstripper
name = "Pink stripper outfit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/stripper_pink
path = /obj/item/clothing/under/misc/stripper
cost = 3
*/
/datum/gear/greenstripper
name = "Green stripper outfit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/stripper_green
path = /obj/item/clothing/under/misc/stripper/green
cost = 3
/datum/gear/qipao
name = "Qipao, Black"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/lunar/qipao
path = /obj/item/clothing/under/costume/qipao
cost = 3
/datum/gear/qipao/white
name = "Qipao, White"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/lunar/qipao/white
path = /obj/item/clothing/under/costume/qipao/white
cost = 3
/datum/gear/qipao/red
name = "Qipao, Red"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/lunar/qipao/red
path = /obj/item/clothing/under/costume/qipao/red
cost = 3
/datum/gear/cheongsam
name = "Cheongsam, Black"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/lunar/cheongsam
path = /obj/item/clothing/under/costume/cheongsam
cost = 3
/datum/gear/cheongsam/white
name = "Cheongsam, White"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/lunar/cheongsam/white
path = /obj/item/clothing/under/costume/cheongsam/white
cost = 3
/datum/gear/cheongsam/red
name = "Cheongsam, Red"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/lunar/cheongsam/red
path = /obj/item/clothing/under/costume/cheongsam/red
cost = 3
@@ -49,6 +49,5 @@
/datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1)
..()
character.give_genitals(TRUE)
character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially
if(icon_updates)
character.update_genitals()
@@ -50,13 +50,11 @@
WRITE_FILE(S["feature_cock_color"], features["cock_color"])
WRITE_FILE(S["feature_cock_length"], features["cock_length"])
WRITE_FILE(S["feature_cock_girth"], features["cock_girth"])
WRITE_FILE(S["feature_has_sheath"], features["sheath_color"])
//balls features
WRITE_FILE(S["feature_has_balls"], features["has_balls"])
WRITE_FILE(S["feature_balls_color"], features["balls_color"])
WRITE_FILE(S["feature_balls_size"], features["balls_size"])
WRITE_FILE(S["feature_balls_shape"], features["balls_shape"])
WRITE_FILE(S["feature_balls_sack_size"], features["balls_sack_size"])
//breasts features
WRITE_FILE(S["feature_has_breasts"], features["has_breasts"])
WRITE_FILE(S["feature_breasts_size"], features["breasts_size"])
@@ -8,85 +8,6 @@
// Armor lists for even Heads of Staff is Nulled out do round start armor as well most armor going onto the suit itself rather then a armor slot - Trilby
///////////////////////////////////////////////////////////////////////////////////
/obj/item/clothing/under/rank/trek
name = "Section 31 Uniform"
desc = "Oooh... right."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
mutantrace_variation = NONE
item_state = ""
can_adjust = FALSE //to prevent you from "wearing it casually"
//TOS
/obj/item/clothing/under/rank/trek/command
name = "Command Uniform"
desc = "The uniform worn by command officers in the mid 2260s."
icon_state = "trek_command"
item_state = "trek_command"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/under/rank/trek/engsec
name = "Operations Uniform"
desc = "The uniform worn by operations officers of the mid 2260s. You feel strangely vulnerable just seeing this..."
icon_state = "trek_engsec"
item_state = "trek_engsec"
/obj/item/clothing/under/rank/trek/medsci
name = "MedSci Uniform"
desc = "The uniform worn by medsci officers in the mid 2260s."
icon_state = "trek_medsci"
item_state = "trek_medsci"
permeability_coefficient = 0.50
//TNG
/obj/item/clothing/under/rank/trek/command/next
desc = "The uniform worn by command officers. This one's from the mid 2360s."
icon_state = "trek_next_command"
item_state = "trek_next_command"
/obj/item/clothing/under/rank/trek/engsec/next
desc = "The uniform worn by operation officers. This one's from the mid 2360s."
icon_state = "trek_next_engsec"
item_state = "trek_next_engsec"
/obj/item/clothing/under/rank/trek/medsci/next
desc = "The uniform worn by medsci officers. This one's from the mid 2360s."
icon_state = "trek_next_medsci"
item_state = "trek_next_medsci"
//ENT
/obj/item/clothing/under/rank/trek/command/ent
desc = "The uniform worn by command officers of the 2140s."
icon_state = "trek_ent_command"
item_state = "trek_ent_command"
/obj/item/clothing/under/rank/trek/engsec/ent
desc = "The uniform worn by operations officers of the 2140s."
icon_state = "trek_ent_engsec"
item_state = "trek_ent_engsec"
/obj/item/clothing/under/rank/trek/medsci/ent
desc = "The uniform worn by medsci officers of the 2140s."
icon_state = "trek_ent_medsci"
item_state = "trek_ent_medsci"
//VOY
/obj/item/clothing/under/rank/trek/command/voy
desc = "The uniform worn by command officers of the 2370s."
icon_state = "trek_voy_command"
item_state = "trek_voy_command"
/obj/item/clothing/under/rank/trek/engsec/voy
desc = "The uniform worn by operations officers of the 2370s."
icon_state = "trek_voy_engsec"
item_state = "trek_voy_engsec"
/obj/item/clothing/under/rank/trek/medsci/voy
desc = "The uniform worn by medsci officers of the 2370s."
icon_state = "trek_voy_medsci"
item_state = "trek_voy_medsci"
//DS9
/obj/item/clothing/suit/storage/trek/ds9
@@ -116,21 +37,6 @@
permeability_coefficient = 0.01
armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50)
/obj/item/clothing/under/rank/trek/command/ds9
desc = "The uniform worn by command officers of the 2380s."
icon_state = "trek_ds9_command"
item_state = "trek_ds9_command"
/obj/item/clothing/under/rank/trek/engsec/ds9
desc = "The uniform worn by operations officers of the 2380s."
icon_state = "trek_ds9_engsec"
item_state = "trek_ds9_engsec"
/obj/item/clothing/under/rank/trek/medsci/ds9
desc = "The uniform undershirt worn by medsci officers of the 2380s."
icon_state = "trek_ds9_medsci"
item_state = "trek_ds9_medsci"
//MODERN ish Joan sqrl sprites. I think
//For general use
@@ -168,8 +74,9 @@
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
var/mob/living/L = usr
if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE))
return FALSE
switch(unbuttoned)
if(0)
@@ -1,80 +0,0 @@
/*
* Turtlenecks in general go here!
*/
//CMO's Turtleneck, because they don't have any unique clothes!
/obj/item/clothing/under/rank/chief_medical_officer/turtleneck
desc = "It's a turtleneck worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection, for an officer with a superior sense of style and practicality."
name = "chief medical officer's turtleneck"
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/turtlenecks.dmi'
icon = 'modular_citadel/icons/obj/clothing/turtlenecks.dmi'
icon_state = "cmoturtle"
item_state = "w_suit"
item_color = "cmoturtle"
permeability_coefficient = 0.5
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0)
can_adjust = TRUE
alt_covers_chest = TRUE
mutantrace_variation = NONE
/obj/structure/closet/secure_closet/CMO/PopulateContents() //This is placed here because it's a very specific addition for a very specific niche
..()
new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src)
/obj/item/clothing/under/syndicate/cosmetic
name = "tactitool turtleneck"
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
icon_state = "tactifool"
item_state = "bl_suit"
item_color = "tactifool"
has_sensor = TRUE
mutantrace_variation = NONE
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
/obj/item/clothing/under/syndicate/tacticool
has_sensor = TRUE
// Sweaters are good enough for this category too.
/obj/item/clothing/under/bb_sweater
name = "cream sweater"
desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north."
icon_state = "bb_turtle"
item_state = "w_suit"
item_color = "bb_turtle"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = TRUE
icon = 'modular_citadel/icons/obj/clothing/turtlenecks.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
mutantrace_variation = NONE
/obj/item/clothing/under/bb_sweater/black
name = "black sweater"
icon_state = "bb_turtleblk"
item_state = "bl_suit"
item_color = "bb_turtleblk"
/obj/item/clothing/under/bb_sweater/purple
name = "purple sweater"
icon_state = "bb_turtlepur"
item_state = "p_suit"
item_color = "bb_turtlepur"
/obj/item/clothing/under/bb_sweater/green
name = "green sweater"
icon_state = "bb_turtlegrn"
item_state = "g_suit"
item_color = "bb_turtlegrn"
/obj/item/clothing/under/bb_sweater/red
name = "red sweater"
icon_state = "bb_turtlered"
item_state = "r_suit"
item_color = "bb_turtlered"
/obj/item/clothing/under/bb_sweater/blue
name = "blue sweater"
icon_state = "bb_turtleblu"
item_state = "b_suit"
item_color = "bb_turtleblu"
@@ -1,29 +0,0 @@
/*/////////////////////////////////////////////////////////////////////////////////
/////// ///////
/////// Cit's exclusive jumpsuits, uniforms, etc. go here ///////
/////// ///////
*//////////////////////////////////////////////////////////////////////////////////
/obj/item/clothing/under/corporateuniform
name = "corporate uniform"
desc = "A comfortable, tight fitting jumpsuit made of premium materials. Not space-proof."
icon = 'modular_citadel/icons/obj/clothing/cit_clothes.dmi'
icon_state = "tssuit"
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
item_state = "r_suit"
can_adjust = FALSE
mutantrace_variation = NONE
/obj/item/clothing/under/rank/captain/femformal
name ="captain's female formal outfit"
desc = ""
icon = 'modular_citadel/icons/obj/clothing/cit_clothes.dmi'
icon_state = "lewdcap"
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
item_state = "lewdcap"
item_color = "lewdcap"
can_adjust = FALSE
sensor_mode = SENSOR_COORDS //it's still a captain's suit nerd
random_sensor = FALSE
mutantrace_variation = NONE
@@ -266,7 +266,7 @@
item_state = "petcollar-stripe"
tagname = null
/obj/item/clothing/under/singery/custom
/obj/item/clothing/under/costume/singer/yellow/custom
name = "bluish performer's outfit"
desc = "Just looking at this makes you want to sing."
icon = 'icons/obj/custom.dmi'
@@ -313,7 +313,7 @@
alternate_worn_icon = 'icons/mob/custom_w.dmi'
mutantrace_variation = NONE
/obj/item/clothing/under/bb_sweater/black/naomi
/obj/item/clothing/under/sweater/black/naomi
name = "worn black sweater"
mutantrace_variation = NONE
desc = "A well-loved sweater, showing signs of several cleanings and re-stitchings. And a few stains. Is that cat fur?"
@@ -382,7 +382,7 @@
icon_state = "luckyjack"
mutantrace_variation = NONE
/obj/item/clothing/under/lunasune
/obj/item/clothing/under/custom/lunasune
name = "Divine Robes"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
@@ -391,7 +391,7 @@
icon_state = "Divine_robes"
mutantrace_variation = NONE
/obj/item/clothing/under/leoskimpy
/obj/item/clothing/under/custom/leoskimpy
name = "Leon's Skimpy Outfit"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
@@ -400,7 +400,7 @@
icon_state = "shark_cloth"
mutantrace_variation = NONE
/obj/item/clothing/under/mimeoveralls
/obj/item/clothing/under/custom/mimeoveralls
name = "Mime's Overalls"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
@@ -461,7 +461,7 @@
body_parts_covered = CHEST|GROIN|LEGS|ARMS
mutantrace_variation = NONE
/obj/item/clothing/under/mw2_russian_para
/obj/item/clothing/under/custom/mw2_russian_para
name = "Russian Paratrooper Jumper"
desc = "A Russian made old paratrooper jumpsuit, has many pockets for easy storage of gear from a by gone era. As bulky as it looks, its shockingly light!"
icon_state = "mw2_russian_para"
@@ -478,7 +478,7 @@
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
/obj/item/clothing/under/trendy_fit
/obj/item/clothing/under/custom/trendy_fit
name = "Trendy Fitting Clothing"
desc = "An outfit straight from the boredom of space, its the type of thing only someone trying to entertain themselves on the way to their next destination would wear."
icon_state = "trendy_fit"
@@ -512,7 +512,7 @@
item_state = "onion"
alternate_worn_icon = 'icons/mob/custom_w.dmi'
/obj/item/clothing/under/mikubikini
/obj/item/clothing/under/custom/mikubikini
name = "starlight singer bikini"
desc = " "
icon_state = "mikubikini"
@@ -0,0 +1,19 @@
/client/proc/cmd_mentor_dementor()
set category = "Mentor"
set name = "dementor"
if(!is_mentor())
return
remove_mentor_verbs()
if (/client/proc/mentor_unfollow in verbs)
mentor_unfollow()
GLOB.mentors -= src
verbs += /client/proc/cmd_mentor_rementor
/client/proc/cmd_mentor_rementor()
set category = "Mentor"
set name = "rementor"
if(!is_mentor())
return
add_mentor_verbs()
GLOB.mentors += src
verbs -= /client/proc/cmd_mentor_rementor
@@ -14,8 +14,7 @@ GLOBAL_PROTECT(mentor_href_token)
/datum/mentors/New(ckey)
if(!ckey)
QDEL_IN(src, 0)
throw EXCEPTION("Mentor datum created without a ckey")
return
CRASH("Mentor datum created without a ckey")
target = ckey(ckey)
name = "[ckey]'s mentor datum"
href_token = GenerateToken()
@@ -1,6 +1,7 @@
GLOBAL_LIST_INIT(mentor_verbs, list(
/client/proc/cmd_mentor_say,
/client/proc/show_mentor_memo
/client/proc/show_mentor_memo,
/client/proc/cmd_mentor_dementor
))
GLOBAL_PROTECT(mentor_verbs)
@@ -38,8 +38,9 @@
if(!msg)
msg = input(src,"Message:", "Private message") as text|null
if(!msg && is_mentor(whom))
to_chat(GLOB.admins | GLOB.mentors, "<span class='purple'>[src] has stopped their reply to [whom]'s mhelp.</span>")
if(!msg)
if (is_mentor(whom))
to_chat(GLOB.admins | GLOB.mentors, "<span class='purple'>[src] has stopped their reply to [whom]'s mhelp.</span>")
return
if(!C)
@@ -54,10 +55,10 @@
return
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
if(!msg && is_mentor(whom))
to_chat(GLOB.admins | GLOB.mentors, "<span class='purple'>[src] has stopped their reply to [whom]'s mhelp.</span>")
if(!msg)
if (is_mentor(whom))
to_chat(GLOB.admins | GLOB.mentors, "<span class='purple'>[src] has stopped their reply to [whom]'s mhelp.</span>")
return
log_mentor("Mentor PM: [key_name(src)]->[key_name(C)]: [msg]")
msg = emoji_parse(msg)
@@ -1,83 +1,29 @@
/mob/living/carbon
var/combatmode = FALSE //literally lifeweb
var/lastmousedir
var/wrongdirmovedelay
var/lastdirchange
var/combatmessagecooldown
//oh no vore time
var/voremode = FALSE
/mob/living/carbon/CanPass(atom/movable/mover, turf/target)
. = ..()
if(.)
var/mob/living/mobdude = mover
if(istype(mobdude))
if(!resting && mobdude.resting)
if(!(mobdude.pass_flags & PASSMOB))
return FALSE
return .
/mob/living/carbon/proc/toggle_combat_mode(forced, silent)
if(!forced)
if(recoveringstam || stat != CONSCIOUS)
return TRUE
for(var/i in status_effects)
var/datum/status_effect/S = i
if(S.blocks_combatmode)
return TRUE
combatmode = !combatmode
if(voremode)
toggle_vore_mode()
if(!silent)
if(combatmode)
if(world.time >= combatmessagecooldown)
if(a_intent != INTENT_HELP)
visible_message("<span class='warning'>[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].</span>")
else
visible_message("<span class='notice'>[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].</span>")
playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay!
else
playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above!
if(client)
client.show_popup_menus = !combatmode // So we can right-click for alternate actions and all that other good shit. Also moves examine to shift+rightclick to make it possible to attack while sprinting
var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory
T?.update_icon_state()
combatmessagecooldown = 10 SECONDS + world.time //This is set 100% of the time to make sure squeezing regen out of process cycles doesn't result in the combat mode message getting spammed
SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode)
return TRUE
mob/living/carbon/proc/toggle_vore_mode()
/mob/living/carbon/proc/toggle_vore_mode()
voremode = !voremode
var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory
T?.update_icon_state()
if(combatmode)
if(combat_flags & COMBAT_FLAG_COMBAT_TOGGLED)
return FALSE //let's not override the main draw of the game these days
SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode)
return TRUE
/mob/living/carbon/Move(atom/newloc, direct = 0)
var/currentdirection = dir
. = ..()
wrongdirmovedelay = FALSE
if(combatmode && client && lastmousedir)
if((combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && client && lastmousedir)
if(lastmousedir != dir)
wrongdirmovedelay = TRUE
setDir(lastmousedir, ismousemovement = TRUE)
if(currentdirection != dir)
lastdirchange = world.time
/mob/living/carbon/onMouseMove(object, location, control, params)
if(!combatmode)
if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
return
mouse_face_atom(object)
lastmousedir = dir
/mob/living/carbon/setDir(newdir, ismousemovement = FALSE)
if(!combatmode || ismousemovement)
if(dir != newdir)
lastdirchange = world.time
. = ..()
else
return
@@ -15,24 +15,6 @@
if(!forced && (status_flags & GODMODE))
return FALSE
apply_damage(amount > 0 ? amount*incomingstammult : amount, STAMINA, affected_zone)
if(recoveringstam && amount > 20)
if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && amount > 20)
incomingstammult = max(0.01, incomingstammult/(amount*0.05))
return amount
/mob/living/carbon/doSprintLossTiles(tiles)
doSprintBufferRegen(FALSE) //first regen.
if(sprint_buffer)
var/use = min(tiles, sprint_buffer)
sprint_buffer -= use
tiles -= use
update_hud_sprint_bar()
if(!tiles) //we had enough, we're done!
return
adjustStaminaLoss(tiles * sprint_stamina_cost) //use stamina to cover deficit.
/mob/living/carbon/proc/doSprintBufferRegen(updating = TRUE)
var/diff = world.time - sprint_buffer_regen_last
sprint_buffer_regen_last = world.time
sprint_buffer = min(sprint_buffer_max, sprint_buffer + sprint_buffer_regen_ds * diff)
if(updating)
update_hud_sprint_bar()
@@ -4,7 +4,7 @@
/mob/living/carbon/human/resist_embedded()
if(handcuffed || legcuffed || (wear_suit && wear_suit.breakouttime))
return
if(canmove && !on_fire)
if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !on_fire)
for(var/obj/item/bodypart/L in bodyparts)
if(istype(L) && L.embedded_objects.len)
for(var/obj/item/I in L.embedded_objects)
@@ -19,10 +19,10 @@
L.embedded_objects -= I
L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class*painmul)//It hurts to rip it out, get surgery you dingus. And if you're ripping it out quickly via resist, it's gonna hurt even more
I.forceMove(get_turf(src))
I.unembedded()
user.put_in_hands(I)
user.emote("scream")
user.visible_message("[user] rips [I] out of [user.p_their()] [L.name]!","<span class='notice'>You remove [I] from your [L.name].</span>")
if(!has_embedded_objects())
clear_alert("embeddedobject")
SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "embedded")
return
@@ -1,37 +0,0 @@
/mob/living/carbon/human/Move(NewLoc, direct)
var/oldpseudoheight = pseudo_z_axis
. = ..()
if(. && sprinting && !(movement_type & FLYING) && canmove && !resting && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
if(!HAS_TRAIT(src, TRAIT_FREESPRINT))
doSprintLossTiles(1)
if((oldpseudoheight - pseudo_z_axis) >= 8)
to_chat(src, "<span class='warning'>You trip off of the elevated surface!</span>")
for(var/obj/item/I in held_items)
accident(I)
Knockdown(80)
/mob/living/carbon/human/movement_delay()
. = 0
if(!resting && m_intent == MOVE_INTENT_RUN && sprinting)
var/static/datum/config_entry/number/movedelay/sprint_speed_increase/SSI
if(!SSI)
SSI = CONFIG_GET_ENTRY(number/movedelay/sprint_speed_increase)
. -= SSI.config_entry_value
if(wrongdirmovedelay)
. += 1
. += ..()
/mob/living/carbon/human/proc/togglesprint() // If you call this proc outside of hotkeys or clicking the HUD button, I'll be disappointed in you.
sprinting = !sprinting
if(!resting && m_intent == MOVE_INTENT_RUN && canmove)
if(sprinting)
playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
else
playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory
S?.update_icon_state()
return TRUE
/mob/living/carbon/human/proc/sprint_hotkey(targetstatus)
if(targetstatus ? !sprinting : sprinting)
togglesprint()
@@ -1,5 +1,2 @@
/mob/living/proc/adjustStaminaLossBuffered(amount, updating_health = TRUE, forced = FALSE)
return
/mob/living/proc/doSprintLossTiles(amount)
return
+14 -104
View File
@@ -1,32 +1,4 @@
/mob/living
var/sprinting = FALSE
var/recoveringstam = FALSE
var/incomingstammult = 1
var/bufferedstam = 0
var/stambuffer = 20
var/stambufferregentime
var/attemptingstandup = FALSE
var/intentionalresting = FALSE
var/attemptingcrawl = FALSE
//Sprint buffer---
var/sprint_buffer = 42 //Tiles
var/sprint_buffer_max = 42
var/sprint_buffer_regen_ds = 0.3 //Tiles per world.time decisecond
var/sprint_buffer_regen_last = 0 //last world.time this was regen'd for math.
var/sprint_stamina_cost = 0.70 //stamina loss per tile while insufficient sprint buffer.
//---End
/mob/living/update_config_movespeed()
. = ..()
sprint_buffer_max = CONFIG_GET(number/movedelay/sprint_buffer_max)
sprint_buffer_regen_ds = CONFIG_GET(number/movedelay/sprint_buffer_regen_per_ds)
sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost)
/mob/living/movement_delay(ignorewalk = 0)
. = ..()
if(resting)
. += 6
/atom
var/pseudo_z_axis
@@ -53,87 +25,25 @@
pseudo_z_axis = newloc.get_fake_z()
pixel_z = pseudo_z_axis
/mob/living/proc/lay_down()
set name = "Rest"
set category = "IC"
if(client && client.prefs && client.prefs.autostand)
intentionalresting = !intentionalresting
to_chat(src, "<span class='notice'>You are now attempting to [intentionalresting ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].</span>")
if(intentionalresting && !resting)
resting = TRUE
update_canmove()
else
resist_a_rest()
else
if(!resting)
resting = TRUE
to_chat(src, "<span class='notice'>You are now laying down.</span>")
update_canmove()
else
resist_a_rest()
/mob/living/proc/resist_a_rest(automatic = FALSE, ignoretimer = FALSE) //Lets mobs resist out of resting. Major QOL change with combat reworks.
if(!resting || stat || attemptingstandup)
return FALSE
if(ignoretimer)
resting = FALSE
update_canmove()
return TRUE
else
var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest
if(getStaminaLoss() >= STAMINA_SOFTCRIT)
to_chat(src, "<span class='warning'>You're too exhausted to get up!")
return FALSE
attemptingstandup = TRUE
var/health_deficiency = max((maxHealth - (health - getStaminaLoss()))*0.5, 0)
if(!has_gravity())
health_deficiency = health_deficiency*0.2
totaldelay += health_deficiency
var/standupwarning = "[src] and everyone around them should probably yell at the dev team"
switch(health_deficiency)
if(-INFINITY to 10)
standupwarning = "[src] stands right up!"
if(10 to 35)
standupwarning = "[src] tries to stand up."
if(35 to 60)
standupwarning = "[src] slowly pushes [p_them()]self upright."
if(60 to 80)
standupwarning = "[src] weakly attempts to stand up."
if(80 to INFINITY)
standupwarning = "[src] struggles to stand up."
var/usernotice = automatic ? "<span class='notice'>You are now getting up. (Auto)</span>" : "<span class='notice'>You are now getting up.</span>"
visible_message("<span class='notice'>[standupwarning]</span>", usernotice, vision_distance = 5)
if(do_after(src, totaldelay, target = src))
resting = FALSE
attemptingstandup = FALSE
update_canmove()
return TRUE
else
visible_message("<span class='notice'>[src] falls right back down.</span>", "<span class='notice'>You fall right back down.</span>")
attemptingstandup = FALSE
if(has_gravity())
playsound(src, "bodyfall", 20, 1)
return FALSE
/mob/living/carbon/update_stamina()
var/total_health = getStaminaLoss()
if(total_health >= STAMINA_SOFTCRIT)
if(!(combat_flags & COMBAT_FLAG_SOFT_STAMCRIT))
ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SOFT_STAMCRIT)
else
if(combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)
DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SOFT_STAMCRIT)
if(total_health)
if(!recoveringstam && total_health >= STAMINA_CRIT && !stat)
if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health >= STAMINA_CRIT && !stat)
to_chat(src, "<span class='notice'>You're too exhausted to keep going...</span>")
resting = TRUE
if(combatmode)
toggle_combat_mode(TRUE)
recoveringstam = TRUE
set_resting(TRUE, FALSE, FALSE)
disable_intentional_combat_mode(TRUE, FALSE)
ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT)
filters += CIT_FILTER_STAMINACRIT
update_canmove()
if(recoveringstam && total_health <= STAMINA_SOFTCRIT)
update_mobility()
if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health <= STAMINA_SOFTCRIT)
to_chat(src, "<span class='notice'>You don't feel nearly as exhausted anymore.</span>")
recoveringstam = FALSE
DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT | COMBAT_FLAG_SOFT_STAMCRIT)
filters -= CIT_FILTER_STAMINACRIT
update_canmove()
update_mobility()
update_health_hud()
/mob/living/proc/update_hud_sprint_bar()
if(hud_used && hud_used.sprint_buffer)
hud_used.sprint_buffer.update_to_mob(src)
@@ -54,8 +54,8 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
var/mob/living/M = A
var/cachedstam = M.getStaminaLoss()
var/totalstuntime = cachedstam * stamtostunconversion * (M.lying ? 2 : 1)
if(!M.resting)
M.Knockdown(cachedstam*2) //BORK BORK. GET DOWN.
if(CHECK_MOBILITY(M, MOBILITY_STAND))
M.DefaultCombatKnockdown(cachedstam*2) //BORK BORK. GET DOWN.
M.Stun(totalstuntime)
user.do_attack_animation(A, ATTACK_EFFECT_BITE)
user.start_pulling(M, TRUE) //Yip yip. Come with.
@@ -284,7 +284,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
to_chat(R, "Insufficent Power!")
return
L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
L.Knockdown(80)
L.DefaultCombatKnockdown(80)
L.apply_effect(EFFECT_STUTTER, 4)
L.visible_message("<span class='danger'>[R] has shocked [L] with its tongue!</span>", \
"<span class='userdanger'>[R] has shocked you with its tongue!</span>")
@@ -426,13 +426,13 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
var/mob/living/L = hit_atom
if(!L.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
L.visible_message("<span class ='danger'>[src] pounces on [L]!</span>", "<span class ='userdanger'>[src] pounces on you!</span>")
L.Knockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
L.DefaultCombatKnockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
log_combat(src, L, "borg pounced")
else
Knockdown(15, 1, 1)
DefaultCombatKnockdown(15, 1, 1)
pounce_cooldown = !pounce_cooldown
spawn(pounce_cooldown_time) //3s by default
@@ -440,10 +440,10 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
else if(hit_atom.density && !hit_atom.CanPass(src))
visible_message("<span class ='danger'>[src] smashes into [hit_atom]!</span>", "<span class ='userdanger'>You smash into [hit_atom]!</span>")
playsound(src, 'sound/items/trayhit1.ogg', 50, 1)
Knockdown(15, 1, 1)
DefaultCombatKnockdown(15, 1, 1)
if(leaping)
leaping = 0
pixel_y = initial(pixel_y)
update_icons()
update_canmove()
update_mobility()
@@ -1,30 +0,0 @@
/mob/living/silicon/robot/Move(NewLoc, direct)
. = ..()
if(. && sprinting && !(movement_type & FLYING) && canmove && !resting)
if(!(cell?.use(25)))
togglesprint(TRUE)
/mob/living/silicon/robot/movement_delay()
. = ..()
if(!resting && !sprinting)
. += 1
. += speed
/mob/living/silicon/robot/proc/togglesprint(shutdown = FALSE) //Basically a copypaste of the proc from /mob/living/carbon/human
if(!shutdown && (!cell || cell.charge < 25) || !cansprint)
return FALSE
sprinting = shutdown ? FALSE : !sprinting
if(!resting && canmove)
if(sprinting)
playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
else
if(shutdown)
playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE)
playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory
S?.update_icon_state()
return TRUE
/mob/living/silicon/robot/proc/sprint_hotkey(targetstatus)
if(targetstatus ? !sprinting : sprinting)
togglesprint()
@@ -185,10 +185,15 @@
name = "electron blast"
icon_state = "stunjectile"
color = null
nodamage = 1
nodamage = TRUE
knockdown = 100
stamina = 5
knockdown_stamoverride = 0
knockdown_stam_max = 0
stamina = 18
stutter = 5
jitter = 20
strong_tase = FALSE
tase_duration = 0
hitsound = 'sound/weapons/taserhit.ogg'
range = 7
range = 3
strong_tase = FALSE
@@ -100,7 +100,7 @@
if(addiction_stage == 11)
to_chat(M, "<span class='userdanger'>You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.</span>")
M.Jitter(200)
M.Knockdown(200)
M.DefaultCombatKnockdown(200)
M.Stun(80)
var/items = M.get_contents()
if(!LAZYLEN(items))
@@ -154,8 +154,8 @@
do_sparks(5,FALSE,M)
M.Sleeping(100, 0)
M.Jitter(50)
M.Knockdown(100)
to_chat(M, "<span class='userdanger'>You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.</span>")
M.DefaultCombatKnockdown(100)
to_chat(M, "<span class='userdanger'>You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself.</span>")
M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE)
log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.")
M.reagents.remove_all_type(/datum/reagent, 100, 0, 1)
@@ -40,7 +40,7 @@
M.visible_message("<span class='warning'>A pair of breasts suddenly fly out of the [M]!</b></span>")
var/T2 = get_random_station_turf()
M.adjustBruteLoss(25)
M.Knockdown(50)
M.DefaultCombatKnockdown(50)
M.Stun(50)
B.throw_at(T2, 8, 1)
M.reagents.del_reagent(type)
@@ -104,8 +104,7 @@
var/obj/item/organ/genital/womb/W = M.getorganslot(ORGAN_SLOT_WOMB)
if(M.gender == MALE)
M.gender = FEMALE
M.visible_message("<span class='boldnotice'>[M] suddenly looks more feminine!</span>", "<span class='boldwarning'>You suddenly feel more feminine!</span>")
M.set_gender(FEMALE)
if(P)
P.modify_size(-0.05)
@@ -196,7 +195,7 @@
M.visible_message("<span class='warning'>A penis suddenly flies out of the [M]!</b></span>")
var/T2 = get_random_station_turf()
M.adjustBruteLoss(25)
M.Knockdown(50)
M.DefaultCombatKnockdown(50)
M.Stun(50)
P.throw_at(T2, 8, 1)
M.reagents.del_reagent(type)
@@ -251,8 +250,7 @@
var/obj/item/organ/genital/womb/W = M.getorganslot(ORGAN_SLOT_WOMB)
if(M.gender == FEMALE)
M.gender = MALE
M.visible_message("<span class='boldnotice'>[M] suddenly looks more masculine!</span>", "<span class='boldwarning'>You suddenly feel more masculine!</span>")
M.set_gender(MALE)
if(B)
B.modify_size(-0.05)
@@ -93,7 +93,7 @@
if(method == INJECT)
var/turf/T = get_turf(M)
M.adjustOxyLoss(15)
M.Knockdown(50)
M.DefaultCombatKnockdown(50)
M.Stun(50)
M.emote("cough")
var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush))
@@ -191,7 +191,7 @@
var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites)
if(prob(5))
to_chat(C, "<span class='warning'>The residual voltage from the nanites causes you to seize up!</b></span>")
C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
C.electrocute_act(10, (get_turf(C)), 1, SHOCK_ILLUSION)
if(prob(10))
var/atom/T = C
T.emp_act(EMP_HEAVY)
@@ -218,7 +218,7 @@ datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
/datum/reagent/fermi/nanite_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good)
if(prob(15))
to_chat(C, "<span class='warning'>The residual voltage in your system causes you to seize up!</b></span>")
C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
C.electrocute_act(10, (get_turf(C)), 1, SHOCK_ILLUSION)
if(prob(50))
var/atom/T = C
T.emp_act(EMP_HEAVY)
@@ -349,14 +349,9 @@
E.data["creatorID"] = B.data["ckey"]
E.creatorID = B.data["ckey"]
/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
var/turf/T = get_turf(my_atom)
var/datum/reagents/R = new/datum/reagents(1000)
var/datum/effect_system/smoke_spread/chem/s = new()
R.add_reagent(/datum/reagent/fermi/enthrallExplo, volume)
s.set_up(R, volume/2, T)
s.start()
my_atom.reagents.clear_reagents()
/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH)
R0.clear_reagents()
..()
/datum/chemical_reaction/fermi/hatmium // done
name = "Hat growth serum"