mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 08:34:16 +01:00
Merge remote-tracking branch 'upstream/master' into Pod-Refactor
This commit is contained in:
@@ -142,6 +142,11 @@ var/global/nologevent = 0
|
||||
if(istype(M, /mob/dead/observer))
|
||||
body += "<a href='?_src_=holder;incarn_ghost=\ref[M]'>Re-incarnate</a> | "
|
||||
|
||||
if(ispAI(M))
|
||||
body += "<B>Is a pAI</B> "
|
||||
else
|
||||
body += "<A href='?_src_=holder;makePAI=\ref[M]'>Make pAI</A> | "
|
||||
|
||||
// DNA2 - Admin Hax
|
||||
if(M.dna && iscarbon(M))
|
||||
body += "<br><br>"
|
||||
|
||||
@@ -1142,6 +1142,28 @@
|
||||
message_admins("\blue [key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1)
|
||||
H.corgize()
|
||||
|
||||
else if(href_list["makePAI"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makePAI"])
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
|
||||
var/painame = "Default"
|
||||
var/name = ""
|
||||
if(alert(usr, "Do you want to set their name or let them choose their own name?", "Name Choice", "Set Name", "Let them choose") == "Set Name")
|
||||
name = sanitize(copytext(input(usr, "Enter a name for the new pAI. Default name is [painame].", "pAI Name", painame),1,MAX_NAME_LEN))
|
||||
else
|
||||
name = sanitize(copytext(input(H, "An admin wants to make you into a pAI. Choose a name. Default is [painame].", "pAI Name", painame),1,MAX_NAME_LEN))
|
||||
|
||||
if(!name)
|
||||
name = painame
|
||||
|
||||
log_admin("[key_name(usr)] attempting to pAIze [key_name(H)]")
|
||||
message_admins("\blue [key_name_admin(usr)] attempting to pAIze [key_name_admin(H)]", 1)
|
||||
H.paize(name)
|
||||
|
||||
else if(href_list["forcespeech"])
|
||||
if(!check_rights(R_SERVER|R_EVENT)) return
|
||||
|
||||
|
||||
@@ -498,6 +498,7 @@ client/proc/one_click_antag()
|
||||
/datum/admins/proc/create_vox_raider(obj/spawn_location, leader_chosen = 0)
|
||||
|
||||
var/mob/living/carbon/human/new_vox = new(spawn_location.loc, "Vox")
|
||||
var/obj/item/organ/external/head/head_organ = new_vox.get_organ("head")
|
||||
|
||||
var/sounds = rand(2,8)
|
||||
var/i = 0
|
||||
@@ -516,8 +517,8 @@ client/proc/one_click_antag()
|
||||
new_vox.add_language("Vox-pidgin")
|
||||
new_vox.add_language("Galactic Common")
|
||||
new_vox.add_language("Tradeband")
|
||||
new_vox.h_style = "Short Vox Quills"
|
||||
new_vox.f_style = "Shaved"
|
||||
head_organ.h_style = "Short Vox Quills"
|
||||
head_organ.f_style = "Shaved"
|
||||
|
||||
for(var/obj/item/organ/external/limb in new_vox.organs)
|
||||
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
|
||||
@@ -558,7 +559,9 @@ client/proc/one_click_antag()
|
||||
|
||||
for(var/i = 0, i<numVampires, i++)
|
||||
H = pick(candidates)
|
||||
H.make_vampire()
|
||||
ticker.mode.vampires += H.mind
|
||||
ticker.mode.grant_vampire_powers(H)
|
||||
ticker.mode.update_vampire_icons_added(H.mind)
|
||||
candidates.Remove(H)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -19,9 +19,6 @@
|
||||
* Areas
|
||||
*/
|
||||
//Gateroom gets its own APC specifically for the gate
|
||||
/area/awaymission
|
||||
report_alerts = 0
|
||||
|
||||
/area/awaymission/gateroom
|
||||
|
||||
//Library, medbay, storage room
|
||||
|
||||
+166
-190
@@ -63,6 +63,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
#define MAX_SAVE_SLOTS 20 // Save slots for regular players
|
||||
#define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members
|
||||
|
||||
#define TAB_CHAR 0
|
||||
#define TAB_GAME 1
|
||||
|
||||
/datum/preferences
|
||||
//doohickeys for savefiles
|
||||
// var/path
|
||||
@@ -174,7 +177,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/nanotrasen_relation = "Neutral"
|
||||
|
||||
// 0 = character settings, 1 = game preferences
|
||||
var/current_tab = 0
|
||||
var/current_tab = TAB_CHAR
|
||||
|
||||
// OOC Metadata:
|
||||
var/metadata = ""
|
||||
@@ -207,229 +210,198 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
save_preferences(C)
|
||||
save_character(C) //let's save this new random character so it doesn't keep generating new ones.
|
||||
|
||||
/datum/preferences/proc/color_square(r, g, b)
|
||||
return "<span style='font-face: fixedsys; background-color: #[num2hex(r, 2)][num2hex(g, 2)][num2hex(b, 2)]; color: #[num2hex(r, 2)][num2hex(g, 2)][num2hex(b, 2)]'>___</span>"
|
||||
|
||||
// Hello I am a proc full of snowflake species checks how are you
|
||||
/datum/preferences/proc/ShowChoices(mob/user)
|
||||
if(!user || !user.client) return
|
||||
if(!user || !user.client)
|
||||
return
|
||||
update_preview_icon()
|
||||
user << browse_rsc(preview_icon_front, "previewicon.png")
|
||||
user << browse_rsc(preview_icon_side, "previewicon2.png")
|
||||
var/dat = "<html><body><center>"
|
||||
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=0' [current_tab == 0 ? "class='linkOn'" : ""]>Character Settings</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=1' [current_tab == 1 ? "class='linkOn'" : ""]>Game Preferences</a>"
|
||||
var/dat = ""
|
||||
dat += "<center>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[TAB_CHAR]' [current_tab == TAB_CHAR ? "class='linkOn'" : ""]>Character Settings</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[TAB_GAME]' [current_tab == TAB_GAME ? "class='linkOn'" : ""]>Game Preferences</a>"
|
||||
dat += "</center>"
|
||||
dat += "<HR>"
|
||||
|
||||
switch(current_tab)
|
||||
if (0) // Character Settings#
|
||||
if(TAB_CHAR) // Character Settings
|
||||
dat += "<div class='statusDisplay' style='max-width: 128px; position: absolute; left: 150px; top: 150px'><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64></div>"
|
||||
dat += "<table width='100%'><tr><td width='405px' height='25px' valign='top'>"
|
||||
dat += "<b>Name: </b>"
|
||||
dat += "<a href='?_src_=prefs;preference=name;task=input'><b>[real_name]</b></a>"
|
||||
dat += "<a href='?_src_=prefs;preference=name;task=random'>(Randomize)</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=name'><span class='[be_random_name ? "good" : "bad"]'>(Always Randomize)</span></a><br>"
|
||||
dat += "</td><td width='405px' height='25px' valign='left'>"
|
||||
dat += "<center>"
|
||||
dat += "Slot <b>[slot_name]</b> - "
|
||||
dat += "<a href=\"byond://?src=\ref[user];preference=open_load_dialog\">Load slot</a> - "
|
||||
dat += "<a href=\"byond://?src=\ref[user];preference=save\">Save slot</a> - "
|
||||
dat += "<a href=\"byond://?src=\ref[user];preference=reload\">Reload slot</a>"
|
||||
dat += "</center>"
|
||||
dat += "<center><h2>Occupation Choices</h2>"
|
||||
dat += "<a href='?_src_=prefs;preference=job;task=menu'>Set Occupation Preferences</a><br></center>"
|
||||
dat += "</td></tr></table>"
|
||||
dat += "<table width='100%'><tr><td width='405px' height='200px' valign='top'>"
|
||||
dat += "<h2>Identity</h2>"
|
||||
dat += "<table width='100%'><tr><td width='75%' valign='top'>"
|
||||
if(appearance_isbanned(user))
|
||||
dat += "<b>You are banned from using custom names and appearances. You can continue to adjust your characters, but you will be randomised once you join the game.</b><br>"
|
||||
dat += "<b>Name:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=name;task=input'><b>[real_name]</b></a><br>"
|
||||
dat += "(<a href='?_src_=prefs;preference=name;task=random'>Random Name</A>) "
|
||||
dat += "(<a href='?_src_=prefs;preference=name'>Always Random Name: [be_random_name ? "Yes" : "No"]</a>)"
|
||||
dat += "<br>"
|
||||
dat += "<b>Gender:</b> <a href='?_src_=prefs;preference=gender'><b>[gender == MALE ? "Male" : "Female"]</b></a><br>"
|
||||
dat += "<b>Age:</b> <a href='?_src_=prefs;preference=age;task=input'>[age]</a>"
|
||||
//dat += "<b>Spawn Point</b>: <a href='byond://?src=\ref[user];preference=spawnpoint;task=input'>[spawnpoint]</a>"
|
||||
dat += "<br><table><tr><td><b>Body</b> "
|
||||
dat += "(<a href='?_src_=prefs;preference=all;task=random'>®</A>)"
|
||||
dat += "<br>"
|
||||
dat += "Species: <a href='?_src_=prefs;preference=species;task=input'>[species]</a><br>"
|
||||
if(species == "Vox")//oldvox code, sucks I know
|
||||
dat += "N2 Tank: <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
|
||||
dat += "Secondary Language:<br><a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
|
||||
dat += "Blood Type: <a href='?_src_=prefs;preference=b_type;task=input'>[b_type]</a><br>"
|
||||
dat += "<b>You are banned from using custom names and appearances. \
|
||||
You can continue to adjust your characters, but you will be randomised once you join the game.\
|
||||
</b><br>"
|
||||
dat += "<b>Gender:</b> <a href='?_src_=prefs;preference=gender'>[gender == MALE ? "Male" : "Female"]</a><br>"
|
||||
dat += "<b>Age:</b> <a href='?_src_=prefs;preference=age;task=input'>[age]</a><br>"
|
||||
dat += "<b>Body:</b> <a href='?_src_=prefs;preference=all;task=random'>(®)</a><br>"
|
||||
dat += "<b>Species:</b> <a href='?_src_=prefs;preference=species;task=input'>[species]</a><br>"
|
||||
if(species == "Vox")
|
||||
dat += "<b>N2 Tank:</b> <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
|
||||
dat += "<b>Secondary Language:</b> <a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
|
||||
dat += "<b>Blood Type:</b> <a href='?_src_=prefs;preference=b_type;task=input'>[b_type]</a><br>"
|
||||
if(species in list("Human", "Drask"))
|
||||
dat += "Skin Tone: <a href='?_src_=prefs;preference=s_tone;task=input'>[-s_tone + 35]/220</a><br>"
|
||||
dat += "<b>Skin Tone:</b> <a href='?_src_=prefs;preference=s_tone;task=input'>[-s_tone + 35]/220</a><br>"
|
||||
dat += "<b>Disabilities:</b> <a href='?_src_=prefs;preference=disabilities'>\[Set\]</a><br>"
|
||||
dat += "<b>Nanotrasen Relation:</b> <a href ='?_src_=prefs;preference=nt_relation;task=input'>[nanotrasen_relation]</a><br>"
|
||||
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=input'>Set Flavor Text</a><br>"
|
||||
if(lentext(flavor_text) <= 40)
|
||||
if(!lentext(flavor_text)) dat += "\[...\]<br>"
|
||||
else dat += "[flavor_text]<br>"
|
||||
else dat += "[TextPreview(flavor_text)]...<br>"
|
||||
|
||||
// dat += "Skin pattern: <a href='byond://?src=\ref[user];preference=skin_style;task=input'>Adjust</a><br>"
|
||||
dat += "<br><b>Handicaps</b><br>"
|
||||
dat += "\t<a href='?_src_=prefs;preference=disabilities'><b>\[Set Disabilities\]</b></a><br>"
|
||||
dat += "Limbs and Parts: <a href='?_src_=prefs;preference=limbs;task=input'>Adjust</a><br>"
|
||||
dat += "<h2>Hair & Accessories</h2>"
|
||||
|
||||
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
|
||||
var/headaccessoryname = "Head Accessory: "
|
||||
if(species == "Unathi")
|
||||
headaccessoryname = "Horns: "
|
||||
dat += "<b>[headaccessoryname]</b>"
|
||||
dat += "<a href='?_src_=prefs;preference=ha_style;task=input'>[ha_style]</a> "
|
||||
dat += "<a href='?_src_=prefs;preference=headaccessory;task=input'>Color</a> [color_square(r_headacc, g_headacc, b_headacc)]<br>"
|
||||
|
||||
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
|
||||
dat += "<b>Body Markings:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=m_style;task=input'>[m_style]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=markings;task=input'>Color</a> [color_square(r_markings, g_markings, b_markings)]<br>"
|
||||
|
||||
dat += "<b>Hair:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=h_style;task=input'>[h_style]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=hair;task=input'>Color</a> [color_square(r_hair, g_hair, b_hair)]<br>"
|
||||
|
||||
dat += "<b>Facial Hair:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=f_style;task=input'>[f_style ? "[f_style]" : "Shaved"]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=facial;task=input'>Color</a> [color_square(r_facial, g_facial, b_facial)]<br>"
|
||||
|
||||
if(species != "Machine")
|
||||
dat += "<b>Eyes:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Color</a> [color_square(r_eyes, g_eyes, b_eyes)]<br>"
|
||||
|
||||
if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
|
||||
dat += "<b>Body Color:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Color</a> [color_square(r_skin, g_skin, b_skin)]<br>"
|
||||
|
||||
if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
|
||||
dat += "<b>Body Accessory:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=body_accessory;task=input'>[body_accessory ? "[body_accessory]" : "None"]</a><br>"
|
||||
|
||||
dat += "</td><td width='405px' height='200px' valign='top'>"
|
||||
dat += "<h2>Occupation Choices</h2>"
|
||||
dat += "<a href='?_src_=prefs;preference=job;task=menu'>Set Occupation Preferences</a><br>"
|
||||
if(jobban_isbanned(user, "Records"))
|
||||
dat += "<b>You are banned from using character records.</b><br>"
|
||||
else
|
||||
dat += "<a href=\"byond://?src=\ref[user];preference=records;record=1\">Character Records</a><br>"
|
||||
|
||||
dat += "<h2>Limbs</h2>"
|
||||
dat += "<b>Limbs and Parts:</b> <a href='?_src_=prefs;preference=limbs;task=input'>Adjust</a><br>"
|
||||
if(species != "Slime People" && species != "Machine")
|
||||
dat += "Internal Organs: <a href='?_src_=prefs;preference=organs;task=input'>Adjust</a><br>"
|
||||
dat += "<b>Internal Organs:</b> <a href='?_src_=prefs;preference=organs;task=input'>Adjust</a><br>"
|
||||
|
||||
//display limbs below
|
||||
var/ind = 0
|
||||
for(var/name in organ_data)
|
||||
// to_chat(world, "[ind] \ [organ_data.len]")
|
||||
var/status = organ_data[name]
|
||||
var/organ_name = null
|
||||
switch(name)
|
||||
if("chest")
|
||||
organ_name = "torso"
|
||||
if("groin")
|
||||
organ_name = "lower body"
|
||||
if("head")
|
||||
organ_name = "head"
|
||||
if("l_arm")
|
||||
organ_name = "left arm"
|
||||
if("r_arm")
|
||||
organ_name = "right arm"
|
||||
if("l_leg")
|
||||
organ_name = "left leg"
|
||||
if("r_leg")
|
||||
organ_name = "right leg"
|
||||
if("l_foot")
|
||||
organ_name = "left foot"
|
||||
if("r_foot")
|
||||
organ_name = "right foot"
|
||||
if("l_hand")
|
||||
organ_name = "left hand"
|
||||
if("r_hand")
|
||||
organ_name = "right hand"
|
||||
if("heart")
|
||||
organ_name = "heart"
|
||||
if("eyes")
|
||||
organ_name = "eyes"
|
||||
if("chest") organ_name = "torso"
|
||||
if("groin") organ_name = "lower body"
|
||||
if("head") organ_name = "head"
|
||||
if("l_arm") organ_name = "left arm"
|
||||
if("r_arm") organ_name = "right arm"
|
||||
if("l_leg") organ_name = "left leg"
|
||||
if("r_leg") organ_name = "right leg"
|
||||
if("l_foot") organ_name = "left foot"
|
||||
if("r_foot") organ_name = "right foot"
|
||||
if("l_hand") organ_name = "left hand"
|
||||
if("r_hand") organ_name = "right hand"
|
||||
if("heart") organ_name = "heart"
|
||||
if("eyes") organ_name = "eyes"
|
||||
|
||||
if(status == "cyborg")
|
||||
if(status in list("cyborg", "amputated", "mechanical", "assisted"))
|
||||
++ind
|
||||
if(ind > 1)
|
||||
dat += ", "
|
||||
var/datum/robolimb/R
|
||||
if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
|
||||
R = all_robolimbs[rlimb_data[name]]
|
||||
else
|
||||
R = basic_robolimb
|
||||
dat += "\t[R.company] [organ_name] prosthesis"
|
||||
if(ind > 1) dat += ", "
|
||||
|
||||
|
||||
else if(status == "amputated")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
dat += ", "
|
||||
dat += "\tAmputated [organ_name]"
|
||||
|
||||
else if(status == "mechanical")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
dat += ", "
|
||||
dat += "\tMechanical [organ_name]"
|
||||
|
||||
else if(status == "assisted")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
dat += ", "
|
||||
switch(organ_name)
|
||||
if("heart")
|
||||
dat += "\tPacemaker-assisted [organ_name]"
|
||||
if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements
|
||||
dat += "\tSurgically altered [organ_name]"
|
||||
if("eyes")
|
||||
dat += "\tRetinal overlayed [organ_name]"
|
||||
switch(status)
|
||||
if("cyborg")
|
||||
var/datum/robolimb/R
|
||||
if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
|
||||
R = all_robolimbs[rlimb_data[name]]
|
||||
else
|
||||
dat += "\tMechanically assisted [organ_name]"
|
||||
if(!ind)
|
||||
dat += "\[...\]<br><br>"
|
||||
else
|
||||
dat += "<br><br>"
|
||||
dat += "<b>Underwear:</b><BR><a href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a><BR>"
|
||||
dat += "<b>Undershirt:</b><BR><a href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a><BR>"
|
||||
dat += "<b>Socks:</b><BR><a href ='?_src_=prefs;preference=socks;task=input'>[socks]</a><BR>"
|
||||
dat += "Backpack Type:<br><a href ='?_src_=prefs;preference=bag;task=input'><b>[backbaglist[backbag]]</b></a><br>"
|
||||
dat += "Nanotrasen Relation:<br><a href ='?_src_=prefs;preference=nt_relation;task=input'><b>[nanotrasen_relation]</b></a><br>"
|
||||
dat += "</td><td><b>Preview</b><br><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64></td></tr></table>"
|
||||
dat += "</td><td width='300px' height='300px'>"
|
||||
R = basic_robolimb
|
||||
dat += "\t[R.company] [organ_name] prosthesis"
|
||||
if("amputated") dat += "\tAmputated [organ_name]"
|
||||
if("mechanical") dat += "\tMechanical [organ_name]"
|
||||
if("assisted")
|
||||
switch(organ_name)
|
||||
if("heart") dat += "\tPacemaker-assisted [organ_name]"
|
||||
if("voicebox") dat += "\tSurgically altered [organ_name]"
|
||||
if("eyes") dat += "\tRetinal overlayed [organ_name]"
|
||||
else dat += "\tMechanically assisted [organ_name]"
|
||||
if(!ind) dat += "\[...\]<br>"
|
||||
else dat += "<br>"
|
||||
|
||||
if(jobban_isbanned(user, "Records"))
|
||||
dat += "<b>You are banned from using character records.</b><br>"
|
||||
else
|
||||
dat += "<b><a href=\"byond://?src=\ref[user];preference=records;record=1\">Character Records</a></b><br>"
|
||||
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=input'><b>Set Flavor Text</b></a><br>"
|
||||
if(lentext(flavor_text) <= 40)
|
||||
if(!lentext(flavor_text))
|
||||
dat += "\[...\]"
|
||||
else
|
||||
dat += "[flavor_text]"
|
||||
else
|
||||
dat += "[TextPreview(flavor_text)]...<br>"
|
||||
dat += "<br>"
|
||||
dat += "<h2>Clothing</h2>"
|
||||
dat += "<b>Underwear:</b> <a href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a><BR>"
|
||||
dat += "<b>Undershirt:</b> <a href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a><BR>"
|
||||
dat += "<b>Socks:</b> <a href ='?_src_=prefs;preference=socks;task=input'>[socks]</a><BR>"
|
||||
dat += "<b>Backpack Type:</b> <a href ='?_src_=prefs;preference=bag;task=input'>[backbaglist[backbag]]</a><br>"
|
||||
|
||||
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
|
||||
var/headaccessoryname = "Head Accessory"
|
||||
if(species == "Unathi")
|
||||
headaccessoryname = "Horns"
|
||||
dat += "<br><b>[headaccessoryname]</b><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=headaccessory;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_headacc, 2)][num2hex(g_headacc, 2)][num2hex(b_headacc, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_headacc, 2)][num2hex(g_headacc, 2)][num2hex(b_headacc)]'><tr><td>__</td></tr></table></font> "
|
||||
dat += "Style: <a href='?_src_=prefs;preference=ha_style;task=input'>[ha_style]</a><br>"
|
||||
dat += "</td></tr></table>"
|
||||
|
||||
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
|
||||
dat += "<br><b>Body Markings</b><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=markings;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_markings, 2)][num2hex(g_markings, 2)][num2hex(b_markings, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_markings, 2)][num2hex(g_markings, 2)][num2hex(b_markings)]'><tr><td>__</td></tr></table></font> "
|
||||
dat += "<br>Style: <a href='?_src_=prefs;preference=m_style;task=input'>[m_style]</a><br>"
|
||||
|
||||
dat += "<br><b>Hair</b><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=hair;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair)]'><tr><td>__</td></tr></table></font> "
|
||||
dat += " <br>Style: <a href='?_src_=prefs;preference=h_style;task=input'>[h_style]</a><br>"
|
||||
|
||||
dat += "<br><b>Facial Hair</b><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=facial;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial)]'><tr><td>__</td></tr></table></font> "
|
||||
dat += " <br>Style: <a href='?_src_=prefs;preference=f_style;task=input'>[f_style ? "[f_style]" : "Shaved"]</a><br>"
|
||||
|
||||
if(species != "Machine")
|
||||
dat += "<br><b>Eyes</b><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]'><tr><td>__</td></tr></table></font><br>"
|
||||
|
||||
if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
|
||||
dat += "<br><b>Body Color</b><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin)]'><tr><td>__</td></tr></table></font>"
|
||||
|
||||
if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
|
||||
dat += "<br><b>Body Accessory</b><br>"
|
||||
dat += "Accessory: <a href='?_src_=prefs;preference=body_accessory;task=input'>[body_accessory ? "[body_accessory]" : "None"]</a><br>"
|
||||
|
||||
dat += "</td></tr></table><hr><center>"
|
||||
|
||||
if (1) // General Preferences
|
||||
if(TAB_GAME) // General Preferences
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>General Settings</h2>"
|
||||
dat += "<b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
|
||||
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Ghost-Item Attack Animation:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Custom UI settings:</b><br>"
|
||||
dat += "<b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <table style='display:inline;' bgcolor='[UI_style_color]'><tr><td>__</td></tr></table><br>"
|
||||
dat += "<b>Alpha (transparency):</b> <a href='?_src_=prefs;preference=UIalpha'><b>[UI_style_alpha]</b></a><br>"
|
||||
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
|
||||
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <table style='display:inline;' bgcolor='[UI_style_color]'<tr><td>__</td></tr></table><br>"
|
||||
dat += " - <b>Alpha (transparency):</b> <a href='?_src_=prefs;preference=UIalpha'><b>[UI_style_alpha]</b></a><br>"
|
||||
dat += "<br>"
|
||||
dat += "<b>Play admin midis:</b> <a href='?_src_=prefs;preference=hear_midis'><b>[(sound & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Play lobby music:</b> <a href='?_src_=prefs;preference=lobby_music'><b>[(sound & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
|
||||
if(user.client.holder)
|
||||
dat += "<b>Adminhelp sound:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
|
||||
|
||||
if(check_rights(R_ADMIN,0))
|
||||
dat += "<b>OOC:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'> </span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
|
||||
if(config.allow_Metadata)
|
||||
dat += "<b>OOC notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
|
||||
if(unlock_content)
|
||||
dat += "<b>BYOND Membership Publicity:</b> <a href='?_src_=prefs;preference=publicity'><b>[(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
|
||||
|
||||
dat += "<b>Randomized character slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]</b></a><br>"
|
||||
dat += "<b>Ghost sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]</b></a><br>"
|
||||
dat += "<b>Ghost radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]</b></a><br>"
|
||||
if(config.allow_Metadata)
|
||||
dat += "<b>OOC notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
|
||||
|
||||
if(user.client)
|
||||
if(user.client.holder)
|
||||
dat += "<b>Adminhelp sound:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
|
||||
|
||||
if(check_rights(R_ADMIN,0))
|
||||
dat += "<b>OOC:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'> </span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
|
||||
|
||||
if(unlock_content)
|
||||
dat += "<b>BYOND Membership Publicity:</b> <a href='?_src_=prefs;preference=publicity'><b>[(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
|
||||
|
||||
dat += "</td><td width='300px' height='300px' valign='top'>"
|
||||
dat += "<h2>Special Role Settings</h2>"
|
||||
// dat += "<br><br>"
|
||||
if(jobban_isbanned(user, "Syndicate"))
|
||||
dat += "<b>You are banned from special roles.</b>"
|
||||
src.be_special = list()
|
||||
be_special = list()
|
||||
else
|
||||
for (var/i in special_roles)
|
||||
for(var/i in special_roles)
|
||||
if(jobban_isbanned(user, i))
|
||||
dat += "<b>Be [capitalize(i)]:</b> <font color=red><b> \[BANNED]</b></font><br>"
|
||||
else if(!player_old_enough_antag(user.client,i))
|
||||
@@ -437,17 +409,17 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "<b>Be [capitalize(i)]:</b> <font color=red><b> \[IN [(available_in_days_antag)] DAYS]</b></font><br>"
|
||||
else
|
||||
dat += "<b>Be [capitalize(i)]:</b> <a href='?_src_=prefs;preference=be_special;role=[i]'><b>[(i in src.be_special) ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "</td></tr></table><hr><center>"
|
||||
|
||||
dat += "</td></tr></table>"
|
||||
|
||||
dat += "<hr><center>"
|
||||
if(!IsGuestKey(user.key))
|
||||
dat += "<a href='?_src_=prefs;preference=load'>Undo</a> - "
|
||||
dat += "<a href='?_src_=prefs;preference=save'>Save Setup</a> - "
|
||||
|
||||
dat += "<a href='?_src_=prefs;preference=reset_all'>Reset Setup</a>"
|
||||
dat += "</center></body></html>"
|
||||
dat += "</center>"
|
||||
|
||||
// user << browse(dat, "window=preferences;size=560x580")
|
||||
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 640, 810)
|
||||
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 820, 640)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
|
||||
@@ -1631,7 +1603,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if("nanoui")
|
||||
nanoui_fancy = !nanoui_fancy
|
||||
|
||||
if("ghost_att_anim")
|
||||
if("ghost_att_anim")
|
||||
show_ghostitem_attack = !show_ghostitem_attack
|
||||
|
||||
if("UIcolor")
|
||||
@@ -1701,6 +1673,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if("open_load_dialog")
|
||||
if(!IsGuestKey(user.key))
|
||||
open_load_dialog(user)
|
||||
return 1
|
||||
|
||||
if("close_load_dialog")
|
||||
close_load_dialog(user)
|
||||
@@ -1753,13 +1726,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
character.g_eyes = g_eyes
|
||||
character.b_eyes = b_eyes
|
||||
|
||||
character.r_hair = r_hair
|
||||
character.g_hair = g_hair
|
||||
character.b_hair = b_hair
|
||||
//Head-specific
|
||||
var/obj/item/organ/external/head/H = character.get_organ("head")
|
||||
H.r_hair = r_hair
|
||||
H.g_hair = g_hair
|
||||
H.b_hair = b_hair
|
||||
|
||||
character.r_facial = r_facial
|
||||
character.g_facial = g_facial
|
||||
character.b_facial = b_facial
|
||||
H.r_facial = r_facial
|
||||
H.g_facial = g_facial
|
||||
H.b_facial = b_facial
|
||||
|
||||
H.h_style = h_style
|
||||
H.f_style = f_style
|
||||
//End of head-specific.
|
||||
|
||||
character.r_skin = r_skin
|
||||
character.g_skin = g_skin
|
||||
@@ -1767,9 +1746,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
character.s_tone = s_tone
|
||||
|
||||
character.h_style = h_style
|
||||
character.f_style = f_style
|
||||
|
||||
// Destroy/cyborgize organs
|
||||
for(var/name in organ_data)
|
||||
|
||||
@@ -1846,10 +1822,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
character.socks = socks
|
||||
|
||||
if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
|
||||
character.r_headacc = r_headacc
|
||||
character.g_headacc = g_headacc
|
||||
character.b_headacc = b_headacc
|
||||
character.ha_style = ha_style
|
||||
H.r_headacc = r_headacc
|
||||
H.g_headacc = g_headacc
|
||||
H.b_headacc = b_headacc
|
||||
H.ha_style = ha_style
|
||||
if(character.species.bodyflags & HAS_MARKINGS)
|
||||
character.r_markings = r_markings
|
||||
character.g_markings = g_markings
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
var/active_sound = null
|
||||
var/toggle_cooldown = null
|
||||
var/cooldown = 0
|
||||
var/species_disguise = null
|
||||
|
||||
//BS12: Species-restricted clothing check.
|
||||
/obj/item/clothing/mob_can_equip(M as mob, slot)
|
||||
|
||||
@@ -176,9 +176,11 @@
|
||||
|
||||
/obj/item/clothing/head/kitty/update_icon(var/mob/living/carbon/human/user)
|
||||
if(!istype(user)) return
|
||||
var/obj/item/organ/external/head/head_organ = user.get_organ("head")
|
||||
|
||||
mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty")
|
||||
// mob2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty2") - Commented out because it seemingly does nothing.
|
||||
mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
|
||||
mob.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
|
||||
// mob2.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) - Commented out because it seemingly does nothing.
|
||||
|
||||
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner")
|
||||
@@ -201,8 +203,9 @@
|
||||
|
||||
/obj/item/clothing/head/kitty/mouse/update_icon(var/mob/living/carbon/human/user)
|
||||
if(!istype(user)) return
|
||||
var/obj/item/organ/external/head/head_organ = user.get_organ("head")
|
||||
mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mousey")
|
||||
mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
|
||||
mob.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
|
||||
|
||||
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner")
|
||||
mob.Blend(earbit, ICON_OVERLAY)
|
||||
@@ -216,6 +219,7 @@
|
||||
item_state = "cardborg_h"
|
||||
flags = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
species_disguise = "High-tech robot"
|
||||
|
||||
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
|
||||
..()
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
w_class = 2
|
||||
gas_transfer_coefficient = 0.90
|
||||
put_on_delay = 20
|
||||
var/resist_time = 0 //deciseconds of how long you need to gnaw to get rid of the gag, 0 to make it impossible to remove
|
||||
var/mute = 1 // 1 - completely mutes you, 0 - muffles everything you say "MHHPHHMMM!!!"
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi'
|
||||
@@ -24,6 +26,34 @@
|
||||
icon_state = "gag"
|
||||
w_class = 1
|
||||
|
||||
/obj/item/clothing/mask/muzzle/tapegag
|
||||
name = "tape gag"
|
||||
desc = "MHPMHHH!"
|
||||
icon_state = "tapegag"
|
||||
item_state = null
|
||||
w_class = 1
|
||||
resist_time = 150
|
||||
mute = 0
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user)
|
||||
var/atom/movable/R = new /obj/item/trash/tapetrash
|
||||
if(user.species.bodyflags & HAS_FUR)
|
||||
R.desc += " Is that...fur?"
|
||||
var/turf/T = get_turf(src)
|
||||
R.loc = T
|
||||
transfer_fingerprints_to(R)
|
||||
playsound(src,'sound/items/poster_ripped.ogg',40,1)
|
||||
spawn(0) // Because of how dropping is done, if the muzzle gets deleted now, icons won't properly update and the whole unEquip() proc will break stuff.
|
||||
qdel(src) // This makes sure it gets deleted AFTER all that has to be done is done.
|
||||
user.emote("scream")
|
||||
|
||||
/obj/item/clothing/mask/surgical
|
||||
name = "sterile mask"
|
||||
desc = "A sterile mask designed to help prevent the spread of diseases."
|
||||
@@ -244,4 +274,4 @@ obj/item/clothing/mask/bandana/purple
|
||||
name = "black bandana"
|
||||
icon_state = "bandblack"
|
||||
item_color = "black"
|
||||
desc = "It's a black bandana."
|
||||
desc = "It's a black bandana."
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
item_state = "cardborg"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
species_disguise = "High-tech robot"
|
||||
|
||||
/obj/item/clothing/suit/cardborg/equipped(mob/living/user, slot)
|
||||
..()
|
||||
|
||||
@@ -25,8 +25,37 @@
|
||||
items = list()
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chocolatebar
|
||||
|
||||
/datum/recipe/candy/fudge_peanut
|
||||
reagents = list("sugar" = 5, "milk" = 5)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
|
||||
fruit = list("peanuts" = 3)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/peanut
|
||||
|
||||
/datum/recipe/candy/fudge_cherry
|
||||
reagents = list("sugar" = 5, "milk" = 5)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
|
||||
fruit = list("cherries" = 3)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cherry
|
||||
|
||||
/datum/recipe/candy/fudge_cookies_n_cream
|
||||
reagents = list("sugar" = 5, "milk" = 5, "cream" = 5)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cookie,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cookies_n_cream
|
||||
|
||||
/datum/recipe/candy/fudge_turtle
|
||||
reagents = list("sugar" = 5, "milk" = 5)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel,
|
||||
)
|
||||
fruit = list("peanuts" = 1)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/turtle
|
||||
|
||||
/datum/recipe/candy/fudge
|
||||
reagents = list("sugar" = 5, "cream" = 5)
|
||||
reagents = list("sugar" = 5, "milk" = 5)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge
|
||||
|
||||
|
||||
@@ -899,6 +899,7 @@
|
||||
seed_name = "peanut"
|
||||
display_name = "peanut vines"
|
||||
chems = list("plantmatter" = list(1,10))
|
||||
kitchen_tag = "peanuts"
|
||||
preset_icon = "peanuts"
|
||||
|
||||
/datum/seed/peanuts/New()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/New()
|
||||
..()
|
||||
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "z")
|
||||
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
|
||||
code = ""
|
||||
for(var/i = 0, i < codelen, i++)
|
||||
var/dig = pick(digits)
|
||||
@@ -165,7 +165,7 @@
|
||||
to_chat(user, "<span class='notice'>You leave the crate alone.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>A red light flashes.</span>")
|
||||
lastattempt = replacetext(input, 0, "z")
|
||||
lastattempt = input
|
||||
attempts--
|
||||
if(attempts == 0)
|
||||
boom(user)
|
||||
@@ -186,19 +186,27 @@
|
||||
else
|
||||
to_chat(user, "<span class='notice'>* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts.</span>")
|
||||
if(lastattempt != null)
|
||||
var/list/guess = list()
|
||||
var/guess = lastattempt
|
||||
var/bulls = 0
|
||||
var/cows = 0
|
||||
for(var/i = 1, i < codelen + 1, i++)
|
||||
var/a = copytext(lastattempt, i, i+1) //Stuff the code into the list
|
||||
guess += a
|
||||
guess[a] = i
|
||||
for(var/i in guess) //Go through list and count matches
|
||||
var/a = findtext(code, i)
|
||||
if(a == guess[i])
|
||||
++bulls
|
||||
else if(a)
|
||||
++cows
|
||||
var/list/banned = list()
|
||||
for(var/i; i <= length(lastattempt); i++)
|
||||
var/list/a = strip_first(guess)
|
||||
if(a[1] in banned)
|
||||
continue
|
||||
if(findtext(a[2], a[1]))
|
||||
if(findtext(code, a[1], i, i+1))
|
||||
++bulls
|
||||
banned += a[1]
|
||||
else
|
||||
var/g = findtext(code, a[1])
|
||||
if(g)
|
||||
if(g == i)
|
||||
++bulls
|
||||
else
|
||||
++cows
|
||||
guess = a[2]
|
||||
|
||||
to_chat(user, "<span class='notice'>Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>")
|
||||
else ..()
|
||||
else ..()
|
||||
|
||||
@@ -49,11 +49,11 @@
|
||||
var/point_upgrade_temp = 1
|
||||
var/sheet_per_ore_temp = 1
|
||||
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
|
||||
sheet_per_ore_temp = B.rating
|
||||
sheet_per_ore_temp = 0.65 + (0.35 * B.rating)
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
ore_pickup_rate_temp = 15 * M.rating
|
||||
for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts)
|
||||
point_upgrade_temp = L.rating
|
||||
point_upgrade_temp = 0.65 + (0.35 * L.rating)
|
||||
ore_pickup_rate = ore_pickup_rate_temp
|
||||
point_upgrade = point_upgrade_temp
|
||||
sheet_per_ore = sheet_per_ore_temp
|
||||
@@ -225,7 +225,7 @@
|
||||
var/obj/item/stack/sheet/inp = stack_list[text2path(href_list["release"])]
|
||||
var/obj/item/stack/sheet/out = new inp.type()
|
||||
var/desired = input("How much?", "How much to eject?", 1) as num
|
||||
out.amount = min(desired,50,inp.amount)
|
||||
out.amount = round(min(desired,50,inp.amount))
|
||||
if(out.amount >= 1)
|
||||
inp.amount -= out.amount
|
||||
unload_mineral(out)
|
||||
@@ -242,7 +242,7 @@
|
||||
|
||||
var/desired = input("How much?", "How much would you like to smelt?", 1) as num
|
||||
var/obj/item/stack/sheet/plasteel/plasteelout = new
|
||||
plasteelout.amount = min(desired,50,metalstack.amount,plasmastack.amount)
|
||||
plasteelout.amount = round(min(desired,50,metalstack.amount,plasmastack.amount))
|
||||
if(plasteelout.amount >= 1)
|
||||
metalstack.amount -= plasteelout.amount
|
||||
plasmastack.amount -= plasteelout.amount
|
||||
@@ -258,7 +258,7 @@
|
||||
|
||||
var/desired = input("How much?", "How much would you like to smelt?", 1) as num
|
||||
var/obj/item/stack/sheet/plasmaglass/plasglassout = new
|
||||
plasglassout.amount = min(desired, 50, glassstack.amount, plasmastack.amount)
|
||||
plasglassout.amount = round(min(desired, 50, glassstack.amount, plasmastack.amount))
|
||||
if(plasglassout.amount >= 1)
|
||||
glassstack.amount -= plasglassout.amount
|
||||
plasmastack.amount -= plasglassout.amount
|
||||
@@ -811,7 +811,7 @@
|
||||
O.forceMove(loc)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/mining_drone/adjustBruteLoss()
|
||||
/mob/living/simple_animal/hostile/mining_drone/adjustHealth()
|
||||
if(search_objects)
|
||||
SetOffenseBehavior()
|
||||
..()
|
||||
@@ -897,7 +897,7 @@
|
||||
/obj/item/weapon/lazarus_injector
|
||||
name = "lazarus injector"
|
||||
desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees."
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
icon = 'icons/obj/hypo.dmi'
|
||||
icon_state = "lazarus_hypo"
|
||||
item_state = "hypo"
|
||||
throwforce = 0
|
||||
|
||||
@@ -192,7 +192,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
return 0
|
||||
|
||||
/mob/dead/observer/can_use_hands() return 0
|
||||
/mob/dead/observer/is_active() return 0
|
||||
|
||||
/mob/dead/observer/Stat()
|
||||
..()
|
||||
|
||||
@@ -124,7 +124,6 @@
|
||||
I.dropped(src)
|
||||
if(I)
|
||||
I.layer = initial(I.layer)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -173,4 +172,4 @@
|
||||
return l_hand
|
||||
if(slot_r_hand)
|
||||
return r_hand
|
||||
return null
|
||||
return null
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
// if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
// act = copytext(act,1,length(act)) //seriously who the fuck wrote this
|
||||
var/muzzled = is_muzzled()
|
||||
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
if("sign")
|
||||
if(!restrained())
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
var/muzzled = is_muzzled()
|
||||
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
if ("me")
|
||||
if(silent)
|
||||
|
||||
@@ -44,14 +44,15 @@
|
||||
user.drop_item()
|
||||
B.forceMove(src)
|
||||
held_brain = B
|
||||
if(istype(O,/obj/item/organ/internal/brain/xeno)) // I'm not sure how well this will work now, since I don't think you can actually get xeno brains
|
||||
if(istype(O,/obj/item/organ/internal/brain/xeno)) // kept the type check, as it still does other weird stuff
|
||||
name = "Man-Machine Interface: Alien - [brainmob.real_name]"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "AlienMMI"
|
||||
alien = 1
|
||||
else
|
||||
name = "Man-Machine Interface: [brainmob.real_name]"
|
||||
icon_state = "mmi_full"
|
||||
icon = B.mmi_icon
|
||||
icon_state = "[B.mmi_icon_state]"
|
||||
alien = 0
|
||||
feedback_inc("cyborg_mmis_filled",1)
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
parent_organ = "head"
|
||||
slot = "brain"
|
||||
vital = 1
|
||||
var/mmi_icon = 'icons/obj/assemblies.dmi'
|
||||
var/mmi_icon_state = "mmi_full"
|
||||
|
||||
/obj/item/organ/internal/brain/surgeryize()
|
||||
if(!owner)
|
||||
@@ -27,6 +29,8 @@
|
||||
desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
|
||||
icon_state = "brain-x"
|
||||
origin_tech = "biotech=7"
|
||||
mmi_icon = 'icons/mob/alien.dmi'
|
||||
mmi_icon_state = "AlienMMI"
|
||||
|
||||
/obj/item/organ/internal/brain/New()
|
||||
..()
|
||||
@@ -107,6 +111,7 @@
|
||||
desc = "A complex, organic knot of jelly and crystalline particles."
|
||||
icon = 'icons/mob/slimes.dmi'
|
||||
icon_state = "green slime extract"
|
||||
mmi_icon_state = "slime_mmi"
|
||||
// parent_organ = "chest" Hello I am from the ministry of rubber forehead aliens how are you
|
||||
|
||||
/obj/item/organ/brain/slime/take_damage(var/amount, var/silent = 1)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
if(src.stat == DEAD)
|
||||
return
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
|
||||
if ("alarm")
|
||||
|
||||
@@ -746,6 +746,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
spintime -= speed
|
||||
|
||||
/mob/living/carbon/resist_buckle()
|
||||
spawn(0)
|
||||
resist_muzzle()
|
||||
if(restrained())
|
||||
changeNext_move(CLICK_CD_BREAKOUT)
|
||||
last_special = world.time + CLICK_CD_BREAKOUT
|
||||
@@ -776,6 +778,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
|
||||
|
||||
/mob/living/carbon/resist_restraints()
|
||||
spawn(0)
|
||||
resist_muzzle()
|
||||
var/obj/item/I = null
|
||||
if(handcuffed)
|
||||
I = handcuffed
|
||||
@@ -786,6 +790,21 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
last_special = world.time + CLICK_CD_BREAKOUT
|
||||
cuff_resist(I)
|
||||
|
||||
/mob/living/carbon/resist_muzzle()
|
||||
if(!istype(wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
return
|
||||
var/obj/item/clothing/mask/muzzle/I = wear_mask
|
||||
var/time = I.resist_time
|
||||
if(I.resist_time == 0)//if it's 0, you can't get out of it
|
||||
to_chat(src, "[I] is too well made, you'll need hands for this one!")
|
||||
else
|
||||
visible_message("<span class='warning'>[src] gnaws on [I], trying to remove it!</span>")
|
||||
to_chat(src, "<span class='notice'>You attempt to remove [I]... (This will take around [time/10] seconds and you need to stand still.)</span>")
|
||||
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>")
|
||||
unEquip(I)
|
||||
|
||||
|
||||
/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0)
|
||||
breakouttime = I.breakouttime
|
||||
|
||||
@@ -18,16 +18,17 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_gender(var/gender, var/update_dna = 1)
|
||||
var/obj/item/organ/external/head/H = organs_by_name["head"]
|
||||
if(src.gender == gender)
|
||||
return
|
||||
|
||||
src.gender = gender
|
||||
|
||||
var/datum/sprite_accessory/hair/current_hair = hair_styles_list[h_style]
|
||||
var/datum/sprite_accessory/hair/current_hair = hair_styles_list[H.h_style]
|
||||
if(current_hair.gender != NEUTER && current_hair.gender != src.gender)
|
||||
reset_head_hair()
|
||||
|
||||
var/datum/sprite_accessory/hair/current_fhair = facial_hair_styles_list[f_style]
|
||||
var/datum/sprite_accessory/hair/current_fhair = facial_hair_styles_list[H.f_style]
|
||||
if(current_fhair.gender != NEUTER && current_fhair.gender != src.gender)
|
||||
reset_facial_hair()
|
||||
|
||||
@@ -38,59 +39,137 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_hair(var/hair_style)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(!hair_style)
|
||||
return
|
||||
|
||||
if(h_style == hair_style)
|
||||
if(H.h_style == hair_style)
|
||||
return
|
||||
|
||||
if(!(hair_style in hair_styles_list))
|
||||
return
|
||||
|
||||
h_style = hair_style
|
||||
H.h_style = hair_style
|
||||
|
||||
update_hair()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_facial_hair(var/facial_hair_style)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(!facial_hair_style)
|
||||
return
|
||||
|
||||
if(f_style == facial_hair_style)
|
||||
if(H.f_style == facial_hair_style)
|
||||
return
|
||||
|
||||
if(!(facial_hair_style in facial_hair_styles_list))
|
||||
return
|
||||
|
||||
f_style = facial_hair_style
|
||||
H.f_style = facial_hair_style
|
||||
|
||||
update_fhair()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_head_accessory(var/head_accessory_style)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(!head_accessory_style)
|
||||
return
|
||||
|
||||
if(H.ha_style == head_accessory_style)
|
||||
return
|
||||
|
||||
if(!(head_accessory_style in head_accessory_styles_list))
|
||||
return
|
||||
|
||||
H.ha_style = head_accessory_style
|
||||
|
||||
update_head_accessory()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_markings(var/marking_style)
|
||||
if(!marking_style)
|
||||
return
|
||||
|
||||
if(src.m_style == marking_style)
|
||||
return
|
||||
|
||||
if(!(marking_style in marking_styles_list))
|
||||
return
|
||||
|
||||
src.m_style = marking_style
|
||||
|
||||
update_markings()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_body_accessory(var/body_accessory_style)
|
||||
var/found
|
||||
if(!body_accessory_style)
|
||||
return
|
||||
|
||||
if(src.body_accessory)
|
||||
if(src.body_accessory.name == body_accessory_style)
|
||||
return
|
||||
|
||||
for(var/B in body_accessory_by_name)
|
||||
if(B == body_accessory_style)
|
||||
src.body_accessory = body_accessory_by_name[body_accessory_style]
|
||||
found = 1
|
||||
|
||||
if(!found)
|
||||
return
|
||||
|
||||
update_tail_layer()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/reset_hair()
|
||||
reset_head_hair()
|
||||
reset_facial_hair()
|
||||
reset_head_accessory()
|
||||
if(m_style && m_style != "None") //Resets the markings if they were head markings.
|
||||
var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
|
||||
if(marking_style && marking_style.marking_location == "head")
|
||||
reset_markings()
|
||||
|
||||
/mob/living/carbon/human/proc/reset_head_hair()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
var/list/valid_hairstyles = generate_valid_hairstyles()
|
||||
|
||||
if(valid_hairstyles.len)
|
||||
h_style = pick(valid_hairstyles)
|
||||
H.h_style = pick(valid_hairstyles)
|
||||
else
|
||||
//this shouldn't happen
|
||||
h_style = "Bald"
|
||||
H.h_style = "Bald"
|
||||
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/proc/reset_facial_hair()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
var/list/valid_facial_hairstyles = generate_valid_facial_hairstyles()
|
||||
if(valid_facial_hairstyles.len)
|
||||
f_style = pick(valid_facial_hairstyles)
|
||||
H.f_style = pick(valid_facial_hairstyles)
|
||||
else
|
||||
//this shouldn't happen
|
||||
f_style = "Shaved"
|
||||
H.f_style = "Shaved"
|
||||
update_fhair()
|
||||
|
||||
/mob/living/carbon/human/proc/reset_markings()
|
||||
var/list/valid_markings = generate_valid_markings()
|
||||
if(valid_markings.len)
|
||||
m_style = pick(valid_markings)
|
||||
else
|
||||
//this shouldn't happen
|
||||
m_style = "None"
|
||||
update_markings()
|
||||
|
||||
/mob/living/carbon/human/proc/reset_head_accessory()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
var/list/valid_head_accessories = generate_valid_head_accessories()
|
||||
if(valid_head_accessories.len)
|
||||
H.ha_style = pick(valid_head_accessories)
|
||||
else
|
||||
//this shouldn't happen
|
||||
H.ha_style = "None"
|
||||
update_head_accessory()
|
||||
|
||||
/mob/living/carbon/human/proc/change_eye_color(var/red, var/green, var/blue)
|
||||
if(red == r_eyes && green == g_eyes && blue == b_eyes)
|
||||
return
|
||||
@@ -104,27 +183,53 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue)
|
||||
if(red == r_eyes && green == g_eyes && blue == b_eyes)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(red == H.r_hair && green == H.g_hair && blue == H.b_hair)
|
||||
return
|
||||
|
||||
r_hair = red
|
||||
g_hair = green
|
||||
b_hair = blue
|
||||
H.r_hair = red
|
||||
H.g_hair = green
|
||||
H.b_hair = blue
|
||||
|
||||
update_hair()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue)
|
||||
if(red == r_facial && green == g_facial && blue == b_facial)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(red == H.r_facial && green == H.g_facial && blue == H.b_facial)
|
||||
return
|
||||
|
||||
r_facial = red
|
||||
g_facial = green
|
||||
b_facial = blue
|
||||
H.r_facial = red
|
||||
H.g_facial = green
|
||||
H.b_facial = blue
|
||||
|
||||
update_fhair()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_head_accessory_color(var/red, var/green, var/blue)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(red == H.r_headacc && green == H.g_headacc && blue == H.b_headacc)
|
||||
return
|
||||
|
||||
H.r_headacc = red
|
||||
H.g_headacc = green
|
||||
H.b_headacc = blue
|
||||
|
||||
update_head_accessory()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_marking_color(var/red, var/green, var/blue)
|
||||
if(red == r_markings && green == g_markings && blue == b_markings)
|
||||
return
|
||||
|
||||
r_markings = red
|
||||
g_markings = green
|
||||
b_markings = blue
|
||||
|
||||
update_markings()
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue)
|
||||
if(red == r_skin && green == g_skin && blue == b_skin || !(species.bodyflags & HAS_SKIN_COLOR))
|
||||
return
|
||||
@@ -170,6 +275,7 @@
|
||||
|
||||
/mob/living/carbon/human/proc/generate_valid_hairstyles()
|
||||
var/list/valid_hairstyles = new()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
for(var/hairstyle in hair_styles_list)
|
||||
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
|
||||
|
||||
@@ -177,12 +283,11 @@
|
||||
continue
|
||||
if(gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
if(species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
|
||||
var/obj/item/organ/external/head/H = organs_by_name["head"]
|
||||
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
|
||||
var/datum/robolimb/robohead = all_robolimbs[H.model]
|
||||
if(!H)
|
||||
return
|
||||
if(species.name in S.species_allowed) //If this is a hairstyle native to the user's species...
|
||||
if(H.species.name in S.species_allowed) //If this is a hairstyle native to the user's species...
|
||||
if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
|
||||
valid_hairstyles += hairstyle //Give them their hairstyles if they do.
|
||||
continue
|
||||
@@ -195,8 +300,8 @@
|
||||
if("Human" in S.species_allowed) //If the user has a robotic head and the hairstyle can fit humans, let them use it as a wig for their humanoid robot head.
|
||||
valid_hairstyles += hairstyle
|
||||
continue
|
||||
else
|
||||
if(!(species.name in S.species_allowed)) //If the user is not a species who can have robotic heads, use the default handling.
|
||||
else //If the user is not a species who can have robotic heads, use the default handling.
|
||||
if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the hair style allows, skip it. Otherwise, add it to the list.
|
||||
continue
|
||||
valid_hairstyles += hairstyle
|
||||
|
||||
@@ -204,6 +309,7 @@
|
||||
|
||||
/mob/living/carbon/human/proc/generate_valid_facial_hairstyles()
|
||||
var/list/valid_facial_hairstyles = new()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
for(var/facialhairstyle in facial_hair_styles_list)
|
||||
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
|
||||
|
||||
@@ -211,12 +317,11 @@
|
||||
continue
|
||||
if(gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
if(species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
|
||||
var/obj/item/organ/external/head/H = organs_by_name["head"]
|
||||
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
|
||||
var/datum/robolimb/robohead = all_robolimbs[H.model]
|
||||
if(!H)
|
||||
continue // No head, no hair
|
||||
if(species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
|
||||
if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
|
||||
if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
|
||||
valid_facial_hairstyles += facialhairstyle //Give them their facial hair styles if they do.
|
||||
continue
|
||||
@@ -231,8 +336,52 @@
|
||||
valid_facial_hairstyles += facialhairstyle
|
||||
continue
|
||||
else //If the user is not a species who can have robotic heads, use the default handling.
|
||||
if(!(species.name in S.species_allowed))
|
||||
if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the facial hair style allows, skip it. Otherwise, add it to the list.
|
||||
continue
|
||||
valid_facial_hairstyles += facialhairstyle
|
||||
|
||||
return valid_facial_hairstyles
|
||||
|
||||
/mob/living/carbon/human/proc/generate_valid_head_accessories()
|
||||
var/list/valid_head_accessories = new()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
for(var/head_accessory in head_accessory_styles_list)
|
||||
var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory]
|
||||
|
||||
if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list.
|
||||
continue
|
||||
valid_head_accessories += head_accessory
|
||||
|
||||
return valid_head_accessories
|
||||
|
||||
/mob/living/carbon/human/proc/generate_valid_markings()
|
||||
var/list/valid_markings = new()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
for(var/marking in marking_styles_list)
|
||||
var/datum/sprite_accessory/S = marking_styles_list[marking]
|
||||
|
||||
if(!(species.name in S.species_allowed)) //If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list.
|
||||
continue
|
||||
if(H.species.flags & ALL_RPARTS) //If the user is a species that can have a robotic head...
|
||||
var/datum/robolimb/robohead = all_robolimbs[H.model]
|
||||
if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
|
||||
continue
|
||||
valid_markings += marking
|
||||
|
||||
return valid_markings
|
||||
|
||||
/mob/living/carbon/human/proc/generate_valid_body_accessories()
|
||||
var/list/valid_body_accessories = new()
|
||||
for(var/B in body_accessory_by_name)
|
||||
var/datum/body_accessory/A = body_accessory_by_name[B]
|
||||
if(check_rights(R_ADMIN, 1, src))
|
||||
valid_body_accessories = body_accessory_by_name.Copy()
|
||||
else
|
||||
if(!istype(A))
|
||||
valid_body_accessories += "None" //The only null entry should be the "None" option.
|
||||
continue
|
||||
if(!(species.name in A.allowed_species)) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
|
||||
continue
|
||||
valid_body_accessories += B
|
||||
|
||||
return valid_body_accessories
|
||||
|
||||
@@ -145,12 +145,13 @@
|
||||
return ..(gibbed)
|
||||
|
||||
/mob/living/carbon/human/proc/makeSkeleton()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(SKELETON in src.mutations) return
|
||||
|
||||
if(f_style)
|
||||
f_style = "Shaved"
|
||||
if(h_style)
|
||||
h_style = "Bald"
|
||||
if(H.f_style)
|
||||
H.f_style = "Shaved"
|
||||
if(H.h_style)
|
||||
H.h_style = "Bald"
|
||||
update_fhair(0)
|
||||
update_hair(0)
|
||||
|
||||
@@ -162,12 +163,13 @@
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/ChangeToHusk()
|
||||
var/obj/item/organ/external/head/H = organs_by_name["head"]
|
||||
if(HUSK in mutations) return
|
||||
|
||||
if(f_style)
|
||||
f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
|
||||
if(h_style)
|
||||
h_style = "Bald"
|
||||
if(H.f_style)
|
||||
H.f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
|
||||
if(H.h_style)
|
||||
H.h_style = "Bald"
|
||||
update_fhair(0)
|
||||
update_hair(0)
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
//Cooldown-inducing emotes
|
||||
if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no")
|
||||
@@ -32,6 +33,11 @@
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
if("drone","drones","hum","hums","rumble","rumbles")
|
||||
if (species.name == "Drask") //Only Drask can make whale noises
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else
|
||||
return
|
||||
if("squish", "squishes")
|
||||
var/found_slime_bodypart = 0
|
||||
|
||||
@@ -114,6 +120,23 @@
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
if("drone", "drones", "hum", "hums", "rumble", "rumbles")
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(null, null))
|
||||
if (param == A.name)
|
||||
M = A
|
||||
break
|
||||
if(!M)
|
||||
param = null
|
||||
|
||||
if (param)
|
||||
message = "<B>[src]</B> drones at [param]."
|
||||
else
|
||||
message = "<B>[src]</B> rumbles."
|
||||
playsound(src.loc, 'sound/voice/DraskTalk.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
if("squish", "squishes")
|
||||
var/M = null
|
||||
if(param)
|
||||
@@ -284,18 +307,30 @@
|
||||
if (M == src)
|
||||
M = null
|
||||
|
||||
if (M)
|
||||
if(src.lying || src.weakened)
|
||||
if(M)
|
||||
if(lying || weakened)
|
||||
message = "<B>[src]</B> flops and flails around on the floor."
|
||||
else
|
||||
message = "<B>[src]</B> flips in [M]'s general direction."
|
||||
src.SpinAnimation(5,1)
|
||||
SpinAnimation(5,1)
|
||||
else
|
||||
if(src.lying || src.weakened)
|
||||
if(lying || weakened)
|
||||
message = "<B>[src]</B> flops and flails around on the floor."
|
||||
else
|
||||
message = "<B>[src]</B> does a flip!"
|
||||
src.SpinAnimation(5,1)
|
||||
var/obj/item/weapon/grab/G
|
||||
if(istype(get_active_hand(), /obj/item/weapon/grab))
|
||||
G = get_active_hand()
|
||||
if(G && G.affecting)
|
||||
var/turf/oldloc = loc
|
||||
var/turf/newloc = G.affecting.loc
|
||||
if(isturf(oldloc) && isturf(newloc))
|
||||
SpinAnimation(5,1)
|
||||
forceMove(newloc)
|
||||
G.affecting.forceMove(oldloc)
|
||||
message = "<B>[src]</B> flips over [G.affecting]!"
|
||||
else
|
||||
message = "<B>[src]</B> does a flip!"
|
||||
SpinAnimation(5,1)
|
||||
|
||||
if ("aflap", "aflaps")
|
||||
if (!src.restrained())
|
||||
|
||||
@@ -56,17 +56,22 @@
|
||||
|
||||
var/list/nospecies = list("Abductor", "Shadowling", "Neara", "Monkey", "Stok", "Farwa", "Wolpin") //species that won't show their race no matter what
|
||||
|
||||
if (skipjumpsuit && skipface || (species.name in nospecies)) //either obscured or on the nospecies list
|
||||
msg += "!\n" //omit the species when examining
|
||||
else if (species.name == "Slime People") //snowflakey because Slime People are defined as a plural
|
||||
var/displayed_species = get_species()
|
||||
for(var/obj/item/clothing/C in src) //Disguise checks
|
||||
if (C == src.head || C == src.wear_suit || C == src.wear_mask || C == src.w_uniform || C == src.belt || C == src.back)
|
||||
if(C.species_disguise)
|
||||
displayed_species = C.species_disguise
|
||||
if (skipjumpsuit && skipface || (displayed_species in nospecies)) //either obscured or on the nospecies list
|
||||
msg += "!\n" //omit the species when examining
|
||||
else if (displayed_species == "Slime People") //snowflakey because Slime People are defined as a plural
|
||||
msg += ", a slime person!\n"
|
||||
else if (species.name == "Unathi") //DAMN YOU, VOWELS
|
||||
else if (displayed_species == "Unathi") //DAMN YOU, VOWELS
|
||||
msg += ", a unathi!\n"
|
||||
else
|
||||
msg += ", \a [lowertext(species.name)]!\n"
|
||||
msg += ", \a [lowertext(displayed_species)]!\n"
|
||||
|
||||
//uniform
|
||||
if(w_uniform && !skipjumpsuit)
|
||||
if(w_uniform && !skipjumpsuit && !(w_uniform.flags & ABSTRACT))
|
||||
//Ties
|
||||
var/tie_msg
|
||||
if(istype(w_uniform,/obj/item/clothing/under))
|
||||
@@ -80,14 +85,14 @@
|
||||
msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
|
||||
|
||||
//head
|
||||
if(head)
|
||||
if(head && !(head.flags & ABSTRACT))
|
||||
if(head.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [head.blood_color != "#030303" ? "blood-stained":"oil-stained"] [head.name] on [t_his] head!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] wearing \icon[head] \a [head] on [t_his] head.\n"
|
||||
|
||||
//suit/armour
|
||||
if(wear_suit)
|
||||
if(wear_suit && !(wear_suit.flags & ABSTRACT))
|
||||
if(wear_suit.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [wear_suit.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_suit.name]!</span>\n"
|
||||
else
|
||||
@@ -101,7 +106,7 @@
|
||||
msg += "[t_He] [t_is] carrying \icon[s_store] \a [s_store] on [t_his] [wear_suit.name].\n"
|
||||
|
||||
//back
|
||||
if(back)
|
||||
if(back && !(back.flags & ABSTRACT))
|
||||
if(back.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[back] [back.gender==PLURAL?"some":"a"] [back.blood_color != "#030303" ? "blood-stained":"oil-stained"] [back] on [t_his] back.</span>\n"
|
||||
else
|
||||
@@ -122,7 +127,7 @@
|
||||
msg += "[t_He] [t_is] holding \icon[r_hand] \a [r_hand] in [t_his] right hand.\n"
|
||||
|
||||
//gloves
|
||||
if(gloves && !skipgloves)
|
||||
if(gloves && !skipgloves && !(gloves.flags & ABSTRACT))
|
||||
if(gloves.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [gloves.blood_color != "#030303" ? "blood-stained":"oil-stained"] [gloves.name] on [t_his] hands!</span>\n"
|
||||
else
|
||||
@@ -147,7 +152,7 @@
|
||||
msg += "[t_He] [t_has] \icon[belt] \a [belt] about [t_his] waist.\n"
|
||||
|
||||
//shoes
|
||||
if(shoes && !skipshoes)
|
||||
if(shoes && !skipshoes && !(shoes.flags & ABSTRACT))
|
||||
if(shoes.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [shoes.blood_color != "#030303" ? "blood-stained":"oil-stained"] [shoes.name] on [t_his] feet!</span>\n"
|
||||
else
|
||||
@@ -157,14 +162,14 @@
|
||||
|
||||
|
||||
//mask
|
||||
if(wear_mask && !skipmask)
|
||||
if(wear_mask && !skipmask && !(wear_mask.flags & ABSTRACT))
|
||||
if(wear_mask.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [wear_mask.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_mask.name] on [t_his] face!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_has] \icon[wear_mask] \a [wear_mask] on [t_his] face.\n"
|
||||
|
||||
//eyes
|
||||
if(glasses && !skipeyes)
|
||||
if(glasses && !skipeyes && !(glasses.flags & ABSTRACT))
|
||||
if(glasses.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [glasses.blood_color != "#030303" ? "blood-stained":"oil-stained"] [glasses] covering [t_his] eyes!</span>\n"
|
||||
else
|
||||
|
||||
@@ -74,38 +74,30 @@
|
||||
status_flags = GODMODE|CANPUSH
|
||||
|
||||
/mob/living/carbon/human/skrell/New(var/new_loc)
|
||||
h_style = "Skrell Male Tentacles"
|
||||
..(new_loc, "Skrell")
|
||||
|
||||
/mob/living/carbon/human/tajaran/New(var/new_loc)
|
||||
ha_style = "Tajaran Ears"
|
||||
..(new_loc, "Tajaran")
|
||||
|
||||
/mob/living/carbon/human/vulpkanin/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Vulpkanin")
|
||||
|
||||
/mob/living/carbon/human/unathi/New(var/new_loc)
|
||||
h_style = "Unathi Horns"
|
||||
..(new_loc, "Unathi")
|
||||
|
||||
/mob/living/carbon/human/vox/New(var/new_loc)
|
||||
h_style = "Short Vox Quills"
|
||||
..(new_loc, "Vox")
|
||||
|
||||
/mob/living/carbon/human/voxarmalis/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Vox Armalis")
|
||||
|
||||
/mob/living/carbon/human/skeleton/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Skeleton")
|
||||
|
||||
/mob/living/carbon/human/kidan/New(var/new_loc)
|
||||
..(new_loc, "Kidan")
|
||||
|
||||
/mob/living/carbon/human/plasma/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Plasmaman")
|
||||
|
||||
/mob/living/carbon/human/slime/New(var/new_loc)
|
||||
@@ -121,31 +113,24 @@
|
||||
..(new_loc, "Human")
|
||||
|
||||
/mob/living/carbon/human/diona/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Diona")
|
||||
|
||||
/mob/living/carbon/human/machine/New(var/new_loc)
|
||||
h_style = "blue IPC screen"
|
||||
..(new_loc, "Machine")
|
||||
|
||||
/mob/living/carbon/human/shadow/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Shadow")
|
||||
|
||||
/mob/living/carbon/human/golem/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Golem")
|
||||
|
||||
/mob/living/carbon/human/wryn/New(var/new_loc)
|
||||
h_style = "Antennae"
|
||||
..(new_loc, "Wryn")
|
||||
|
||||
/mob/living/carbon/human/nucleation/New(var/new_loc)
|
||||
h_style = "Nucleation Crystals"
|
||||
..(new_loc, "Nucleation")
|
||||
|
||||
/mob/living/carbon/human/drask/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Drask")
|
||||
|
||||
/mob/living/carbon/human/monkey/New(var/new_loc)
|
||||
@@ -1270,6 +1255,54 @@
|
||||
else
|
||||
germ_level += n
|
||||
|
||||
/mob/living/carbon/human/proc/check_and_regenerate_organs(var/mob/living/carbon/human/H) //Regenerates missing limbs/organs.
|
||||
var/list/types_of_int_organs = list() //This will hold all the types of organs in the mob before rejuvenation.
|
||||
for(var/obj/item/organ/internal/I in H.internal_organs)
|
||||
types_of_int_organs |= I.type //Compiling the list of organ types. It is possible for organs to be missing from this list if they are absent from the mob.
|
||||
|
||||
//Removing stumps.
|
||||
for(var/obj/item/organ/organ in H.contents)
|
||||
if(istype(organ, /obj/item/organ/external/stump)) //Get rid of all stumps.
|
||||
qdel(organ)
|
||||
H.contents -= organ //Making sure the list entry is removed.
|
||||
for(var/obj/item/organ/organ in H.organs)
|
||||
if(istype(organ, /obj/item/organ/external/stump))
|
||||
qdel(organ)
|
||||
H.organs -= organ //Making sure the list entry is removed.
|
||||
for(var/organ_name in H.organs_by_name)
|
||||
var/obj/item/organ/organ = H.organs_by_name[organ_name]
|
||||
if(istype(organ, /obj/item/organ/external/stump) || !organ) //The !organ check is to account for mechanical limb (prostheses) losses, since those are handled in a way that leaves indexed but null list entries instead of stumps.
|
||||
qdel(organ)
|
||||
H.organs_by_name -= organ_name //Making sure the list entry is removed.
|
||||
|
||||
//Replacing lost limbs with the species default.
|
||||
var/mob/living/carbon/human/temp_holder
|
||||
for(var/limb_type in H.species.has_limbs)
|
||||
if(!(limb_type in H.organs_by_name))
|
||||
var/list/organ_data = H.species.has_limbs[limb_type]
|
||||
var/limb_path = organ_data["path"]
|
||||
var/obj/item/organ/external/O = new limb_path(temp_holder)
|
||||
if(H.get_limb_by_name(O.name)) //Check to see if the user already has an limb with the same name as the 'missing limb'. If they do, skip regrowth.
|
||||
continue //In an example, this will prevent duplication of the mob's right arm if the mob is a Human and they have a Diona right arm, since,
|
||||
//while the limb with the name 'right_arm' the mob has may not be listed in their species' bodyparts definition, it is still viable and has the appropriate limb name.
|
||||
else
|
||||
O = new limb_path(H) //Create the limb on the player.
|
||||
O.owner = H
|
||||
H.organs |= H.organs_by_name[O.limb_name]
|
||||
|
||||
//Replacing lost organs with the species default.
|
||||
temp_holder = new /mob/living/carbon/human()
|
||||
for(var/index in H.species.has_organ)
|
||||
var/organ = H.species.has_organ[index]
|
||||
if(!(organ in types_of_int_organs)) //If the mob is missing this particular organ...
|
||||
var/obj/item/organ/internal/I = new organ(temp_holder) //Create the organ inside our holder so we can check it before implantation.
|
||||
if(H.get_organ_slot(I.slot)) //Check to see if the user already has an organ in the slot the 'missing organ' belongs to. If they do, skip implantation.
|
||||
continue //In an example, this will prevent duplication of the mob's eyes if the mob is a Human and they have Nucleation eyes, since,
|
||||
//while the organ in the eyes slot may not be listed in the mob's species' organs definition, it is still viable and fits in the appropriate organ slot.
|
||||
else
|
||||
I = new organ(H) //Create the organ inside the player.
|
||||
I.insert(H)
|
||||
|
||||
/mob/living/carbon/human/revive()
|
||||
|
||||
if(species && !(species.flags & NO_BLOOD))
|
||||
@@ -1277,9 +1310,18 @@
|
||||
vessel.add_reagent(blood_reagent, max_blood-vessel.total_volume)
|
||||
fixblood()
|
||||
|
||||
// Fix up all organs.
|
||||
// This will ignore any prosthetics in the prefs currently.
|
||||
species.create_organs(src)
|
||||
//Fix up all organs and replace lost ones.
|
||||
restore_all_organs() //Rejuvenate and reset all existing organs.
|
||||
check_and_regenerate_organs(src) //Regenerate limbs and organs only if they're really missing.
|
||||
surgeries.Cut() //End all surgeries.
|
||||
update_revive()
|
||||
|
||||
if(species.name != "Skeleton" && (SKELETON in mutations))
|
||||
mutations.Remove(SKELETON)
|
||||
if(NOCLONE in mutations)
|
||||
mutations.Remove(NOCLONE)
|
||||
if(HUSK in mutations)
|
||||
mutations.Remove(HUSK)
|
||||
|
||||
if(!client || !key) //Don't boot out anyone already in the mob.
|
||||
for (var/obj/item/organ/internal/brain/H in world)
|
||||
@@ -1505,6 +1547,15 @@
|
||||
|
||||
species.create_organs(src)
|
||||
|
||||
//Handle default hair/head accessories for created mobs.
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(species.default_hair)
|
||||
H.h_style = species.default_hair
|
||||
if(species.default_fhair)
|
||||
H.f_style = species.default_fhair
|
||||
if(species.default_headacc)
|
||||
H.ha_style = species.default_headacc
|
||||
|
||||
if(!dna)
|
||||
dna = new /datum/dna(null)
|
||||
dna.species = species.name
|
||||
@@ -1601,9 +1652,8 @@
|
||||
return
|
||||
|
||||
if(species.flags & ALL_RPARTS) //If they can have a fully cybernetic body...
|
||||
var/obj/item/organ/external/head/H = organs_by_name["head"]
|
||||
var/datum/robolimb/robohead = all_robolimbs[H.model]
|
||||
if(!H)
|
||||
var/datum/robolimb/robohead = all_robolimbs[head_organ.model]
|
||||
if(!head_organ)
|
||||
return
|
||||
if(!robohead.is_monitor) //If they've got a prosthetic head and it isn't a monitor, they've no screen to adjust. Instead, let them change the colour of their optics!
|
||||
var/optic_colour = input(src, "Select optic colour", rgb(r_markings, g_markings, b_markings)) as color|null
|
||||
@@ -1620,15 +1670,15 @@
|
||||
var/list/hair = list()
|
||||
for(var/i in hair_styles_list)
|
||||
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
|
||||
if((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.
|
||||
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
|
||||
|
||||
var/new_style = input(src, "Select a monitor display", "Monitor Display", h_style) as null|anything in hair
|
||||
var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You were interrupted while changing your monitor display.</span>")
|
||||
return
|
||||
if(new_style)
|
||||
h_style = new_style
|
||||
head_organ.h_style = new_style
|
||||
|
||||
update_hair()
|
||||
|
||||
@@ -1930,3 +1980,6 @@
|
||||
if(U.accessories)
|
||||
for(var/obj/item/clothing/accessory/A in U.accessories)
|
||||
. |= A.GetAccess()
|
||||
|
||||
/mob/living/carbon/human/is_mechanical()
|
||||
return ..() || (species.flags & ALL_RPARTS) != 0
|
||||
@@ -9,24 +9,6 @@ var/global/default_martial_art = new/datum/martial_art
|
||||
var/b_markings = 0
|
||||
var/m_style = "None"
|
||||
|
||||
//Hair colour and style
|
||||
var/r_hair = 0
|
||||
var/g_hair = 0
|
||||
var/b_hair = 0
|
||||
var/h_style = "Bald"
|
||||
|
||||
//Head accessory colour and style
|
||||
var/r_headacc = 0
|
||||
var/g_headacc = 0
|
||||
var/b_headacc = 0
|
||||
var/ha_style = "None"
|
||||
|
||||
//Facial hair colour and style
|
||||
var/r_facial = 0
|
||||
var/g_facial = 0
|
||||
var/b_facial = 0
|
||||
var/f_style = "Shaved"
|
||||
|
||||
//Eye colour
|
||||
var/r_eyes = 0
|
||||
var/g_eyes = 0
|
||||
|
||||
@@ -607,4 +607,4 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
return 0 //Unsupported slot
|
||||
return 0 //Unsupported slot
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
base_color = "#704300"
|
||||
flesh_color = "#704300"
|
||||
blood_color = "#FFFF99"
|
||||
//Default styles for created mobs.
|
||||
default_hair = "Antennae"
|
||||
|
||||
|
||||
/datum/species/wryn/handle_death(var/mob/living/carbon/human/H)
|
||||
@@ -54,6 +56,7 @@
|
||||
to_chat(C, "<span class='danger'>It feels like part of you has died.</span>")
|
||||
|
||||
/datum/species/wryn/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M)
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
if(M.a_intent == I_HARM)
|
||||
if(H.handcuffed)
|
||||
if(!H.get_int_organ(/obj/item/organ/internal/wryn/hivenode)) return
|
||||
@@ -71,7 +74,7 @@
|
||||
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'><span class='danger'><B>It's so quiet...</B></span>")
|
||||
H.h_style = "Bald"
|
||||
head_organ.h_style = "Bald"
|
||||
H.update_hair()
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>removed antennae [H.name] ([H.ckey])</font>")
|
||||
@@ -87,7 +90,7 @@
|
||||
blurb = "A sub-race of unforunates who have been exposed to too much supermatter radiation. As a result, \
|
||||
supermatter crystal clusters have begun to grow across their bodies. Research to find a cure for this ailment \
|
||||
has been slow, and so this is a common fate for veteran engineers. The supermatter crystals produce oxygen, \
|
||||
negating the need for the individual to breath. Their massive change in biology, however, renders most medicines \
|
||||
negating the need for the individual to breathe. Their massive change in biology, however, renders most medicines \
|
||||
obselete. Ionizing radiation seems to cause resonance in some of their crystals, which seems to encourage regeneration \
|
||||
and produces a calming effect on the individual. Nucleations are highly stigmatized, and are treated much in the same \
|
||||
way as lepers were back on Earth."
|
||||
@@ -97,6 +100,9 @@
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN
|
||||
dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet
|
||||
|
||||
//Default styles for created mobs.
|
||||
default_hair = "Nucleation Crystals"
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
has_organ = list(
|
||||
"heart" = /obj/item/organ/internal/heart,
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
reagent_tag = PROCESS_ORG
|
||||
base_color = "#a3d4eb"
|
||||
blood_color = "#a3d4eb"
|
||||
butt_sprite = "drask"
|
||||
|
||||
has_organ = list(
|
||||
"heart" = /obj/item/organ/internal/heart/drask,
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
deform = 'icons/mob/human_races/r_golem.dmi'
|
||||
|
||||
default_language = "Galactic Common"
|
||||
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE
|
||||
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE | NOGUNS
|
||||
virus_immune = 1
|
||||
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
brute_mod = 1.5
|
||||
burn_mod = 1.5
|
||||
|
||||
flags = IS_RESTRICTED
|
||||
|
||||
/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H)
|
||||
if(H.stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
//default_mutations=list(SKELETON) // This screws things up
|
||||
|
||||
butt_sprite = "plasma"
|
||||
|
||||
breath_type = "plasma"
|
||||
|
||||
heat_level_1 = 350 // Heat damage level 1 above this point.
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
var/eyes = "eyes_s" // Icon for eyes.
|
||||
var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen.
|
||||
var/butt_sprite = "human"
|
||||
|
||||
var/primitive_form // Lesser form, if any (ie. monkey for humans)
|
||||
var/greater_form // Greater form, if any, ie. human for monkeys.
|
||||
@@ -118,6 +119,11 @@
|
||||
var/male_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
|
||||
var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg'
|
||||
|
||||
//Default hair/headacc style vars.
|
||||
var/default_hair = "Bald" //Default hair style for newly created humans unless otherwise set.
|
||||
var/default_fhair = "Shaved" //Default facial hair style for newly created humans unless otherwise set.
|
||||
var/default_headacc = "None" //Default head accessory style for newly created humans unless otherwise set.
|
||||
|
||||
// Determines the organs that the species spawns with and
|
||||
var/list/has_organ = list( // which required-organ checks are conducted.
|
||||
"heart" = /obj/item/organ/internal/heart,
|
||||
@@ -158,7 +164,6 @@
|
||||
|
||||
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
|
||||
|
||||
|
||||
for(var/obj/item/organ/internal/iorgan in H.internal_organs)
|
||||
if(iorgan in H.internal_organs)
|
||||
qdel(iorgan)
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
flesh_color = "#34AF10"
|
||||
reagent_tag = PROCESS_ORG
|
||||
base_color = "#066000"
|
||||
//Default styles for created mobs.
|
||||
default_hair = "Unathi Horns"
|
||||
butt_sprite = "unathi"
|
||||
|
||||
allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
|
||||
/mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble)
|
||||
@@ -104,11 +107,14 @@
|
||||
|
||||
flags = HAS_LIPS | CAN_BE_FAT
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
|
||||
dietflags = DIET_OMNI
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
//Default styles for created mobs.
|
||||
default_headacc = "Tajaran Ears"
|
||||
butt_sprite = "tajaran"
|
||||
|
||||
allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/chick, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot,
|
||||
/mob/living/simple_animal/tribble)
|
||||
@@ -148,11 +154,12 @@
|
||||
|
||||
flags = HAS_LIPS
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
|
||||
dietflags = DIET_OMNI
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#966464"
|
||||
base_color = "#B43214"
|
||||
butt_sprite = "vulp"
|
||||
|
||||
allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
|
||||
/mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble)
|
||||
@@ -189,7 +196,20 @@
|
||||
dietflags = DIET_HERB
|
||||
flesh_color = "#8CD7A3"
|
||||
blood_color = "#1D2CBF"
|
||||
//Default styles for created mobs.
|
||||
default_hair = "Skrell Male Tentacles"
|
||||
reagent_tag = PROCESS_ORG
|
||||
butt_sprite = "skrell"
|
||||
|
||||
has_organ = list(
|
||||
"heart" = /obj/item/organ/internal/heart,
|
||||
"lungs" = /obj/item/organ/internal/lungs,
|
||||
"liver" = /obj/item/organ/internal/liver/skrell,
|
||||
"kidneys" = /obj/item/organ/internal/kidneys,
|
||||
"brain" = /obj/item/organ/internal/brain,
|
||||
"appendix" = /obj/item/organ/internal/appendix,
|
||||
"eyes" = /obj/item/organ/internal/eyes,
|
||||
)
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
@@ -251,12 +271,26 @@
|
||||
|
||||
blood_color = "#2299FC"
|
||||
flesh_color = "#808D11"
|
||||
//Default styles for created mobs.
|
||||
default_hair = "Short Vox Quills"
|
||||
butt_sprite = "vox"
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
scream_verb = "shrieks"
|
||||
male_scream_sound = 'sound/voice/shriek1.ogg'
|
||||
female_scream_sound = 'sound/voice/shriek1.ogg'
|
||||
|
||||
has_organ = list(
|
||||
"heart" = /obj/item/organ/internal/heart,
|
||||
"lungs" = /obj/item/organ/internal/lungs,
|
||||
"liver" = /obj/item/organ/internal/liver,
|
||||
"kidneys" = /obj/item/organ/internal/kidneys,
|
||||
"brain" = /obj/item/organ/internal/brain,
|
||||
"appendix" = /obj/item/organ/internal/appendix,
|
||||
"eyes" = /obj/item/organ/internal/eyes,
|
||||
"stack" = /obj/item/organ/internal/stack/vox //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
|
||||
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their claws into their eye sockets!",
|
||||
@@ -347,8 +381,8 @@
|
||||
"kidneys" = /obj/item/organ/internal/kidneys,
|
||||
"brain" = /obj/item/organ/internal/brain,
|
||||
"eyes" = /obj/item/organ/internal/eyes,
|
||||
"stack" = /obj/item/organ/internal/stack/vox
|
||||
)
|
||||
"stack" = /obj/item/organ/internal/stack/vox //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
|
||||
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
@@ -376,6 +410,7 @@
|
||||
dietflags = DIET_HERB
|
||||
blood_color = "#FB9800"
|
||||
reagent_tag = PROCESS_ORG
|
||||
butt_sprite = "kidan"
|
||||
|
||||
allowed_consumed_mobs = list(/mob/living/simple_animal/diona)
|
||||
|
||||
@@ -408,6 +443,7 @@
|
||||
reagent_tag = PROCESS_ORG
|
||||
exotic_blood = "water"
|
||||
//ventcrawler = 1 //ventcrawling commented out
|
||||
butt_sprite = "slime"
|
||||
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/internal/brain/slime
|
||||
@@ -578,6 +614,7 @@
|
||||
unarmed_type = /datum/unarmed_attack/punch
|
||||
darksight = 5 // BOOSTED from 2
|
||||
eyes = "grey_eyes_s"
|
||||
butt_sprite = "grey"
|
||||
|
||||
brute_mod = 1.25 //greys are fragile
|
||||
|
||||
@@ -642,6 +679,7 @@
|
||||
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
|
||||
blood_color = "#004400"
|
||||
flesh_color = "#907E4A"
|
||||
butt_sprite = "diona"
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
@@ -656,17 +694,17 @@
|
||||
|
||||
vision_organ = /obj/item/organ/internal/diona_receptor
|
||||
has_limbs = list(
|
||||
"chest" = list("path" = /obj/item/organ/external/diona/chest),
|
||||
"groin" = list("path" = /obj/item/organ/external/diona/groin),
|
||||
"head" = list("path" = /obj/item/organ/external/diona/head),
|
||||
"l_arm" = list("path" = /obj/item/organ/external/diona/arm),
|
||||
"r_arm" = list("path" = /obj/item/organ/external/diona/arm/right),
|
||||
"l_leg" = list("path" = /obj/item/organ/external/diona/leg),
|
||||
"r_leg" = list("path" = /obj/item/organ/external/diona/leg/right),
|
||||
"l_hand" = list("path" = /obj/item/organ/external/diona/hand),
|
||||
"r_hand" = list("path" = /obj/item/organ/external/diona/hand/right),
|
||||
"l_foot" = list("path" = /obj/item/organ/external/diona/foot),
|
||||
"r_foot" = list("path" = /obj/item/organ/external/diona/foot/right)
|
||||
"chest" = list("path" = /obj/item/organ/external/chest/diona),
|
||||
"groin" = list("path" = /obj/item/organ/external/groin/diona),
|
||||
"head" = list("path" = /obj/item/organ/external/head/diona),
|
||||
"l_arm" = list("path" = /obj/item/organ/external/arm/diona),
|
||||
"r_arm" = list("path" = /obj/item/organ/external/arm/right/diona),
|
||||
"l_leg" = list("path" = /obj/item/organ/external/leg/diona),
|
||||
"r_leg" = list("path" = /obj/item/organ/external/leg/right/diona),
|
||||
"l_hand" = list("path" = /obj/item/organ/external/hand/diona),
|
||||
"r_hand" = list("path" = /obj/item/organ/external/hand/right/diona),
|
||||
"l_foot" = list("path" = /obj/item/organ/external/foot/diona),
|
||||
"r_foot" = list("path" = /obj/item/organ/external/foot/right/diona)
|
||||
)
|
||||
|
||||
suicide_messages = list(
|
||||
@@ -751,11 +789,14 @@
|
||||
dietflags = 0 //IPCs can't eat, so no diet
|
||||
blood_color = "#1F181F"
|
||||
flesh_color = "#AAAAAA"
|
||||
//Default styles for created mobs.
|
||||
default_hair = "Blue IPC Screen"
|
||||
virus_immune = 1
|
||||
can_revive_by_healing = 1
|
||||
reagent_tag = PROCESS_SYN
|
||||
male_scream_sound = 'sound/goonstation/voice/robot_scream.ogg'
|
||||
female_scream_sound = 'sound/goonstation/voice/robot_scream.ogg'
|
||||
butt_sprite = "machine"
|
||||
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain,
|
||||
@@ -791,6 +832,10 @@
|
||||
)
|
||||
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
H.h_style = ""
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
head_organ.h_style = "Bald"
|
||||
head_organ.f_style = "Shaved"
|
||||
spawn(100)
|
||||
if(H) H.update_hair()
|
||||
if(H)
|
||||
H.update_hair()
|
||||
H.update_fhair()
|
||||
@@ -393,13 +393,13 @@ var/global/list/damage_icon_parts = list()
|
||||
//base icons
|
||||
var/icon/head_accessory_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
|
||||
|
||||
if(ha_style && (src.species.bodyflags & HAS_HEAD_ACCESSORY))
|
||||
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
|
||||
if(head_organ.ha_style && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY))
|
||||
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[head_organ.ha_style]
|
||||
if(head_accessory_style && head_accessory_style.species_allowed)
|
||||
if(src.species.name in head_accessory_style.species_allowed)
|
||||
if(head_organ.species.name in head_accessory_style.species_allowed)
|
||||
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
|
||||
if(head_accessory_style.do_colouration)
|
||||
head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD)
|
||||
head_accessory_s.Blend(rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc), ICON_ADD)
|
||||
head_accessory_standing = head_accessory_s //head_accessory_standing.Blend(head_accessory_s, ICON_OVERLAY)
|
||||
//Having it this way preserves animations. Useful for animated antennae.
|
||||
else
|
||||
@@ -429,17 +429,17 @@ var/global/list/damage_icon_parts = list()
|
||||
var/icon/hair_standing = new /icon('icons/mob/human_face.dmi',"bald_s")
|
||||
//var/icon/debrained_s = new /icon("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s")
|
||||
|
||||
if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic())))
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
|
||||
if(head_organ.h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic())))
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_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)
|
||||
if((src.species.name in hair_style.species_allowed) || (src.species.flags & ALL_RPARTS))
|
||||
if((head_organ.species.name in hair_style.species_allowed) || (head_organ.species.flags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
|
||||
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
if(src.get_species() == "Slime People") // I am el worstos
|
||||
if(head_organ.species.name == "Slime People") // I am el worstos
|
||||
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
|
||||
else if(hair_style.do_colouration)
|
||||
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
|
||||
|
||||
hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY)
|
||||
//Having it this way preserves animations. Useful for IPC screens.
|
||||
@@ -470,15 +470,15 @@ var/global/list/damage_icon_parts = list()
|
||||
//base icons
|
||||
var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s")
|
||||
|
||||
if(f_style)
|
||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
|
||||
if(head_organ.f_style)
|
||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
|
||||
if(facial_hair_style && facial_hair_style.species_allowed)
|
||||
if((src.species.name in facial_hair_style.species_allowed) || (src.species.flags & ALL_RPARTS))
|
||||
if((head_organ.species.name in facial_hair_style.species_allowed) || (head_organ.species.flags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
|
||||
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
|
||||
if(src.get_species() == "Slime People") // I am el worstos
|
||||
if(head_organ.species.name == "Slime People") // I am el worstos
|
||||
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
|
||||
else if(facial_hair_style.do_colouration)
|
||||
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
|
||||
face_standing.Blend(facial_s, ICON_OVERLAY)
|
||||
else
|
||||
//warning("Invalid f_style for [species.name]: [f_style]")
|
||||
@@ -574,6 +574,8 @@ var/global/list/damage_icon_parts = list()
|
||||
UpdateDamageIcon()
|
||||
update_icons()
|
||||
update_fire()
|
||||
force_update_limbs()
|
||||
update_tail_layer(0)
|
||||
/* --------------------------------------- */
|
||||
//vvvvvv UPDATE_INV PROCS vvvvvv
|
||||
|
||||
@@ -1265,22 +1267,23 @@ var/global/list/damage_icon_parts = list()
|
||||
//gender no longer matters for the mouth, although there should probably be seperate base head icons.
|
||||
// var/g = "m"
|
||||
// if (gender == FEMALE) g = "f"
|
||||
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
//base icons
|
||||
var/icon/face_lying = new /icon('icons/mob/human_face.dmi',"bald_l")
|
||||
|
||||
if(f_style)
|
||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
|
||||
|
||||
if(H.f_style)
|
||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style]
|
||||
if(facial_hair_style)
|
||||
var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l")
|
||||
facial_l.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
facial_l.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
|
||||
face_lying.Blend(facial_l, ICON_OVERLAY)
|
||||
|
||||
if(h_style)
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
|
||||
if(H.h_style)
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style]
|
||||
if(hair_style)
|
||||
var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l")
|
||||
hair_l.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
hair_l.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD)
|
||||
face_lying.Blend(hair_l, ICON_OVERLAY)
|
||||
|
||||
//Eyes
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
act = lowertext(act)
|
||||
switch(act) //Alphabetical please
|
||||
if ("me")
|
||||
if(silent)
|
||||
|
||||
@@ -148,6 +148,7 @@
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets)
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
var/obj/item/organ/external/head/head_organ = target.get_organ("head")
|
||||
if(ticker.mode.greyshirts.len >= 3)
|
||||
to_chat(usr, "<span class='warning'>You have already recruited the maximum number of henchmen.</span>")
|
||||
if(!in_range(usr, target))
|
||||
@@ -210,8 +211,8 @@
|
||||
to_chat(target, "<span class='deadsay'>You may not harm other Greyshirt or [usr]. However, you do not need to obey other Greyshirts.</span>")
|
||||
ticker.mode.greyshirts += target.mind
|
||||
target.set_species("Human")
|
||||
target.h_style = "Bald"
|
||||
target.f_style = "Shaved"
|
||||
head_organ.h_style = "Bald"
|
||||
head_organ.f_style = "Shaved"
|
||||
target.s_tone = 35
|
||||
target.r_eyes = 1
|
||||
target.b_eyes = 1
|
||||
|
||||
@@ -320,7 +320,6 @@
|
||||
|
||||
/mob/living/proc/revive()
|
||||
rejuvenate()
|
||||
buckled = initial(src.buckled)
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
|
||||
@@ -348,6 +347,8 @@
|
||||
timeofdeath = 0
|
||||
|
||||
/mob/living/proc/rejuvenate()
|
||||
var/mob/living/carbon/human/human_mob = null //Get this declared for use later.
|
||||
|
||||
// shut down various types of badness
|
||||
setToxLoss(0)
|
||||
setOxyLoss(0)
|
||||
@@ -366,6 +367,7 @@
|
||||
drowsyness = 0
|
||||
radiation = 0
|
||||
druggy = 0
|
||||
hallucination = 0
|
||||
nutrition = 400
|
||||
bodytemperature = 310
|
||||
sdisabilities = 0
|
||||
@@ -380,7 +382,13 @@
|
||||
fire_stacks = 0
|
||||
on_fire = 0
|
||||
suiciding = 0
|
||||
buckled = initial(src.buckled)
|
||||
if(buckled) //Unbuckle the mob and clear the alerts.
|
||||
buckled.buckled_mob = null
|
||||
buckled = null
|
||||
anchored = initial(src.anchored)
|
||||
update_canmove()
|
||||
clear_alert("buckled")
|
||||
post_buckle_mob(src)
|
||||
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
@@ -392,12 +400,13 @@
|
||||
|
||||
// restore all of the human's blood and reset their shock stage
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/human_mob = src
|
||||
human_mob = src
|
||||
human_mob.restore_blood()
|
||||
human_mob.shock_stage = 0
|
||||
human_mob.decaylevel = 0
|
||||
|
||||
restore_all_organs()
|
||||
surgeries.Cut() //End all surgeries.
|
||||
if(stat == DEAD)
|
||||
dead_mob_list -= src
|
||||
living_mob_list += src
|
||||
@@ -406,6 +415,9 @@
|
||||
stat = CONSCIOUS
|
||||
update_fire()
|
||||
regenerate_icons()
|
||||
if(human_mob)
|
||||
human_mob.update_eyes()
|
||||
human_mob.update_dna()
|
||||
return
|
||||
|
||||
/mob/living/proc/UpdateDamageIcon()
|
||||
@@ -580,12 +592,19 @@
|
||||
return
|
||||
|
||||
/mob/living/proc/resist_buckle()
|
||||
spawn(0)
|
||||
resist_muzzle()
|
||||
buckled.user_unbuckle_mob(src,src)
|
||||
|
||||
/mob/living/proc/resist_muzzle()
|
||||
return
|
||||
|
||||
/mob/living/proc/resist_fire()
|
||||
return
|
||||
|
||||
/mob/living/proc/resist_restraints()
|
||||
spawn(0)
|
||||
resist_muzzle()
|
||||
return
|
||||
|
||||
/*//////////////////////
|
||||
@@ -835,4 +854,4 @@
|
||||
if(slowed)
|
||||
tally += 10
|
||||
|
||||
return tally
|
||||
return tally
|
||||
|
||||
@@ -166,8 +166,13 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
verb = say_quote(message, speaking)
|
||||
|
||||
if(is_muzzled())
|
||||
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
|
||||
return
|
||||
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
|
||||
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
|
||||
return
|
||||
else
|
||||
message = muffledspeech(message)
|
||||
verb = "mumbles"
|
||||
|
||||
message = trim_left(message)
|
||||
|
||||
@@ -356,7 +361,10 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
return
|
||||
|
||||
if(is_muzzled())
|
||||
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
|
||||
if(istype(wear_mask, /obj/item/clothing/mask/muzzle/tapegag)) //just for tape
|
||||
to_chat(src, "<span class='danger'>Your mouth is taped and you cannot speak!</span>")
|
||||
else
|
||||
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
|
||||
return
|
||||
|
||||
var/message_range = 1
|
||||
|
||||
@@ -307,7 +307,7 @@ var/list/ai_verbs_default = list(
|
||||
//if(icon_state == initial(icon_state))
|
||||
var/icontype = ""
|
||||
if (custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available
|
||||
else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President")
|
||||
else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT")
|
||||
switch(icontype)
|
||||
if("Custom") icon_state = "[src.ckey]-ai"
|
||||
if("Clown") icon_state = "ai-clown2"
|
||||
@@ -329,6 +329,7 @@ var/list/ai_verbs_default = list(
|
||||
if("Sparkles") icon_state = "ai-sparkles"
|
||||
if("ANIMA") icon_state = "ai-anima"
|
||||
if("President") icon_state = "ai-president"
|
||||
if("NT") icon_state = "ai-nt"
|
||||
else icon_state = "ai"
|
||||
//else
|
||||
// to_chat(usr, "You can only change your display once!")
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
if(c.can_use())
|
||||
cameras += c
|
||||
|
||||
for(var/turf/t in block(locate(x, y, z), locate(min(x + CHUNK_SIZE - 1, world.maxx), min(y + CHUNK_SIZE - 1, world.maxy), z)))
|
||||
for(var/turf/t in block(locate(max(x, 1), max(y, 1), max(z, 1)), locate(min(x + CHUNK_SIZE - 1, world.maxx), min(y + CHUNK_SIZE - 1, world.maxy), z)))
|
||||
turfs[t] = t
|
||||
|
||||
for(var/camera in cameras)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
//Cooldown-inducing emotes
|
||||
if("scream", "screams")
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
/mob/living/silicon/pai/death(gibbed)
|
||||
if(stat == DEAD) return
|
||||
if(canmove || resting)
|
||||
var/turf/T = get_turf_or_move(loc)
|
||||
for (var/mob/M in viewers(T))
|
||||
M.show_message("\red [src] emits a dull beep before it loses power and collapses.", 3, "\red You hear a dull beep followed by the sound of glass crunching.", 2)
|
||||
name = "pAI debris"
|
||||
desc = "The unfortunate remains of some poor personal AI device."
|
||||
icon_state = "[chassis]_dead"
|
||||
else
|
||||
card.overlays.Cut()
|
||||
card.overlays += "pai-off"
|
||||
if(stat == DEAD)
|
||||
return
|
||||
|
||||
force_fold_out()
|
||||
|
||||
var/turf/T = get_turf_or_move(loc)
|
||||
for (var/mob/M in viewers(T))
|
||||
M.show_message("\red [src] emits a dull beep before it loses power and collapses.", 3, "\red You hear a dull beep followed by the sound of glass crunching.", 2)
|
||||
name = "pAI debris"
|
||||
desc = "The unfortunate remains of some poor personal AI device."
|
||||
icon_state = "[chassis]_dead"
|
||||
stat = DEAD
|
||||
canmove = 0
|
||||
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
|
||||
@@ -340,35 +340,37 @@
|
||||
if(stat || sleeping || paralysis || weakened)
|
||||
return
|
||||
|
||||
if(src.loc != card)
|
||||
to_chat(src, "\red You are already in your mobile form!")
|
||||
if(loc != card)
|
||||
to_chat(src, "<span class=warning>You are already in your mobile form!</span>")
|
||||
return
|
||||
|
||||
if(world.time <= last_special)
|
||||
to_chat(src, "\red You must wait before folding your chassis out again!")
|
||||
to_chat(src, "<span class=warning>You must wait before folding your chassis out again!</span>")
|
||||
return
|
||||
|
||||
last_special = world.time + 200
|
||||
|
||||
//I'm not sure how much of this is necessary, but I would rather avoid issues.
|
||||
if(istype(card.loc,/mob))
|
||||
force_fold_out()
|
||||
|
||||
visible_message("<span class=notice>[src] folds outwards, expanding into a mobile form.</span>", "<span class=notice>You fold outwards, expanding into a mobile form.</span>")
|
||||
|
||||
/mob/living/silicon/pai/proc/force_fold_out()
|
||||
if(istype(card.loc, /mob))
|
||||
var/mob/holder = card.loc
|
||||
holder.unEquip(card)
|
||||
else if(istype(card.loc,/obj/item/device/pda))
|
||||
else if(istype(card.loc, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/holder = card.loc
|
||||
holder.pai = null
|
||||
|
||||
|
||||
src.client.perspective = EYE_PERSPECTIVE
|
||||
src.client.eye = src
|
||||
src.forceMove(get_turf(card))
|
||||
if(client)
|
||||
client.perspective = EYE_PERSPECTIVE
|
||||
client.eye = src
|
||||
forceMove(get_turf(card))
|
||||
|
||||
card.forceMove(src)
|
||||
card.screen_loc = null
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(istype(T)) T.visible_message("<b>[src]</b> folds outwards, expanding into a mobile form.")
|
||||
|
||||
/mob/living/silicon/pai/verb/fold_up()
|
||||
set category = "pAI Commands"
|
||||
set name = "Collapse Chassis"
|
||||
@@ -376,12 +378,12 @@
|
||||
if(stat || sleeping || paralysis || weakened)
|
||||
return
|
||||
|
||||
if(src.loc == card)
|
||||
to_chat(src, "\red You are already in your card form!")
|
||||
if(loc == card)
|
||||
to_chat(src, "<span class=warning>You are already in your card form!</span>")
|
||||
return
|
||||
|
||||
if(world.time <= last_special)
|
||||
to_chat(src, "\red You must wait before returning to your card form!")
|
||||
to_chat(src, "<span class=warning>You must wait before returning to your card form!</span>")
|
||||
return
|
||||
|
||||
close_up()
|
||||
@@ -474,16 +476,15 @@
|
||||
|
||||
last_special = world.time + 200
|
||||
resting = 0
|
||||
if(src.loc == card)
|
||||
if(loc == card)
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(istype(T)) T.visible_message("<b>[src]</b> neatly folds inwards, compacting down to a rectangular card.")
|
||||
visible_message("<span class=notice>[src] neatly folds inwards, compacting down to a rectangular card.</span>", "<span class=notice>You neatly fold inwards, compacting down to a rectangular card.</span>")
|
||||
|
||||
src.stop_pulling()
|
||||
if(src.client)
|
||||
src.client.perspective = EYE_PERSPECTIVE
|
||||
src.client.eye = card
|
||||
stop_pulling()
|
||||
if(client)
|
||||
client.perspective = EYE_PERSPECTIVE
|
||||
client.eye = card
|
||||
|
||||
// If we are being held, handle removing our holder from their inv.
|
||||
var/obj/item/weapon/holder/H = loc
|
||||
@@ -492,13 +493,13 @@
|
||||
if(istype(M))
|
||||
M.unEquip(H)
|
||||
H.loc = get_turf(src)
|
||||
src.loc = get_turf(H)
|
||||
loc = get_turf(H)
|
||||
|
||||
// Move us into the card and move the card to the ground
|
||||
//This seems redundant but not including the forced loc setting messes the behavior up.
|
||||
src.loc = card
|
||||
loc = card
|
||||
card.loc = get_turf(card)
|
||||
src.forceMove(card)
|
||||
forceMove(card)
|
||||
card.forceMove(card.loc)
|
||||
icon_state = "[chassis]"
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
//Cooldown-inducing emotes
|
||||
if("law","flip","flips","halt") //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT.
|
||||
|
||||
@@ -355,4 +355,7 @@
|
||||
|
||||
/mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/noise)
|
||||
if(affect_silicon)
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/is_mechanical()
|
||||
return 1
|
||||
@@ -216,17 +216,10 @@
|
||||
else
|
||||
to_chat(user, "[src] is in pristine condition.")
|
||||
|
||||
/mob/living/simple_animal/bot/adjustBruteLoss(amount)
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/bot/adjustHealth(amount)
|
||||
if(amount > 0 && prob(10))
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
|
||||
/mob/living/simple_animal/bot/adjustFireLoss(amount)
|
||||
. = ..()
|
||||
|
||||
if(amount > 0 && prob(5))
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
return ..(amount)
|
||||
|
||||
/mob/living/simple_animal/bot/updatehealth()
|
||||
..()
|
||||
@@ -346,9 +339,7 @@
|
||||
return
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
if(WT.remove_fuel(0, user))
|
||||
adjustBruteLoss(-10)
|
||||
adjustFireLoss(-10)
|
||||
updatehealth()
|
||||
adjustHealth(-10)
|
||||
add_fingerprint(user)
|
||||
user.visible_message("[user] repairs [src]!","<span class='notice'>You repair [src].</span>")
|
||||
else
|
||||
@@ -1019,4 +1010,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
if(260 to 300)
|
||||
throw_alert("temp", /obj/screen/alert/cold/robot, 1)
|
||||
else
|
||||
throw_alert("temp", /obj/screen/alert/cold/robot, 2)
|
||||
throw_alert("temp", /obj/screen/alert/cold/robot, 2)
|
||||
|
||||
/mob/living/simple_animal/bot/is_mechanical()
|
||||
return 1
|
||||
@@ -11,6 +11,7 @@
|
||||
//Emote Cooldown System (it's so simple!)
|
||||
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
//Cooldown-inducing emotes
|
||||
if("scream", "screams")
|
||||
|
||||
@@ -492,7 +492,7 @@
|
||||
if(reagent_id == "internal_beaker")
|
||||
if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
|
||||
var/fraction = min(injection_amount/reagent_glass.reagents.total_volume, 1)
|
||||
reagent_glass.reagents.reaction(patient, 2, fraction)
|
||||
reagent_glass.reagents.reaction(patient, INGEST, fraction)
|
||||
reagent_glass.reagents.trans_to(patient, injection_amount) //Inject from beaker instead.
|
||||
else
|
||||
patient.reagents.add_reagent(reagent_id,injection_amount)
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
flying = 1
|
||||
universal_speak = 1
|
||||
var/list/construct_spells = list()
|
||||
loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm)
|
||||
|
||||
/mob/living/simple_animal/construct/New()
|
||||
..()
|
||||
@@ -31,7 +32,6 @@
|
||||
|
||||
/mob/living/simple_animal/construct/death()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm (src.loc)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.blinded )))
|
||||
M.show_message("\red [src] collapses in a shattered heap. ")
|
||||
|
||||
@@ -603,6 +603,7 @@
|
||||
var/emagged = 0
|
||||
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)
|
||||
minbodytemp = 0
|
||||
loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
|
||||
|
||||
/mob/living/simple_animal/pet/corgi/Ian/borgi/emag_act(user as mob)
|
||||
if(!emagged)
|
||||
@@ -651,7 +652,6 @@
|
||||
/mob/living/simple_animal/pet/corgi/Ian/borgi/death()
|
||||
..()
|
||||
visible_message("<b>[src]</b> blows apart!")
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
@@ -250,18 +250,19 @@
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/diona/emote(var/act, var/m_type=1, var/message = null)
|
||||
if(stat)
|
||||
if(stat)
|
||||
return
|
||||
|
||||
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
if("chirp")
|
||||
on_CD = handle_emote_CD()
|
||||
on_CD = handle_emote_CD()
|
||||
else
|
||||
on_CD = 0
|
||||
on_CD = 0
|
||||
|
||||
if(on_CD == 1)
|
||||
return
|
||||
return
|
||||
|
||||
switch(act) //IMPORTANT: Emotes MUST NOT CONFLICT anywhere along the chain.
|
||||
if("chirp")
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
attacktext = "kicks"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
health = 40
|
||||
maxHealth = 40
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 2
|
||||
stop_automated_movement_when_pulled = 1
|
||||
@@ -109,6 +110,7 @@
|
||||
attacktext = "kicks"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
var/milk_content = 0
|
||||
can_collar = 1
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
@@ -172,7 +174,8 @@
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 1
|
||||
health = 3
|
||||
maxHealth = 3
|
||||
ventcrawler = 2
|
||||
var/amount_grown = 0
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
@@ -216,6 +219,7 @@ var/global/chicken_count = 0
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 10
|
||||
maxHealth = 10
|
||||
var/eggsleft = 0
|
||||
var/chicken_color
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
@@ -299,6 +303,7 @@ var/global/chicken_count = 0
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
can_collar = 1
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
|
||||
@@ -321,6 +326,7 @@ var/global/chicken_count = 0
|
||||
response_harm = "kicks the"
|
||||
attacktext = "pecks"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
can_collar = 1
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
|
||||
@@ -343,6 +349,7 @@ var/global/chicken_count = 0
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
can_collar = 1
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
|
||||
@@ -365,6 +372,7 @@ var/global/chicken_count = 0
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
can_collar = 1
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
|
||||
@@ -387,5 +395,6 @@ var/global/chicken_count = 0
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
can_collar = 1
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
icon_living = "aliend_running"
|
||||
icon_dead = "aliend_l"
|
||||
health = 60
|
||||
maxHealth = 60
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
var/plant_cooldown = 30
|
||||
@@ -59,6 +60,7 @@
|
||||
icon_living = "aliens_running"
|
||||
icon_dead = "aliens_l"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
ranged = 1
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
minbodytemp = 0
|
||||
speak_emote = list("states")
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
|
||||
loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/range
|
||||
name = "Hivebot"
|
||||
@@ -41,12 +42,12 @@
|
||||
name = "Strong Hivebot"
|
||||
desc = "A robot, this one is armed and looks tough!"
|
||||
health = 80
|
||||
maxHealth = 80
|
||||
ranged = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/death()
|
||||
..()
|
||||
visible_message("<b>[src]</b> blows apart!")
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
/mob/living/simple_animal/hostile/proc/Goto(var/target, var/delay, var/minimum_distance)
|
||||
walk_to(src, target, minimum_distance, delay)
|
||||
|
||||
/mob/living/simple_animal/hostile/adjustBruteLoss(var/damage)
|
||||
/mob/living/simple_animal/hostile/adjustHealth(damage)
|
||||
..(damage)
|
||||
if(!stat && search_objects < 3)//Not unconscious, and we don't ignore mobs
|
||||
if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
visible_message("<b>[src]</b> starts to move!")
|
||||
attempt_open = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/crate/adjustBruteLoss(var/damage)
|
||||
/mob/living/simple_animal/hostile/mimic/crate/adjustHealth(damage)
|
||||
trigger()
|
||||
..(damage)
|
||||
|
||||
|
||||
@@ -73,6 +73,8 @@
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 2
|
||||
turns_per_move = 5
|
||||
loot = list(/obj/item/weapon/ore/diamond{layer = 4.1},
|
||||
/obj/item/weapon/ore/diamond{layer = 4.1})
|
||||
|
||||
/obj/item/projectile/temp/basilisk
|
||||
name = "freezing blast"
|
||||
@@ -100,14 +102,6 @@
|
||||
if(3.0)
|
||||
adjustBruteLoss(110)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/death()
|
||||
if(stat != DEAD)
|
||||
var/counter
|
||||
for(counter=0, counter<2, counter++)
|
||||
var/obj/item/weapon/ore/diamond/D = new /obj/item/weapon/ore/diamond(src.loc)
|
||||
D.layer = 4.1
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub
|
||||
name = "goldgrub"
|
||||
desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name."
|
||||
@@ -204,7 +198,7 @@
|
||||
Reward()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(var/damage)
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(damage)
|
||||
idle_vision_range = 9
|
||||
..()
|
||||
|
||||
@@ -239,6 +233,7 @@
|
||||
retreat_distance = 3
|
||||
minimum_distance = 3
|
||||
pass_flags = PASSTABLE
|
||||
loot = list(/obj/item/organ/internal/hivelord_core)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(var/the_target)
|
||||
var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood(src.loc)
|
||||
@@ -250,11 +245,6 @@
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
|
||||
OpenFire()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/death()
|
||||
if(stat != DEAD)
|
||||
new /obj/item/organ/internal/hivelord_core(src.loc)
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/hivelord_core
|
||||
name = "hivelord remains"
|
||||
desc = "All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly. Try not to think about what you're eating."
|
||||
@@ -370,6 +360,7 @@
|
||||
idle_vision_range = 5
|
||||
anchored = 1 //Stays anchored until death as to be unpullable
|
||||
var/pre_attack = 0
|
||||
loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1})
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/process_ai()
|
||||
..()
|
||||
@@ -386,13 +377,6 @@
|
||||
anchored = 1
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/death()
|
||||
anchored = 0
|
||||
if(stat != DEAD)
|
||||
var/obj/item/asteroid/goliath_hide/G = new /obj/item/asteroid/goliath_hide(src.loc)
|
||||
G.layer = 4.1
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
|
||||
var/tturf = get_turf(target)
|
||||
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
|
||||
@@ -403,7 +387,7 @@
|
||||
pre_attack = 0
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/adjustBruteLoss(var/damage)
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage)
|
||||
ranged_cooldown--
|
||||
handle_preattack()
|
||||
..()
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
health = maxHealth
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/mushroom/adjustBruteLoss(var/damage)//Possibility to flee from a fight just to make it more visually interesting
|
||||
/mob/living/simple_animal/hostile/mushroom/adjustHealth(damage)//Possibility to flee from a fight just to make it more visually interesting
|
||||
if(!retreat_distance && prob(33))
|
||||
retreat_distance = 5
|
||||
spawn(30)
|
||||
|
||||
@@ -22,9 +22,8 @@
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 15
|
||||
speak_emote = list("yarrs")
|
||||
var/corpse = /obj/effect/landmark/mobcorpse/pirate
|
||||
var/weapon1 = /obj/item/weapon/melee/energy/sword/pirate
|
||||
|
||||
loot = list(/obj/effect/landmark/mobcorpse/pirate,
|
||||
/obj/item/weapon/melee/energy/sword/pirate)
|
||||
faction = list("pirate")
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/ranged
|
||||
@@ -38,16 +37,12 @@
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectiletype = /obj/item/projectile/beam
|
||||
corpse = /obj/effect/landmark/mobcorpse/pirate/ranged
|
||||
weapon1 = /obj/item/weapon/gun/energy/laser
|
||||
loot = list(/obj/effect/landmark/mobcorpse/pirate/ranged,
|
||||
/obj/item/weapon/gun/energy/laser)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/death()
|
||||
..()
|
||||
if(corpse)
|
||||
new corpse (src.loc)
|
||||
if(weapon1)
|
||||
new weapon1 (src.loc)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
@@ -150,8 +150,8 @@
|
||||
walk(src,0)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone/death()
|
||||
src.visible_message("\blue \icon[src] [src] suddenly breaks apart.")
|
||||
..()
|
||||
visible_message("\blue \icon[src] [src] suddenly breaks apart.")
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //Seriously, what the actual hell.
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
H.enemies |= enemies
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(var/damage)
|
||||
/mob/living/simple_animal/hostile/retaliate/adjustHealth(damage)
|
||||
..(damage)
|
||||
Retaliate()
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
minbodytemp = 0
|
||||
|
||||
faction = list("undead") // did I mention ghost
|
||||
loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(var/check_drift = 0)
|
||||
return 1
|
||||
@@ -61,7 +62,7 @@
|
||||
invisibility = pick(0,60,60,invisibility)
|
||||
..()
|
||||
/mob/living/simple_animal/hostile/retaliate/ghost/death()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(loc)
|
||||
..()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -90,9 +91,10 @@
|
||||
minbodytemp = 0
|
||||
|
||||
faction = list("undead")
|
||||
loot = list(/obj/effect/decal/remains/human)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/skeleton/death()
|
||||
new /obj/effect/decal/remains/human(loc)
|
||||
..()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -121,8 +123,9 @@
|
||||
minbodytemp = 0
|
||||
|
||||
faction = list("undead")
|
||||
loot = list(/obj/effect/decal/cleanable/blood/gibs)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/zombie/death()
|
||||
new /obj/effect/decal/cleanable/blood/gibs(loc)
|
||||
..()
|
||||
qdel(src)
|
||||
return
|
||||
@@ -19,35 +19,30 @@
|
||||
attacktext = "punches"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
a_intent = I_HARM
|
||||
var/corpse = /obj/effect/landmark/mobcorpse/russian
|
||||
var/weapon1 = /obj/item/weapon/kitchen/knife
|
||||
unsuitable_atmos_damage = 15
|
||||
faction = list("russian")
|
||||
status_flags = CANPUSH
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian,
|
||||
/obj/item/weapon/kitchen/knife)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged
|
||||
icon_state = "russianranged"
|
||||
icon_living = "russianranged"
|
||||
corpse = /obj/effect/landmark/mobcorpse/russian/ranged
|
||||
weapon1 = /obj/item/weapon/gun/projectile/revolver/mateba
|
||||
ranged = 1
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectiletype = /obj/item/projectile/bullet
|
||||
projectilesound = 'sound/weapons/Gunshot.ogg'
|
||||
casingtype = /obj/item/ammo_casing/a357
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian/ranged, /obj/item/weapon/gun/projectile/revolver/mateba)
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged/New()
|
||||
if(prob(50) && ispath(weapon1,/obj/item/weapon/gun/projectile/revolver/mateba)) //to preserve varedits
|
||||
weapon1 = /obj/item/weapon/gun/projectile/shotgun/boltaction
|
||||
casingtype = /obj/item/ammo_casing/a762
|
||||
/mob/living/simple_animal/hostile/russian/ranged/mosin
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian/ranged,
|
||||
/obj/item/weapon/gun/projectile/shotgun/boltaction)
|
||||
casingtype = /obj/item/ammo_casing/a762
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/death()
|
||||
..()
|
||||
if(corpse)
|
||||
new corpse (src.loc)
|
||||
if(weapon1)
|
||||
new weapon1 (src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -19,22 +19,14 @@
|
||||
attacktext = "punches"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
a_intent = I_HARM
|
||||
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
|
||||
var/weapon1
|
||||
var/weapon2
|
||||
unsuitable_atmos_damage = 15
|
||||
faction = list("syndicate")
|
||||
check_friendly_fire = 1
|
||||
status_flags = CANPUSH
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/death()
|
||||
..()
|
||||
if(corpse)
|
||||
new corpse (src.loc)
|
||||
if(weapon1)
|
||||
new weapon1 (src.loc)
|
||||
if(weapon2)
|
||||
new weapon2 (src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -45,11 +37,10 @@
|
||||
melee_damage_upper = 25
|
||||
icon_state = "syndicatemelee"
|
||||
icon_living = "syndicatemelee"
|
||||
weapon1 = /obj/item/weapon/melee/energy/sword/saber/red
|
||||
weapon2 = /obj/item/weapon/shield/energy
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
status_flags = 0
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier, /obj/item/weapon/melee/energy/sword/saber/red, /obj/item/weapon/shield/energy)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
|
||||
if(O.force)
|
||||
@@ -71,7 +62,7 @@
|
||||
if(!Proj) return
|
||||
if(prob(65))
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
src.health -= Proj.damage
|
||||
adjustHealth(Proj.damage)
|
||||
else
|
||||
visible_message("\red <B>[src] blocks [Proj] with its shield!</B>")
|
||||
return 0
|
||||
@@ -83,8 +74,8 @@
|
||||
icon_state = "syndicatemeleespace"
|
||||
icon_living = "syndicatemeleespace"
|
||||
name = "Syndicate Commando"
|
||||
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
|
||||
speed = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando, /obj/item/weapon/melee/energy/sword/saber/red, /obj/item/weapon/shield/energy)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(var/movement_dir = 0)
|
||||
return
|
||||
@@ -99,8 +90,7 @@
|
||||
casingtype = /obj/item/ammo_casing/c45
|
||||
projectilesound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
projectiletype = /obj/item/projectile/bullet/midbullet2
|
||||
|
||||
weapon1 = /obj/item/weapon/gun/projectile/automatic/c20r
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier, /obj/item/weapon/gun/projectile/automatic/c20r)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space
|
||||
icon_state = "syndicaterangedpsace"
|
||||
@@ -108,8 +98,9 @@
|
||||
name = "Syndicate Commando"
|
||||
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)
|
||||
minbodytemp = 0
|
||||
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
|
||||
speed = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando, /obj/item/weapon/gun/projectile/automatic/c20r)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/movement_dir = 0)
|
||||
return
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
minbodytemp = 0
|
||||
|
||||
faction = list("hostile", "winter")
|
||||
loot = list(/obj/item/stack/sheet/wood)
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/FindTarget()
|
||||
@@ -46,5 +47,4 @@
|
||||
/mob/living/simple_animal/hostile/tree/death()
|
||||
..()
|
||||
visible_message("\red <b>[src]</b> is hacked into pieces!")
|
||||
new /obj/item/stack/sheet/wood(loc)
|
||||
qdel(src)
|
||||
@@ -20,15 +20,12 @@
|
||||
melee_damage_lower = 3
|
||||
melee_damage_upper = 7
|
||||
|
||||
var/weapon1
|
||||
|
||||
/mob/living/simple_animal/hostile/winter/snowman
|
||||
name = "snowman"
|
||||
desc = "A very angry snowman. Doesn't look like it wants to play around..."
|
||||
icon_state = "snowman"
|
||||
icon_living = "snowman"
|
||||
icon_dead = "snowman-dead"
|
||||
weapon1 = /obj/item/weapon/melee/candy_sword
|
||||
|
||||
bodytemperature = 73.0 //it's made of snow and hatred, so it's pretty cold.
|
||||
maxbodytemp = 280.15 //at roughly 7 C, these will start melting (dying) from the warmth. Mind over matter or something.
|
||||
@@ -37,10 +34,10 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/winter/snowman/death()
|
||||
if(weapon1 && prob(50)) //50% chance to drop weapon on death, if it has one to drop
|
||||
new weapon1(get_turf(src))
|
||||
if(prob(50)) //50% chance to drop weapon on death, if it has one to drop
|
||||
loot = list(/obj/item/weapon/melee/candy_sword)
|
||||
if(prob(20)) //chance to become a stationary snowman structure instead of a corpse
|
||||
new /obj/structure/snowman(get_turf(src))
|
||||
loot.Add(/obj/structure/snowman)
|
||||
visible_message("<span class='notice'>The [src.name] shimmers as its animating magic fades away!</span>")
|
||||
..() //this is just to make sure it gets properly killed before we qdel it
|
||||
qdel(src)
|
||||
@@ -52,7 +49,6 @@
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectiletype = /obj/item/projectile/snowball
|
||||
weapon1 = null
|
||||
|
||||
/mob/living/simple_animal/hostile/winter/reindeer
|
||||
name = "reindeer"
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
status_flags = 0
|
||||
faction = list("cult")
|
||||
status_flags = CANPUSH
|
||||
loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm)
|
||||
|
||||
|
||||
death()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm (src.loc)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.blinded )))
|
||||
M.show_message("\red [src] lets out a contented sigh as their form unwinds. ")
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
|
||||
var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
|
||||
var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions
|
||||
var/list/loot = list() //list of things spawned at mob's loc when it dies
|
||||
|
||||
|
||||
/mob/living/simple_animal/New()
|
||||
@@ -269,8 +270,9 @@
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/emote(var/act, var/m_type=1, var/message = null)
|
||||
if(stat) return
|
||||
|
||||
if(stat)
|
||||
return
|
||||
act = lowertext(act)
|
||||
switch(act) //IMPORTANT: Emotes MUST NOT CONFLICT anywhere along the chain.
|
||||
if("scream")
|
||||
message = "<B>\The [src]</B> whimpers."
|
||||
@@ -404,22 +406,18 @@
|
||||
if(health < maxHealth)
|
||||
if(MED.amount >= 1)
|
||||
if(MED.heal_brute >= 1)
|
||||
adjustBruteLoss(-MED.heal_brute)
|
||||
MED.amount -= 1
|
||||
if(MED.amount <= 0)
|
||||
qdel(MED)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\blue [user] applies [MED] on [src]")
|
||||
heal_organ_damage((MED.heal_brute * 1.66), (MED.heal_burn * 1.66))
|
||||
MED.use(1)
|
||||
visible_message("<span class='notice'>[user] applies [MED] on [src]</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "\blue [MED] won't help at all.")
|
||||
to_chat(user, "<span class='notice'>[MED] won't help at all.</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "\blue [src] is at full health.")
|
||||
to_chat(user, "<span class='notice'>[src] is at full health.</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "\blue [src] is dead, medical items won't bring it back to life.")
|
||||
to_chat(user, "<span class='notice'>[src] is dead, medical items won't bring it back to life.</span>")
|
||||
return
|
||||
else if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar))
|
||||
var/obj/item/clothing/accessory/petcollar/C = O
|
||||
@@ -470,6 +468,9 @@
|
||||
stat(null, "Health: [round((health / maxHealth) * 100)]%")
|
||||
|
||||
/mob/living/simple_animal/death(gibbed)
|
||||
if(loot.len)
|
||||
for(var/i in loot)
|
||||
new i(loc)
|
||||
health = 0
|
||||
icon_state = icon_dead
|
||||
stat = DEAD
|
||||
@@ -492,25 +493,31 @@
|
||||
if(3.0)
|
||||
adjustBruteLoss(30)
|
||||
|
||||
/mob/living/simple_animal/proc/adjustHealth(amount)
|
||||
if(status_flags & GODMODE)
|
||||
return 0
|
||||
bruteloss = Clamp(bruteloss + amount, 0, maxHealth)
|
||||
handle_regular_status_updates()
|
||||
|
||||
/mob/living/simple_animal/adjustBruteLoss(amount)
|
||||
if(damage_coeff[BRUTE])
|
||||
return ..(amount * damage_coeff[BRUTE])
|
||||
adjustHealth(amount * damage_coeff[BRUTE])
|
||||
|
||||
/mob/living/simple_animal/adjustFireLoss(amount)
|
||||
if(damage_coeff[BURN])
|
||||
return ..(amount * damage_coeff[BURN])
|
||||
adjustHealth(amount * damage_coeff[BURN])
|
||||
|
||||
/mob/living/simple_animal/adjustOxyLoss(amount)
|
||||
if(damage_coeff[OXY])
|
||||
return ..(amount * damage_coeff[OXY])
|
||||
adjustHealth(amount * damage_coeff[OXY])
|
||||
|
||||
/mob/living/simple_animal/adjustToxLoss(amount)
|
||||
if(damage_coeff[TOX])
|
||||
return ..(amount * damage_coeff[TOX])
|
||||
adjustHealth(amount * damage_coeff[TOX])
|
||||
|
||||
/mob/living/simple_animal/adjustCloneLoss(amount)
|
||||
if(damage_coeff[CLONE])
|
||||
return ..(amount * damage_coeff[CLONE])
|
||||
adjustHealth(amount * damage_coeff[CLONE])
|
||||
|
||||
/mob/living/simple_animal/adjustStaminaLoss(amount)
|
||||
if(damage_coeff[STAMINA])
|
||||
@@ -665,7 +672,7 @@
|
||||
if(!can_collar || collar)
|
||||
return
|
||||
var/obj/item/clothing/accessory/petcollar/C = usr.get_active_hand()
|
||||
if(!C)
|
||||
if(!istype(C))
|
||||
usr.visible_message("[usr] rubs [src]'s neck.","<span class='notice'>You rub [src]'s neck for a moment.</span>")
|
||||
return
|
||||
usr.drop_item()
|
||||
|
||||
+1
-16
@@ -903,13 +903,8 @@ var/list/slot_equipment_priority = list( \
|
||||
/mob/proc/can_use_hands()
|
||||
return
|
||||
|
||||
/mob/proc/is_active()
|
||||
return (0 >= usr.stat)
|
||||
|
||||
/mob/proc/is_mechanical()
|
||||
if(mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI"))
|
||||
return 1
|
||||
return istype(src, /mob/living/silicon) || get_species() == "Machine"
|
||||
return mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI")
|
||||
|
||||
/mob/proc/is_ready()
|
||||
return client && !!mind
|
||||
@@ -936,19 +931,9 @@ var/list/slot_equipment_priority = list( \
|
||||
/mob/proc/get_gender()
|
||||
return gender
|
||||
|
||||
/mob/proc/see(message)
|
||||
if(!is_active())
|
||||
return 0
|
||||
to_chat(src, message)
|
||||
return 1
|
||||
|
||||
/mob/proc/is_muzzled()
|
||||
return 0
|
||||
|
||||
/mob/proc/show_viewers(message)
|
||||
for(var/mob/M in viewers())
|
||||
M.see(message)
|
||||
|
||||
/mob/Stat()
|
||||
..()
|
||||
|
||||
|
||||
+19
-181
@@ -1,10 +1,3 @@
|
||||
|
||||
// fun if you want to typecast humans/monkeys/etc without writing long path-filled lines.
|
||||
/proc/ishuman(A)
|
||||
if(istype(A, /mob/living/carbon/human))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/issmall(A)
|
||||
if(A && istype(A, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = A
|
||||
@@ -12,56 +5,6 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isbrain(A)
|
||||
if(A && istype(A, /mob/living/carbon/brain))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isalien(A)
|
||||
if(istype(A, /mob/living/carbon/alien))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isalienadult(A)
|
||||
if(istype(A, /mob/living/carbon/alien/humanoid))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/islarva(A)
|
||||
if(istype(A, /mob/living/carbon/alien/larva))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/isfacehugger(A)
|
||||
if(istype(A, /obj/item/clothing/mask/facehugger))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/isembryo(A)
|
||||
if(istype(A, /obj/item/organ/internal/body_egg/alien_embryo))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isslime(A)
|
||||
if(istype(A, /mob/living/carbon/slime))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isrobot(A)
|
||||
if(istype(A, /mob/living/silicon/robot))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isanimal(A)
|
||||
if(istype(A, /mob/living/simple_animal))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/iscorgi(A)
|
||||
if(istype(A, /mob/living/simple_animal/pet/corgi))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/ispet(A)
|
||||
if(istype(A, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/SA = A
|
||||
@@ -69,46 +12,6 @@ proc/isembryo(A)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/iscrab(A)
|
||||
if(istype(A, /mob/living/simple_animal/crab))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/iscat(A)
|
||||
if(istype(A, /mob/living/simple_animal/pet/cat))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/ismouse(A)
|
||||
if(istype(A, /mob/living/simple_animal/mouse))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isbear(A)
|
||||
if(istype(A, /mob/living/simple_animal/hostile/bear))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/iscarp(A)
|
||||
if(istype(A, /mob/living/simple_animal/hostile/carp))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isbot(A)
|
||||
if(istype(A, /mob/living/simple_animal/bot))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isclown(A)
|
||||
if(istype(A, /mob/living/simple_animal/hostile/retaliate/clown))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isAI(A)
|
||||
if(istype(A, /mob/living/silicon/ai))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/proc/isSynthetic()
|
||||
return 0
|
||||
|
||||
@@ -119,76 +22,6 @@ proc/isembryo(A)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/proc/isAIEye(A)
|
||||
if(istype(A, /mob/camera/aiEye))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/ispAI(A)
|
||||
if(istype(A, /mob/living/silicon/pai))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/iscarbon(A)
|
||||
if(istype(A, /mob/living/carbon))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/issilicon(A)
|
||||
if(istype(A, /mob/living/silicon))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isSilicon(A) // Bay support
|
||||
if(istype(A, /mob/living/silicon))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isliving(A)
|
||||
if(istype(A, /mob/living))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isswarmer(A)
|
||||
if(istype(A, /mob/living/simple_animal/hostile/swarmer))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isguardian(A)
|
||||
if(istype(A, /mob/living/simple_animal/hostile/guardian))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isobserver(A)
|
||||
if(istype(A, /mob/dead/observer))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isSpirit(A)
|
||||
if(istype(A, /mob/spirit))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/isovermind(A)
|
||||
if(istype(A, /mob/camera/blob))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/ismask(A)
|
||||
if(istype(A, /mob/spirit/mask))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isAutoAnnouncer(A)
|
||||
if(istype(A, /mob/living/automatedannouncer))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isorgan(A)
|
||||
if(istype(A, /obj/item/organ/external))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isloyal(A) //Checks to see if the person contains a loyalty implant, then checks that the implant is actually inside of them
|
||||
for(var/obj/item/weapon/implant/loyalty/L in A)
|
||||
if(L && L.implanted)
|
||||
@@ -220,14 +53,6 @@ proc/isNonCrewAntag(A)
|
||||
|
||||
return 1
|
||||
|
||||
proc/isnewplayer(A)
|
||||
if(istype(A, /mob/new_player))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/hasorgans(A)
|
||||
return ishuman(A)
|
||||
|
||||
proc/iscuffed(A)
|
||||
if(istype(A, /mob/living/carbon))
|
||||
var/mob/living/carbon/C = A
|
||||
@@ -255,10 +80,6 @@ proc/getsensorlevel(A)
|
||||
return U.sensor_mode
|
||||
return SUIT_SENSOR_OFF
|
||||
|
||||
/proc/is_admin(var/mob/user)
|
||||
return check_rights(R_ADMIN, 0, user) != 0
|
||||
|
||||
|
||||
/proc/check_zone(zone)
|
||||
if(!zone) return "chest"
|
||||
switch(zone)
|
||||
@@ -412,6 +233,24 @@ proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 fo
|
||||
|
||||
return returntext
|
||||
|
||||
proc/muffledspeech(phrase)
|
||||
phrase = html_decode(phrase)
|
||||
var/leng=lentext(phrase)
|
||||
var/counter=lentext(phrase)
|
||||
var/newphrase=""
|
||||
var/newletter=""
|
||||
while(counter>=1)
|
||||
newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2)
|
||||
if(newletter in list(" ", "!", "?", ".", ","))
|
||||
//do nothing
|
||||
else if(lowertext(newletter) in list("a", "e", "i", "o", "u", "y"))
|
||||
newletter = "ph"
|
||||
else
|
||||
newletter = "m"
|
||||
newphrase+="[newletter]"
|
||||
counter-=1
|
||||
return newphrase
|
||||
|
||||
|
||||
/proc/shake_camera(mob/M, duration, strength=1)
|
||||
if(!M || !M.client || M.shakecamera)
|
||||
@@ -537,8 +376,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
|
||||
return P
|
||||
|
||||
/proc/get_both_hands(mob/living/carbon/M)
|
||||
var/list/hands = list(M.l_hand, M.r_hand)
|
||||
return hands
|
||||
return list(M.l_hand, M.r_hand)
|
||||
|
||||
|
||||
//Direct dead say used both by emote and say
|
||||
|
||||
@@ -88,13 +88,17 @@
|
||||
stat("Time To Start:", "DELAYED")
|
||||
|
||||
if(ticker.current_state == GAME_STATE_PREGAME)
|
||||
stat("Players: [totalPlayers]", "Players Ready: [totalPlayersReady]")
|
||||
stat("Players:", "[totalPlayers]")
|
||||
if(client.holder)
|
||||
stat("Players Ready:", "[totalPlayersReady]")
|
||||
totalPlayers = 0
|
||||
totalPlayersReady = 0
|
||||
for(var/mob/new_player/player in player_list)
|
||||
stat("[player.key]", (player.ready)?("(Playing)"):(null))
|
||||
if(client.holder)
|
||||
stat("[player.key]", (player.ready)?("(Playing)"):(null))
|
||||
totalPlayers++
|
||||
if(player.ready)totalPlayersReady++
|
||||
if(player.ready)
|
||||
totalPlayersReady++
|
||||
|
||||
/mob/new_player/Topic(href, href_list[])
|
||||
if(!client) return 0
|
||||
|
||||
@@ -886,12 +886,12 @@
|
||||
species_allowed = list("Vox")
|
||||
|
||||
vox_quills_fluff
|
||||
name = "Fluffy Quills"
|
||||
name = "Fluffy Vox Quills"
|
||||
icon_state = "vox_afro"
|
||||
species_allowed = list("Vox")
|
||||
|
||||
vox_quills_mohawk
|
||||
name = "Quill Mohawk"
|
||||
name = "Vox Quill Mohawk"
|
||||
icon_state = "vox_mohawk"
|
||||
species_allowed = list("Vox")
|
||||
|
||||
@@ -910,6 +910,11 @@
|
||||
icon_state = "vox_nights"
|
||||
species_allowed = list("Vox")
|
||||
|
||||
vox_razor
|
||||
name = "Vox Razorback"
|
||||
icon_state = "vox_razor"
|
||||
species_allowed = list("Vox")
|
||||
|
||||
// Apollo-specific
|
||||
|
||||
//Wryn antennae
|
||||
@@ -1893,22 +1898,22 @@
|
||||
icon_state = "markings_tiger"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tigerhead
|
||||
name = "Tiger Body + Head"
|
||||
name = "Tiger Body and Head"
|
||||
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
|
||||
icon_state = "markings_tigerhead"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tigerheadface_taj
|
||||
name = "Tajaran Tiger Body + Head + Face"
|
||||
name = "Tajaran Tiger Body, Head and Face"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_tigerheadface_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tigerheadface_vulp
|
||||
name = "Vulpkanin Tiger Body + Head + Face"
|
||||
name = "Vulpkanin Tiger Body, Head and Face"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_tigerheadface_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tigerheadface_una
|
||||
name = "Unathi Tiger Body + Head + Face"
|
||||
name = "Unathi Tiger Body, Head and Face"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_tigerheadface_una"
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ mob/spirit
|
||||
var/follow_target = null
|
||||
|
||||
|
||||
mob/spirit/is_active()
|
||||
mob/spirit/proc/is_active()
|
||||
if (client && client.inactivity <= 10 * 60 * 10)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -319,6 +319,35 @@
|
||||
|
||||
qdel(src)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/paize(var/name)
|
||||
if(notransform)
|
||||
return
|
||||
for(var/obj/item/W in src)
|
||||
unEquip(W)
|
||||
regenerate_icons()
|
||||
notransform = 1
|
||||
canmove = 0
|
||||
icon = null
|
||||
invisibility = 101
|
||||
for(var/t in organs) //this really should not be necessary
|
||||
qdel(t)
|
||||
|
||||
var/obj/item/device/paicard/card = new(loc)
|
||||
var/mob/living/silicon/pai/pai = new(card)
|
||||
pai.key = key
|
||||
card.setPersonality(pai)
|
||||
|
||||
pai.name = name
|
||||
pai.real_name = name
|
||||
card.name = name
|
||||
|
||||
to_chat(pai, "<B>You have become a pAI! Your name is [pai.name].</B>")
|
||||
pai.update_pipe_vision()
|
||||
spawn(0)//To prevent the proc from returning null.
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/mob/proc/safe_respawn(var/MP)
|
||||
if(!MP)
|
||||
return 0
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
name = "Appearance Editor"
|
||||
var/flags = APPEARANCE_ALL_HAIR
|
||||
var/mob/living/carbon/human/owner = null
|
||||
var/obj/item/organ/external/head/head_organ = null
|
||||
var/list/valid_species = list()
|
||||
var/list/valid_hairstyles = list()
|
||||
var/list/valid_facial_hairstyles = list()
|
||||
var/list/valid_head_accessories = list()
|
||||
var/list/valid_marking_styles = list()
|
||||
var/list/valid_body_accessories = list()
|
||||
|
||||
var/check_whitelist
|
||||
var/list/whitelist
|
||||
@@ -13,6 +17,7 @@
|
||||
/datum/nano_module/appearance_changer/New(var/location, var/mob/living/carbon/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list())
|
||||
..()
|
||||
owner = H
|
||||
head_organ = owner.get_organ("head")
|
||||
src.check_whitelist = check_species_whitelist
|
||||
src.whitelist = species_whitelist
|
||||
src.blacklist = species_blacklist
|
||||
@@ -54,7 +59,7 @@
|
||||
return 1
|
||||
if(href_list["hair_color"])
|
||||
if(can_change(APPEARANCE_HAIR_COLOR))
|
||||
var/new_hair = input("Please select hair color.", "Hair Color", rgb(owner.r_hair, owner.g_hair, owner.b_hair)) as color|null
|
||||
var/new_hair = input("Please select hair color.", "Hair Color", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as color|null
|
||||
if(new_hair && can_still_topic(state))
|
||||
var/r_hair = hex2num(copytext(new_hair, 2, 4))
|
||||
var/g_hair = hex2num(copytext(new_hair, 4, 6))
|
||||
@@ -69,7 +74,7 @@
|
||||
return 1
|
||||
if(href_list["facial_hair_color"])
|
||||
if(can_change(APPEARANCE_FACIAL_HAIR_COLOR))
|
||||
var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(owner.r_facial, owner.g_facial, owner.b_facial)) as color|null
|
||||
var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as color|null
|
||||
if(new_facial && can_still_topic(state))
|
||||
var/r_facial = hex2num(copytext(new_facial, 2, 4))
|
||||
var/g_facial = hex2num(copytext(new_facial, 4, 6))
|
||||
@@ -87,6 +92,41 @@
|
||||
if(owner.change_eye_color(r_eyes, g_eyes, b_eyes))
|
||||
update_dna()
|
||||
return 1
|
||||
if(href_list["head_accessory"])
|
||||
if(can_change_head_accessory() && (href_list["head_accessory"] in valid_head_accessories))
|
||||
if(owner.change_head_accessory(href_list["head_accessory"]))
|
||||
update_dna()
|
||||
return 1
|
||||
if(href_list["head_accessory_color"])
|
||||
if(can_change_head_accessory())
|
||||
var/new_head_accessory = input("Please select head accessory color.", "Head Accessory Color", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as color|null
|
||||
if(new_head_accessory && can_still_topic(state))
|
||||
var/r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
|
||||
var/g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
|
||||
var/b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
|
||||
if(owner.change_head_accessory_color(r_headacc, g_headacc, b_headacc))
|
||||
update_dna()
|
||||
return 1
|
||||
if(href_list["marking"])
|
||||
if(can_change_markings() && (href_list["marking"] in valid_marking_styles))
|
||||
if(owner.change_markings(href_list["marking"]))
|
||||
update_dna()
|
||||
return 1
|
||||
if(href_list["marking_color"])
|
||||
if(can_change_markings())
|
||||
var/new_markings = input("Please select marking color.", "Marking Color", rgb(owner.r_markings, owner.g_markings, owner.b_markings)) as color|null
|
||||
if(new_markings && can_still_topic(state))
|
||||
var/r_markings = hex2num(copytext(new_markings, 2, 4))
|
||||
var/g_markings = hex2num(copytext(new_markings, 4, 6))
|
||||
var/b_markings = hex2num(copytext(new_markings, 6, 8))
|
||||
if(owner.change_marking_color(r_markings, g_markings, b_markings))
|
||||
update_dna()
|
||||
return 1
|
||||
if(href_list["body_accessory"])
|
||||
if(can_change_body_accessory() && (href_list["body_accessory"] in valid_body_accessories))
|
||||
if(owner.change_body_accessory(href_list["body_accessory"]))
|
||||
update_dna()
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
@@ -107,13 +147,21 @@
|
||||
data["change_skin_tone"] = can_change_skin_tone()
|
||||
data["change_skin_color"] = can_change_skin_color()
|
||||
data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR)
|
||||
data["change_head_accessory"] = can_change_head_accessory()
|
||||
if(data["change_head_accessory"])
|
||||
var/head_accessory_styles[0]
|
||||
for(var/head_accessory_style in valid_head_accessories)
|
||||
head_accessory_styles[++head_accessory_styles.len] = list("headaccessorystyle" = head_accessory_style)
|
||||
data["head_accessory_styles"] = head_accessory_styles
|
||||
data["head_accessory_style"] = head_organ.ha_style
|
||||
|
||||
data["change_hair"] = can_change(APPEARANCE_HAIR)
|
||||
if(data["change_hair"])
|
||||
var/hair_styles[0]
|
||||
for(var/hair_style in valid_hairstyles)
|
||||
hair_styles[++hair_styles.len] = list("hairstyle" = hair_style)
|
||||
data["hair_styles"] = hair_styles
|
||||
data["hair_style"] = owner.h_style
|
||||
data["hair_style"] = head_organ.h_style
|
||||
|
||||
data["change_facial_hair"] = can_change(APPEARANCE_FACIAL_HAIR)
|
||||
if(data["change_facial_hair"])
|
||||
@@ -121,10 +169,31 @@
|
||||
for(var/facial_hair_style in valid_facial_hairstyles)
|
||||
facial_hair_styles[++facial_hair_styles.len] = list("facialhairstyle" = facial_hair_style)
|
||||
data["facial_hair_styles"] = facial_hair_styles
|
||||
data["facial_hair_style"] = owner.f_style
|
||||
data["facial_hair_style"] = head_organ.f_style
|
||||
|
||||
data["change_markings"] = can_change_markings()
|
||||
if(data["change_markings"])
|
||||
var/marking_styles[0]
|
||||
for(var/marking_style in valid_marking_styles)
|
||||
marking_styles[++marking_styles.len] = list("markingstyle" = marking_style)
|
||||
data["marking_styles"] = marking_styles
|
||||
data["marking_style"] = owner.m_style
|
||||
|
||||
data["change_body_accessory"] = can_change_body_accessory()
|
||||
if(data["change_body_accessory"])
|
||||
var/body_accessory_styles[0]
|
||||
for(var/body_accessory_style in valid_body_accessories)
|
||||
body_accessory_styles[++body_accessory_styles.len] = list("bodyaccessorystyle" = body_accessory_style)
|
||||
data["body_accessory_styles"] = body_accessory_styles
|
||||
var/datum/body_accessory/BA
|
||||
if(owner.body_accessory)
|
||||
BA = owner.body_accessory.name
|
||||
data["body_accessory_style"] = BA
|
||||
|
||||
data["change_head_accessory_color"] = can_change_head_accessory()
|
||||
data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR)
|
||||
data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR)
|
||||
data["change_marking_color"] = can_change_markings()
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state)
|
||||
@@ -145,10 +214,22 @@
|
||||
/datum/nano_module/appearance_changer/proc/can_change_skin_color()
|
||||
return owner && (flags & APPEARANCE_SKIN) && (owner.species.bodyflags & HAS_SKIN_COLOR)
|
||||
|
||||
/datum/nano_module/appearance_changer/proc/can_change_head_accessory()
|
||||
return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
|
||||
|
||||
/datum/nano_module/appearance_changer/proc/can_change_markings()
|
||||
return owner && (flags & APPEARANCE_MARKINGS) && (owner.species.bodyflags & HAS_MARKINGS)
|
||||
|
||||
/datum/nano_module/appearance_changer/proc/can_change_body_accessory()
|
||||
return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL)
|
||||
|
||||
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()
|
||||
// Making the assumption that the available species remain constant
|
||||
valid_hairstyles.Cut()
|
||||
valid_facial_hairstyles.Cut()
|
||||
valid_facial_hairstyles.Cut()
|
||||
valid_head_accessories.Cut()
|
||||
valid_marking_styles.Cut()
|
||||
valid_body_accessories.Cut()
|
||||
generate_data()
|
||||
|
||||
/datum/nano_module/appearance_changer/proc/generate_data()
|
||||
@@ -158,4 +239,10 @@
|
||||
valid_species = owner.generate_valid_species(check_whitelist, whitelist, blacklist)
|
||||
if(!valid_hairstyles.len || !valid_facial_hairstyles.len)
|
||||
valid_hairstyles = owner.generate_valid_hairstyles()
|
||||
valid_facial_hairstyles = owner.generate_valid_facial_hairstyles()
|
||||
valid_facial_hairstyles = owner.generate_valid_facial_hairstyles()
|
||||
if(!valid_head_accessories.len)
|
||||
valid_head_accessories = owner.generate_valid_head_accessories()
|
||||
if(!valid_marking_styles.len)
|
||||
valid_marking_styles = owner.generate_valid_markings()
|
||||
if(!valid_body_accessories.len)
|
||||
valid_body_accessories = owner.generate_valid_body_accessories()
|
||||
|
||||
@@ -226,45 +226,18 @@
|
||||
|
||||
/obj/machinery/photocopier/proc/copyass()
|
||||
var/icon/temp_img
|
||||
if(check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on.
|
||||
if(ishuman(ass)) //Suit checks are in check_ass
|
||||
var/mob/living/carbon/human/H = ass
|
||||
switch(H.get_species())
|
||||
if("Human")
|
||||
temp_img = icon('icons/obj/butts.dmi', "human")
|
||||
if("Tajaran")
|
||||
temp_img = icon('icons/obj/butts.dmi', "tajaran")
|
||||
if("Unathi")
|
||||
temp_img = icon('icons/obj/butts.dmi', "unathi")
|
||||
if("Skrell")
|
||||
temp_img = icon('icons/obj/butts.dmi', "skrell")
|
||||
if("Vox")
|
||||
temp_img = icon('icons/obj/butts.dmi', "vox")
|
||||
if("Kidan")
|
||||
temp_img = icon('icons/obj/butts.dmi', "kidan")
|
||||
if("Grey")
|
||||
temp_img = icon('icons/obj/butts.dmi', "grey")
|
||||
if("Diona")
|
||||
temp_img = icon('icons/obj/butts.dmi', "diona")
|
||||
if("Slime People")
|
||||
temp_img = icon('icons/obj/butts.dmi', "slime")
|
||||
if("Vulpkanin")
|
||||
temp_img = icon('icons/obj/butts.dmi', "vulp")
|
||||
if("Machine")
|
||||
temp_img = icon('icons/obj/butts.dmi', "machine")
|
||||
if("Plasmaman")
|
||||
temp_img = icon('icons/obj/butts.dmi', "plasma")
|
||||
if("Drask")
|
||||
temp_img = icon('icons/obj/butts.dmi', "drask")
|
||||
else
|
||||
temp_img = icon('icons/obj/butts.dmi', "human")
|
||||
else if(istype(ass,/mob/living/silicon/robot/drone))
|
||||
temp_img = icon('icons/obj/butts.dmi', "drone")
|
||||
else if(istype(ass,/mob/living/simple_animal/diona))
|
||||
temp_img = icon('icons/obj/butts.dmi', "nymph")
|
||||
else if(isalien(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro.
|
||||
temp_img = icon('icons/obj/butts.dmi', "xeno")
|
||||
else return
|
||||
if(!check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on.
|
||||
return
|
||||
|
||||
if(ishuman(ass)) //Suit checks are in check_ass
|
||||
var/mob/living/carbon/human/H = ass
|
||||
temp_img = icon('icons/obj/butts.dmi', H.species.butt_sprite)
|
||||
else if(istype(ass,/mob/living/silicon/robot/drone))
|
||||
temp_img = icon('icons/obj/butts.dmi', "drone")
|
||||
else if(istype(ass,/mob/living/simple_animal/diona))
|
||||
temp_img = icon('icons/obj/butts.dmi', "nymph")
|
||||
else if(isalien(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro.
|
||||
temp_img = icon('icons/obj/butts.dmi', "xeno")
|
||||
else
|
||||
return
|
||||
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc)
|
||||
|
||||
@@ -25,6 +25,7 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
/obj/structure/cable
|
||||
level = 1
|
||||
anchored =1
|
||||
on_blueprints = TRUE
|
||||
var/datum/powernet/powernet
|
||||
name = "power cable"
|
||||
desc = "A flexible superconducting cable for heavy-duty power transfer"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
var/image/overlay_image
|
||||
|
||||
var/power_multiplier = 1 // This is so admins can tweak how good it is to find a good balance for effort -> power
|
||||
var/powercap = 500000 //Not a hard cap, but outputs above this have a 10% chance to cause the TeG to lose half it's power.
|
||||
|
||||
/obj/machinery/power/generator/New()
|
||||
@@ -81,7 +82,7 @@
|
||||
var/efficiency = 0.65
|
||||
var/energy_transfer = delta_temperature*air2_heat_capacity*air1_heat_capacity/(air2_heat_capacity+air1_heat_capacity)
|
||||
var/heat = energy_transfer*(1-efficiency)
|
||||
lastgen = energy_transfer*efficiency*0.05
|
||||
lastgen = energy_transfer*efficiency*0.05*power_multiplier
|
||||
|
||||
if(air2.temperature > air1.temperature)
|
||||
air2.temperature = air2.temperature - energy_transfer/air2_heat_capacity
|
||||
@@ -97,8 +98,10 @@
|
||||
circ2.air2.merge(air2)
|
||||
|
||||
//Update the gas networks
|
||||
circ1.parent2.update = 1
|
||||
circ2.parent2.update = 1
|
||||
if(circ1.parent2)
|
||||
circ1.parent2.update = 1
|
||||
if(circ2.parent2)
|
||||
circ2.parent2.update = 1
|
||||
|
||||
// update icon overlays and power usage only if displayed level has changed
|
||||
if(lastgen > powercap && prob(10))
|
||||
|
||||
@@ -433,83 +433,59 @@
|
||||
if(status == LIGHT_EMPTY)
|
||||
to_chat(user, "There is no [fitting] in this light.")
|
||||
return
|
||||
if(user.a_intent == "help")
|
||||
if(on)
|
||||
to_chat(user, "This light [fitting] feels hot!")
|
||||
else
|
||||
to_chat(user, "The light [fitting] feels cold.")
|
||||
return
|
||||
|
||||
if(user.a_intent == "disarm" || user.a_intent == "grab") //trying to grab the bulb
|
||||
|
||||
// make it burn hands if not wearing fire-insulated gloves
|
||||
if(on)
|
||||
var/prot = 0
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(on)
|
||||
var/prot = 0
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if(istype(H))
|
||||
if(istype(H))
|
||||
if(H.gloves)
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
if(G.max_heat_protection_temperature)
|
||||
prot = (G.max_heat_protection_temperature > 360)
|
||||
else
|
||||
prot = 1
|
||||
|
||||
if(H.gloves)
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
if(G.max_heat_protection_temperature)
|
||||
prot = (G.max_heat_protection_temperature > 360)
|
||||
else
|
||||
prot = 1
|
||||
|
||||
if(prot > 0 || (RESIST_HEAT in user.mutations))
|
||||
to_chat(user, "You remove the light [fitting]")
|
||||
else if(TK in user.mutations)
|
||||
to_chat(user, "You telekinetically remove the light [fitting].")
|
||||
else
|
||||
if(prot > 0 || (RESIST_HEAT in user.mutations))
|
||||
to_chat(user, "You remove the light [fitting]")
|
||||
else if(TK in user.mutations)
|
||||
to_chat(user, "You telekinetically remove the light [fitting].")
|
||||
else
|
||||
if(user.a_intent == I_DISARM || user.a_intent == I_GRAB)
|
||||
to_chat(user, "You try to remove the light [fitting], but you burn your hand on it!")
|
||||
|
||||
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
|
||||
if(affecting.take_damage( 0, 5 )) // 5 burn damage
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
return // if burned, don't remove the light
|
||||
else
|
||||
to_chat(user, "You remove the light [fitting].")
|
||||
return
|
||||
else
|
||||
to_chat(user, "You try to remove the light [fitting], but it's too hot to touch!")
|
||||
return
|
||||
else
|
||||
to_chat(user, "You remove the light [fitting].")
|
||||
|
||||
|
||||
// create a light tube/bulb item and put it in the user's hand
|
||||
var/obj/item/weapon/light/L = new light_type()
|
||||
L.status = status
|
||||
L.rigged = rigged
|
||||
L.brightness_range = brightness_range
|
||||
L.brightness_power = brightness_power
|
||||
L.brightness_color = brightness_color
|
||||
// create a light tube/bulb item and put it in the user's hand
|
||||
var/obj/item/weapon/light/L = new light_type()
|
||||
L.status = status
|
||||
L.rigged = rigged
|
||||
L.brightness_range = brightness_range
|
||||
L.brightness_power = brightness_power
|
||||
L.brightness_color = brightness_color
|
||||
|
||||
// light item inherits the switchcount, then zero it
|
||||
L.switchcount = switchcount
|
||||
switchcount = 0
|
||||
L.switchcount = switchcount
|
||||
switchcount = 0
|
||||
|
||||
L.update()
|
||||
L.add_fingerprint(user)
|
||||
L.update()
|
||||
L.add_fingerprint(user)
|
||||
|
||||
user.put_in_active_hand(L) //puts it in our active hand
|
||||
|
||||
status = LIGHT_EMPTY
|
||||
update()
|
||||
|
||||
if(user.a_intent == "harm") //hitting the bulb
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
if(prob(10)) //10% chance to break a light with bare hands
|
||||
to_chat(user, "You hit the light, and it smashes!")
|
||||
for(var/mob/M in viewers(src))
|
||||
if(M == user)
|
||||
continue
|
||||
M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2)
|
||||
if(on)
|
||||
electrocute_mob(user, get_area(src), src, 0.3)
|
||||
broken()
|
||||
else
|
||||
user.visible_message("<span class='danger'>[user.name] hits the light.</span>")
|
||||
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
|
||||
return
|
||||
user.put_in_active_hand(L) //puts it in our active hand
|
||||
|
||||
status = LIGHT_EMPTY
|
||||
update()
|
||||
|
||||
// break the light and make sparks if was on
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
name = null
|
||||
icon = 'icons/obj/power.dmi'
|
||||
anchored = 1.0
|
||||
on_blueprints = TRUE
|
||||
var/datum/powernet/powernet = null
|
||||
use_power = 0
|
||||
idle_power_usage = 0
|
||||
|
||||
@@ -134,11 +134,8 @@
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.get_species() == "Golem")
|
||||
to_chat(user, "<span class='danger'>Your metal fingers don't fit in the trigger guard!</span>")
|
||||
return
|
||||
if(H.get_species() == "Shadowling")
|
||||
to_chat(user, "<span class='danger'>The muzzle flash would cause damage to your form!</span>")
|
||||
if(H.species.flags & NOGUNS)
|
||||
to_chat(user, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
|
||||
return
|
||||
if(H.martial_art && H.martial_art.name == "The Sleeping Carp") //great dishonor to famiry
|
||||
to_chat(user, "<span class='danger'>Use of ranged weaponry would bring dishonor to the clan.</span>")
|
||||
|
||||
@@ -387,45 +387,48 @@ var/const/INGEST = 2
|
||||
can_process = 1
|
||||
return can_process
|
||||
|
||||
/datum/reagents/proc/reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0)
|
||||
|
||||
/datum/reagents/proc/reaction(atom/A, method=TOUCH, volume_modifier = 1)
|
||||
switch(method)
|
||||
if(TOUCH)
|
||||
for(var/datum/reagent/R in reagent_list)
|
||||
if(ismob(A))
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
var/check = reaction_check(A, R)
|
||||
if(!check)
|
||||
continue
|
||||
else
|
||||
R.reaction_mob(A, TOUCH, R.volume+volume_modifier)
|
||||
if(!R)
|
||||
return
|
||||
var/check = reaction_check(A, R)
|
||||
if(!check)
|
||||
continue
|
||||
else
|
||||
R.reaction_mob(A, TOUCH, R.volume*volume_modifier)
|
||||
if(isturf(A))
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
else R.reaction_turf(A, R.volume+volume_modifier)
|
||||
if(!R)
|
||||
return
|
||||
else
|
||||
R.reaction_turf(A, R.volume*volume_modifier)
|
||||
if(isobj(A))
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
else R.reaction_obj(A, R.volume+volume_modifier)
|
||||
if(!R)
|
||||
return
|
||||
else
|
||||
R.reaction_obj(A, R.volume*volume_modifier)
|
||||
if(INGEST)
|
||||
for(var/datum/reagent/R in reagent_list)
|
||||
if(ismob(A) && R)
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
var/check = reaction_check(A, R)
|
||||
if(!check)
|
||||
continue
|
||||
else
|
||||
R.reaction_mob(A, INGEST, R.volume+volume_modifier)
|
||||
if(!R)
|
||||
return
|
||||
var/check = reaction_check(A, R)
|
||||
if(!check)
|
||||
continue
|
||||
else
|
||||
R.reaction_mob(A, INGEST, R.volume*volume_modifier)
|
||||
if(isturf(A) && R)
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
else R.reaction_turf(A, R.volume+volume_modifier)
|
||||
if(!R)
|
||||
return
|
||||
else
|
||||
R.reaction_turf(A, R.volume*volume_modifier)
|
||||
if(isobj(A) && R)
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
else R.reaction_obj(A, R.volume+volume_modifier)
|
||||
if(!R)
|
||||
return
|
||||
else
|
||||
R.reaction_obj(A, R.volume*volume_modifier)
|
||||
return
|
||||
|
||||
/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15)
|
||||
|
||||
@@ -242,10 +242,6 @@
|
||||
addiction_chance = 60
|
||||
metabolization_rate = 0.6
|
||||
|
||||
/datum/reagent/methamphetamine/meth2 //for donk pockets
|
||||
id = "methamphetamine2"
|
||||
addiction_chance = 0
|
||||
|
||||
/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(prob(5))
|
||||
@@ -337,9 +333,10 @@
|
||||
var/check = rand(0,100)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(check < 8 && H.h_style != "Very Long Beard")
|
||||
H.h_style = "Very Long Hair"
|
||||
H.f_style = "Very Long Beard"
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
if(check < 8 && head_organ.h_style != "Very Long Beard")
|
||||
head_organ.h_style = "Very Long Hair"
|
||||
head_organ.f_style = "Very Long Beard"
|
||||
H.update_hair()
|
||||
H.update_fhair()
|
||||
H.visible_message("<span class='warning'>[H] has a wild look in their eyes!</span>")
|
||||
|
||||
@@ -646,11 +646,14 @@ datum/reagent/strange_reagent
|
||||
metabolization_rate = 0.2
|
||||
|
||||
datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
|
||||
if(istype(M, /mob/living/simple_animal))
|
||||
if(isanimal(M))
|
||||
if(method == TOUCH)
|
||||
if(M.stat == DEAD)
|
||||
M.revive()
|
||||
M.visible_message("<span class='warning'>[M] seems to rise from the dead!</span>")
|
||||
var/mob/living/simple_animal/SM = M
|
||||
if(SM.stat == DEAD)
|
||||
SM.revive()
|
||||
SM.loot.Cut() //no abusing strange reagent for unlimited farming of resources
|
||||
SM.visible_message("<span class='warning'>[M] seems to rise from the dead!</span>")
|
||||
|
||||
if(istype(M, /mob/living/carbon))
|
||||
if(method == INGEST)
|
||||
if(M.stat == DEAD)
|
||||
|
||||
@@ -198,12 +198,13 @@ datum/reagent/hair_dye
|
||||
datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume)
|
||||
if(M && ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.r_facial = rand(0,255)
|
||||
H.g_facial = rand(0,255)
|
||||
H.b_facial = rand(0,255)
|
||||
H.r_hair = rand(0,255)
|
||||
H.g_hair = rand(0,255)
|
||||
H.b_hair = rand(0,255)
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
head_organ.r_facial = rand(0,255)
|
||||
head_organ.g_facial = rand(0,255)
|
||||
head_organ.b_facial = rand(0,255)
|
||||
head_organ.r_hair = rand(0,255)
|
||||
head_organ.g_hair = rand(0,255)
|
||||
head_organ.b_hair = rand(0,255)
|
||||
H.update_hair()
|
||||
H.update_fhair()
|
||||
..()
|
||||
@@ -228,8 +229,9 @@ datum/reagent/hairgrownium
|
||||
datum/reagent/hairgrownium/reaction_mob(var/mob/living/M, var/volume)
|
||||
if(M && ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.h_style = random_hair_style(H.gender, H.species)
|
||||
H.f_style = random_facial_hair_style(H.gender, H.species)
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
head_organ.h_style = random_hair_style(H.gender, head_organ.species.name)
|
||||
head_organ.f_style = random_facial_hair_style(H.gender, head_organ.species.name)
|
||||
H.update_hair()
|
||||
H.update_fhair()
|
||||
..()
|
||||
@@ -252,12 +254,21 @@ datum/reagent/super_hairgrownium
|
||||
result_amount = 3
|
||||
mix_message = "The liquid becomes amazingly furry and smells peculiar."
|
||||
|
||||
datum/reagent/super_hairgrownium/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
datum/reagent/super_hairgrownium/reaction_mob(var/mob/living/M, var/volume)
|
||||
if(M && ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.h_style = "Very Long Hair"
|
||||
H.f_style = "Very Long Beard"
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
var/datum/sprite_accessory/tmp_hair_style = hair_styles_list["Very Long Hair"]
|
||||
var/datum/sprite_accessory/tmp_facial_hair_style = facial_hair_styles_list["Very Long Beard"]
|
||||
|
||||
if(head_organ.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them.
|
||||
head_organ.h_style = "Very Long Hair"
|
||||
else //Otherwise, give them a random hair style.
|
||||
head_organ.h_style = random_hair_style(H.gender, head_organ.species.name)
|
||||
if(head_organ.species.name in tmp_facial_hair_style.species_allowed) //If 'Very Long Beard' is a style the person's species can have, give it to them.
|
||||
head_organ.f_style = "Very Long Beard"
|
||||
else //Otherwise, give them a random facial hair style.
|
||||
head_organ.f_style = random_facial_hair_style(H.gender, head_organ.species.name)
|
||||
H.update_hair()
|
||||
H.update_fhair()
|
||||
if(!H.wear_mask || H.wear_mask && !istype(H.wear_mask, /obj/item/clothing/mask/fakemoustache))
|
||||
|
||||
@@ -293,7 +293,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
|
||||
required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1)
|
||||
result_amount = 1
|
||||
mix_message = "The mixture quickly turns into a pall of smoke!"
|
||||
var/forbidden_reagents = list("sugar", "phosphorus", "potassium") //Do not transfer this stuff through smoke.
|
||||
var/forbidden_reagents = list("sugar", "phosphorus", "potassium", "stimulants") //Do not transfer this stuff through smoke.
|
||||
|
||||
/datum/chemical_reaction/smoke/on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
for(var/f_reagent in forbidden_reagents)
|
||||
@@ -325,7 +325,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
|
||||
min_temp = 374
|
||||
secondary = 1
|
||||
result_amount = 1
|
||||
forbidden_reagents = list()
|
||||
forbidden_reagents = list("stimulants")
|
||||
mix_sound = null
|
||||
|
||||
/datum/reagent/sonic_powder
|
||||
|
||||
@@ -63,13 +63,11 @@
|
||||
return
|
||||
|
||||
/datum/reagent/proc/on_mob_life(var/mob/living/M as mob, var/alien)
|
||||
if(!istype(M, /mob/living)) // YOU'RE A FUCKING RETARD NEO WHY CAN'T YOU JUST FIX THE PROBLEM ON THE REAGENT - Iamgoofball
|
||||
return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO
|
||||
// Certain elements in too large amounts cause side-effects
|
||||
if(!istype(M))
|
||||
return
|
||||
if(holder)
|
||||
holder.remove_reagent(src.id, metabolization_rate) //By default it slowly disappears.
|
||||
holder.remove_reagent(id, metabolization_rate) //By default it slowly disappears.
|
||||
current_cycle++
|
||||
return
|
||||
|
||||
// Called when two reagents of the same are mixing.
|
||||
/datum/reagent/proc/on_merge(var/data)
|
||||
|
||||
@@ -36,8 +36,7 @@
|
||||
if(ishuman(M) && !M.isSynthetic())
|
||||
var/mob/living/carbon/human/H = M
|
||||
L = H.get_int_organ(/obj/item/organ/internal/liver)
|
||||
if(!L || (istype(L) && L.dna.species in list("Skrell", "Neara")))
|
||||
d*=5
|
||||
d *= L ? L.alcohol_intensity : 5
|
||||
|
||||
M.dizziness += dizzy_adj.
|
||||
if(d >= slur_start && d < pass_out)
|
||||
|
||||
@@ -42,16 +42,6 @@
|
||||
reagent_state = GAS
|
||||
color = "#808080" // rgb: 128, 128, 128
|
||||
|
||||
/datum/reagent/oxygen/on_mob_life(var/mob/living/M as mob, var/alien)
|
||||
if(M.stat == 2) return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
|
||||
M.adjustToxLoss(REAGENTS_METABOLISM)
|
||||
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/datum/reagent/nitrogen
|
||||
name = "Nitrogen"
|
||||
@@ -60,16 +50,6 @@
|
||||
reagent_state = GAS
|
||||
color = "#808080" // rgb: 128, 128, 128
|
||||
|
||||
/datum/reagent/nitrogen/on_mob_life(var/mob/living/M as mob, var/alien)
|
||||
if(M.stat == 2) return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
|
||||
M.adjustOxyLoss(-2*REM)
|
||||
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/datum/reagent/hydrogen
|
||||
name = "Hydrogen"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/obj/item/weapon/reagent_containers/borghypo
|
||||
name = "Cyborg Hypospray"
|
||||
desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment."
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
icon = 'icons/obj/hypo.dmi'
|
||||
item_state = "hypo"
|
||||
icon_state = "borghypo"
|
||||
amount_per_transfer_from_this = 5
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/borghypo/crisis
|
||||
reagent_ids = list("salglu_solution", "epinephrine", "sal_acid")
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/borghypo/syndicate
|
||||
name = "syndicate cyborg hypospray"
|
||||
desc = "An experimental piece of Syndicate technology used to produce powerful restorative nanites used to very quickly restore injuries of all types. Also metabolizes potassium iodide, for radiation poisoning, and morphine, for offense."
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
to_chat(user, "<span class='notice'>You finish eating \the [src].</span>")
|
||||
user.visible_message("<span class='notice'>[user] finishes eating \the [src].</span>")
|
||||
user.unEquip(src) //so icons update :[
|
||||
|
||||
Post_Consume(M)
|
||||
if(trash)
|
||||
if(ispath(trash,/obj/item))
|
||||
var/obj/item/TrashItem = new trash(user)
|
||||
@@ -35,6 +35,9 @@
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/proc/Post_Consume(mob/living/M)
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/attack_self(mob/user as mob)
|
||||
return
|
||||
|
||||
@@ -756,27 +759,32 @@
|
||||
desc = "The food of choice for the seasoned traitor."
|
||||
icon_state = "donkpocket"
|
||||
filling_color = "#DEDEAB"
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("nutriment", 4)
|
||||
reagents.add_reagent("omnizine", 4)
|
||||
|
||||
Post_Consume(mob/living/M)
|
||||
M.reagents.add_reagent("omnizine", 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket
|
||||
name = "Donk-pocket"
|
||||
desc = "This donk-pocket is emitting a small amount of heat."
|
||||
icon_state = "donkpocket"
|
||||
filling_color = "#DEDEAB"
|
||||
volume = 90
|
||||
bitesize = 100 //nom the whole thing at once.
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("omnizine", 15)
|
||||
reagents.add_reagent("teporone", 15)
|
||||
reagents.add_reagent("synaptizine", 15)
|
||||
reagents.add_reagent("salglu_solution", 15)
|
||||
reagents.add_reagent("salbutamol", 15)
|
||||
reagents.add_reagent("methamphetamine2", 15)
|
||||
reagents.add_reagent("nutriment", 1)
|
||||
|
||||
Post_Consume(mob/living/M)
|
||||
M.reagents.add_reagent("omnizine", 15)
|
||||
M.reagents.add_reagent("teporone", 15)
|
||||
M.reagents.add_reagent("synaptizine", 15)
|
||||
M.reagents.add_reagent("salglu_solution", 15)
|
||||
M.reagents.add_reagent("salbutamol", 15)
|
||||
M.reagents.add_reagent("methamphetamine", 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/brainburger
|
||||
name = "brainburger"
|
||||
|
||||
@@ -96,6 +96,34 @@
|
||||
reagents.add_reagent("chocolate",6)
|
||||
bitesize = 3
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/peanut
|
||||
name = "Peanut Fudge"
|
||||
desc = "Chocolate fudge, with bits of peanuts mixed in. People with nut allergies shouldn't eat this."
|
||||
icon_state = "fudge_peanut"
|
||||
filling_color = "#7D5F46"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cherry
|
||||
name = "Chocolate Cherry Fudge"
|
||||
desc = "Chocolate fudge surrounding sweet cherries. Good for tricking kids into eating some fruit."
|
||||
icon_state = "fudge_cherry"
|
||||
filling_color = "#7D5F46"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cookies_n_cream
|
||||
name = "Cookies 'n' Cream Fudge"
|
||||
desc = "An extra creamy fudge with bits of real chocolate cookie mixed in. Crunchy!"
|
||||
icon_state = "fudge_cookies_n_cream"
|
||||
filling_color = "#7D5F46"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cookies_n_cream/New()
|
||||
..()
|
||||
reagents.add_reagent("cream", 3)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge/turtle
|
||||
name = "Turtle Fudge"
|
||||
desc = "Chocolate fudge with caramel and nuts. It doesn't contain real turtles, thankfully."
|
||||
icon_state = "fudge_turtle"
|
||||
filling_color = "#7D5F46"
|
||||
|
||||
// ***********************************************************
|
||||
// Candy Products (Pre-existing)
|
||||
// ***********************************************************
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
/obj/item/weapon/reagent_containers/hypospray
|
||||
name = "hypospray"
|
||||
desc = "The DeForest Medical Corporation hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients."
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
icon = 'icons/obj/hypo.dmi'
|
||||
item_state = "hypo"
|
||||
icon_state = "hypo"
|
||||
amount_per_transfer_from_this = 5
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
name = "Syringe"
|
||||
desc = "A syringe."
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
icon = 'icons/goonstation/objects/syringe.dmi'
|
||||
item_state = "syringe_0"
|
||||
icon_state = "0"
|
||||
amount_per_transfer_from_this = 5
|
||||
@@ -336,7 +336,7 @@
|
||||
/obj/item/weapon/reagent_containers/ld50_syringe
|
||||
name = "Lethal Injection Syringe"
|
||||
desc = "A syringe used for lethal injections."
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
icon = 'icons/goonstation/objects/syringe.dmi'
|
||||
item_state = "syringe_0"
|
||||
icon_state = "0"
|
||||
amount_per_transfer_from_this = 50
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
icon_state = "disposal"
|
||||
anchored = 1
|
||||
density = 1
|
||||
on_blueprints = TRUE
|
||||
var/datum/gas_mixture/air_contents // internal reservoir
|
||||
var/mode = 1 // item mode 0=off 1=charging 2=charged
|
||||
var/flush = 0 // true if flush handle is pulled
|
||||
@@ -656,6 +657,7 @@
|
||||
anchored = 1
|
||||
density = 0
|
||||
|
||||
on_blueprints = TRUE
|
||||
level = 1 // underfloor only
|
||||
var/dpdir = 0 // bitmask of pipe directions
|
||||
dir = 0 // dir will contain dominant direction for junction pipes
|
||||
|
||||
@@ -688,6 +688,14 @@
|
||||
build_path = /obj/item/weapon/hand_labeler
|
||||
category = list("initial", "Electronics")
|
||||
|
||||
/datum/design/floorpainter
|
||||
name = "Floor painter"
|
||||
id = "floor_painter"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 150, MAT_GLASS = 125)
|
||||
build_path = /obj/item/device/floor_painter
|
||||
category = list("initial", "Electronics")
|
||||
|
||||
/datum/design/logic_board
|
||||
name = "Logic Circuit"
|
||||
id = "logic_board"
|
||||
|
||||
@@ -92,6 +92,16 @@
|
||||
build_path = /obj/item/weapon/circuitboard/teleporter_station
|
||||
category = list ("Teleportation Machinery")
|
||||
|
||||
/datum/design/teleport_perma
|
||||
name = "Machine Board (Permanent Teleporter)"
|
||||
desc = "Allows for the construction of circuit boards used to build a Permanent Teleporter."
|
||||
id = "tele_perma"
|
||||
req_tech = list("programming" = 3, "bluespace" = 5, "materials" = 4, "engineering" = 5)
|
||||
build_type = IMPRINTER
|
||||
materials = list(MAT_GLASS = 1000, "sacid" = 20)
|
||||
build_path = /obj/item/weapon/circuitboard/teleporter_perma
|
||||
category = list ("Teleportation Machinery")
|
||||
|
||||
/datum/design/bodyscanner
|
||||
name = "Machine Board (Body Scanner)"
|
||||
desc = "Allows for the construction of circuit boards used to build a Body Scanner."
|
||||
|
||||
@@ -81,9 +81,9 @@ Note: Must be placed west/left of and R&D console to function.
|
||||
var/A = materials.amount(M)
|
||||
if(!A)
|
||||
A = reagents.get_reagent_amount(M)
|
||||
A = A / max(1, (being_built.reagents[M]/efficiency_coeff))
|
||||
A = A / max(1, (being_built.reagents[M]))
|
||||
else
|
||||
A = A / max(1, (being_built.materials[M]/efficiency_coeff))
|
||||
A = A / max(1, (being_built.materials[M]))
|
||||
return A
|
||||
|
||||
/obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user