fixes conflicts

This commit is contained in:
VampyrBytes
2016-05-10 04:12:55 +01:00
212 changed files with 3166 additions and 1336 deletions
+3 -1
View File
@@ -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
+18 -8
View File
@@ -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
View File
@@ -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'>&reg;</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'>(&reg;)</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];'>&nbsp;&nbsp;&nbsp;</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];'>&nbsp;&nbsp;&nbsp;</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)
+31 -1
View File
@@ -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
+3 -2
View File
@@ -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()
..()
+21 -13
View File
@@ -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 ..()
+6 -6
View File
@@ -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()
..()
+1 -2
View File
@@ -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")
+19
View File
@@ -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
+25 -7
View File
@@ -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)
+5 -1
View File
@@ -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
+18 -1
View File
@@ -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
+21 -7
View File
@@ -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)
+1
View File
@@ -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])
+5 -3
View File
@@ -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)
+1
View File
@@ -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
View File
@@ -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)
+4 -4
View File
@@ -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)
+1
View File
@@ -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"
+36 -60
View File
@@ -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
+1
View File
@@ -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
+16 -6
View File
@@ -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"
+21 -7
View File
@@ -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"
+81
View File
@@ -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"
+50
View File
@@ -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!
+276 -82
View File
@@ -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"
+52 -13
View File
@@ -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
..()
+84 -55
View File
@@ -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
+46
View File
@@ -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
+49 -19
View File
@@ -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"
+2
View File
@@ -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")
+2 -2
View File
@@ -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)
+13 -16
View File
@@ -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))
+6
View File
@@ -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."
+5
View File
@@ -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