Merge remote-tracking branch 'upstream/master' into lungsss

# Conflicts:
#	code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
#	code/modules/mob/living/carbon/carbon_defines.dm
This commit is contained in:
Fox-McCloud
2017-11-18 18:49:47 -05:00
394 changed files with 15085 additions and 5344 deletions
+2 -2
View File
@@ -289,9 +289,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
switch(data_hud_seen) //give new huds
if(0)
show_me_the_hud(DATA_HUD_SECURITY_BASIC)
show_me_the_hud(DATA_HUD_SECURITY_ADVANCED)
to_chat(src, "<span class='notice'>Security HUD set.</span>")
if(DATA_HUD_SECURITY_BASIC)
if(DATA_HUD_SECURITY_ADVANCED)
show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED)
to_chat(src, "<span class='notice'>Medical HUD set.</span>")
if(DATA_HUD_MEDICAL_ADVANCED)
@@ -14,6 +14,8 @@
var/custom_pixel_x_offset = 0 //for admin fuckery.
var/custom_pixel_y_offset = 0
pass_flags = PASSTABLE
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
@@ -135,6 +135,11 @@ var/const/MAX_ACTIVE_TIME = 400
if(target.wear_mask)
if(prob(20))
return 0
if(istype(target.wear_mask, /obj/item/clothing/mask/muzzle))
var/obj/item/clothing/mask/muzzle/S = target.wear_mask
if(S.do_break())
target.visible_message("<span class='danger'>[src] spits acid onto [S] melting the lock!</span>", \
"<span class='userdanger'>[src] spits acid onto [S] melting the lock!</span>")
var/obj/item/clothing/W = target.wear_mask
if(W.flags & NODROP)
return 0
@@ -149,7 +154,10 @@ var/const/MAX_ACTIVE_TIME = 400
M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
else if(iscorgi(M))
var/mob/living/simple_animal/pet/corgi/C = M
loc = C
if(C.facehugger)
var/obj/item/F = C.facehugger
F.forceMove(C.loc)
forceMove(C)
C.facehugger = src
C.regenerate_icons()
@@ -161,7 +169,7 @@ var/const/MAX_ACTIVE_TIME = 400
return 1
/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob)
if(!target || target.stat == DEAD) //was taken off or something
if(!target || target.stat == DEAD || loc != target) //was taken off or something
return
if(iscarbon(target))
+10 -18
View File
@@ -625,6 +625,13 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
var/obj/item/clothing/mask/muzzle/M = wear_mask
if(M.security_lock)
dat += "&nbsp;<A href='?src=[M.UID()];locked=\ref[src]'>[M.locked ? "Disable Lock" : "Set Lock"]</A>"
dat += "</td></tr><tr><td>&nbsp;</td></tr>"
if(handcuffed)
dat += "<tr><td><B>Handcuffed:</B> <A href='?src=[UID()];item=[slot_handcuffed]'>Remove</A></td></tr>"
if(legcuffed)
@@ -727,23 +734,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
/mob/living/carbon/proc/spin(spintime, speed)
spawn()
var/D = dir
while(spintime >= speed)
sleep(speed)
switch(D)
if(NORTH)
D = EAST
if(SOUTH)
D = WEST
if(EAST)
D = SOUTH
if(WEST)
D = NORTH
dir = D
spintime -= speed
/mob/living/carbon/resist_buckle()
spawn(0)
resist_muzzle()
@@ -802,6 +792,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(do_after(src, time, 0, target = src))
visible_message("<span class='warning'>[src] removes [I]!</span>")
to_chat(src, "<span class='notice'>You get rid of [I]!</span>")
if(I.security_lock)
I.do_break()
unEquip(I)
@@ -1113,4 +1105,4 @@ so that different stomachs can handle things in different ways VB*/
update_tint()
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
update_inv_head()
@@ -24,6 +24,7 @@
var/wetlevel = 0 //how wet the mob is
var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/list/active_effect = list()
var/co2overloadtime = null
blood_volume = BLOOD_VOLUME_NORMAL
@@ -21,7 +21,7 @@
gender = new_gender
var/datum/sprite_accessory/hair/current_hair = hair_styles_list[H.h_style]
var/datum/sprite_accessory/hair/current_hair = hair_styles_full_list[H.h_style]
if(current_hair.gender != NEUTER && current_hair.gender != gender)
reset_head_hair()
@@ -35,9 +35,12 @@
update_body()
return 1
/mob/living/carbon/human/proc/change_hair(var/hair_style)
/mob/living/carbon/human/proc/change_hair(var/hair_style, var/fluff)
var/obj/item/organ/external/head/H = get_organ("head")
if(!hair_style || !H || H.h_style == hair_style || !(hair_style in hair_styles_list))
if(!hair_style || !H || H.h_style == hair_style)
return
if(!(fluff || (hair_style in hair_styles_public_list)))
return
H.h_style = hair_style
@@ -339,8 +342,8 @@
if(!H)
return //No head, no hair.
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
for(var/hairstyle in hair_styles_public_list)
var/datum/sprite_accessory/S = hair_styles_public_list[hairstyle]
if(hairstyle == "Bald") //Just in case.
valid_hairstyles += hairstyle
@@ -140,3 +140,4 @@ var/global/list/body_accessory_by_species = list("None" = null)
icon_state = "vulptail6"
animated_icon_state = "vulptail6_a"
allowed_species = list("Vulpkanin")
+49 -2
View File
@@ -76,6 +76,12 @@
else //Everyone else fails, skip the emote attempt
return
if("creaks", "creak")
if(species.name == "Diona") //Only Dionas can Creaks.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("hiss", "hisses")
if(species.name == "Unathi") //Only Unathi can hiss.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
@@ -86,7 +92,7 @@
on_CD = handle_emote_CD(50) //longer cooldown
if("fart", "farts", "flip", "flips", "snap", "snaps")
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
if("cough", "coughs", "slap", "slaps")
if("cough", "coughs", "slap", "slaps", "highfive")
on_CD = handle_emote_CD()
if("sneeze", "sneezes")
on_CD = handle_emote_CD()
@@ -170,6 +176,13 @@
playsound(loc, 'sound/effects/Kidanclack2.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
m_type = 2
if("creaks", "creak")
var/M = handle_emote_param(param)
message = "<B>[src]</B> creaks[M ? " at [M]" : ""]."
playsound(loc, 'sound/voice/dionatalk1.ogg', 50, 0) //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16]
m_type = 2
if("hiss", "hisses")
var/M = handle_emote_param(param)
@@ -808,10 +821,42 @@
continue
M.reagents.add_reagent("jenkem", 1)
if("hem")
message = "<b>[src]</b> hems."
if("highfive")
if(restrained())
return
if(EFFECT_HIGHFIVE in active_effect)
to_chat(src, "You give up on the high-five.")
active_effect -= EFFECT_HIGHFIVE
return
active_effect |= EFFECT_HIGHFIVE
for(var/mob/living/carbon/C in orange(1))
if(EFFECT_HIGHFIVE in C.active_effect)
if((C.mind.special_role == SPECIAL_ROLE_WIZARD) && (mind.special_role == SPECIAL_ROLE_WIZARD))
visible_message("<span class='danger'><b>[name]</b> and <b>[C.name]</b> high-five EPICALLY!</span>")
status_flags |= GODMODE
C.status_flags |= GODMODE
explosion(loc,5,2,1,3)
status_flags &= ~GODMODE
C.status_flags &= ~GODMODE
break
visible_message("<b>[name]</b> and <b>[C.name]</b> high-five!")
C.active_effect -= EFFECT_HIGHFIVE
active_effect -= EFFECT_HIGHFIVE
playsound('sound/effects/snap.ogg', 50)
break
if(EFFECT_HIGHFIVE in active_effect)
visible_message("<b>[name]</b> requests a highfive.", "You request a highfive.")
if(do_after(src, 25, target = src))
visible_message("[name] was left hanging. Embarrassing.", "You are left hanging. How embarrassing!")
active_effect -= EFFECT_HIGHFIVE
if("help")
var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dance, dap(s)(none)/mob," \
+ " deathgasp(s), drool(s), eyebrow, fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), grin(s)," \
+ " handshake-mob, hug(s)-(none)/mob, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
+ " handshake-mob, hug(s)-(none)/mob, hem, highfive, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
+ " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \
+ " wag(s), wave(s), whimper(s), wink(s), yawn(s)"
@@ -826,6 +871,8 @@
emotelist += "\nUnathi specific emotes :- hiss(es)"
if("Vulpkanin")
emotelist += "\nVulpkanin specific emotes :- growl(s)-none/mob, howl(s)-none/mob"
if("Diona")
emotelist += "\nDiona specific emotes :- creak(s)"
if (species.name == "Slime People")
emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob"
@@ -245,7 +245,7 @@
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a robotic [E.name]!\n"
else if(E.status & ORGAN_SPLINTED)
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on his [E.name]!\n"
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on [t_his] [E.name]!\n"
for(var/obj/item/I in E.embedded_objects)
msg += "<B>[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [E.name]!</B>\n"
+51 -10
View File
@@ -62,6 +62,7 @@
/mob/living/carbon/human/Destroy()
QDEL_LIST(bodyparts)
splinted_limbs.Cut()
return ..()
/mob/living/carbon/human/dummy
@@ -454,7 +455,14 @@
if(slot_wear_mask in obscured)
dat += "<tr><td><font color=grey><B>Mask:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A>"
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
var/obj/item/clothing/mask/muzzle/M = wear_mask
if(M.security_lock)
dat += "&nbsp;<A href='?src=[M.UID()];locked=\ref[src]'>[M.locked ? "Disable Lock" : "Set Lock"]</A>"
dat += "</td></tr><tr><td>&nbsp;</td></tr>"
if(!issmall(src))
if(slot_glasses in obscured)
@@ -796,7 +804,7 @@
if(href_list["criminal"])
if(hasHUD(usr,"security"))
var/modified = 0
var/found_record = 0
var/perpname = "wot"
if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID()
@@ -814,16 +822,33 @@
if(R.fields["id"] == E.fields["id"])
var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
var/t1 = copytext(trim(sanitize(input("Enter Reason:", "Security HUD", null, null) as text)), 1, MAX_MESSAGE_LEN)
if(!t1)
t1 = "(none)"
if(hasHUD(usr, "security") && setcriminal != "Cancel")
found_record = 1
var/their_name = R.fields["name"]
var/their_rank = R.fields["rank"]
if(R.fields["criminal"] == "*Execute*")
to_chat(usr, "<span class='warning'>Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.</span>")
else
if(ishuman(usr))
var/mob/living/carbon/human/U = usr
R.fields["comments"] += "Set to [setcriminal] by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()] with comment: [t1]<BR>"
if(isrobot(usr))
var/mob/living/silicon/robot/U = usr
R.fields["comments"] += "Set to [setcriminal] by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()] with comment: [t1]<BR>"
if(isAI(usr))
var/mob/living/silicon/ai/U = usr
R.fields["comments"] += "Set to [setcriminal] by [U.name] (artificial intelligence) on [current_date_string] [worldtime2text()] with comment: [t1]<BR>"
if(hasHUD(usr, "security"))
if(setcriminal != "Cancel")
R.fields["criminal"] = setcriminal
modified = 1
log_admin("[key_name_admin(usr)] set secstatus of [their_rank] [their_name] to [setcriminal], comment: [t1]")
spawn()
sec_hud_set_security_status()
if(!modified)
if(!found_record)
to_chat(usr, "<span class='warning'>Unable to locate a data core entry for this person.</span>")
if(href_list["secrecord"])
@@ -1556,8 +1581,8 @@
else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize.
var/list/hair = list()
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
for(var/i in hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
@@ -1727,6 +1752,8 @@
var/datum/data/record/R = find_record("name", perpname, data_core.security)
if(R && R.fields["criminal"])
switch(R.fields["criminal"])
if("*Execute*")
threatcount += 7
if("*Arrest*")
threatcount += 5
if("Incarcerated")
@@ -1999,7 +2026,21 @@
..()
mob/living/carbon/human/get_taste_sensitivity()
/mob/living/carbon/human/vv_get_dropdown()
. = ..()
. += "---"
.["Set Species"] = "?_src_=vars;setspecies=[UID()]"
.["Make AI"] = "?_src_=vars;makeai=[UID()]"
.["Make Mask of Nar'sie"] = "?_src_=vars;makemask=[UID()]"
.["Make cyborg"] = "?_src_=vars;makerobot=[UID()]"
.["Make monkey"] = "?_src_=vars;makemonkey=[UID()]"
.["Make alien"] = "?_src_=vars;makealien=[UID()]"
.["Make slime"] = "?_src_=vars;makeslime=[UID()]"
.["Make superhero"] = "?_src_=vars;makesuper=[UID()]"
. += "---"
/mob/living/carbon/human/get_taste_sensitivity()
if(species)
return species.taste_sensitivity
else
@@ -72,3 +72,5 @@ var/global/default_martial_art = new/datum/martial_art
var/datum/body_accessory/body_accessory = null
var/tail // Name of tail image in species effects icon file.
var/list/splinted_limbs = list() //limbs we know are splinted
@@ -36,40 +36,45 @@
/mob/living/carbon/human/Move(NewLoc, direct)
. = ..()
if(.) // did we actually move?
if(!lying && !buckled)
var/obj/item/clothing/shoes/S = shoes
if(!has_gravity(loc))
return
//Bloody footprints
var/turf/T = get_turf(src)
var/obj/item/organ/external/l_foot = get_organ("l_foot")
var/obj/item/organ/external/r_foot = get_organ("r_foot")
var/hasfeet = 1
if(!l_foot && !r_foot)
hasfeet = 0
if(!lying && !buckled && !throwing)
for(var/obj/item/organ/external/splinted in splinted_limbs)
splinted.update_splints()
if(!has_gravity(loc))
return
var/obj/item/clothing/shoes/S = shoes
//Bloody footprints
var/turf/T = get_turf(src)
var/obj/item/organ/external/l_foot = get_organ("l_foot")
var/obj/item/organ/external/r_foot = get_organ("r_foot")
var/hasfeet = TRUE
if(!l_foot && !r_foot)
hasfeet = FALSE
if(shoes)
if(S.bloody_shoes && S.bloody_shoes[S.blood_state])
var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T
if(oldFP && oldFP.blood_state == S.blood_state && oldFP.basecolor == S.blood_color)
return
else
//No oldFP or it's a different kind of blood
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
createFootprintsFrom(shoes, dir, T)
update_inv_shoes()
else if(hasfeet)
if(bloody_feet && bloody_feet[blood_state])
var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T
if(oldFP && oldFP.blood_state == blood_state && oldFP.basecolor == feet_blood_color)
return
else
bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP)
createFootprintsFrom(src, dir, T)
update_inv_shoes()
//End bloody footprints
if(S)
S.step_action(src)
if(shoes)
if(S.bloody_shoes && S.bloody_shoes[S.blood_state])
var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T
if(oldFP && oldFP.blood_state == S.blood_state && oldFP.basecolor == S.blood_color)
return
else
//No oldFP or it's a different kind of blood
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
createFootprintsFrom(shoes, dir, T)
update_inv_shoes()
else if(hasfeet)
if(bloody_feet && bloody_feet[blood_state])
var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T
if(oldFP && oldFP.blood_state == blood_state && oldFP.basecolor == feet_blood_color)
return
else
bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP)
createFootprintsFrom(src, dir, T)
update_inv_shoes()
//End bloody footprints
if(S)
S.step_action(src)
/mob/living/carbon/human/handle_footstep(turf/T)
if(..())
@@ -182,3 +182,9 @@ I use this to standardize shadowling dethrall code
odmg += O.brute_dam
odmg += O.burn_dam
return (health < (100 - odmg))
/mob/living/carbon/human/proc/handle_splints() //proc that rebuilds the list of splints on this person, for ease of processing
splinted_limbs.Cut()
for(var/obj/item/organ/external/limb in bodyparts)
if(limb.status & ORGAN_SPLINTED)
splinted_limbs += limb
+25 -8
View File
@@ -93,32 +93,49 @@
if(getBrainLoss() >= 60 && stat != DEAD)
speech_problem_flag = 1
if(prob(3))
var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH",
var/list/s1 = list("IM A [pick("PONY","LIZARD","taJaran","kitty","Vulpakin","drASK","BIRDIE","voxxie","race car","combat meCH","SPESSSHIP")] [pick("NEEEEEEIIIIIIIIIGH","sKREEEEEE","MEOW","NYA~","rawr","Barkbark","Hissssss","vROOOOOM","pewpew","choo Choo")]!",
"without oxigen blob don't evoluate?",
"CAPTAINS A COMDOM",
"[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!",
"can u give me [pick("telikesis","halk","eppilapse")]?",
"THe saiyans screwed",
"Bi is THE BEST OF BOTH WORLDS>",
"Bi is THE BEST OF BOTH WORLDS",
"I WANNA PET TEH monkeyS",
"stop grifing me!!!!",
"SOTP IT#")
"SOTP IT!",
"HALPZ SITCULITY",
"VOXES caN't LOVE",
"my dad own this station",
"the CHef put [pick("PROTEIN", "toiret waTer", "RiPPleing TendIes", "Einzymes","HORRY WALTER","nuTriments","ReActive MutAngen","TeSLium","sKrektonium")] in my [pick("wiSh soup","Bullito","rAingurber","sOilent GREEn","KoI Susishes","yaya")]!",
"the monkey have TASER ARMS!",
"qM blew my points on [pick("cOMbat Shtogun","inSuLated gloves","LOTS MASSHEEN!")]",
"EI'NATH!",
"WAKE UP SHEEPLES!",
"et wus my [pick("wittle brother!!","fiancee","friend staying over","entiRe orphanage","love interest","wife","husband","liTTle kids","sentient cAT","accidentally")]!")
var/list/s2 = list("FUS RO DAH",
"fucking 4rries!",
"fuckin tangerines!!!",
"stat me",
">my face",
"roll it easy!",
"waaaaaagh!!!",
"red wonz go fasta",
"FOR TEH EMPRAH",
"lol2cat",
"HAZ A SECURE DAY!!!!",
"dem dwarfs man, dem dwarfs",
"SPESS MAHREENS",
"hwee did eet fhor khayosss",
"lifelike texture ;_;",
"lifelike texture",
"luv can bloooom",
"PACKETS!!!")
"PACKETS!!!",
"[pick("WHERE MY","aYE need","giv me my","bath me inn.")] [pick("dermaline","alKkyZine","dylOvene","inAprovaline","biCaridine","Hyperzine","kELotane","lePorazine","bAcch Salts","tricord","clOnexazone","hydroChloric Acid","chlorine Hydrate","paRoxetine")]!",
"mALPRACTICEBAY",
"I HavE A pe H dee iN ENTerpriSE resOUrCE pLaNNIN",
"h-h-HalP MaINT",
"dey come, dey COME! DEY COME!!!",
"THE END IS NIGH!",
"I FOT AND DIED FOR MUH [pick("RITES","FREEDOM","payCHECK","cARGO points","teCH Level","doG","mAPLe syrup","fluffy fWiends","gateway Loot")]",
"KILL DEM [pick("mainTnacE cHickinNS","kiRA CulwnNES","FLOOR CLUWNEs","MIME ASSASSIN","BOMBING TAJARAN","cC offiser","morPhlings","slinglings")]!")
switch(pick(1,2,3))
if(1)
say(pick(s1))
@@ -876,7 +893,7 @@
/mob/living/carbon/human/handle_changeling()
if(mind)
if(mind.changeling)
mind.changeling.regenerate()
mind.changeling.regenerate(src)
if(hud_used)
hud_used.lingchemdisplay.invisibility = 0
hud_used.lingchemdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#dd66dd'>[round(mind.changeling.chem_charges)]</font></div>"
@@ -73,7 +73,7 @@
node.remove(H)
node.loc = M.loc
to_chat(M, "<span class='notice'>You hear a loud crunch as you mercilessly pull off [H]'s antennae.</span>")
to_chat(H, "<span class='danger'><B>You hear a loud crunch as your antennae is ripped off your head by [M].</span></B>")
to_chat(H, "<span class='danger'>You hear a loud crunch as your antennae is ripped off your head by [M].</span>")
to_chat(H, "<span class='danger'><span class='danger'><B>It's so quiet...</B></span>")
head_organ.h_style = "Bald"
H.update_hair()
@@ -53,6 +53,7 @@
if(L.brute_dam < L.min_broken_damage)
L.status &= ~ORGAN_BROKEN
L.status &= ~ORGAN_SPLINTED
H.handle_splints()
L.perma_injury = 0
break // We're only checking one limb here, bucko
if(prob(3))
@@ -752,6 +752,8 @@
path = /mob/living/carbon/human/diona
default_language = "Galactic Common"
language = "Rootspeak"
speech_sounds = list('sound/voice/dionatalk1.ogg') //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16]
speech_chance = 20
unarmed_type = /datum/unarmed_attack/diona
//primitive_form = "Nymph"
slowdown = 5
@@ -442,7 +442,7 @@ var/global/list/damage_icon_parts = list()
//var/icon/debrained_s = new /icon("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s")
if(head_organ.h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic())))
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[head_organ.h_style]
var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style]
//if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN
// hair_standing.Blend(debrained_s, ICON_OVERLAY)
if(hair_style && hair_style.species_allowed)
@@ -759,7 +759,7 @@ var/global/list/damage_icon_parts = list()
else
new_glasses = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]")
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[head_organ.h_style]
var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style]
if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value.
overlays_standing[GLASSES_OVER_LAYER] = new_glasses
else
+1 -1
View File
@@ -12,8 +12,8 @@
handle_blood()
for(var/obj/item/organ/internal/O in internal_organs)
O.on_life()
handle_changeling()
handle_changeling()
handle_wetness()
// Increase germ_level regularly
@@ -175,6 +175,7 @@
return
if(target.mind.assigned_role != "Civilian")
to_chat(user, "<span class='warning'>You can only recruit Civilians.</span>")
return
if(recruiting)
to_chat(user, "<span class='danger'>You are already recruiting!</span>")
charge_counter = charge_max
@@ -187,7 +188,7 @@
switch(progress)
if(1)
to_chat(user, "<span class='notice'>You begin by introducing yourself and explaining what you're about.</span>")
user.visible_message("<span class='danger'>[user]'s introduces himself and explains his plans.</span>")
user.visible_message("<span class='danger'>[user]'s introduces \himself and explains \his plans.</span>")
if(2)
to_chat(user, "<span class='notice'>You begin the recruitment of [target].</span>")
user.visible_message("<span class='danger'>[user] leans over towards [target], whispering excitedly as he gives a speech.</span>")
@@ -213,7 +214,7 @@
recruiting = 0
to_chat(user, "<span class='notice'>You have recruited <b>[target]</b> as your henchman!</span>")
to_chat(target, "<span class='deadsay'><b>You have decided to enroll as a henchman for [user]. You are now part of the feared 'Greyshirts'.</b></span>")
to_chat(target, "<span class='deadsay'><b>You must follow the orders of [user], and help him succeed in his dastardly schemes.</span>")
to_chat(target, "<span class='deadsay'><b>You must follow the orders of [user], and help him succeed in \his dastardly schemes.</span>")
to_chat(target, "<span class='deadsay'>You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.</span>")
ticker.mode.greyshirts += target.mind
target.set_species("Human")
+3
View File
@@ -1,6 +1,9 @@
/mob/living/death(gibbed)
blinded = max(blinded, 1)
if(suiciding)
mind.suicided = TRUE
clear_fullscreens()
update_action_buttons_icon()
+1 -1
View File
@@ -1036,7 +1036,7 @@
return //no message spam
if(final_taste_list.len == 0)//too many reagents - none meet their thresholds
to_chat(src, "<span class='notice'>You you can't really make out what you're tasting...</span>")
to_chat(src, "<span class='notice'>You can't really make out what you're tasting...</span>")
return
to_chat(src, "<span class='notice'>You can taste [english_list(final_taste_list)].</span>")
+3 -2
View File
@@ -30,6 +30,7 @@ var/list/department_radio_keys = list(
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
":Z" = "Service", "#Z" = "Service", ".Z" = "Service",
":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private",
":$" = "Response Team", "#$" = "Response Team", ".$" = "Response Team",
":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops",
":_" = "SyndTeam", "#_" = "SyndTeam", "._" = "SyndTeam",
":X" = "cords", "#X" = "cords", ".X" = "cords"
@@ -163,10 +164,10 @@ proc/get_radio_key_from_channel(var/channel)
if(is_muzzled())
var/obj/item/clothing/mask/muzzle/G = wear_mask
if(G.mute) //if the mask is supposed to mute you completely or just muffle you
if(G.mute == MUTE_ALL) //if the mask is supposed to mute you completely or just muffle you
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
return
else
else if(G.mute == MUTE_MUFFLE)
message = muffledspeech(message)
verb = "mumbles"
+59 -17
View File
@@ -68,6 +68,7 @@ var/list/robot_verbs_default = list(
var/lockcharge //Used when locking down a borg to preserve cell charge
var/speed = 0 //Cause sec borgs gotta go fast //No they dont!
var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
var/pdahide = 0 //Used to hide the borg from the messenger list
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
var/braintype = "Cyborg"
var/base_icon = ""
@@ -193,6 +194,7 @@ var/list/robot_verbs_default = list(
return 1
/mob/living/silicon/robot/proc/get_default_name(var/prefix as text)
if(prefix)
modtype = prefix
@@ -226,10 +228,12 @@ var/list/robot_verbs_default = list(
if(!rbPDA)
rbPDA = new(src)
rbPDA.set_name_and_job(real_name, braintype)
if(scrambledcodes)
var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger)
if(M)
var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger)
if(M)
if(scrambledcodes)
M.hidden = 1
if(pdahide)
M.toff = 1
/mob/living/silicon/robot/binarycheck()
if(is_component_functioning("comms"))
@@ -262,14 +266,18 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/pick_module()
if(module)
return
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service")
if(!config.forbid_secborg)
modules += "Security"
if(!config.forbid_peaceborg)
modules += "Peacekeeper"
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
to_chat(src, "<span class='warning'>Crisis mode active. Combat module available.</span>")
modules+="Combat"
modules += "Combat"
if(ticker && ticker.mode && ticker.mode.name == "nations")
var/datum/game_mode/nations/N = ticker.mode
if(N.kickoff)
modules = list("Peacekeeper")
modules = list("Nations")
if(mmi != null && mmi.alien)
modules = "Hunter"
modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules
@@ -336,6 +344,11 @@ var/list/robot_verbs_default = list(
module_sprites["Noble-SEC"] = "Noble-SEC"
status_flags &= ~CANPUSH
if("Peacekeeper")
module = new /obj/item/weapon/robot_module/peacekeeper(src)
module_sprites["Peacekeeper"] = "peace"
status_flags &= ~CANPUSH
if("Engineering")
module = new /obj/item/weapon/robot_module/engineering(src)
module.channels = list("Engineering" = 1)
@@ -362,8 +375,8 @@ var/list/robot_verbs_default = list(
module.channels = list("Security" = 1)
icon_state = "droidcombat"
if("Peacekeeper")
module = new /obj/item/weapon/robot_module/peacekeeper(src)
if("Nations")
module = new /obj/item/weapon/robot_module/nations(src)
module.channels = list()
icon_state = "droidpeace"
@@ -381,14 +394,14 @@ var/list/robot_verbs_default = list(
module.add_subsystems_and_actions(src)
//Custom_sprite check and entry
if(custom_sprite == 1)
if(custom_sprite && check_sprite("[ckey]-[modtype]"))
module_sprites["Custom"] = "[src.ckey]-[modtype]"
hands.icon_state = lowertext(module.module_type)
feedback_inc("cyborg_[lowertext(modtype)]",1)
rename_character(real_name, get_default_name())
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper")
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper" || modtype == "Nations")
status_flags &= ~CANPUSH
choose_icon(6,module_sprites)
@@ -480,7 +493,7 @@ var/list/robot_verbs_default = list(
toggle_ionpulse()
return
cell.charge -= 50 // 500 steps on a default cell.
cell.charge -= 25 // 500 steps on a default cell.
return 1
/mob/living/silicon/robot/proc/toggle_ionpulse()
@@ -958,7 +971,7 @@ var/list/robot_verbs_default = list(
else
overlays += "[panelprefix]-openpanel -c"
var/combat = list("Combat","Peacekeeper")
var/combat = list("Combat","Nations")
if(modtype in combat)
if(base_icon == "")
base_icon = icon_state
@@ -1323,11 +1336,13 @@ var/list/robot_verbs_default = list(
icon_state = "nano_bloodhound"
lawupdate = 0
scrambledcodes = 1
pdahide = 1
modtype = "Commando"
faction = list("nanotrasen")
designation = "Nanotrasen Combat"
req_access = list(access_cent_specops)
ionpulse = 1
magpulse = 1
var/searching_for_ckey = 0
/mob/living/silicon/robot/deathsquad/New(loc)
@@ -1371,11 +1386,13 @@ var/list/robot_verbs_default = list(
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
pdahide = 1
faction = list("syndicate")
designation = "Syndicate Assault"
modtype = "Syndicate"
req_access = list(access_syndicate)
ionpulse = 1
magpulse = 1
lawchannel = "State"
var/playstyle_string = "<span class='userdanger'>You are a Syndicate assault cyborg!</span><br>\
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
@@ -1437,15 +1454,33 @@ var/list/robot_verbs_default = list(
radio.config(module.channels)
notify_ai(2)
/mob/living/silicon/robot/peacekeeper
/mob/living/silicon/robot/ert
designation = "ERT"
lawupdate = 0
scrambledcodes = 1
req_access = list(access_cent_specops)
ionpulse = 1
/mob/living/silicon/robot/ert/init()
laws = new /datum/ai_laws/ert_override
radio = new /obj/item/device/radio/borg/ert(src)
radio.recalculateChannels()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
/mob/living/silicon/robot/ert/New(loc)
..()
cell.maxcharge = 25000
cell.charge = 25000
/mob/living/silicon/robot/nations
base_icon = "droidpeace"
icon_state = "droidpeace"
modtype = "Peacekeeper"
designation = "Peacekeeper"
modtype = "Nations"
designation = "Nations"
/mob/living/silicon/robot/peacekeeper/init()
/mob/living/silicon/robot/nations/init()
..()
module = new /obj/item/weapon/robot_module/peacekeeper(src)
module = new /obj/item/weapon/robot_module/nations(src)
//languages
module.add_languages(src)
//subsystems
@@ -1474,3 +1509,10 @@ var/list/robot_verbs_default = list(
borked_part.wrapped = new borked_part.external_type
borked_part.heal_damage(brute,burn)
borked_part.install()
/mob/living/silicon/robot/proc/check_sprite(spritename)
. = FALSE
var/static/all_borg_icon_states = icon_states('icons/mob/custom_synthetic/custom-synthetic.dmi')
if(spritename in all_borg_icon_states)
. = TRUE
@@ -189,6 +189,7 @@
/obj/item/weapon/robot_module/engineering/New()
..()
modules += new /obj/item/weapon/rcd/borg(src)
modules += new /obj/item/weapon/rpd(src)
modules += new /obj/item/weapon/extinguisher(src)
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
modules += new /obj/item/weapon/screwdriver/cyborg(src)
@@ -228,6 +229,22 @@
fix_modules()
/obj/item/weapon/robot_module/peacekeeper
name = "peacekeeping robot module"
module_type = "Standard"
/obj/item/weapon/robot_module/peacekeeper/New()
..()
modules += new /obj/item/weapon/cookiesynth(src)
modules += new /obj/item/device/harmalarm(src)
modules += new /obj/item/weapon/reagent_containers/borghypo/peace(src)
modules += new /obj/item/taperoll/police(src)
modules += new /obj/item/borg/cyborghug/peacekeeper(src)
modules += new /obj/item/weapon/extinguisher(src)
emag = new /obj/item/weapon/reagent_containers/borghypo/peace/hacked(src)
fix_modules()
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
module_type = "Janitor"
@@ -413,11 +430,11 @@
fix_modules()
/obj/item/weapon/robot_module/peacekeeper
name = "peacekeeper robot module"
/obj/item/weapon/robot_module/nations
name = "nations robot module"
module_type = "Malf"
/obj/item/weapon/robot_module/peacekeeper/New()
/obj/item/weapon/robot_module/nations/New()
..()
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
@@ -482,6 +499,7 @@
modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
modules += new /obj/item/weapon/soap(src)
modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/weapon/rpd(src)
emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
@@ -681,11 +681,12 @@
if(istype(M,/mob/living/silicon/robot))
visible_message("<span class='danger'>[src] bumps into [M]!</span>")
else
add_logs(src, M, "knocked down")
visible_message("<span class='danger'>[src] knocks over [M]!</span>")
M.stop_pulling()
M.Stun(8)
M.Weaken(5)
if(!paicard)
add_logs(src, M, "knocked down")
visible_message("<span class='danger'>[src] knocks over [M]!</span>")
M.stop_pulling()
M.Stun(8)
M.Weaken(5)
return ..()
/mob/living/simple_animal/bot/mulebot/proc/RunOver(mob/living/carbon/human/H)
@@ -60,7 +60,8 @@
if(can_collar)
dat += "<tr><td>&nbsp;</td></tr>"
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=[UID()];item=[slot_collar]'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
if(facehugger)
dat += "<tr><td><B>Facehugger:</B></td><td><A href='?src=[UID()];remove_hugger=1'>[facehugger]</A></td></tr>"
dat += {"</table>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
"}
@@ -103,11 +104,10 @@
/mob/living/simple_animal/pet/corgi/Topic(href, href_list)
if(usr.stat) return
if((!ishuman(usr) && !isrobot(usr)) || !Adjacent(usr))
return
//Removing from inventory
if(href_list["remove_inv"])
if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr)))
return
var/remove_from = href_list["remove_inv"]
switch(remove_from)
if("head")
@@ -143,14 +143,9 @@
else
to_chat(usr, "<span class='danger'>There is nothing to remove from its [remove_from].</span>")
return
show_inv(usr)
//Adding things to inventory
else if(href_list["add_inv"])
if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr)))
return
var/add_to = href_list["add_inv"]
switch(add_to)
@@ -201,7 +196,16 @@
item_to_add.loc = src
src.inventory_back = item_to_add
regenerate_icons()
show_inv(usr)
//Removing facehuggers
else if(href_list["remove_hugger"])
if(!facehugger)
return
var/obj/item/F = facehugger
F.forceMove(loc)
facehugger = null
to_chat(usr, "<span class='notice'>You remove [F] from [src]'s face. [src] pants for air and barks.</span>")
regenerate_icons()
show_inv(usr)
else
..()
@@ -462,10 +466,7 @@
if(prob(1))
custom_emote(1, pick("dances around.","chases its tail!"))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
sleep(1)
spin(20, 1)
/obj/item/weapon/reagent_containers/food/snacks/meat/corgi
name = "Corgi meat"
@@ -550,10 +551,7 @@
if(!resting && !buckled)
if(prob(1))
custom_emote(1, pick("dances around.","chases her tail."))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
sleep(1)
spin(20, 1)
/mob/living/simple_animal/pet/corgi/attack_hand(mob/living/carbon/human/M)
. = ..()
@@ -6,6 +6,4 @@
for(var/mob/O in oviewers(src, null))
if((O.client && !( O.blinded )))
to_chat(O, text("[] [pick("dances around","chases its tail")].", src))
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
sleep(1)
spin(20, 1)
@@ -23,6 +23,8 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
heat_damage_per_tick = 20
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
faction = list("alien")
status_flags = CANPUSH
minbodytemp = 0
@@ -127,9 +127,6 @@
return 1
return 0
//Botany Worker Bees
/mob/living/simple_animal/hostile/poison/bees/worker
//Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee)
@@ -253,6 +250,9 @@
if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped
if(S.reagents.has_reagent("royal_bee_jelly",5))
S.reagents.remove_reagent("royal_bee_jelly", 5)
if(!queen.beegent.can_synth)
to_chat(user, "<span class='warning'>You inject [src] with the royal bee jelly. It's ineffective! Maybe it's something to do with the [src] reagent.</span>")
return
var/obj/item/queen_bee/qb = new(get_turf(user))
qb.queen = new(qb)
if(queen && queen.beegent)
@@ -16,6 +16,8 @@
humanize_prompt += " Role: [spider_role_summary]"
if(user.ckey in ts_ckey_blacklist)
error_on_humanize = "You are not able to control any terror spider this round."
else if(user.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
error_on_humanize = "You have enabled antag HUD and are unable to re-enter the round."
else if(spider_awaymission)
error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts."
else if(!ai_playercontrol_allowtype)
@@ -38,6 +38,8 @@ var/global/list/ts_spiderling_list = list()
// Movement
move_to_delay = 6
turns_per_move = 5
pressure_resistance = 50 //50 kPa difference required to push
throw_pressure_limit = 100 //100 kPa difference required to throw
pass_flags = PASSTABLE
// Ventcrawling
+4 -4
View File
@@ -97,8 +97,9 @@
/mob/living/proc/update_stamina()
return
/mob/living/on_varedit(modified_var)
switch(modified_var)
/mob/living/vv_edit_var(var_name, var_value)
. = ..()
switch(var_name)
if("weakened")
SetWeakened(weakened)
if("stunned")
@@ -120,5 +121,4 @@
if("maxHealth")
updatehealth()
if("resize")
update_transform()
..()
update_transform()
+46 -1
View File
@@ -684,7 +684,7 @@ var/list/slot_equipment_priority = list( \
set src in usr
if(usr != src)
to_chat(usr, "No.")
var/msg = input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null
var/msg = input(usr,"Set the flavor text in your 'examine' verb. The flavor text should be a physical descriptor of your character at a glance.","Flavor Text",html_decode(flavor_text)) as message|null
if(msg != null)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
@@ -1237,3 +1237,48 @@ var/list/slot_equipment_priority = list( \
attack_log += new_log
last_log = world.timeofday
/mob/vv_get_dropdown()
. = ..()
.["Show player panel"] = "?_src_=vars;mob_player_panel=[UID()]"
.["Give Spell"] = "?_src_=vars;give_spell=[UID()]"
.["Give Disease"] = "?_src_=vars;give_disease=[UID()]"
.["Toggle Godmode"] = "?_src_=vars;godmode=[UID()]"
.["Toggle Build Mode"] = "?_src_=vars;build_mode=[UID()]"
.["Make 2spooky"] = "?_src_=vars;make_skeleton=[UID()]"
.["Assume Direct Control"] = "?_src_=vars;direct_control=[UID()]"
.["Offer Control to Ghosts"] = "?_src_=vars;offer_control=[UID()]"
.["Drop Everything"] = "?_src_=vars;drop_everything=[UID()]"
.["Regenerate Icons"] = "?_src_=vars;regenerateicons=[UID()]"
.["Add Language"] = "?_src_=vars;addlanguage=[UID()]"
.["Remove Language"] = "?_src_=vars;remlanguage=[UID()]"
.["Add Organ"] = "?_src_=vars;addorgan=[UID()]"
.["Remove Organ"] = "?_src_=vars;remorgan=[UID()]"
.["Fix NanoUI"] = "?_src_=vars;fix_nano=[UID()]"
.["Add Verb"] = "?_src_=vars;addverb=[UID()]"
.["Remove Verb"] = "?_src_=vars;remverb=[UID()]"
.["Gib"] = "?_src_=vars;gib=[UID()]"
/mob/proc/spin(spintime, speed)
set waitfor = 0
var/D = dir
while(spintime >= speed)
sleep(speed)
switch(D)
if(NORTH)
D = EAST
if(SOUTH)
D = WEST
if(EAST)
D = SOUTH
if(WEST)
D = NORTH
setDir(D)
spintime -= speed
@@ -341,7 +341,7 @@
face_s.Blend(eyes_s, ICON_OVERLAY)
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
var/datum/sprite_accessory/hair_style = hair_styles_full_list[h_style]
if(hair_style)
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
if(current_species.name == "Slime People") // whee I am part of the problem
@@ -17,16 +17,21 @@
conversion in savefile.dm
*/
/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female)
/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female, var/list/full_list)
if(!istype(L)) L = list()
if(!istype(male)) male = list()
if(!istype(female)) female = list()
if(!istype(full_list)) full_list = list()
for(var/path in subtypesof(prototype))
var/datum/sprite_accessory/D = new path()
if(D.name)
L[D.name] = D
if(D.fluff)
full_list[D.name] = D
else
L[D.name] = D
full_list[D.name] = D
switch(D.gender)
if(MALE) male[D.name] = D
@@ -50,7 +55,7 @@
var/marking_location //Specifies which bodypart a body marking is located on.
var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this.
var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme.
var/fluff = 0
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -65,7 +70,7 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
var/glasses_over //Hair styles with hair that don't overhang the arms of glasses should have glasses_over set to a positive value.
var/glasses_over //Hair styles with hair that don't overhang the arms of glasses should have glasses_over set to a positive value
/datum/sprite_accessory/hair/bald
name = "Bald"
@@ -428,6 +433,343 @@
//////END VG HAIRSTYLES///////
//////////////////////////////
///////////////////////////////////
//////START POLARIS HAIRSTYLES/////
//////////////////////////////////
/datum/sprite_accessory/hair/dave
name = "Dave"
icon_state = "hair_dave"
/datum/sprite_accessory/hair/rosa
name = "Rosa"
icon_state = "hair_rosa"
/datum/sprite_accessory/hair/jade
name = "Jade"
icon_state = "hair_jade"
/datum/sprite_accessory/hair/shy
name = "Shy"
icon_state = "hair_shy"
/datum/sprite_accessory/hair/manbun
name = "Manbun"
icon_state = "hair_manbun"
/datum/sprite_accessory/hair/thinningback
name = "Thinning Back"
icon_state = "hair_thinningrear"
/datum/sprite_accessory/hair/thinningfront
name = "Thinning Front"
icon_state = "hair_thinningfront"
/datum/sprite_accessory/hair/thinning
name = "Thinning"
icon_state = "hair_thinning"
/datum/sprite_accessory/hair/bowlcut2
name = "Bowl 2"
icon_state = "hair_bowlcut2"
/datum/sprite_accessory/hair/ronin
name = "Ronin"
icon_state = "hair_ronin"
/datum/sprite_accessory/hair/topknot
name = "Topknot"
icon_state = "hair_topknot"
/datum/sprite_accessory/hair/regulationmohawk
name = "Regulation Mohawk"
icon_state = "hair_shavedmohawk"
/datum/sprite_accessory/hair/rowbraid
name = "Row Braid"
icon_state = "hair_rowbraid"
/datum/sprite_accessory/hair/rowdualbraid
name = "Row Dual Braid"
icon_state = "hair_rowdualtail"
/datum/sprite_accessory/hair/rowbun
name = "Row Bun"
icon_state = "hair_rowbun"
/datum/sprite_accessory/hair/hightight
name = "High and Tight"
icon_state = "hair_hightight"
/datum/sprite_accessory/hair/partfade
name = "Parted Fade"
icon_state = "hair_shavedpart"
gender = MALE
/datum/sprite_accessory/hair/undercut3
name = "Undercut Swept Left"
icon_state = "hair_undercut3"
gender = MALE
/datum/sprite_accessory/hair/undercut2
name = "Undercut Swept Right"
icon_state = "hair_undercut2"
gender = MALE
/datum/sprite_accessory/hair/undercut1
name = "Undercut"
icon_state = "hair_undercut1"
gender = MALE
/datum/sprite_accessory/hair/coffeehouse
name = "Coffee House Cut"
icon_state = "hair_coffeehouse"
gender = MALE
/datum/sprite_accessory/hair/tightbun
name = "Tight Bun"
icon_state = "hair_tightbun"
gender = FEMALE
/datum/sprite_accessory/hair/trimmed
name = "Trimmed"
icon_state = "hair_trimmed"
gender = MALE
/datum/sprite_accessory/hair/trimflat
name = "Trimmed Flat Top"
icon_state = "hair_trimflat"
gender = MALE
/datum/sprite_accessory/hair/nofade
name = "Regulation Cut"
icon_state = "hair_nofade"
gender = MALE
/datum/sprite_accessory/hair/baldfade
name = "Balding Fade"
icon_state = "hair_baldfade"
gender = MALE
/datum/sprite_accessory/hair/highfade
name = "High Fade"
icon_state = "hair_highfade"
gender = MALE
/datum/sprite_accessory/hair/medfade
name = "Medium Fade"
icon_state = "hair_medfade"
/datum/sprite_accessory/hair/lowfade
name = "Low Fade"
icon_state = "hair_lowfade"
gender = MALE
/datum/sprite_accessory/hair/oxton
name = "Oxton"
icon_state = "hair_oxton"
/datum/sprite_accessory/hair/doublebun
name = "Double-Bun"
icon_state = "hair_doublebun"
/datum/sprite_accessory/hair/halfshaved
name = "Half-Shaved Emo"
icon_state = "hair_halfshaved"
/datum/sprite_accessory/hair/shortbangs
name = "Short Bangs"
icon_state = "hair_shortbangs"
/datum/sprite_accessory/hair/longeralt2
name = "Long Hair Alt 2"
icon_state = "hair_longeralt2"
/datum/sprite_accessory/hair/nia
name = "Nia"
icon_state = "hair_nia"
/datum/sprite_accessory/hair/eighties
name = "80's"
icon_state = "hair_80s"
/datum/sprite_accessory/hair/volaju
name = "Volaju"
icon_state = "hair_volaju"
/datum/sprite_accessory/hair/joestar
name = "Joestar"
icon_state = "hair_joestar"
gender = MALE
/datum/sprite_accessory/hair/nitori
name = "Nitori"
icon_state = "hair_nitori"
/datum/sprite_accessory/hair/scully
name = "Scully"
icon_state = "hair_scully"
/datum/sprite_accessory/hair/vegeta
name = "Vegeta"
icon_state = "hair_toriyama2"
/datum/sprite_accessory/hair/crono
name = "Chrono"
icon_state = "hair_toriyama"
/datum/sprite_accessory/hair/poofy2
name = "Poofy2"
icon_state = "hair_poofy2"
/datum/sprite_accessory/hair/poofy
name = "Poofy"
icon_state = "hair_poofy"
/datum/sprite_accessory/hair/dandypomp
name = "Dandy Pompadour"
icon_state = "hair_dandypompadour"
/datum/sprite_accessory/hair/fringetail
name = "Fringetail"
icon_state = "hair_fringetail"
/datum/sprite_accessory/hair/mahdrills
name = "Drillruru"
icon_state = "hair_drillruru"
/datum/sprite_accessory/hair/familyman
name = "The Family Man"
icon_state = "hair_thefamilyman"
/datum/sprite_accessory/hair/grandebraid
name = "Grande Braid"
icon_state = "hair_grande"
/datum/sprite_accessory/hair/fringeemo
name = "Emo Fringe"
icon_state = "hair_emofringe"
/datum/sprite_accessory/hair/emo2
name = "Emo Alt"
icon_state = "hair_emo2"
/datum/sprite_accessory/hair/sargeant
name = "Flat Top"
icon_state = "hair_sargeant"
/datum/sprite_accessory/hair/rows2
name = "Rows 2"
icon_state = "hair_rows2"
/datum/sprite_accessory/hair/rows
name = "Rows"
icon_state = "hair_rows1"
/datum/sprite_accessory/hair/reversemohawk
name = "Reverse Mohawk"
icon_state = "hair_reversemohawk"
/datum/sprite_accessory/hair/father
name = "Father"
icon_state = "hair_father"
/datum/sprite_accessory/hair/beehive2
name = "Beehive 2"
icon_state = "hair_beehive2"
/datum/sprite_accessory/hair/sleeze
name = "Sleeze"
icon_state = "hair_sleeze"
/datum/sprite_accessory/hair/zieglertail
name = "Zieglertail"
icon_state = "hair_ziegler"
/datum/sprite_accessory/hair/spikyponytail
name = "Spiky Ponytail"
icon_state = "hair_spikyponytail"
/datum/sprite_accessory/hair/tresshoulder
name = "Tress Shoulder"
icon_state = "hair_tressshoulder"
/datum/sprite_accessory/hair/oneshoulder
name = "One Shoulder"
icon_state = "hair_oneshoulder"
/datum/sprite_accessory/hair/ponytail6
name = "Ponytail 6"
icon_state = "hair_ponytail6"
/datum/sprite_accessory/hair/ponytail5
name = "Ponytail 5"
icon_state = "hair_ponytail5"
/datum/sprite_accessory/hair/ponytail4
name = "Ponytail 4"
icon_state = "hair_ponytail4"
/datum/sprite_accessory/hair/country
name = "Country"
icon_state = "hair_country"
/datum/sprite_accessory/hair/bedheadlong
name = "Bedhead Long"
icon_state = "hair_long_bedhead"
/datum/sprite_accessory/hair/flair
name = "Flaired Hair"
icon_state = "hair_flair"
/datum/sprite_accessory/hair/twintail
name = "Twintail"
icon_state = "hair_twintail"
/datum/sprite_accessory/hair/short2
name = "Short Hair 2"
icon_state = "hair_shorthair3"
/datum/sprite_accessory/hair/bun2
name = "Bun 2"
icon_state = "hair_bun2"
/datum/sprite_accessory/hair/bun3
name = "Bun 3"
icon_state = "hair_bun3"
/datum/sprite_accessory/hair/shavehair
name = "Shaved Hair"
icon_state = "hair_shaved"
/datum/sprite_accessory/hair/veryshortovereyealternate
name = "Overeye Very Short, Alternate"
icon_state = "hair_veryshortovereyealternate"
/datum/sprite_accessory/hair/veryshortovereye
name = "Overeye Very Short"
icon_state = "hair_veryshortovereye"
/datum/sprite_accessory/hair/shortovereye
name = "Overeye Short"
icon_state = "hair_shortovereye"
/datum/sprite_accessory/hair/longovereye
name = "Overeye Long"
icon_state = "hair_longovereye"
/datum/sprite_accessory/hair/father
name = "Father"
icon_state = "hair_father"
/datum/sprite_accessory/hair/bun4 // Due to a vulp hairstyle called bun
name = "Bun 4"
icon_state = "hair_bun4"
///////////////////////////////////
//////END POLARIS HAIRSTYLES///////
//////////////////////////////////
/datum/sprite_accessory/hair/ipc
species_allowed = list("Machine")
glasses_over = 1
@@ -566,7 +908,7 @@
name = "Unathi Side Frills"
icon_state = "unathi_sidefrills"
secondary_theme = "webbing"
/datum/sprite_accessory/hair/unathi/una_cobra_hood
icon = 'icons/mob/human_face.dmi'
name = "Unathi Cobra Hood"
@@ -742,6 +1084,8 @@
icon_state = "hair_fingerwave"
glasses_over = null
/datum/sprite_accessory/hair/vulpkanin
species_allowed = list("Vulpkanin")
@@ -927,6 +1271,15 @@
icon_state = "nuc_neutron"
/datum/sprite_accessory/hair/fluff
fluff = 1
/datum/sprite_accessory/hair/fluff/zeke_fluff_tentacle //Zeke Fluff hair
name = "Zekes Tentacles"
icon_state = "zeke_fluff_hair"
species_allowed = list("Skrell")
/*
///////////////////////////////////
/ =---------------------------= /