mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
fixes conflicts
This commit is contained in:
@@ -558,7 +558,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
|
||||
|
||||
@@ -52,7 +52,7 @@ var/list/sounds_cache = list()
|
||||
set desc = "Plays a sound at every intercomm on the station z level. Works best with small sounds."
|
||||
if(!check_rights(R_SOUNDS)) return
|
||||
|
||||
var/A = alert("This will play a sound at every intercomm on the station Z, are you sure you want to continue? This works best with short sounds, beware.","Warning","Yep","Nope")
|
||||
var/A = alert("This will play a sound at every intercomm, are you sure you want to continue? This works best with short sounds, beware.","Warning","Yep","Nope")
|
||||
if(A != "Yep") return
|
||||
|
||||
var/list/sounds = file2list("sound/serversound_list.txt");
|
||||
@@ -67,15 +67,25 @@ var/list/sounds_cache = list()
|
||||
if(inputvol && inputvol >= 1 && inputvol <= 70)
|
||||
cvol = inputvol
|
||||
|
||||
var/list/intercomms = list()
|
||||
//Allows for override to utilize intercomms on all z-levels
|
||||
var/B = alert("Do you want to play through intercomms on ALL Z-levels, or just the station?", "Override", "All", "Station")
|
||||
var/ignore_z = 0
|
||||
if(B == "All")
|
||||
ignore_z = 1
|
||||
|
||||
for(var/obj/item/device/radio/intercom/I in world)
|
||||
if(I.z != ZLEVEL_STATION) continue
|
||||
intercomms += I
|
||||
//Allows for override to utilize incomplete and unpowered intercomms
|
||||
var/C = alert("Do you want to play through unpowered / incomplete intercomms, so the crew can't silence it?", "Override", "Yep", "Nope")
|
||||
var/ignore_power = 0
|
||||
if(C == "Yep")
|
||||
ignore_power = 1
|
||||
|
||||
if(intercomms.len)
|
||||
for(var/obj/item/device/radio/intercom/I in intercomms)
|
||||
playsound(I, melody, cvol)
|
||||
for(var/O in global_intercoms)
|
||||
var/obj/item/device/radio/intercom/I = O
|
||||
if(I.z != ZLEVEL_STATION && !ignore_z)
|
||||
continue
|
||||
if(!I.on && !ignore_power)
|
||||
continue
|
||||
playsound(I, melody, cvol)
|
||||
|
||||
/*
|
||||
/client/proc/cuban_pete()
|
||||
|
||||
@@ -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
|
||||
|
||||
+149
-176
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -31,10 +31,6 @@
|
||||
then click where you want to fire. To recharge this weapon, use a weapon recharger. \
|
||||
To switch between insta-stun and disabler beams, click the weapon in your hand. This weapon can only fire through glass if it is set to disabler beams."
|
||||
|
||||
/obj/item/weapon/gun/energy/stunrevolver
|
||||
description_info = "This is an energy weapon. To fire the weapon, have your gun mode set to 'fire', \
|
||||
then click where you want to fire. To recharge this weapon, use a weapon recharger."
|
||||
|
||||
/obj/item/weapon/gun/energy/nuclear
|
||||
description_info = "This is an energy weapon. To fire the weapon, have your gun mode set to 'fire', \
|
||||
then click where you want to fire. Most energy weapons can fire through windows harmlessly. To switch between stun and lethal, click the weapon \
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee)
|
||||
if(!freebee)
|
||||
bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0)
|
||||
var/mob/living/simple_animal/hostile/poison/bees/B = new(src)
|
||||
var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src)
|
||||
B.beehome = src
|
||||
B.assign_reagent(queen_bee.beegent)
|
||||
bees += B
|
||||
@@ -180,7 +180,7 @@
|
||||
visible_message("<span class='notice'>[user] sets [qb] down inside the apiary, making it their new home.</span>")
|
||||
var/relocated = 0
|
||||
for(var/b in bees)
|
||||
var/mob/living/simple_animal/hostile/poison/bees/B = b
|
||||
var/mob/living/simple_animal/hostile/poison/bees/worker/B = b
|
||||
if(B.reagent_incompatible(queen_bee))
|
||||
bees -= B
|
||||
B.beehome = null
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
seed_name = "ghost pepper"
|
||||
display_name = "ghost pepper plants"
|
||||
mutants = null
|
||||
chems = list("capsaicin" = list(8,2), "condensedcapsaicin" = list(4,4), "plantmatter" = list(1,50))
|
||||
chems = list("capsaicin" = list(8,2), "condensedcapsaicin" = list(4,4), "ghostchilijuice" = list(4,4), "plantmatter" = list(1,50))
|
||||
kitchen_tag = "ghostchili"
|
||||
preset_icon = "ghostchilipepper"
|
||||
|
||||
@@ -513,7 +513,7 @@
|
||||
seed_noun = "spores"
|
||||
display_name = "chanterelle mushrooms"
|
||||
mutants = list("reishi","amanita","plumphelmet")
|
||||
chems = list("plantmatter" = list(1,25), "fungus" = list(1,10))
|
||||
chems = list("plantmatter" = list(1,25))
|
||||
splat_type = /obj/effect/plant
|
||||
kitchen_tag = "mushroom"
|
||||
preset_icon = "chanterelle"
|
||||
@@ -534,6 +534,7 @@
|
||||
seed_name = "brown mold"
|
||||
display_name = "brown mold"
|
||||
mutants = null
|
||||
chems = list("fungus" = list(1,10))
|
||||
|
||||
/datum/seed/mushroom/mold/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()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -9,7 +9,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())
|
||||
|
||||
@@ -9,7 +9,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)
|
||||
|
||||
@@ -12,6 +12,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
|
||||
|
||||
@@ -26,6 +26,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")
|
||||
@@ -33,6 +34,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
|
||||
|
||||
@@ -115,6 +121,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)
|
||||
@@ -337,7 +360,7 @@
|
||||
message = "<B>[src]</B> faints."
|
||||
if(src.sleeping)
|
||||
return //Can't faint while asleep
|
||||
src.sleeping += 10 //Short-short nap
|
||||
src.sleeping += 1
|
||||
m_type = 1
|
||||
|
||||
if ("cough", "coughs")
|
||||
@@ -792,14 +815,9 @@
|
||||
continue
|
||||
// Now, we don't have this:
|
||||
//new /obj/effects/fart_cloud(T,L)
|
||||
// But:
|
||||
// <[REDACTED]> so, what it does is...imagine a 3x3 grid with the person in the center. When someone uses the emote *fart (it's not a spell style ability and has no cooldown), then anyone in the 8 tiles AROUND the person who uses it
|
||||
// <[REDACTED]> gets between 1 and 10 units of jenkem added to them...we obviously don't have Jenkem, but Space Drugs do literally the same exact thing as Jenkem
|
||||
// <[REDACTED]> the user, of course, isn't impacted because it's not an actual smoke cloud
|
||||
// So, let's give 'em space drugs.
|
||||
if (M == src)
|
||||
continue
|
||||
M.reagents.add_reagent("space_drugs",rand(1,10))
|
||||
M.reagents.add_reagent("jenkem", 1)
|
||||
|
||||
if ("help")
|
||||
var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dap(s)(none)/mob," \
|
||||
|
||||
@@ -262,12 +262,13 @@ emp_act
|
||||
if(!stat)
|
||||
switch(hit_area)
|
||||
if("head")//Harder to score a stun but if you do it lasts a bit longer
|
||||
if(stat == CONSCIOUS && prob(I.force) && armor < 50)
|
||||
visible_message("<span class='danger'>[src] has been knocked down!</span>", \
|
||||
"<span class='userdanger'>[src] has been knocked down!</span>")
|
||||
apply_effect(5, WEAKEN, armor)
|
||||
confused += 15
|
||||
if(src != user && I.damtype == BRUTE)
|
||||
if(stat == CONSCIOUS && armor < 50)
|
||||
if(prob(I.force))
|
||||
visible_message("<span class='danger'>[src] has been knocked down!</span>", \
|
||||
"<span class='userdanger'>[src] has been knocked down!</span>")
|
||||
apply_effect(5, WEAKEN, armor)
|
||||
confused += 15
|
||||
if(prob(I.force + ((100 - health)/2)) && src != user && I.damtype == BRUTE)
|
||||
ticker.mode.remove_revolutionary(mind)
|
||||
|
||||
if(bloody)//Apply blood
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
if(embedded_flag)
|
||||
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
|
||||
|
||||
if(slowed)
|
||||
tally += 10
|
||||
|
||||
var/health_deficiency = (maxHealth - health + staminaloss)
|
||||
if(reagents)
|
||||
|
||||
@@ -607,4 +607,4 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
return 0 //Unsupported slot
|
||||
return 0 //Unsupported slot
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
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"
|
||||
@@ -148,7 +148,7 @@
|
||||
|
||||
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"
|
||||
@@ -793,4 +793,4 @@
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
H.h_style = ""
|
||||
spawn(100)
|
||||
if(H) H.update_hair()
|
||||
if(H) H.update_hair()
|
||||
|
||||
@@ -685,7 +685,6 @@ var/global/list/damage_icon_parts = list()
|
||||
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands")
|
||||
bloodsies.color = gloves.blood_color
|
||||
standing.overlays += bloodsies
|
||||
gloves.screen_loc = ui_gloves
|
||||
overlays_standing[GLOVES_LAYER] = standing
|
||||
else
|
||||
if(blood_DNA)
|
||||
|
||||
@@ -8,6 +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))
|
||||
|
||||
act = lowertext(act)
|
||||
switch(act) //Alphabetical please
|
||||
if ("me")
|
||||
if(silent)
|
||||
|
||||
@@ -111,6 +111,7 @@
|
||||
handle_slurring()
|
||||
handle_paralysed()
|
||||
handle_sleeping()
|
||||
handle_slowed()
|
||||
|
||||
|
||||
/mob/living/proc/handle_stunned()
|
||||
@@ -160,7 +161,10 @@
|
||||
clear_alert("asleep")
|
||||
return sleeping
|
||||
|
||||
|
||||
/mob/living/proc/handle_slowed()
|
||||
if(slowed)
|
||||
slowed = max(slowed-1, 0)
|
||||
return slowed
|
||||
|
||||
/mob/living/proc/handle_disabilities()
|
||||
//Eyes
|
||||
|
||||
@@ -333,7 +333,7 @@
|
||||
C.unEquip(C.legcuffed)
|
||||
C.legcuffed = initial(C.legcuffed)
|
||||
C.update_inv_legcuffed()
|
||||
|
||||
|
||||
if(C.reagents)
|
||||
for(var/datum/reagent/R in C.reagents.reagent_list)
|
||||
C.reagents.clear_reagents()
|
||||
@@ -358,12 +358,14 @@
|
||||
SetParalysis(0)
|
||||
SetStunned(0)
|
||||
SetWeakened(0)
|
||||
slowed = 0
|
||||
losebreath = 0
|
||||
dizziness = 0
|
||||
jitteriness = 0
|
||||
confused = 0
|
||||
drowsyness = 0
|
||||
radiation = 0
|
||||
druggy = 0
|
||||
nutrition = 400
|
||||
bodytemperature = 310
|
||||
sdisabilities = 0
|
||||
@@ -578,12 +580,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
|
||||
|
||||
/*//////////////////////
|
||||
@@ -826,3 +835,11 @@
|
||||
butcher_results.Remove(path) //In case you want to have things like simple_animals drop their butcher results on gib, so it won't double up below.
|
||||
visible_message("<span class='notice'>[user] butchers [src].</span>")
|
||||
gib()
|
||||
|
||||
/mob/living/movement_delay()
|
||||
var/tally = 0
|
||||
|
||||
if(slowed)
|
||||
tally += 10
|
||||
|
||||
return tally
|
||||
|
||||
@@ -70,7 +70,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
/mob/living/proc/handle_speech_problems(var/message, var/verb)
|
||||
var/list/returns[3]
|
||||
var/speech_problem_flag = 0
|
||||
|
||||
var/robot = isSynthetic()
|
||||
|
||||
|
||||
if((HULK in mutations) && health >= 25 && length(message))
|
||||
@@ -79,11 +79,17 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
speech_problem_flag = 1
|
||||
|
||||
if(slurring)
|
||||
message = slur(message)
|
||||
if(robot)
|
||||
message = slur(message, list("@", "!", "#", "$", "%", "&", "?"))
|
||||
else
|
||||
message = slur(message)
|
||||
verb = "slurs"
|
||||
speech_problem_flag = 1
|
||||
if(stuttering)
|
||||
message = stutter(message)
|
||||
if(robot)
|
||||
message = robostutter(message)
|
||||
else
|
||||
message = stutter(message)
|
||||
verb = "stammers"
|
||||
speech_problem_flag = 1
|
||||
|
||||
@@ -160,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)
|
||||
|
||||
@@ -351,7 +362,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
|
||||
@@ -451,4 +465,4 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
/mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
var/image/I = image('icons/mob/talk.dmi', bubble_loc, bubble_state, MOB_LAYER + 1)
|
||||
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
|
||||
flick_overlay(I, bubble_recipients, 30)
|
||||
flick_overlay(I, bubble_recipients, 30)
|
||||
|
||||
@@ -9,6 +9,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")
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
|
||||
|
||||
var/data[0]
|
||||
data["manifest"] = list("__json_cache" = ManifestJSON)
|
||||
data["manifest"] = PDA_Manifest
|
||||
|
||||
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
|
||||
if(!ui)
|
||||
|
||||
@@ -9,6 +9,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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -12,6 +12,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")
|
||||
|
||||
@@ -255,6 +255,7 @@
|
||||
..()
|
||||
/*
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
if("chirp")
|
||||
on_CD = handle_emote_CD()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -42,33 +42,23 @@
|
||||
|
||||
var/datum/reagent/beegent = null //hehe, beegent
|
||||
var/obj/structure/beebox/beehome = null
|
||||
var/idle = 0
|
||||
var/isqueen = FALSE
|
||||
var/idle = 0
|
||||
var/icon_base = "bee"
|
||||
var/static/list/bee_icons = list()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0)
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/New()
|
||||
..()
|
||||
generate_bee_visuals()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Destroy()
|
||||
if(beehome)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
beegent = null
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/death(gibbed)
|
||||
if(beehome)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
beegent = null
|
||||
..()
|
||||
ghostize()
|
||||
@@ -77,10 +67,6 @@
|
||||
/mob/living/simple_animal/hostile/poison/bees/examine(mob/user)
|
||||
..()
|
||||
|
||||
if(!beehome)
|
||||
to_chat(user, "<span class='warning'>This bee is homeless!</span>")
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals()
|
||||
overlays.Cut()
|
||||
|
||||
@@ -107,31 +93,87 @@
|
||||
wings = bee_icons["[icon_base]_wings"]
|
||||
overlays += wings
|
||||
|
||||
|
||||
//We don't attack beekeepers/people dressed as bees//Todo: bee costume
|
||||
/mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(ishuman(the_target))
|
||||
var/mob/living/carbon/human/H = the_target
|
||||
return !H.bee_friendly()
|
||||
|
||||
return .
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Found(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
return !L.bee_friendly()
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/AttackingTarget()
|
||||
if(beegent && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(!isnull(target.reagents))
|
||||
beegent.reaction_mob(L, INGEST)
|
||||
L.reagents.add_reagent(beegent.id, rand(1,5))
|
||||
target.attack_animal(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R)
|
||||
if(istype(R))
|
||||
beegent = R
|
||||
name = "[initial(name)] ([R.name])"
|
||||
generate_bee_visuals()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/handle_automated_action()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B)
|
||||
if(!B)
|
||||
return 0
|
||||
if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
|
||||
//Botany Worker Bees
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker
|
||||
//Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/Destroy()
|
||||
if(beehome)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed)
|
||||
if(beehome)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user)
|
||||
..()
|
||||
|
||||
if(!beehome)
|
||||
to_chat(user, "<span class='warning'>This bee is homeless!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A)
|
||||
if(istype(A, /obj/machinery/portable_atmospherics/hydroponics))
|
||||
var/obj/machinery/portable_atmospherics/hydroponics/Hydro = A
|
||||
if(Hydro.seed && !Hydro.dead && !Hydro.recent_bee_visit)
|
||||
wanted_objects |= /obj/machinery/portable_atmospherics/hydroponics //so we only hunt them while they're alive/seeded/not visisted
|
||||
return 1
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/H = A
|
||||
return !H.bee_friendly()
|
||||
return 0
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case
|
||||
var/mob/living/L = the_target
|
||||
return !L.bee_friendly()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/AttackingTarget()
|
||||
//Pollinate
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/AttackingTarget()
|
||||
//Pollinate
|
||||
if(istype(target, /obj/machinery/portable_atmospherics/hydroponics))
|
||||
var/obj/machinery/portable_atmospherics/hydroponics/Hydro = target
|
||||
pollinate(Hydro)
|
||||
@@ -141,22 +183,9 @@
|
||||
target = null
|
||||
wanted_objects.Remove(/obj/structure/beebox) //so we don't attack beeboxes when not going home
|
||||
else
|
||||
if(beegent && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(!isnull(target.reagents))
|
||||
beegent.reaction_mob(L, INGEST)
|
||||
L.reagents.add_reagent(beegent.id, rand(1,5))
|
||||
target.attack_animal(src)
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R)
|
||||
if(istype(R))
|
||||
beegent = R
|
||||
name = "[initial(name)] ([R.name])"
|
||||
generate_bee_visuals()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/portable_atmospherics/hydroponics/Hydro)
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/portable_atmospherics/hydroponics/Hydro)
|
||||
if(!istype(Hydro) || !Hydro.seed || Hydro.dead || Hydro.recent_bee_visit)
|
||||
target = null
|
||||
return
|
||||
@@ -187,12 +216,10 @@
|
||||
if(beehome)
|
||||
beehome.bee_resources = min(beehome.bee_resources + growth, 100)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/handle_automated_action()
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/handle_automated_action()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
if(!isqueen)
|
||||
if(loc == beehome)
|
||||
idle = min(100, ++idle)
|
||||
@@ -212,7 +239,9 @@
|
||||
beehome = BB
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen
|
||||
|
||||
//Botany Queen Bee
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen
|
||||
name = "queen bee"
|
||||
desc = "she's the queen of bees, BZZ BZZ"
|
||||
icon_base = "queen"
|
||||
@@ -223,28 +252,13 @@
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A)
|
||||
return 0
|
||||
|
||||
|
||||
//leave pollination for the peasent bees
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget()
|
||||
if(beegent && isliving(target))
|
||||
var/mob/living/L = target
|
||||
beegent.reaction_mob(L, TOUCH)
|
||||
L.reagents.add_reagent(beegent.id, rand(1,5))
|
||||
target.attack_animal(src)
|
||||
|
||||
|
||||
//PEASENT BEES
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/pollinate()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B)
|
||||
if(!B)
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case
|
||||
var/mob/living/L = the_target
|
||||
return !L.bee_friendly()
|
||||
|
||||
/obj/item/queen_bee
|
||||
name = "queen bee"
|
||||
@@ -254,7 +268,6 @@
|
||||
icon = 'icons/mob/bees.dmi'
|
||||
var/mob/living/simple_animal/hostile/poison/bees/queen/queen
|
||||
|
||||
|
||||
/obj/item/queen_bee/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I,/obj/item/weapon/reagent_containers/syringe))
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = I
|
||||
@@ -280,7 +293,6 @@
|
||||
to_chat(user, "<span class='warning'>You don't have enough units of that chemical to modify the bee's DNA!</span>")
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/queen_bee/bought/New()
|
||||
..()
|
||||
queen = new(src)
|
||||
@@ -288,3 +300,43 @@
|
||||
/obj/item/queen_bee/Destroy()
|
||||
qdel(queen)
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
//Syndicate Bees
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi
|
||||
name = "syndi-bee"
|
||||
desc = "The result of a large influx of BEES!"
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
faction = list("hostile", "syndicate")
|
||||
search_objects = 0 //these bees don't care about trivial things like plants, especially when there is havoc to sow
|
||||
beegent = new /datum/reagent/facid() //prepare to die
|
||||
var/list/master_and_friends = list()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/assign_reagent(datum/reagent/R)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A)
|
||||
return CanAttack(A)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(isliving(the_target))
|
||||
var/mob/living/L = the_target
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H in master_and_friends)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/AttackingTarget()
|
||||
..()
|
||||
if(target && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.stat)
|
||||
LoseTarget()
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -204,7 +204,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
|
||||
..()
|
||||
|
||||
@@ -403,7 +403,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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -71,7 +71,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
|
||||
|
||||
@@ -269,8 +269,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 +405,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
|
||||
@@ -492,25 +489,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])
|
||||
|
||||
@@ -1350,16 +1350,18 @@ mob/proc/yank_out_object()
|
||||
ghost.notify_cloning(message, sound, source)
|
||||
return ghost
|
||||
|
||||
/mob/proc/fakevomit(green=0) //for aesthetic vomits that need to be instant and do not stun. -Fox
|
||||
/mob/proc/fakevomit(green = 0, no_text = 0) //for aesthetic vomits that need to be instant and do not stun. -Fox
|
||||
if(stat==DEAD)
|
||||
return
|
||||
var/turf/location = loc
|
||||
if (istype(location, /turf/simulated))
|
||||
if(green)
|
||||
src.visible_message("<span class='warning'>[src] vomits up some green goo!</span>","<span class='warning'>You vomit up some green goo!</span>")
|
||||
if(!no_text)
|
||||
visible_message("<span class='warning'>[src] vomits up some green goo!</span>","<span class='warning'>You vomit up some green goo!</span>")
|
||||
new /obj/effect/decal/cleanable/vomit/green(location)
|
||||
else
|
||||
src.visible_message("<span class='warning'>[src] pukes all over \himself!</span>","<span class='warning'>You puke all over yourself!</span>")
|
||||
if(!no_text)
|
||||
visible_message("<span class='warning'>[src] pukes all over \himself!</span>","<span class='warning'>You puke all over yourself!</span>")
|
||||
location.add_vomit_floor(src, 1)
|
||||
playsound(location, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
var/paralysis = 0.0
|
||||
var/stunned = 0.0
|
||||
var/weakened = 0.0
|
||||
var/slowed = 0
|
||||
var/losebreath = 0.0//Carbon
|
||||
var/intent = null//Living
|
||||
var/shakecamera = 0
|
||||
|
||||
+48
-185
@@ -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)
|
||||
@@ -323,7 +144,7 @@ proc/getsensorlevel(A)
|
||||
p++
|
||||
return t
|
||||
|
||||
proc/slur(phrase)
|
||||
proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an input if you want to make robots slur with $#@%! characters
|
||||
phrase = html_decode(phrase)
|
||||
var/leng=lentext(phrase)
|
||||
var/counter=lentext(phrase)
|
||||
@@ -339,11 +160,12 @@ proc/slur(phrase)
|
||||
switch(rand(1,15))
|
||||
if(1,3,5,8) newletter="[lowertext(newletter)]"
|
||||
if(2,4,6,15) newletter="[uppertext(newletter)]"
|
||||
if(7) newletter+="'"
|
||||
if(7) newletter+=pick(slurletters)
|
||||
//if(9,10) newletter="<b>[newletter]</b>"
|
||||
//if(11,12) newletter="<big>[newletter]</big>"
|
||||
//if(13) newletter="<small>[newletter]</small>"
|
||||
newphrase+="[newletter]";counter-=1
|
||||
newphrase+="[newletter]"
|
||||
counter-=1
|
||||
return newphrase
|
||||
|
||||
/proc/stutter(n)
|
||||
@@ -369,6 +191,30 @@ proc/slur(phrase)
|
||||
p++//for each letter p is increased to find where the next letter will be.
|
||||
return sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
|
||||
/proc/robostutter(n) //for robutts
|
||||
var/te = html_decode(n)
|
||||
var/t = ""//placed before the message. Not really sure what it's for.
|
||||
n = length(n)//length of the entire word
|
||||
var/p = null
|
||||
p = 1//1 is the start of any word
|
||||
while(p <= n)//while P, which starts at 1 is less or equal to N which is the length.
|
||||
var/robotletter = pick("@", "!", "#", "$", "%", "&", "?") //for beep boop
|
||||
var/n_letter = copytext(te, p, p + 1)//copies text from a certain distance. In this case, only one letter at a time.
|
||||
if (prob(80) && (ckey(n_letter) in list("b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z")))
|
||||
if (prob(10))
|
||||
n_letter = text("[n_letter]-[robotletter]-[n_letter]-[n_letter]")//replaces the current letter with this instead.
|
||||
else
|
||||
if (prob(20))
|
||||
n_letter = text("[n_letter]-[robotletter]-[n_letter]")
|
||||
else
|
||||
if (prob(5))
|
||||
n_letter = robotletter
|
||||
else
|
||||
n_letter = text("[n_letter]-[n_letter]")
|
||||
t = text("[t][n_letter]")//since the above is ran through for each letter, the text just adds up back to the original word.
|
||||
p++//for each letter p is increased to find where the next letter will be.
|
||||
return sanitize(copytext(t,1,MAX_MESSAGE_LEN))
|
||||
|
||||
|
||||
proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added
|
||||
/* Turn text into complete gibberish! */
|
||||
@@ -387,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)
|
||||
@@ -512,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
|
||||
@@ -668,4 +531,4 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
|
||||
if(!newname) //we'll stick with the oldname then
|
||||
return
|
||||
|
||||
rename_character(oldname, newname)
|
||||
rename_character(oldname, newname)
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
|
||||
/datum/data/pda/app/main_menu/update_ui(mob/user as mob, list/data)
|
||||
title = pda.name
|
||||
|
||||
|
||||
data["app"]["is_home"] = 1
|
||||
|
||||
|
||||
data["apps"] = pda.shortcut_cache
|
||||
data["categories"] = pda.shortcut_cat_order
|
||||
data["pai"] = !isnull(pda.pai) // pAI inserted?
|
||||
|
||||
|
||||
var/list/notifying[0]
|
||||
for(var/P in pda.notifying_programs)
|
||||
notifying["\ref[P]"] = 1
|
||||
@@ -72,7 +72,7 @@
|
||||
|
||||
/datum/data/pda/app/manifest/update_ui(mob/user as mob, list/data)
|
||||
data_core.get_manifest_json()
|
||||
data["manifest"] = list("__json_cache" = ManifestJSON)
|
||||
data["manifest"] = PDA_Manifest
|
||||
|
||||
/datum/data/pda/app/manifest/Topic(href, list/href_list)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -56,20 +56,30 @@ obj/item/weapon/gun/energy/laser/retro
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/lasercannon
|
||||
name = "laser cannon"
|
||||
desc = "With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!"
|
||||
name = "accelerator laser cannon"
|
||||
desc = "An advanced laser cannon that does more damage the farther away the target is."
|
||||
icon_state = "lasercannon"
|
||||
item_state = "laser"
|
||||
w_class = 4.0
|
||||
w_class = 4
|
||||
force = 10
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
origin_tech = "combat=4;materials=3;powerstorage=3"
|
||||
projectile_type = "/obj/item/projectile/beam/heavylaser"
|
||||
projectile_type = "/obj/item/projectile/beam/laser/accelerator"
|
||||
|
||||
isHandgun()
|
||||
return 0
|
||||
/obj/item/weapon/gun/energy/lasercannon/isHandgun()
|
||||
return 0
|
||||
|
||||
/obj/item/projectile/beam/laser/accelerator
|
||||
name = "accelerator laser"
|
||||
icon_state = "heavylaser"
|
||||
range = 255
|
||||
damage = 6
|
||||
|
||||
/obj/item/projectile/beam/laser/accelerator/Range()
|
||||
..()
|
||||
damage = min(damage+7, 100)
|
||||
|
||||
/obj/item/weapon/gun/energy/lasercannon/mounted
|
||||
name = "mounted laser cannon"
|
||||
|
||||
@@ -25,16 +25,30 @@
|
||||
self_recharge = 1
|
||||
recharge_time = 10 //Time it takes for shots to recharge (in ticks)
|
||||
|
||||
/obj/item/weapon/gun/energy/stunrevolver
|
||||
name = "stun revolver"
|
||||
desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. Holds twice as much ammo as a standard taser."
|
||||
/obj/item/weapon/gun/energy/shock_revolver
|
||||
name = "tesla revolver"
|
||||
desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
|
||||
icon_state = "stunrevolver"
|
||||
fire_sound = "sound/weapons/gunshot.ogg"
|
||||
projectile_type = "/obj/item/projectile/energy/electrode"
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell"
|
||||
fire_delay = 15
|
||||
item_state = "gun"
|
||||
fire_sound = 'sound/weapons/gunshot.ogg'
|
||||
projectile_type = "/obj/item/projectile/energy/shock_revolver"
|
||||
charge_cost = 2000
|
||||
can_flashlight = 0
|
||||
|
||||
/obj/item/projectile/energy/shock_revolver
|
||||
name = "shock bolt"
|
||||
icon_state = "purple_laser"
|
||||
var/chain
|
||||
|
||||
/obj/item/projectile/energy/shock_revolver/OnFired()
|
||||
spawn(1)
|
||||
chain = Beam(firer, icon_state="purple_lightning", icon = 'icons/effects/effects.dmi',time=1000, maxdistance = 30)
|
||||
|
||||
/obj/item/projectile/energy/shock_revolver/on_hit(atom/target)
|
||||
. = ..()
|
||||
if(isliving(target))
|
||||
tesla_zap(src, 3, 10000)
|
||||
qdel(chain)
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow
|
||||
name = "mini energy-crossbow"
|
||||
|
||||
@@ -50,6 +50,87 @@
|
||||
M.ForceContractDisease(new /datum/disease/tuberculosis(0))
|
||||
..()
|
||||
|
||||
/datum/reagent/jagged_crystals
|
||||
name = "Jagged Crystals"
|
||||
id = "jagged_crystals"
|
||||
description = "Rapid chemical decomposition has warped these crystals into twisted spikes."
|
||||
reagent_state = SOLID
|
||||
color = "#FA0000" // rgb: 250, 0, 0
|
||||
|
||||
/datum/reagent/jagged_crystals/on_mob_life(var/mob/living/carbon/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.ForceContractDisease(new /datum/disease/berserker(0))
|
||||
..()
|
||||
|
||||
/datum/reagent/salmonella
|
||||
name = "Salmonella"
|
||||
id = "salmonella"
|
||||
description = "A nasty bacteria found in spoiled food."
|
||||
reagent_state = LIQUID
|
||||
color = "#1E4600"
|
||||
|
||||
/datum/reagent/salmonella/on_mob_life(var/mob/living/carbon/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.ForceContractDisease(new /datum/disease/food_poisoning(0))
|
||||
..()
|
||||
|
||||
/datum/reagent/gibbis
|
||||
name = "Gibbis"
|
||||
id = "gibbis"
|
||||
description = "Liquid gibbis."
|
||||
reagent_state = LIQUID
|
||||
color = "#FF0000"
|
||||
|
||||
/datum/reagent/gibbis/on_mob_life(var/mob/living/carbon/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(volume > 2.5)
|
||||
M.ForceContractDisease(new /datum/disease/gbs/curable(0))
|
||||
..()
|
||||
|
||||
/datum/reagent/prions
|
||||
name = "Prions"
|
||||
id = "prions"
|
||||
description = "A disease-causing agent that is neither bacterial nor fungal nor viral and contains no genetic material."
|
||||
reagent_state = LIQUID
|
||||
color = "#FFFFFF"
|
||||
|
||||
/datum/reagent/prions/on_mob_life(var/mob/living/carbon/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(volume > 4.5)
|
||||
M.ForceContractDisease(new /datum/disease/kuru(0))
|
||||
..()
|
||||
|
||||
/datum/reagent/grave_dust
|
||||
name = "Grave Dust"
|
||||
id = "grave_dust"
|
||||
description = "Moldy old dust taken from a grave site."
|
||||
reagent_state = LIQUID
|
||||
color = "#465046"
|
||||
|
||||
/datum/reagent/grave_dust/on_mob_life(var/mob/living/carbon/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(volume > 4.5)
|
||||
M.ForceContractDisease(new /datum/disease/vampire(0))
|
||||
..()
|
||||
|
||||
/datum/reagent/heartworms
|
||||
name = "Space heartworms"
|
||||
id = "heartworms"
|
||||
description = "Aww, gross! These things can't be good for your heart. They're gunna eat it!"
|
||||
reagent_state = SOLID
|
||||
color = "#925D6C"
|
||||
|
||||
/datum/reagent/heartworms/on_mob_life(var/mob/living/carbon/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(volume > 4.5)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/internal/heart/ate_heart = H.get_int_organ(/obj/item/organ/internal/heart)
|
||||
if(ate_heart)
|
||||
ate_heart.remove(H)
|
||||
qdel(ate_heart)
|
||||
..()
|
||||
|
||||
/datum/reagent/spore
|
||||
name = "Blob Spores"
|
||||
id = "spore"
|
||||
|
||||
@@ -67,6 +67,56 @@
|
||||
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
|
||||
|
||||
|
||||
/datum/reagent/ethanol/dragons_breath
|
||||
name = "Dragon's Breath"
|
||||
id = "dragonsbreath"
|
||||
description = "Possessing this stuff probably breaks the Geneva convention."
|
||||
reagent_state = LIQUID
|
||||
color = "#DC0000"
|
||||
alcohol_perc = 1
|
||||
|
||||
/datum/reagent/ethanol/dragons_breath/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
|
||||
if(method == INGEST && prob(20))
|
||||
if(M.on_fire)
|
||||
M.adjust_fire_stacks(3)
|
||||
|
||||
/datum/reagent/ethanol/dragons_breath/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(M.reagents.has_reagent("milk"))
|
||||
to_chat(M, "<span class='notice'>The milk stops the burning. Ahhh.</span>")
|
||||
M.reagents.del_reagent("milk")
|
||||
M.reagents.del_reagent("dragonsbreath")
|
||||
return
|
||||
if(prob(8))
|
||||
to_chat(M, "<span class='userdanger'>Oh god! Oh GODD!!</span>")
|
||||
if(prob(50))
|
||||
to_chat(M, "<span class='danger'>Your throat burns terribly!</span>")
|
||||
M.emote(pick("scream","cry","choke","gasp"))
|
||||
M.Stun(1)
|
||||
if(prob(8))
|
||||
to_chat(M, "<span class='danger'>Why!? WHY!?</span>")
|
||||
if(prob(8))
|
||||
to_chat(M, "<span class='danger'>ARGHHHH!</span>")
|
||||
if(prob(2 * volume))
|
||||
to_chat(M, "<span class='userdanger'>OH GOD OH GOD PLEASE NO!!</b></span>")
|
||||
if(M.on_fire)
|
||||
M.adjust_fire_stacks(5)
|
||||
if(prob(50))
|
||||
to_chat(M, "<span class='userdanger'>IT BURNS!!!!</span>")
|
||||
M.visible_message("<span class='danger'>[M] is consumed in flames!</span>")
|
||||
M.dust()
|
||||
return
|
||||
..()
|
||||
|
||||
/datum/chemical_reaction/dragons_breath
|
||||
name = "Dragon's Breath"
|
||||
id = "dragonsbreath"
|
||||
result = "dragonsbreath"
|
||||
required_reagents = list("whiskey" = 1, "phlogiston" = 1, "pyrosium" = 1, "fuel" = 1, "ghostchilijuice"= 1)
|
||||
result_amount = 1
|
||||
mix_message = "A tiny mushroom cloud erupts from the container. That's not worrying at all!"
|
||||
mix_sound = 'sound/effects/meteorimpact.ogg'
|
||||
|
||||
// ROBOT ALCOHOL PAST THIS POINT
|
||||
// WOOO!
|
||||
|
||||
|
||||
@@ -26,11 +26,45 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
|
||||
M.adjustToxLoss(1*REM)
|
||||
M.adjustOxyLoss(1*REM)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] looks nervous!</span>")
|
||||
M.confused += 15
|
||||
M.adjustToxLoss(2)
|
||||
M.Jitter(10)
|
||||
M.emote("twitch_s")
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='warning'>[M] is all sweaty!</span>")
|
||||
M.bodytemperature += rand(15,30)
|
||||
M.adjustToxLoss(3)
|
||||
else if(effect <= 7)
|
||||
M.adjustToxLoss(4)
|
||||
M.emote("twitch")
|
||||
M.Jitter(10)
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.emote("gasp")
|
||||
to_chat(M, "<span class='warning'>You can't breathe!</span>")
|
||||
M.adjustOxyLoss(15)
|
||||
M.adjustToxLoss(3)
|
||||
M.Stun(1)
|
||||
else if(effect <= 4)
|
||||
to_chat(M, "<span class='warning'>You feel terrible!</span>")
|
||||
M.emote("drool")
|
||||
M.Jitter(10)
|
||||
M.adjustToxLoss(5)
|
||||
M.Weaken(1)
|
||||
M.confused += 33
|
||||
else if(effect <= 7)
|
||||
M.emote("collapse")
|
||||
to_chat(M, "<span class='warning'>Your heart is pounding!</span>")
|
||||
M << 'sound/effects/singlebeat.ogg'
|
||||
M.Paralyse(5)
|
||||
M.Jitter(30)
|
||||
M.adjustToxLoss(6)
|
||||
M.adjustOxyLoss(20)
|
||||
|
||||
/datum/reagent/crank
|
||||
name = "Crank"
|
||||
@@ -62,12 +96,45 @@
|
||||
M.emote(pick("groan", "moan"))
|
||||
..()
|
||||
return
|
||||
/datum/reagent/crank/overdose_process(var/mob/living/M as mob)
|
||||
M.adjustBrainLoss(rand(1,10)*REM)
|
||||
M.adjustToxLoss(rand(1,10)*REM)
|
||||
M.adjustBruteLoss(rand(1,10)*REM)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/crank/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] looks confused!</span>")
|
||||
M.confused += 20
|
||||
M.Jitter(20)
|
||||
M.emote("scream")
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='warning'>[M] is all sweaty!</span>")
|
||||
M.bodytemperature += rand(5,30)
|
||||
M.adjustBrainLoss(1)
|
||||
M.adjustToxLoss(1)
|
||||
M.Stun(2)
|
||||
else if(effect <= 7)
|
||||
M.Jitter(30)
|
||||
M.emote("grumble")
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] is sweating like a pig!</span>")
|
||||
M.bodytemperature += rand(20,100)
|
||||
M.adjustToxLoss(5)
|
||||
M.Stun(3)
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='warning'>[M] starts tweaking the hell out!</span>")
|
||||
M.Jitter(100)
|
||||
M.adjustToxLoss(2)
|
||||
M.adjustBrainLoss(8)
|
||||
M.Weaken(3)
|
||||
M.confused += 25
|
||||
M.emote("scream")
|
||||
M.reagents.add_reagent("jagged_crystals", 5)
|
||||
else if(effect <= 7)
|
||||
M.emote("scream")
|
||||
M.visible_message("<span class='warning'>[M] nervously scratches at their skin!</span>")
|
||||
M.Jitter(10)
|
||||
M.adjustBruteLoss(5)
|
||||
M.emote("twitch_s")
|
||||
|
||||
/datum/chemical_reaction/crank
|
||||
name = "Crank"
|
||||
@@ -120,12 +187,40 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(10))
|
||||
M.adjustBrainLoss(rand(1,5)*REM)
|
||||
M.adjustToxLoss(rand(1,5)*REM)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] looks dazed!</span>")
|
||||
M.Stun(3)
|
||||
M.emote("drool")
|
||||
else if(effect <= 4)
|
||||
M.emote("shiver")
|
||||
M.bodytemperature -= 40
|
||||
else if(effect <= 7)
|
||||
to_chat(M, "<span class='warning'>Your skin is cracking and bleeding!</span>")
|
||||
M.adjustBruteLoss(5)
|
||||
M.adjustToxLoss(2)
|
||||
M.adjustBrainLoss(1)
|
||||
M.emote("cry")
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M]</b> sways and falls over!</span>")
|
||||
M.adjustToxLoss(3)
|
||||
M.adjustBrainLoss(3)
|
||||
M.Weaken(8)
|
||||
M.emote("faint")
|
||||
else if(effect <= 4)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.visible_message("<span class='warning'>[M]'s skin is rotting away!</span>")
|
||||
H.adjustBruteLoss(25)
|
||||
H.emote("scream")
|
||||
H.ChangeToHusk()
|
||||
H.emote("faint")
|
||||
else if(effect <= 7)
|
||||
M.emote("shiver")
|
||||
M.bodytemperature -= 70
|
||||
|
||||
/datum/chemical_reaction/krokodil
|
||||
name = "Krokodil"
|
||||
@@ -169,19 +264,30 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(20))
|
||||
M.emote("laugh")
|
||||
if(prob(33))
|
||||
M.visible_message("<span class='danger'>[M]'s hands flip out and flail everywhere!</span>")
|
||||
var/obj/item/I = M.get_active_hand()
|
||||
if(I)
|
||||
M.drop_item()
|
||||
..()
|
||||
if(prob(50))
|
||||
M.adjustToxLoss(10)
|
||||
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
|
||||
return
|
||||
/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] can't seem to control their legs!</span>")
|
||||
M.confused += 20
|
||||
M.Weaken(4)
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='warning'>[M]'s hands flip out and flail everywhere!</span>")
|
||||
M.drop_l_hand()
|
||||
M.drop_r_hand()
|
||||
else if(effect <= 7)
|
||||
M.emote("laugh")
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M]'s hands flip out and flail everywhere!</span>")
|
||||
M.drop_l_hand()
|
||||
M.drop_r_hand()
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='warning'>[M] falls to the floor and flails uncontrollably!</span>")
|
||||
M.Jitter(10)
|
||||
M.Weaken(10)
|
||||
else if(effect <= 7)
|
||||
M.emote("laugh")
|
||||
|
||||
/datum/chemical_reaction/methamphetamine
|
||||
name = "methamphetamine"
|
||||
@@ -220,30 +326,97 @@
|
||||
name = "Bath Salts"
|
||||
id = "bath_salts"
|
||||
description = "Sometimes packaged as a refreshing bathwater additive, these crystals are definitely not for human consumption."
|
||||
reagent_state = LIQUID
|
||||
color = "#60A584" // rgb: 96, 165, 132
|
||||
reagent_state = SOLID
|
||||
color = "#FAFAFA"
|
||||
overdose_threshold = 20
|
||||
addiction_chance = 80
|
||||
metabolization_rate = 0.6
|
||||
|
||||
|
||||
/datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
|
||||
if(prob(5))
|
||||
to_chat(M, "<span class='notice'>[high_message]</span>")
|
||||
M.AdjustParalysis(-5)
|
||||
M.AdjustStunned(-5)
|
||||
M.AdjustWeakened(-5)
|
||||
M.adjustStaminaLoss(-10)
|
||||
M.adjustBrainLoss(1)
|
||||
M.adjustToxLoss(0.1)
|
||||
M.hallucination += 10
|
||||
if(M.canmove && !istype(M.loc, /turf/space))
|
||||
step(M, pick(cardinal))
|
||||
step(M, pick(cardinal))
|
||||
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"
|
||||
H.update_hair()
|
||||
H.update_fhair()
|
||||
H.visible_message("<span class='warning'>[H] has a wild look in their eyes!</span>")
|
||||
if(check < 60)
|
||||
M.SetParalysis(0)
|
||||
M.SetStunned(0)
|
||||
M.SetWeakened(0)
|
||||
if(check < 30)
|
||||
M.emote(pick("twitch", "twitch_s", "scream", "drool", "grumble", "mumble"))
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(check < 20)
|
||||
M.confused += 10
|
||||
if(check < 8)
|
||||
M.reagents.add_reagent(pick("methamphetamine", "crank", "neurotoxin"), rand(1,5))
|
||||
M.visible_message("<span class='warning'>[M] scratches at something under their skin!</span>")
|
||||
M.adjustBruteLoss(5)
|
||||
else if(check < 16)
|
||||
M.hallucination += 30
|
||||
else if(check < 24)
|
||||
to_chat(M, "<span class='userdanger'>They're coming for you!</span>")
|
||||
else if(check < 28)
|
||||
to_chat(M, "<span class='userdanger'>THEY'RE GONNA GET YOU!</span>")
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/bath_salts/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
|
||||
if(method == INGEST)
|
||||
to_chat(M, "<span class = 'danger'><font face='[pick("Curlz MT", "Comic Sans MS")]' size='[rand(4,6)]'>You feel FUCKED UP!!!!!!</font></span>")
|
||||
M << 'sound/effects/singlebeat.ogg'
|
||||
M.emote("faint")
|
||||
M.apply_effect(5, IRRADIATE, negate_armor = 1)
|
||||
M.adjustToxLoss(5)
|
||||
M.adjustBrainLoss(10)
|
||||
else
|
||||
to_chat(M, "<span class='notice'>You feel a bit more salty than usual.</span>")
|
||||
|
||||
/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='danger'>[M] flails around like a lunatic!</span>")
|
||||
M.confused += 25
|
||||
M.Jitter(10)
|
||||
M.emote("scream")
|
||||
M.reagents.add_reagent("jagged_crystals", 5)
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='danger'>[M]'s eyes dilate!</span>")
|
||||
M.emote("twitch_s")
|
||||
M.adjustToxLoss(2)
|
||||
M.adjustBrainLoss(1)
|
||||
M.Stun(3)
|
||||
M.eye_blurry = max(M.eye_blurry, 7)
|
||||
M.reagents.add_reagent("jagged_crystals", 5)
|
||||
else if(effect <= 7)
|
||||
M.emote("faint")
|
||||
M.reagents.add_reagent("jagged_crystals", 5)
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='danger'>[M]'s eyes dilate!</span>")
|
||||
M.adjustToxLoss(2)
|
||||
M.adjustBrainLoss(1)
|
||||
M.Stun(3)
|
||||
M.eye_blurry = max(M.eye_blurry, 7)
|
||||
M.reagents.add_reagent("jagged_crystals", 5)
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='danger'>[M] convulses violently and falls to the floor!</span>")
|
||||
M.Jitter(50)
|
||||
M.adjustToxLoss(2)
|
||||
M.adjustBrainLoss(1)
|
||||
M.Weaken(8)
|
||||
M.emote("gasp")
|
||||
M.reagents.add_reagent("jagged_crystals", 5)
|
||||
else if(effect <= 7)
|
||||
M.emote("scream")
|
||||
M.visible_message("<span class='danger'>[M] tears at their own skin!</span>")
|
||||
M.adjustBruteLoss(5)
|
||||
M.reagents.add_reagent("jagged_crystals", 5)
|
||||
M.emote("twitch")
|
||||
|
||||
/datum/chemical_reaction/bath_salts
|
||||
name = "bath_salts"
|
||||
@@ -255,19 +428,37 @@
|
||||
mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh."
|
||||
mix_sound = 'sound/goonstation/misc/fuse.ogg'
|
||||
|
||||
/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob)
|
||||
M.hallucination += 10
|
||||
if(M.canmove && !istype(M.loc, /turf/space))
|
||||
for(var/i = 0, i < 8, i++)
|
||||
step(M, pick(cardinal))
|
||||
if(prob(20))
|
||||
M.emote(pick("twitch","drool","moan"))
|
||||
if(prob(33))
|
||||
var/obj/item/I = M.get_active_hand()
|
||||
if(I)
|
||||
M.drop_item()
|
||||
/datum/chemical_reaction/jenkem
|
||||
name = "Jenkem"
|
||||
id = "jenkem"
|
||||
result = "jenkem"
|
||||
required_reagents = list("toiletwater" = 1, "ammonia" = 1, "water" = 1)
|
||||
result_amount = 3
|
||||
mix_message = "The mixture ferments into a filthy morass."
|
||||
mix_sound = 'sound/effects/blobattack.ogg'
|
||||
|
||||
/datum/chemical_reaction/jenkem/on_reaction(var/datum/reagents/holder)
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
T.visible_message("<span class='warning'>The solution generates a strong vapor!</span>")
|
||||
for(var/mob/living/carbon/C in range(T, 1))
|
||||
if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
|
||||
C.reagents.add_reagent("jenkem", 25)
|
||||
|
||||
/datum/reagent/jenkem
|
||||
name = "Jenkem"
|
||||
id = "jenkem"
|
||||
description = "Jenkem is a prison drug made from fermenting feces in a solution of urine. Extremely disgusting."
|
||||
reagent_state = LIQUID
|
||||
color = "#644600"
|
||||
addiction_chance = 30
|
||||
|
||||
/datum/reagent/jenkem/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.Dizzy(5)
|
||||
if(prob(10))
|
||||
M.emote(pick("twitch_s","drool","moan"))
|
||||
M.adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/aranesp
|
||||
name = "Aranesp"
|
||||
@@ -381,24 +572,30 @@
|
||||
/datum/reagent/fliptonium/reagent_deleted(var/mob/living/M as mob)
|
||||
M.SpinAnimation(speed = 12, loops = -1)
|
||||
|
||||
/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob)
|
||||
if(volume > 15)
|
||||
if(prob(5))
|
||||
switch(pick(1, 2, 3))
|
||||
if(1)
|
||||
M.emote("laugh")
|
||||
M.adjustToxLoss(1)
|
||||
if(2)
|
||||
to_chat(M, "<span class='danger'>[M] can't seem to control their legs!</span>")
|
||||
M.Weaken(8)
|
||||
M.adjustToxLoss(1)
|
||||
if(3)
|
||||
to_chat(M, "<span class='danger'>[M]'s hands flip out and flail everywhere!</span>")
|
||||
M.drop_l_hand()
|
||||
M.drop_r_hand()
|
||||
M.adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] can't seem to control their legs!</span>")
|
||||
M.confused += 33
|
||||
M.Weaken(2)
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='warning'>[M]'s hands flip out and flail everywhere!</span>")
|
||||
M.drop_l_hand()
|
||||
M.drop_r_hand()
|
||||
else if(effect <= 7)
|
||||
M.emote("laugh")
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M]'s hands flip out and flail everywhere!</span>")
|
||||
M.drop_l_hand()
|
||||
M.drop_r_hand()
|
||||
else if (effect <= 4)
|
||||
M.visible_message("<span class='warning'>[M] falls to the floor and flails uncontrollably!</span>")
|
||||
M.Jitter(5)
|
||||
M.Weaken(5)
|
||||
else if(effect <= 7)
|
||||
M.emote("laugh")
|
||||
|
||||
//////////////////////////////
|
||||
// Synth-Drugs //
|
||||
@@ -445,7 +642,7 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob)
|
||||
/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob, severity)
|
||||
if(prob(20))
|
||||
M.emote("ping")
|
||||
if(prob(33))
|
||||
@@ -457,7 +654,6 @@
|
||||
if(prob(50))
|
||||
M.adjustFireLoss(10)
|
||||
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
|
||||
return
|
||||
|
||||
//Surge: Krokodil
|
||||
/datum/reagent/surge
|
||||
@@ -484,7 +680,7 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/surge/overdose_process(var/mob/living/M as mob)
|
||||
/datum/reagent/surge/overdose_process(var/mob/living/M as mob, severity)
|
||||
//Hit them with the same effects as an electrode!
|
||||
M.Stun(5)
|
||||
M.Weaken(5)
|
||||
@@ -502,8 +698,6 @@
|
||||
B.icon = I
|
||||
M.adjustFireLoss(rand(1,5)*REM)
|
||||
M.adjustBruteLoss(rand(1,5)*REM)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/surge
|
||||
name = "Surge"
|
||||
|
||||
@@ -10,8 +10,10 @@ datum/reagent/questionmark/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
if(!istype(M, /mob/living))
|
||||
return
|
||||
if(method == INGEST)
|
||||
M.Stun(2)
|
||||
M.Weaken(2)
|
||||
to_chat(M, "<span class='danger'>Ugh! Eating that was a terrible idea!</span>")
|
||||
M.ForceContractDisease(new /datum/disease/food_poisoning(0))
|
||||
|
||||
datum/reagent/egg
|
||||
name = "Egg"
|
||||
@@ -175,15 +177,12 @@ datum/reagent/mugwort/on_mob_life(var/mob/living/M as mob)
|
||||
metabolization_rate = 0.2
|
||||
overdose_threshold = 133
|
||||
|
||||
datum/reagent/porktonium/overdose_process(var/mob/living/M as mob)
|
||||
if(volume > 133)
|
||||
if(prob(15))
|
||||
M.reagents.add_reagent("cholesterol", rand(1,3))
|
||||
if(prob(8))
|
||||
M.reagents.add_reagent("radium", 15)
|
||||
M.reagents.add_reagent("cyanide", 10)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/porktonium/overdose_process(var/mob/living/M as mob, severity)
|
||||
if(prob(15))
|
||||
M.reagents.add_reagent("cholesterol", rand(1,3))
|
||||
if(prob(8))
|
||||
M.reagents.add_reagent("radium", 15)
|
||||
M.reagents.add_reagent("cyanide", 10)
|
||||
|
||||
/datum/reagent/fungus
|
||||
name = "Space fungus"
|
||||
@@ -202,6 +201,7 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
M.reagents.add_reagent("toxin", rand(1,5))
|
||||
else if(ranchance <= 5)
|
||||
to_chat(M, "<span class='warning'>That tasted absolutely FOUL.</span>")
|
||||
M.ForceContractDisease(new /datum/disease/food_poisoning(0))
|
||||
else
|
||||
to_chat(M, "<span class='warning'>Yuck!</span>")
|
||||
|
||||
@@ -283,11 +283,10 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume)
|
||||
color = "#B2B139"
|
||||
overdose_threshold = 50
|
||||
|
||||
/datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob)
|
||||
/datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob, severity)
|
||||
if(prob(8))
|
||||
to_chat(M, "<span class='warning'>You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.</span>")
|
||||
M.adjustToxLoss(rand(1,2))
|
||||
..()
|
||||
|
||||
/datum/reagent/weird_cheese
|
||||
name = "Weird cheese"
|
||||
@@ -442,7 +441,7 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob)
|
||||
/datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob, severity)
|
||||
if(prob(33))
|
||||
to_chat(M, "<span class='warning'>You feel horribly weak.</span>")
|
||||
if(prob(10))
|
||||
@@ -453,7 +452,6 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
|
||||
M.adjustOxyLoss(25)
|
||||
M.Stun(5)
|
||||
M.Paralyse(10)
|
||||
..()
|
||||
|
||||
/datum/chemical_reaction/hydrogenated_soybeanoil
|
||||
name = "Partially hydrogenated space-soybean oil"
|
||||
@@ -603,3 +601,44 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol
|
||||
if(!H.heart_attack)
|
||||
H.heart_attack = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/ghost_chili_juice
|
||||
name = "Ghost chili juice"
|
||||
id = "ghostchilijuice"
|
||||
description = "Juice from the universe's hottest chilli. Do not consume."
|
||||
reagent_state = LIQUID
|
||||
color = "#FF7F32"
|
||||
|
||||
/datum/reagent/ghost_chili_juice/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(M.reagents.has_reagent("milk"))
|
||||
to_chat(M, "<span class='notice'>The milk stops the burning. Ahhh.</span>")
|
||||
M.reagents.del_reagent("milk")
|
||||
M.reagents.del_reagent("ghostchilijuice")
|
||||
return
|
||||
if(prob(8))
|
||||
to_chat(M, "<span class='userdanger'>Oh god! Oh GODD!!</span>")
|
||||
if(prob(50))
|
||||
to_chat(M, "<span class='danger'>Your throat burns furiously!</span>")
|
||||
M.emote(pick("scream","cry","choke","gasp"))
|
||||
M.Stun(1)
|
||||
if(prob(8))
|
||||
to_chat(M, "<span class='danger'>Why!? WHY!?</span>")
|
||||
if(prob(8))
|
||||
to_chat(M, "<span class='danger'>ARGHHHH!</span>")
|
||||
if(prob(33))
|
||||
M.visible_message("<span class='danger'>[M] suddenly and violently vomits!</span>")
|
||||
M.fakevomit(no_text = 1)
|
||||
to_chat(M, "<span class='notice'>Thank goodness. You're not sure how long you could have held out with heat that intense!</span>")
|
||||
M.reagents.del_reagent("ghostchilijuice")
|
||||
return
|
||||
if(prob(10))
|
||||
to_chat(M, "<span class='userdanger'>OH GOD OH GOD PLEASE NO!!</span>")
|
||||
if(M.on_fire)
|
||||
M.adjust_fire_stacks(5)
|
||||
if(prob(50))
|
||||
to_chat(M, "<span class='userdanger'>IT BURNS!!!!</span>")
|
||||
M.visible_message("<span class='danger'>[M] is consumed in flames!</span>")
|
||||
M.dust()
|
||||
return
|
||||
..()
|
||||
@@ -65,6 +65,7 @@ datum/reagent/salglu_solution
|
||||
description = "This saline and glucose solution can help stabilize critically injured patients and cleanse wounds."
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC"
|
||||
penetrates_skin = 1
|
||||
metabolization_rate = 0.15
|
||||
|
||||
datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob)
|
||||
@@ -170,7 +171,7 @@ datum/reagent/omnizine
|
||||
overdose_threshold = 30
|
||||
addiction_chance = 5
|
||||
|
||||
datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob)
|
||||
/datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.adjustToxLoss(-1*REM)
|
||||
M.adjustOxyLoss(-1*REM)
|
||||
@@ -181,13 +182,39 @@ datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/omnizine/overdose_process(var/mob/living/M as mob)
|
||||
M.adjustToxLoss(3*REM)
|
||||
M.adjustOxyLoss(3*REM)
|
||||
M.adjustBruteLoss(3*REM)
|
||||
M.adjustFireLoss(3*REM)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/omnizine/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1) //lesser
|
||||
M.stuttering += 1
|
||||
if(effect <= 1)
|
||||
M.visible_message("<span class='warning'>[M] suddenly cluches their gut!</span>")
|
||||
M.emote("scream")
|
||||
M.Stun(4)
|
||||
M.Weaken(4)
|
||||
else if(effect <= 3)
|
||||
M.visible_message("<span class='warning'>[M] completely spaces out for a moment.</span>")
|
||||
M.confused += 15
|
||||
else if(effect <= 5)
|
||||
M.visible_message("<span class='warning'>[M] stumbles and staggers.</span>")
|
||||
M.Dizzy(5)
|
||||
M.Weaken(3)
|
||||
else if(effect <= 7)
|
||||
M.visible_message("<span class='warning'>[M] shakes uncontrollably.</span>")
|
||||
M.Jitter(30)
|
||||
else if(severity == 2) // greater
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] suddenly cluches their gut!</span>")
|
||||
M.emote("scream")
|
||||
M.Stun(7)
|
||||
M.Weaken(7)
|
||||
else if(effect <= 5)
|
||||
M.visible_message("<span class='warning'>[M] jerks bolt upright, then collapses!</span>")
|
||||
M.Paralyse(5)
|
||||
M.Weaken(4)
|
||||
else if(effect <= 8)
|
||||
M.visible_message("<span class='warning'>[M] stumbles and staggers.</span>")
|
||||
M.Dizzy(5)
|
||||
M.Weaken(3)
|
||||
|
||||
datum/reagent/calomel
|
||||
name = "Calomel"
|
||||
@@ -290,13 +317,6 @@ datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob)
|
||||
if(volume > 25)
|
||||
if(prob(8))
|
||||
M.adjustToxLoss(rand(1,2))
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/sal_acid
|
||||
name = "Salicyclic Acid"
|
||||
id = "sal_acid"
|
||||
@@ -361,17 +381,17 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
|
||||
mix_message = "The mixture rapidly turns into a dense pink liquid."
|
||||
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
|
||||
|
||||
datum/reagent/ephedrine
|
||||
/datum/reagent/ephedrine
|
||||
name = "Ephedrine"
|
||||
id = "ephedrine"
|
||||
description = "Ephedrine is a plant-derived stimulant."
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC"
|
||||
metabolization_rate = 0.3
|
||||
overdose_threshold = 45
|
||||
overdose_threshold = 35
|
||||
addiction_chance = 25
|
||||
|
||||
datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
|
||||
/datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.drowsyness = max(0, M.drowsyness-5)
|
||||
M.AdjustParalysis(-1)
|
||||
@@ -389,12 +409,26 @@ datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(33))
|
||||
M.adjustToxLoss(1*REM)
|
||||
M.losebreath++
|
||||
..()
|
||||
return
|
||||
/datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 1)
|
||||
M.visible_message("<span class='warning'>[M] suddenly and violently vomits!</span>")
|
||||
M.fakevomit(no_text = 1)
|
||||
else if(effect <= 3)
|
||||
M.emote(pick("groan","moan"))
|
||||
if(effect <= 8)
|
||||
M.emote("collapse")
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] suddenly and violently vomits!</span>")
|
||||
M.fakevomit(no_text = 1)
|
||||
else if(effect <= 5)
|
||||
M.visible_message("<span class='warning'>[M.name] staggers and drools, their eyes bloodshot!</span>")
|
||||
M.Dizzy(2)
|
||||
M.Weaken(3)
|
||||
if(effect <= 15)
|
||||
M.emote("collapse")
|
||||
|
||||
/datum/chemical_reaction/ephedrine
|
||||
name = "Ephedrine"
|
||||
@@ -441,7 +475,7 @@ datum/reagent/morphine
|
||||
description = "A strong but highly addictive opiate painkiller with sedative side effects."
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC"
|
||||
overdose_threshold = 30
|
||||
overdose_threshold = 20
|
||||
addiction_chance = 50
|
||||
shock_reduction = 50
|
||||
|
||||
@@ -464,16 +498,6 @@ datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/morphine/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(33))
|
||||
var/obj/item/I = M.get_active_hand()
|
||||
if(I)
|
||||
M.drop_item()
|
||||
M.Dizzy(1)
|
||||
M.Jitter(1)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/oculine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(prob(80))
|
||||
@@ -519,7 +543,7 @@ datum/reagent/atropine
|
||||
reagent_state = LIQUID
|
||||
color = "#000000"
|
||||
metabolization_rate = 0.2
|
||||
overdose_threshold = 35
|
||||
overdose_threshold = 25
|
||||
|
||||
datum/reagent/atropine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
@@ -541,14 +565,6 @@ datum/reagent/atropine/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/atropine/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(50))
|
||||
M.adjustToxLoss(2*REM)
|
||||
M.Dizzy(1)
|
||||
M.Jitter(1)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/atropine
|
||||
name = "Atropine"
|
||||
id = "atropine"
|
||||
@@ -564,7 +580,7 @@ datum/reagent/epinephrine
|
||||
reagent_state = LIQUID
|
||||
color = "#96B1AE"
|
||||
metabolization_rate = 0.2
|
||||
overdose_threshold = 30
|
||||
overdose_threshold = 20
|
||||
|
||||
datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
@@ -591,13 +607,26 @@ datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(33))
|
||||
M.adjustStaminaLoss(5*REM)
|
||||
M.adjustToxLoss(2*REM)
|
||||
M.losebreath++
|
||||
..()
|
||||
return
|
||||
/datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if (severity == 1)
|
||||
if(effect <= 1)
|
||||
M.visible_message("<span class='warning'>[M] suddenly and violently vomits!</span>")
|
||||
M.fakevomit(no_text = 1)
|
||||
else if(effect <= 3)
|
||||
M.emote(pick("groan","moan"))
|
||||
if(effect <= 8)
|
||||
M.emote("collapse")
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] suddenly and violently vomits!</span>")
|
||||
M.fakevomit(no_text = 1)
|
||||
else if(effect <= 5)
|
||||
M.visible_message("<span class='warning'>[M] staggers and drools, their eyes bloodshot!</span>")
|
||||
M.Dizzy(2)
|
||||
M.Weaken(3)
|
||||
if(effect <= 15)
|
||||
M.emote("collapse")
|
||||
|
||||
/datum/chemical_reaction/epinephrine
|
||||
name = "Epinephrine"
|
||||
@@ -771,6 +800,7 @@ datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob)
|
||||
M.adjustBruteLoss(-10*REM)
|
||||
M.adjustFireLoss(-10*REM)
|
||||
M.setStaminaLoss(0)
|
||||
M.slowed = 0
|
||||
M.dizziness = max(0,M.dizziness-10)
|
||||
M.drowsyness = max(0,M.drowsyness-10)
|
||||
M.confused = 0
|
||||
@@ -812,13 +842,11 @@ datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob)
|
||||
M.adjustStaminaLoss(-5*REM)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M)
|
||||
/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M, severity)
|
||||
if(prob(33))
|
||||
M.adjustStaminaLoss(2.5*REM)
|
||||
M.adjustToxLoss(1*REM)
|
||||
M.losebreath++
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/insulin
|
||||
name = "Insulin"
|
||||
@@ -855,6 +883,7 @@ datum/reagent/teporone
|
||||
reagent_state = LIQUID
|
||||
color = "#D782E6"
|
||||
addiction_chance = 20
|
||||
overdose_threshold = 50
|
||||
|
||||
datum/reagent/teporone/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
|
||||
@@ -51,14 +51,15 @@
|
||||
continue
|
||||
//If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here.
|
||||
if(M && R)
|
||||
R.on_mob_life(M)
|
||||
if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0)
|
||||
R.overdosed = 1
|
||||
R.overdose_start(M)
|
||||
if(R.volume < R.overdose_threshold && R.overdosed)
|
||||
R.overdosed = 0
|
||||
if(R.overdosed)
|
||||
R.overdose_process(M)
|
||||
R.on_mob_life(M)
|
||||
R.overdose_process(M, R.volume >= R.overdose_threshold*2 ? 2 : 1)
|
||||
|
||||
for(var/A in addiction_list)
|
||||
var/datum/reagent/R = A
|
||||
if(M && R)
|
||||
@@ -117,8 +118,11 @@
|
||||
return
|
||||
|
||||
// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects
|
||||
/datum/reagent/proc/overdose_process(var/mob/living/M as mob)
|
||||
return
|
||||
/datum/reagent/proc/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = rand(1, 100) - severity
|
||||
if (effect <= 8)
|
||||
M.adjustToxLoss(severity)
|
||||
return effect
|
||||
|
||||
/datum/reagent/proc/overdose_start(var/mob/living/M as mob)
|
||||
return
|
||||
|
||||
@@ -351,6 +351,52 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
|
||||
required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1)
|
||||
result_amount = 3
|
||||
|
||||
/datum/reagent/hugs
|
||||
name = "Pure hugs"
|
||||
id = "hugs"
|
||||
description = "Hugs, in liquid form. Yes, the concept of a hug. As a liquid. This makes sense in the future."
|
||||
reagent_state = LIQUID
|
||||
color = "#FF97B9"
|
||||
|
||||
/datum/reagent/love
|
||||
name = "Pure love"
|
||||
id = "love"
|
||||
description = "What is this emotion you humans call \"love?\" Oh, it's this? This is it? Huh, well okay then, thanks."
|
||||
reagent_state = LIQUID
|
||||
color = "#FF83A5"
|
||||
|
||||
/datum/reagent/love/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
|
||||
to_chat(M, "<span class='notice'>You feel loved!</span>")
|
||||
|
||||
/datum/reagent/love/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
|
||||
if(M.a_intent == I_HARM)
|
||||
M.a_intent = I_HELP
|
||||
|
||||
if(prob(8))
|
||||
var/lovely_phrase = pick("appreciated", "loved", "pretty good", "really nice", "pretty happy with yourself, even though things haven't always gone as well as they could")
|
||||
to_chat(M, "<span class='notice'>You feel [lovely_phrase].</span>")
|
||||
|
||||
else if(!M.restrained())
|
||||
for(var/mob/living/carbon/C in orange(1, M))
|
||||
if(C)
|
||||
if(C == M)
|
||||
continue
|
||||
if(!C.stat)
|
||||
M.visible_message("<span class='notice'>[M] gives [C] a [pick("hug","warm embrace")].</span>")
|
||||
playsound(get_turf(M), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
break
|
||||
..()
|
||||
|
||||
/datum/chemical_reaction/love
|
||||
name = "pure love"
|
||||
id = "love"
|
||||
result = "love"
|
||||
required_reagents = list("hugs" = 1, "chocolate" = 1)
|
||||
result_amount = 2
|
||||
mix_message = "The substance gives off a lovely scent!"
|
||||
|
||||
///Alchemical Reagents
|
||||
|
||||
datum/reagent/eyenewt
|
||||
|
||||
@@ -55,23 +55,45 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/histamine/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(2))
|
||||
to_chat(M, "<span class='danger'>You feel mucus running down the back of your throat.</span>")
|
||||
M.adjustToxLoss(1)
|
||||
M.jitteriness += 4
|
||||
M.emote("sneeze", "cough")
|
||||
else if(prob(4))
|
||||
M.stuttering += rand(0,5)
|
||||
if(prob(25))
|
||||
M.emote(pick("choke","gasp"))
|
||||
M.adjustOxyLoss(5)
|
||||
else if(prob(7))
|
||||
to_chat(M, "<span class='danger'>Your chest hurts!</span>")
|
||||
M.emote(pick("cough","gasp"))
|
||||
M.adjustOxyLoss(3)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/histamine/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 2)
|
||||
to_chat(M, "<span class='warning'>You feel mucus running down the back of your throat.</span>")
|
||||
M.adjustToxLoss(1)
|
||||
M.Jitter(4)
|
||||
M.emote(pick("sneeze", "cough"))
|
||||
else if(effect <= 4)
|
||||
M.stuttering += rand(0,5)
|
||||
if(prob(25))
|
||||
M.emote(pick("choke","gasp"))
|
||||
M.adjustOxyLoss(5)
|
||||
else if(effect <= 7)
|
||||
to_chat(M, "<span class='warning'>Your chest hurts!</span>")
|
||||
M.emote(pick("cough","gasp"))
|
||||
M.adjustOxyLoss(3)
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] breaks out in hives!</span>")
|
||||
M.adjustBruteLoss(6)
|
||||
else if(effect <= 4)
|
||||
M.visible_message("<span class='warning'>[M] has a horrible coughing fit!</span>")
|
||||
M.Jitter(10)
|
||||
M.stuttering += rand(0,5)
|
||||
M.emote("cough")
|
||||
if(prob(40))
|
||||
M.emote(pick("choke","gasp"))
|
||||
M.adjustOxyLoss(6)
|
||||
M.Weaken(8)
|
||||
else if(effect <= 7)
|
||||
to_chat(M, "<span class='warning'>Your heartbeat is pounding inside your head!</span>")
|
||||
M << 'sound/effects/singlebeat.ogg'
|
||||
M.emote("collapse")
|
||||
M.adjustOxyLoss(8)
|
||||
M.adjustToxLoss(3)
|
||||
M.Weaken(3)
|
||||
M.emote(pick("choke", "gasp"))
|
||||
to_chat(M, "<span class='warning'>You feel like you're dying!</span>")
|
||||
|
||||
/datum/reagent/formaldehyde
|
||||
name = "Formaldehyde"
|
||||
@@ -130,8 +152,6 @@
|
||||
M.jitteriness += 1000
|
||||
spawn(rand(20, 100))
|
||||
M.gib()
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/neurotoxin2
|
||||
name = "Neurotoxin"
|
||||
@@ -377,6 +397,15 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/initropidril
|
||||
name = "Initropidril"
|
||||
id = "initropidril"
|
||||
result = "initropidril"
|
||||
required_reagents = list("crank" = 1, "histamine" = 1, "krokodil" = 1, "bath_salts" = 1, "atropine" = 1, "nicotine" = 1, "morphine" = 1)
|
||||
result_amount = 4
|
||||
mix_message = "A sweet and sugary scent drifts from the unpleasant milky substance."
|
||||
|
||||
|
||||
/datum/reagent/concentrated_initro
|
||||
name = "Concentrated Initropidril"
|
||||
id = "concentrated_initro"
|
||||
@@ -627,6 +656,7 @@
|
||||
color = "#C7C7C7"
|
||||
metabolization_rate = 0.1
|
||||
penetrates_skin = 1
|
||||
overdose_threshold = 25
|
||||
|
||||
/datum/chemical_reaction/sarin
|
||||
name = "sarin"
|
||||
|
||||
@@ -151,10 +151,8 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M)
|
||||
/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M, severity)
|
||||
M.adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/ethanol/rum
|
||||
name = "Rum"
|
||||
@@ -169,10 +167,8 @@
|
||||
M.dizziness +=5
|
||||
return
|
||||
|
||||
/datum/reagent/ethanol/rum/overdose_process(mob/living/M)
|
||||
/datum/reagent/ethanol/rum/overdose_process(mob/living/M, severity)
|
||||
M.adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/ethanol/mojito
|
||||
name = "Mojito"
|
||||
|
||||
@@ -201,13 +201,10 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob)
|
||||
/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob, severity)
|
||||
if(volume > 45)
|
||||
M.Jitter(5)
|
||||
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/drink/coffee/icecoffee
|
||||
name = "Iced Coffee"
|
||||
id = "icecoffee"
|
||||
|
||||
@@ -167,13 +167,11 @@
|
||||
description = "Sodium chloride, common table salt."
|
||||
reagent_state = SOLID
|
||||
color = "#B1B0B0"
|
||||
overdose_threshold = 100
|
||||
|
||||
/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob)
|
||||
if(volume > 100)
|
||||
if(prob(70))
|
||||
M.adjustBrainLoss(1)
|
||||
if(prob(8))
|
||||
M.adjustToxLoss(rand(1,2))
|
||||
/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob, severity)
|
||||
if(prob(70))
|
||||
M.adjustBrainLoss(1)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -454,11 +452,9 @@
|
||||
M.emote("collapse")
|
||||
..()
|
||||
|
||||
/datum/reagent/sugar/overdose_process(var/mob/living/M as mob)
|
||||
if(volume > 200)
|
||||
M.Paralyse(3)
|
||||
M.Weaken(4)
|
||||
if(prob(8))
|
||||
M.adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/sugar/overdose_process(var/mob/living/M as mob, severity)
|
||||
M.Paralyse(3 * severity)
|
||||
M.Weaken(4 * severity)
|
||||
if(prob(8))
|
||||
M.adjustToxLoss(severity)
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis."
|
||||
reagent_state = LIQUID
|
||||
color = "#FA46FA"
|
||||
overdose_threshold = 40
|
||||
|
||||
/datum/reagent/synaptizine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
@@ -53,6 +54,27 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/synaptizine/overdose_process(var/mob/living/M as mob, severity)
|
||||
var/effect = ..()
|
||||
if(severity == 1)
|
||||
if(effect <= 1)
|
||||
M.visible_message("<span class='warning'>[M] suddenly and violently vomits!</span>")
|
||||
M.fakevomit(no_text = 1)
|
||||
else if(effect <= 3)
|
||||
M.emote(pick("groan","moan"))
|
||||
if(effect <= 8)
|
||||
M.adjustToxLoss(1)
|
||||
else if(severity == 2)
|
||||
if(effect <= 2)
|
||||
M.visible_message("<span class='warning'>[M] suddenly and violently vomits!</span>")
|
||||
M.fakevomit(no_text = 1)
|
||||
else if(effect <= 5)
|
||||
M.visible_message("<span class='warning'>[M] staggers and drools, their eyes bloodshot!</span>")
|
||||
M.Dizzy(8)
|
||||
M.Weaken(4)
|
||||
if(effect <= 15)
|
||||
M.adjustToxLoss(1)
|
||||
|
||||
/datum/reagent/mitocholide
|
||||
name = "Mitocholide"
|
||||
id = "mitocholide"
|
||||
@@ -114,12 +136,10 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/rezadone/overdose_process(mob/living/M)
|
||||
/datum/reagent/rezadone/overdose_process(mob/living/M, severity)
|
||||
M.adjustToxLoss(1)
|
||||
M.Dizzy(5)
|
||||
M.Jitter(5)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/spaceacillin
|
||||
name = "Spaceacillin"
|
||||
|
||||
@@ -787,7 +787,7 @@
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("nutriment", 6)
|
||||
reagents.add_reagent("mannitol", 6)
|
||||
reagents.add_reagent("prions", 10)
|
||||
bitesize = 2
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/ghostburger
|
||||
@@ -1339,7 +1339,7 @@
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("????", 1)
|
||||
reagents.add_reagent("????", 5)
|
||||
reagents.add_reagent("carbon", 3)
|
||||
bitesize = 2
|
||||
|
||||
|
||||
@@ -299,7 +299,7 @@
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","sarin","histamine","venom","cyanide","spidereggs","nanomachines"), 40)
|
||||
reagents.add_reagent(pick_list("chemistry_tools.json", "traitor_poison_bottle"), 40)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/plasma
|
||||
name = "plasma dust bottle"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -181,4 +181,29 @@
|
||||
build_type = PODFAB
|
||||
materials = list(MAT_METAL=20000, MAT_GLASS=2000)
|
||||
build_path = /obj/item/device/spacepod_equipment/cargo/ore
|
||||
category = list("Pod_Parts")
|
||||
|
||||
//////////////////////////////////////////
|
||||
//////SPACEPOD LOCK ITEMS////////////////
|
||||
//////////////////////////////////////////
|
||||
/datum/design/pod_lock_keyed
|
||||
construction_time = 100
|
||||
name = "Spacepod Tumbler Lock"
|
||||
desc = "Allows for the construction of a tumbler style podlock."
|
||||
id = "podlock_keyed"
|
||||
req_tech = list("materials" = 1) //The most basic kind of locking system
|
||||
build_type = PODFAB
|
||||
materials = list(MAT_METAL=4500)
|
||||
build_path = /obj/item/device/spacepod_equipment/lock/keyed
|
||||
category = list("Pod_Parts")
|
||||
|
||||
/datum/design/pod_key
|
||||
construction_time = 100
|
||||
name = "Spacepod Tumbler Lock Key"
|
||||
desc = "Allows for the construction of a blank key for a podlock."
|
||||
id = "podkey"
|
||||
req_tech = list("materials" = 1) //The most basic kind of locking system
|
||||
build_type = PODFAB
|
||||
materials = list(MAT_METAL=500)
|
||||
build_path = /obj/item/device/spacepod_key
|
||||
category = list("Pod_Parts")
|
||||
@@ -94,8 +94,8 @@
|
||||
category = list("Weapons")
|
||||
|
||||
/datum/design/lasercannon
|
||||
name = "Laser Cannon"
|
||||
desc = "A heavy duty laser cannon."
|
||||
name = "Accelerator Laser Cannon"
|
||||
desc = "A heavy duty laser cannon. It does more damage the farther away the target is."
|
||||
id = "lasercannon"
|
||||
req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3)
|
||||
build_type = PROTOLATHE
|
||||
@@ -125,48 +125,6 @@
|
||||
locked = 1
|
||||
category = list("Weapons")
|
||||
|
||||
/datum/design/smg
|
||||
name = "Nanotrasen Saber SMG"
|
||||
desc = "A prototype weapon made using lightweight materials on a traditional frame, designed to fire standard 9mm rounds."
|
||||
id = "smg"
|
||||
req_tech = list("combat" = 4, "materials" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 8000, MAT_SILVER = 2000, MAT_DIAMOND = 1000)
|
||||
build_path = /obj/item/weapon/gun/projectile/automatic/proto
|
||||
locked = 1
|
||||
category = list("Weapons")
|
||||
|
||||
/datum/design/mag_smg
|
||||
name = "Saber Submachine Gun Magazine (9mm)"
|
||||
desc = "A 30-round magazine for the Saber submachine gun."
|
||||
id = "mag_smg"
|
||||
req_tech = list("combat" = 4, "materials" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000)
|
||||
build_path = /obj/item/ammo_box/magazine/smgm9mm
|
||||
category = list("Weapons")
|
||||
|
||||
/datum/design/mag_smg/ap_mag
|
||||
name = "Saber Submachine Gun Magazine (9mmAP)"
|
||||
desc = "A 30-round armour piercing magazine for the Saber submachine gun. Deals slightly less damage but bypasses most armor."
|
||||
id = "mag_smg_ap"
|
||||
materials = list(MAT_METAL = 3000, MAT_SILVER = 100)
|
||||
build_path = /obj/item/ammo_box/magazine/smgm9mm/ap
|
||||
|
||||
/datum/design/mag_smg/incin_mag
|
||||
name = "Saber Submachine Gun Magazine (9mmIC)"
|
||||
desc = "A 30-round incendiary round magazine for the Saber submachine gun. Deals significantly less damage but sets the target on fire."
|
||||
id = "mag_smg_ic"
|
||||
materials = list(MAT_METAL = 3000, MAT_SILVER = 100, MAT_GLASS = 400)
|
||||
build_path = /obj/item/ammo_box/magazine/smgm9mm/fire
|
||||
|
||||
/datum/design/mag_smg/incin_tox
|
||||
name = "Saber Submachine Gun Magazine (9mmTX)"
|
||||
desc = "A 30-round uranium tipped round magazine for the Saber submachine gun. Deals toxin damage, but less overall damage."
|
||||
id = "mag_smg_tx"
|
||||
materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAT_URANIUM = 1000)
|
||||
build_path = /obj/item/ammo_box/magazine/smgm9mm/toxin
|
||||
|
||||
//WT550 Mags
|
||||
|
||||
/datum/design/mag_oldsmg
|
||||
@@ -221,13 +179,13 @@
|
||||
category = list("Weapons")
|
||||
|
||||
/datum/design/stunrevolver
|
||||
name = "Stun Revolver"
|
||||
desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. The stun cartridges can be recharged using a conventional energy weapon recharger."
|
||||
name = "Tesla Revolver"
|
||||
desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
|
||||
id = "stunrevolver"
|
||||
req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2)
|
||||
req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 5)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/weapon/gun/energy/stunrevolver
|
||||
materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000)
|
||||
build_path = /obj/item/weapon/gun/energy/shock_revolver
|
||||
locked = 1
|
||||
category = list("Weapons")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -171,7 +171,7 @@ proc/CallMaterialName(ID)
|
||||
return
|
||||
D.loc = src
|
||||
to_chat(user, "<span class='notice'>You add the disk to the machine!</span>")
|
||||
else
|
||||
else if(!(linked_destroy && linked_destroy.busy) && !(linked_lathe && linked_lathe.busy) && !(linked_imprinter && linked_imprinter.busy))
|
||||
..()
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
@@ -411,7 +411,7 @@ proc/CallMaterialName(ID)
|
||||
|
||||
var/list/efficient_mats = list()
|
||||
for(var/MAT in being_built.materials)
|
||||
efficient_mats[MAT] = being_built.materials[MAT] / coeff
|
||||
efficient_mats[MAT] = being_built.materials[MAT]
|
||||
|
||||
if(!linked_lathe.materials.has_materials(efficient_mats, amount))
|
||||
src.visible_message("<span class='notice'>The [src.name] beeps, \"Not enough materials to complete prototype.\"</span>")
|
||||
@@ -419,7 +419,7 @@ proc/CallMaterialName(ID)
|
||||
g2g = 0
|
||||
else
|
||||
for(var/R in being_built.reagents)
|
||||
if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R]/coeff))
|
||||
if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R]))
|
||||
src.visible_message("<span class='notice'>The [src.name] beeps, \"Not enough reagents to complete prototype.\"</span>")
|
||||
enough_materials = 0
|
||||
g2g = 0
|
||||
@@ -427,7 +427,7 @@ proc/CallMaterialName(ID)
|
||||
if(enough_materials)
|
||||
linked_lathe.materials.use_amount(efficient_mats, amount)
|
||||
for(var/R in being_built.reagents)
|
||||
linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]/coeff)
|
||||
linked_lathe.reagents.remove_reagent(R, being_built.reagents[R])
|
||||
|
||||
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
|
||||
var/O = being_built.locked
|
||||
@@ -439,8 +439,7 @@ proc/CallMaterialName(ID)
|
||||
new_item.investigate_log("built by [key]","singulo")
|
||||
new_item.reliability = 100
|
||||
if(!istype(new_item, /obj/item/stack/sheet)) // To avoid materials dupe glitches
|
||||
new_item.materials[MAT_METAL] /= coeff
|
||||
new_item.materials[MAT_GLASS] /= coeff
|
||||
new_item.materials = efficient_mats.Copy()
|
||||
if(O)
|
||||
var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
|
||||
new_item.loc = L
|
||||
@@ -873,7 +872,6 @@ proc/CallMaterialName(ID)
|
||||
dat += "<B>Material Amount:</B> [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount]<BR>"
|
||||
dat += "<B>Chemical Volume:</B> [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]<HR>"
|
||||
|
||||
var/coeff = linked_lathe.efficiency_coeff
|
||||
for(var/datum/design/D in files.known_designs)
|
||||
if(!(selected_category in D.category)|| !(D.build_type & PROTOLATHE))
|
||||
continue
|
||||
@@ -884,9 +882,9 @@ proc/CallMaterialName(ID)
|
||||
t = linked_lathe.check_mat(D, M)
|
||||
temp_material += " | "
|
||||
if (t < 1)
|
||||
temp_material += "<span class='bad'>[D.materials[M]/coeff] [CallMaterialName(M)]</span>"
|
||||
temp_material += "<span class='bad'>[D.materials[M]] [CallMaterialName(M)]</span>"
|
||||
else
|
||||
temp_material += " [D.materials[M]/coeff] [CallMaterialName(M)]"
|
||||
temp_material += " [D.materials[M]] [CallMaterialName(M)]"
|
||||
c = min(c,t)
|
||||
|
||||
|
||||
@@ -894,9 +892,9 @@ proc/CallMaterialName(ID)
|
||||
t = linked_lathe.check_mat(D, R)
|
||||
temp_material += " | "
|
||||
if (t < 1)
|
||||
temp_material += "<span class='bad'>[D.reagents[R]/coeff] [CallMaterialName(R)]</span>"
|
||||
temp_material += "<span class='bad'>[D.reagents[R]] [CallMaterialName(R)]</span>"
|
||||
else
|
||||
temp_material += " [D.reagents[R]/coeff] [CallMaterialName(R)]"
|
||||
temp_material += " [D.reagents[R]] [CallMaterialName(R)]"
|
||||
c = min(c,t)
|
||||
|
||||
if (c >= 1)
|
||||
@@ -920,7 +918,6 @@ proc/CallMaterialName(ID)
|
||||
dat += "<B>Material Amount:</B> [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount]<BR>"
|
||||
dat += "<B>Chemical Volume:</B> [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]<HR>"
|
||||
|
||||
var/coeff = linked_lathe.efficiency_coeff
|
||||
for(var/datum/design/D in matching_designs)
|
||||
var/temp_material
|
||||
var/c = 50
|
||||
@@ -929,18 +926,18 @@ proc/CallMaterialName(ID)
|
||||
t = linked_lathe.check_mat(D, M)
|
||||
temp_material += " | "
|
||||
if (t < 1)
|
||||
temp_material += "<span class='bad'>[D.materials[M]/coeff] [CallMaterialName(M)]</span>"
|
||||
temp_material += "<span class='bad'>[D.materials[M]] [CallMaterialName(M)]</span>"
|
||||
else
|
||||
temp_material += " [D.materials[M]/coeff] [CallMaterialName(M)]"
|
||||
temp_material += " [D.materials[M]] [CallMaterialName(M)]"
|
||||
c = min(c,t)
|
||||
|
||||
for(var/R in D.reagents)
|
||||
t = linked_lathe.check_mat(D, R)
|
||||
temp_material += " | "
|
||||
if (t < 1)
|
||||
temp_material += "<span class='bad'>[D.reagents[R]/coeff] [CallMaterialName(R)]</span>"
|
||||
temp_material += "<span class='bad'>[D.reagents[R]] [CallMaterialName(R)]</span>"
|
||||
else
|
||||
temp_material += " [D.reagents[R]/coeff] [CallMaterialName(R)]"
|
||||
temp_material += " [D.reagents[R]] [CallMaterialName(R)]"
|
||||
c = min(c,t)
|
||||
|
||||
if (c >= 1)
|
||||
|
||||
@@ -199,27 +199,27 @@
|
||||
interpreter.SetProc("tostring", /proc/n_num2str)
|
||||
interpreter.SetProc("sqrt", /proc/n_sqrt)
|
||||
interpreter.SetProc("abs", /proc/n_abs)
|
||||
interpreter.SetProc("floor", /proc/Floor)
|
||||
interpreter.SetProc("ceil", /proc/Ceiling)
|
||||
interpreter.SetProc("floor", /proc/n_floor)
|
||||
interpreter.SetProc("ceil", /proc/n_ceiling)
|
||||
interpreter.SetProc("round", /proc/n_round)
|
||||
interpreter.SetProc("clamp", /proc/n_clamp)
|
||||
interpreter.SetProc("inrange", /proc/IsInRange)
|
||||
interpreter.SetProc("inrange", /proc/n_isInRange)
|
||||
interpreter.SetProc("rand", /proc/rand_chance)
|
||||
interpreter.SetProc("arctan", /proc/Atan2)
|
||||
interpreter.SetProc("lcm", /proc/Lcm)
|
||||
interpreter.SetProc("lcm", /proc/n_lcm)
|
||||
interpreter.SetProc("gcd", /proc/Gcd)
|
||||
interpreter.SetProc("mean", /proc/Mean)
|
||||
interpreter.SetProc("root", /proc/Root)
|
||||
interpreter.SetProc("root", /proc/n_root)
|
||||
interpreter.SetProc("sin", /proc/n_sin)
|
||||
interpreter.SetProc("cos", /proc/n_cos)
|
||||
interpreter.SetProc("arcsin", /proc/n_asin)
|
||||
interpreter.SetProc("arccos", /proc/n_acos)
|
||||
interpreter.SetProc("tan", /proc/Tan)
|
||||
interpreter.SetProc("csc", /proc/Csc)
|
||||
interpreter.SetProc("cot", /proc/Cot)
|
||||
interpreter.SetProc("sec", /proc/Sec)
|
||||
interpreter.SetProc("todegrees", /proc/ToDegrees)
|
||||
interpreter.SetProc("toradians", /proc/ToRadians)
|
||||
interpreter.SetProc("tan", /proc/n_tan)
|
||||
interpreter.SetProc("csc", /proc/n_csc)
|
||||
interpreter.SetProc("cot", /proc/n_cot)
|
||||
interpreter.SetProc("sec", /proc/n_sec)
|
||||
interpreter.SetProc("todegrees", /proc/n_toDegrees)
|
||||
interpreter.SetProc("toradians", /proc/n_toRadians)
|
||||
interpreter.SetProc("lerp", /proc/Lerp)
|
||||
interpreter.SetProc("max", /proc/n_max)
|
||||
interpreter.SetProc("min", /proc/n_min)
|
||||
|
||||
@@ -221,13 +221,13 @@ proc/n_abs(var/num)
|
||||
proc/n_floor(var/num)
|
||||
//writepanic("[__FILE__].[__LINE__] \\/proc/n_floor() called tick#: [world.time]")
|
||||
if(isnum(num))
|
||||
return round(num)
|
||||
return Floor(num)
|
||||
|
||||
// Round up
|
||||
proc/n_ceil(var/num)
|
||||
proc/n_ceiling(var/num)
|
||||
//writepanic("[__FILE__].[__LINE__] \\/proc/n_ceil() called tick#: [world.time]")
|
||||
if(isnum(num))
|
||||
return round(num)+1
|
||||
return Ceiling(num)
|
||||
|
||||
// Round to nearest integer
|
||||
proc/n_round(var/num)
|
||||
@@ -235,22 +235,61 @@ proc/n_round(var/num)
|
||||
if(isnum(num))
|
||||
if(num-round(num)<0.5)
|
||||
return round(num)
|
||||
return n_ceil(num)\
|
||||
return Ceiling(num)
|
||||
|
||||
// END OF BY DONKIE :(
|
||||
|
||||
/proc/n_sin(var/const/x)
|
||||
return sin(x)
|
||||
if(isnum(x))
|
||||
return sin(x)
|
||||
|
||||
/proc/n_cos(var/const/x)
|
||||
return cos(x)
|
||||
if(isnum(x))
|
||||
return cos(x)
|
||||
|
||||
/proc/n_tan(var/const/x)
|
||||
if(isnum(x))
|
||||
return Tan(x)
|
||||
|
||||
/proc/n_csc(var/const/x)
|
||||
if(isnum(x))
|
||||
return Csc(x)
|
||||
|
||||
/proc/n_cot(var/const/x)
|
||||
if(isnum(x))
|
||||
return Cot(x)
|
||||
|
||||
/proc/n_sec(var/const/x)
|
||||
if(isnum(x))
|
||||
return Sec(x)
|
||||
|
||||
/proc/n_asin(var/const/x)
|
||||
return arcsin(x)
|
||||
if(isnum(x))
|
||||
return arcsin(x)
|
||||
|
||||
/proc/n_acos(var/const/x)
|
||||
return arccos(x)
|
||||
if(isnum(x))
|
||||
return arccos(x)
|
||||
|
||||
/proc/n_isInRange(var/const/x, var/const/min, var/const/max)
|
||||
if(isnum(x) && isnum(min) && isnum(max))
|
||||
return IsInRange(x, min, max)
|
||||
|
||||
/proc/n_lcm(var/const/a, var/const/b)
|
||||
if(isnum(a) && isnum(b))
|
||||
return Lcm(a, b)
|
||||
|
||||
/proc/n_root(var/const/n, var/const/x)
|
||||
if(isnum(n) && isnum(x))
|
||||
return Root(n, x)
|
||||
|
||||
/proc/n_toDegrees(var/const/x)
|
||||
if(isnum(x))
|
||||
return ToDegrees(x)
|
||||
|
||||
/proc/n_toRadians(var/const/x)
|
||||
if(isnum(x))
|
||||
return ToRadians(x)
|
||||
|
||||
/proc/n_max(...)
|
||||
return max(arglist(args))
|
||||
|
||||
@@ -171,6 +171,12 @@
|
||||
typepath = /obj/item/flag/species/vulp
|
||||
cost = 1000
|
||||
|
||||
/datum/storeitem/flag_drask
|
||||
name = "Drask flag"
|
||||
desc = "A flag proudly proclaiming the superior heritage of Drask."
|
||||
typepath = /obj/item/flag/species/drask
|
||||
cost = 1000
|
||||
|
||||
/datum/storeitem/flag_ian
|
||||
name = "Ian flag"
|
||||
desc = "The banner of Ian, because SQUEEEEE."
|
||||
|
||||
@@ -175,6 +175,11 @@
|
||||
to_chat(user, "<span class='warning'>Central command would kill you if you implanted the disk into someone.</span>")
|
||||
return 0//fail
|
||||
|
||||
var/obj/item/weapon/disk/nuclear/datdisk = locate() in tool
|
||||
if(datdisk)
|
||||
to_chat(user, "<span class='warning'>Central command would kill you if you implanted the disk into someone. Even if in a box. Especially in a box.</span>")
|
||||
return 0//fail
|
||||
|
||||
if(istype(tool,/obj/item/organ))
|
||||
to_chat(user, "<span class='warning'>This isn't the type of surgery for organ transplants!</span>")
|
||||
return 0//fail
|
||||
|
||||
Reference in New Issue
Block a user